데이터 오염의 최전선 방어: 데이터 유효성 검사 ‘사용자 지정’을 통한 중복 원천 차단
실무에서 수집되는 로우 데이터(Raw Data)를 다루다 보면, 가장 치명적이고 빈번하게 마주하는 데이터 오염의 형태가 바로 고유 키(Unique Key)의 중복 입력이다. 사번, 고객 번호, 송장 번호, 혹은 프로젝트 코드와 같이 시스템 내에서 절대적으로 유일해야만 하는 식별자 값들이 타 부서의 무성의한 취합 과정을 거치며 수없이 중첩되어 내 모니터로 넘어온다. 이러한 중복 데이터는 단순히 보기 불편한 수준의 미관상 문제가 아니다. 이는 후행되는 모든 브이룩업(VLOOKUP)이나 인덱스 매치(INDEX MATCH) 기반의 관계형 데이터 참조를 심각하게 교란시키며, 재무 데이터나 실적 통계를 산출할 때 치명적인 이중 계상(Double Counting) 오류를 발생시켜 보고서 전체의 무결성을 철저하게 파괴한다. 데이터의 중복을 방치하는 것은 곧 전체 시스템의 신뢰도를 바닥으로 내동댕이치는 것과 같다.

대부분의 실무자들은 이 중복 데이터를 처리하기 위해 엑셀 상단 리본 메뉴에 있는 ‘중복된 항목 제거’ 기능을 사후 약방문 격으로 사용하곤 한다. 하지만 이는 데이터 아키텍처 관점에서 볼 때 대단히 위험하고 나태한 발상이다. 수만 줄의 데이터 속에서 이미 발생한 중복 값을 기계적으로 제거해 버리면, 중복 입력된 두 개의 행 중에서 과연 어느 것이 최신 정보이고 어느 것이 오류인지 교차 검증할 기회조차 영구적으로 날아가 버린다. A부서의 담당자가 어제 입력한 데이터와 오늘 수정해서 다시 입력한 데이터가 중복으로 쌓였을 때, 엑셀의 기본 기능은 단순히 위에 있는 행을 남기고 아래 행을 무자비하게 삭제해 버리기 때문이다. 결국 실무자는 원본 작성자에게 일일이 메신저를 보내 어떤 데이터가 진짜인지 확인하는 불필요한 커뮤니케이션에 귀중한 업무 시간을 탕진하게 된다. 에러는 발생한 뒤에 수습하는 것이 아니다. 데이터가 셀에 입력되는 바로 그 프론트엔드(Front-end) 순간에, 규칙에 어긋나는 값의 진입 자체를 원천적으로 튕겨내는 엄격한 게이트키퍼(Gatekeeper) 시스템이 필요하다.
이러한 비효율적인 사후 검증의 고리를 끊어내고 데이터의 고유성을 강제하기 위해 도입하는 시스템적 방어막이 바로 ‘데이터 유효성 검사(Data Validation)’의 ‘사용자 지정(Custom)’ 기능이다. 많은 이들이 데이터 유효성 검사를 단순히 드롭다운 목록(목록 상자)을 만드는 가벼운 용도로만 소비하지만, 사용자 지정 메뉴를 통해 논리식(Formula)을 주입하는 순간 이 기능은 사용자의 입력을 실시간으로 감시하고 통제하는 강력한 컴파일러로 돌변한다. 이러한 프론트엔드 통제 시스템의 아키텍처 설계와 관련하여 데이터 유효성 검사의 세부적인 제약 사항 및 엔진 작동 원리는 마이크로소프트 공식 데이터 유효성 검사 기술 문서를 통해 보다 깊이 있는 구조적 이해를 도모할 수 있다. 우리의 목적은 특정 열(예: A열의 사원번호)에 이미 존재하는 값이 다시 타이핑될 경우, 엑셀이 이를 즉각적으로 거부하고 에러 메시지를 띄우도록 아키텍처를 짜는 것이다. 이를 위해 데이터를 입력받을 범위, 예를 들어 A2 셀부터 A10000 셀까지를 마우스로 정확하게 블록 지정한 후, 상단 리본 메뉴의 [데이터] 탭에서 [데이터 유효성 검사] 메뉴를 호출한다. 제한 대상을 ‘사용자 지정’으로 변경하면 나타나는 수식 입력창에 아래와 같은 조건부 카운트 함수 기반의 논리식을 작성한다.

=COUNTIF($A$2:$A$10000, A2)<=1
이 간결한 수식 한 줄이 대량 데이터의 무결성을 지키는 핵심 엔진이다. 작동 원리는 철저한 불리언(Boolean) 논리에 기반한다. 사용자가 A2 셀에 새로운 사원번호를 타이핑하고 엔터를 치는 찰나의 순간, 엑셀의 렌더링 엔진은 지정된 절대 참조 범위인 `$A$2:$A$10000` 전체를 백그라운드에서 광속으로 스캔한다. 그리고 방금 입력된 `A2` 셀의 값이 그 거대한 범위 내에 총 몇 개가 존재하는지 카운트(COUNTIF)한다. 만약 처음 입력하는 정상적인 고유 값이라면, 방금 타이핑한 자기 자신 딱 하나만 존재할 것이므로 카운트 결과는 1이 된다. 수식의 조건인 `<=1` (1보다 작거나 같다)을 완벽하게 만족하므로, 엔진은 이를 ‘TRUE(참)’로 평가하고 셀에 값이 안착하도록 허락한다.

