여러 곳에서 다른 이름으로 들어오는 데이터를 '결국 같은 대상인지' 판단해 연결해 온 데이터 엔지니어입니다.
초기 멤버로 합류한 보안 데이터 회사에서 5년간, 오픈소스 제품과 버전, 취약점, 12종 리눅스 배포판의 보안 정보를 수집하고 연결하는 파이프라인을 만들었습니다. 같은 제품이 표기 차이로 갈라지고 다른 제품이 하나로 합쳐지는 문제를 식별 규칙부터 원본 보존, 변경 이력, 재처리 구조까지 고쳤고, 그 위에서 수십억 행 MySQL과 80개 넘는 크롤러가 도는 시스템을 안정화했습니다.
이제는 이 노하우를 '일하는 사람들의 커리어와 기회를 연결하는' 리멤버의 데이터 위에서 쓰고 싶습니다. 명함·프로필·회사 데이터는 제가 해 온 식별과 정합성 문제가 그대로 있으면서, 그 품질이 직장인들의 실제 기회로 이어지는 데이터입니다. 행동 로그 집계를 넘어 그 신뢰를 떠받치는 데이터 전문가로 리멤버의 성장에 함께하고 싶어 지원했습니다.
| # | 항목 | 숫자 1개 |
|---|---|---|
| 01 | OS 패키지 취약점 수집 정확도 — 고쳐진 버전까지 맞아야 스캐너가 신뢰된다 | 12종 배포판 × 4가지 제공 방식 |
| 02 | 라이브러리 컴포넌트 테이블 재설계 — 슬로우 쿼리→실행계획→원인은 collation·식별자 정책 | 예상 스캔 행 130만 → 6,000 |
| 03 | 인덱스 최적화·용량 절감 — 지울 근거(95개 쿼리 실행계획)를 먼저 만들고 지웠다 | 311개 중 224개 삭제 · 9.6→4TB |
| 04 | RAW 보존·재파싱 ETL — 외부 재요청 없이 재처리. 이번 과제 설계의 원형 | 재처리 외부 요청 0건 |
| 05 | K8s·Airflow 운영 — 노드 증설 + pool·backoff·resource request를 함께 조정 | Pod 할당 실패 주 70~100 → 1~5건 |
| 06 | DML Broker — 80개 크롤러의 DB 쓰기를 공통 규칙 하나로 (bounded queue + 429) | lock 오류 일 3~4건 → 4개월 0건 |
| 07 | AWS→IDC 이전 — 수집 시간 분산으로 버티고, 준비 후 DB 역할 분리 (임시복구→구조개선) | 장애 월 10~20건 → 1~2건 |
| 08 | Grafana 모니터링 — 서버 자원·DB·수집 누락·고객사 동기화를 같은 시간축에서 | 10~20대 서버 |
단위 방어 — 130만→6,000은 실행계획상 예상 스캔 행 수(응답시간 아님) · "2일→5분"은 설계 산정 예시(실측 아님) · IDC 이관 확인 범위는 전후 행 수 대조까지.
IS DISTINCT FROM) → 마스터+이력+부재 표시+검산 8종을 한 트랜잭션. 하나라도 틀리면 통째로 롤백. 단일 writer라 직렬 + max_active_runs=1.
30,513 + 2,174 = 32,687 초기+신규=최종 21,087 = 4,000 + 17,087 공통키=변경+no-op 23,261 + 9,426 = 32,687 활성+부재 이력 5,196 (컬럼별 1건씩) 8/8 통과 · 불일치 0 · ERROR 0먼저 인정할 한계 3개 실행 기록은 트랜잭션 밖(exactly-once는 업무 데이터까지) · 동시 backfill 미보장 · stage()가 한 해 분량 메모리 적재.
직무 키워드(공고): 정교한 매핑 · MDM · 데이터 정합성 — "같은 회사가 여러 이름으로 들어와도 한 회사로 알아보고, 잘못 연결하지 않게 관리하는 일".
| 기술 | 어떤 기술인가 |
|---|---|
| Aurora MySQL + binlog | 운영 DB와 그 변경 기록. 모든 동기화의 원천 |
| Debezium · MSK(Kafka) | binlog를 변경 이벤트로 바꿔(CDC) 컨베이어 벨트(topic·partition)로 흘리는 실시간 스트리밍 |
| Glue PySpark Full Load | 전용 replica에서 초기 전량 적재 — 원본 영향 격리가 목적. 기준점(binlog position) 고정 후 CDC로 이어붙임 |
| S3 Tables · Iceberg | Parquet 파일 더미를 목록표(metadata·snapshot)로 테이블처럼 관리하는 레이크하우스. CDC는 PK upsert로 반영 |
| 운영 유지보수 | compaction(작은 파일 합치기) · snapshot 만료 · orphan file 정리 — 파일을 테이블처럼 쓰는 대가 |
| PyIceberg | 쿼리 엔진 밖에서 파일 수·크기·스냅샷 상태를 관측하는 Python 도구 |
| StarRocks on EKS · Athena | 자주 보는 걸 앞 진열대에 정리해 저지연 서빙(OLAP) / 애드혹·BI 조회 |
| Lake Formation | IAM(출입증)과 별개로 DB·테이블·컬럼·행 단위 데이터 권한을 판정 |
많이 씁니다. 특히 팀이 쓰도록 파이프라인에 넣은 쪽을 신경 썼습니다. 사내 CI/CD 중앙 kit에 Claude 기반 PR 리뷰를 넣어 여러 저장소에 같은 방식으로 적용했습니다. Jira 브랜치, 테스트, PR 자동 생성, AI 리뷰, Slack 알림, 이미지 푸시가 한 흐름으로 돕니다.
오래 고민한 것은 프롬프트보다 경계였습니다. diff에 secret scan을 먼저 돌리고 통과한 뒤에만 외부 모델을 호출합니다. 실행 kit 버전은 커밋 SHA로 못 박아 main 같은 움직이는 참조를 신뢰하지 않고, 변경 경로가 매핑되지 않으면 기본 실패로 둬서 조용한 초록불을 막았습니다.
IS DISTINCT FROM을 쓴 이유는 <>가 NULL을 만나면 변경을 놓치기 때문이고, 2023년 주소가 비어 온 2,093건이 실제로 그 경우.