하지만 사용자가 A500 셀쯤에 도달하여 이미 위에서 입력했던 사원번호를 무심코 다시 타이핑했다고 가정해 보자. 엔터를 치는 순간 엔진이 범위를 스캔하면, 과거에 입력된 값 하나와 지금 막 입력하려는 값 하나가 합쳐져 카운트 결과가 2가 도출된다. 2는 1보다 작거나 같다는 조건(`<=1`)에 위배되므로, 논리식은 즉각 ‘FALSE(거짓)’를 반환한다. FALSE 판정이 떨어지는 순간 엑셀은 시스템 경고음과 함께 데이터 입력을 강제로 취소시키며 팝업 창을 띄워버린다. 이때 데이터 유효성 검사 메뉴의 [오류 메시지] 탭을 미리 세팅하여 “중복된 고유 코드입니다. 기존 데이터를 다시 확인하십시오.”라는 건조하고 명확한 가이드라인을 출력하게 만들면, 오입력을 범한 작업자는 자신의 실수를 즉시 인지하고 스스로 데이터를 수정할 수밖에 없다. 데이터 정제의 책임이 수합하는 내가 아니라, 데이터를 생산하는 입력자 본인에게로 완벽하게 이전되는 것이다.
이 수식에서 가장 주의해야 할 기술적 포인트는 달러 기호($)를 활용한 참조의 고정이다. 탐색의 대상이 되는 전체 데이터 범위 `$A$2:$A$10000`은 달러 기호로 단단히 묶어 절대 참조로 만들어야 엔진이 다른 셀을 검사할 때도 엉뚱한 곳을 쳐다보지 않는다. 반면 쉼표 뒤에 오는 기준값 `A2`는 달러 기호를 완전히 제거한 상대 참조로 두어야 한다. 그래야 블록 지정된 수만 개의 셀에 이 규칙이 일괄 적용될 때, A3 셀은 A3의 값을 검사하고, A100 셀은 A100의 값을 유동적으로 추적하며 스스로를 검증할 수 있기 때문이다. 이 논리를 정확히 이해하고 세팅한다면, 인간의 눈과 손에 의존하던 중복 검사라는 지루한 노동은 시스템 백그라운드의 자동 연산으로 완전히 대체된다.
그러나 이처럼 견고하게 설계된 유효성 검사 시스템도 실무의 무자비한 환경 앞에서는 뼈아픈 기술적 한계점을 노출한다. 엑셀의 데이터 유효성 검사는 사용자가 키보드로 직접 값을 ‘타이핑’할 때 발생하는 이벤트에만 반응하도록 설계되어 있다. 즉, 타 부서 담당자가 다른 엑셀 파일이나 웹페이지에서 중복된 데이터를 마우스로 복사(Ctrl+C)하여 유효성 검사가 걸려 있는 셀 위에 그대로 붙여넣기(Ctrl+V)를 해버리면, 데이터의 값뿐만 아니라 유효성 검사 규칙이라는 껍데기 자체까지 덮어쓰기로 날아가 버리며 방어막이 허무하게 뚫리게 된다. 이는 엑셀 프로그램 자체가 가진 구조적 맹점이다.
이러한 강제 붙여넣기라는 변수마저 완벽하게 차단하려면 ‘값만 붙여넣기’를 강제하는 복잡한 매크로(VBA) 스크립트를 삽입하거나 시트 보호 모드를 고도화해야 하지만, 이는 시스템을 불필요하게 무겁게 만들고 유지보수의 난이도를 급격히 상승시킨다. 따라서 실무적인 타협점으로서, 유효성 검사를 통해 1차적인 타이핑 오입력을 방어하되, 앞선 칼럼에서 다루었던 수식 기반의 조건부 서식을 활용한 행 전체 색상 제어 기법을 2차 방어선으로 병행 적용하는 아키텍처를 권장한다. COUNTIF 수식을 조건부 서식에 동일하게 걸어 중복 값이 발생하면 셀을 붉은색으로 강렬하게 렌더링하도록 설정해 두면, 누군가 강제 붙여넣기로 시스템을 우회하더라도 즉각적인 시각적 알람을 통해 이상 데이터의 색출이 가능해진다. 시스템적 방어선과 시각적 모니터링 체계를 이중으로 구축해 두었다면, 더 이상 로우 데이터의 오염에 신경을 곤두세울 필요가 없다. 나는 굳게 닫힌 게이트를 통과해 들어온 무결한 데이터의 정합성만을 건조하게 모니터링하며, 분석이라는 본연의 가치에만 집중할 뿐이다.
