LLM WikiAccess-protected knowledge portal

WIKI

인터뷰2 — 리멤버 과제, 쉬운 설명

인터뷰2 — 리멤버 과제, 쉬운 설명 기술 용어를 덜 쓰고 짧게 다시 쓴 버전입니다. 자세한 내용은 2026 08 11 remember assignment code review.md 에 있습니다. 한 줄로 2022년 명부와 2023년 명부를 합쳐서, 회사별로 최신 정보 한 줄만 남긴 명부를 자동으로 만드는 프로그램 입니다. 매년 새 파일이 오면 같은 방식으로 계속 갱신됩니다. 원본은 근로복지공단이 공개한 고용·산재보험 가입 사

경로human/reports/인터뷰2.md
카테고리Reports
태그#human #report #reports #인터뷰2

기술 용어를 덜 쓰고 짧게 다시 쓴 버전입니다. 자세한 내용은 2026-08-11-remember-assignment-code-review.md에 있습니다.


한 줄로

2022년 명부와 2023년 명부를 합쳐서, 회사별로 최신 정보 한 줄만 남긴 명부를 자동으로 만드는 프로그램입니다. 매년 새 파일이 오면 같은 방식으로 계속 갱신됩니다.

원본은 근로복지공단이 공개한 고용·산재보험 가입 사업장 목록이고, 한 회사당 사업자등록번호, 사업장명, 주소, 업종, 근로자수, 보험 성립일자가 들어 있습니다.


왜 단순 합치기가 아닌가

엑셀 두 개를 아래로 붙이면 끝날 것 같지만, 그러면 같은 회사가 두 줄이 됩니다. 회사별로 한 줄만 남기려면 판단이 네 번 필요합니다.

  1. 같은 회사인지 어떻게 아나 — 사업자등록번호로 봅니다. 이름이나 주소는 바뀌지만

번호는 그대로입니다.

  1. 정보가 바뀌었는지 어떻게 아나 — 2022년 값과 2023년 값을 항목별로 비교합니다.

그런데 실제로는 안 바뀌었는데 바뀐 것처럼 보이는 경우가 많습니다(아래 참고).

  1. 2023년에만 있는 회사 — 새로 생긴 회사입니다. 추가합니다.
  2. 2022년에만 있는 회사 — 문 닫았는지, 이번 파일에서 빠진 것인지 알 수 없습니다.

지우지 않고 "최근 명부에 없음" 표시만 남겼습니다.

안 바뀐 걸 바뀐 것처럼 보이게 하는 것들

그냥 비교했다면 변경 건수가 실제보다 5천 건 넘게 부풀었습니다. 그래서 비교 전에 값의 표기를 통일하는 단계를 따로 뒀습니다. 이걸 정규화라고 부릅니다.


프로그램은 4단계로 돕니다

한 해 파일을 처리하는 한 번의 실행이 아래 순서로 진행됩니다. 앞 단계가 끝나야 다음 단계가 시작합니다.

단계하는 일쉬운 비유
1. 대상 확인올해 파일이 있는지 확인하고 없으면 조용히 건너뜀택배가 왔는지 확인
2. 원본 저장파일을 손대지 않은 상태로 그대로 저장박스를 뜯되 내용물은 그대로 보관
3. 값 정리·검사표기를 통일하고, 쓸 수 없는 줄은 따로 빼둠검수하고 불량품은 따로 담기
4. 명부 갱신최신 명부에 반영하고, 숫자가 맞는지 다시 검산장부에 옮겨 적고 합계 확인

2단계에서 원본을 그대로 남기는 이유가 있습니다. 나중에 "표기를 통일하는 규칙이 잘못됐다"고 판단되면, 공공데이터를 다시 받아오지 않고 저장된 원본에서 다시 계산하면 됩니다.

3단계에서 쓸 수 없는 줄을 지우지 않고 따로 빼두는 것도 같은 이유입니다. 무엇을 왜 제외했는지가 남아 있어야 나중에 확인할 수 있습니다.


결과 숫자 읽는 법

여기가 이해의 핵심입니다. 숫자가 서로 맞아떨어지는지 보면 됩니다.

2022년 — 명부가 비어 있으니 30,513건이 전부 새로 들어갑니다.

항목
파일에 있던 회사30,513
새로 추가30,513
명부 합계30,513

2023년 — 파일에 23,261개 회사가 있습니다. 이 23,261개가 세 종류로 갈립니다.

항목
새로 추가2,1742022년에 없던 회사
정보 변경4,000있던 회사인데 값이 달라짐
그대로17,087있던 회사이고 값도 같음
합계23,261파일에 있던 회사 수와 일치

여기서 검산이 두 번 됩니다.

빠뜨린 회사도, 두 번 센 회사도 없다는 뜻입니다.

갱신하다가 실수로 줄을 더 만들지 않았다는 뜻입니다.

사라진 회사 — 2022년에는 있었는데 2023년 파일에 없는 회사가 9,426개입니다. 지우지 않았으므로 명부에는 남아 있고, "최근 명부에 없음" 표시가 붙습니다.

명부 32,687줄의 구성
최근 명부에 있는 회사23,261
최근 명부에 없는 회사9,426

23,261이 2023년 파일의 회사 수와 같습니다. 이것도 검산입니다.


검산 8개

위에서 손으로 해본 검산을 프로그램이 매번 스스로 8가지 돌립니다. 하나라도 틀리면 그 회차 작업을 통째로 되돌립니다.

가계부에 옮겨 적은 뒤 합계를 맞춰보는 것과 같습니다. 다른 점은 사람이 아니라 코드가 매번 하고, 안 맞으면 아예 저장을 안 한다는 것입니다.

개수가 맞나 (3개)

검산쉬운 말틀리면
명부 증가분 = 신규 건수명부가 2,174줄 늘었으면 새로 추가한 것도 정확히 2,174개갱신하다 줄을 잘못 만들었거나 지웠다
세 분류의 합 = 파일 건수2,174 + 4,000 + 17,087 = 23,261어떤 회사를 빠뜨렸거나 두 번 셌다
같은 회사가 두 줄 있나사업자번호 중복 0건회사당 한 줄이라는 전제가 깨졌다

값이 맞나 (2개) — 가장 중요

검산쉬운 말틀리면
파일의 회사가 명부에 다 있나파일에 있는데 명부에서 못 찾는 게 0건반영이 누락됐다
명부의 값이 규칙대로인가규칙을 처음부터 다시 적용해 나온 값과 명부의 실제 값을 대조회사끼리 연결을 잘못했거나 조건을 잘못 썼다

두 번째가 8개 중 가장 강합니다. 앞의 것들은 개수만 보지만 이건 을 봅니다. 개수는 맞는데 엉뚱한 회사 정보가 들어간 경우를 이것만 잡아냅니다.

상태 표시가 맞나 (3개)

검산쉬운 말틀리면
올해 등장한 회사에 "없음" 표시가 남았나2023년 파일에 있는데 "최근 명부에 없음"이면 모순되살리기 처리가 빠졌다
미래 연도가 찍힌 회사가 있나2023년 작업인데 2024가 적혀 있으면 안 됨연도를 거꾸로 실행했다
지켜야 할 값을 지웠나보존 설정을 켰는데 값을 지운 기록이 있으면 안 됨설정이 지켜지지 않았다

마지막 것은 보존 설정을 켰을 때만 의미가 있습니다. 기본 설정에서는 지우는 것이 의도된 동작이라 이 검산을 건너뜁니다.

왜 이렇게까지 하나

데이터 프로그램은 조용히 틀립니다. 오류 없이 끝나고 기록도 정상인데, 명부 안에서 500개 회사의 주소만 엉뚱하게 들어가 있을 수 있습니다. 다음 달에 누가 발견할 때까지 아무도 모릅니다.

그래서 틀리면 시끄럽게 실패하도록 만들었습니다. 검산을 갱신과 같은 묶음에 넣었기 때문에, 검산이 깨지면 갱신도 없던 일이 됩니다. 실패한 회차는 명부에 흔적을 남기지 않아서 사람이 나중에 청소할 일이 없습니다.

물어보면

8개 중 하나만 남긴다면요 값 검산입니다. 나머지가 개수 검산이라면 이건 규칙을 독립적으로 다시 계산해 명부의 실제 값과 대조합니다. 개수는 맞는데 값이 틀린 경우를 이것만 잡습니다.

결국 스스로 계산한 값끼리 비교하는 것 아닌가요 일부는 그렇습니다. 증가분이나 분류 합계는 내부 일관성 확인에 가깝습니다. 값 검산과 누락 검산은 정리해둔 표를 다시 맞대 대조하고, 별도 확인 스크립트로 2023년 원본과 명부를 직접 대조해 불일치 0건을 확인했습니다. 완전히 독립된 검증은 아니고, 같은 규칙을 다른 경로로 다시 계산해 대조하는 수준입니다.

왜 8개인가요 처음부터 8개로 정한 것이 아니고, 만들면서 "이게 틀리면 조용히 넘어간다" 싶은 지점마다 하나씩 추가한 결과입니다. 개수 3개, 값 2개, 상태 3개입니다.


판단이 갈렸던 문제 하나

2023년 파일에는 주소 칸이 비어 있는 회사가 2,249개 있었습니다. 그중 2,093개는 2022년에 주소가 있던 회사입니다. 예를 들어 어떤 저축은행은 2022년에 "서울 중구 남대문로 113"이었고 2023년 파일에는 주소 칸이 비어 있습니다. 본점이 사라졌을 리는 없습니다.

그러면 이 빈칸을 어떻게 봐야 할까요.

원본 설명만으로는 확정할 수 없었습니다. 과제 지시가 "최신 파일 값으로 갱신"이었으므로 기본은 지우는 쪽으로 하고, 설정 하나로 지키는 쪽도 선택할 수 있게 만들었습니다.

설정명부의 주소 빈칸
기본 (지운다)2,249
보존 (지킨다)156

2,249 − 2,093 = 156입니다. 남는 156개는 2022년에도 주소가 없던 회사라 어느 쪽을 골라도 빈칸입니다.

지운 경우에도 무엇을 지웠는지 기록에 남습니다. 나중에 판단이 뒤집히면 기록을 보고 되돌릴 수 있습니다.


어려운 단어 5개만

단어
마스터회사당 한 줄, 최신 정보만 담은 최종 명부
정규화비교하기 전에 값의 표기를 통일하는 일 (1.01)
트랜잭션여러 작업을 한 묶음으로 처리. 중간에 실패하면 전부 없던 일로 되돌림
멱등같은 작업을 두 번 해도 결과가 같은 성질
정합성 검증작업 후에 숫자와 값이 맞는지 스스로 검산하는 일 (위 "검산 8개" 절)

트랜잭션이 왜 중요한가 — 명부를 갱신하다가 중간에 프로그램이 죽으면, 절반만 반영된 이상한 명부가 남습니다. 다음 실행이 그 위에서 시작하면 문제가 커집니다. 그래서 갱신과 검산을 한 묶음으로 묶고, 검산이 하나라도 틀리면 전부 되돌립니다. 실패한 실행은 명부에 아무 흔적을 남기지 않습니다.

멱등이 왜 중요한가 — 자동 실행 프로그램은 오류로 다시 돌 때가 있습니다. 2023년을 두 번 실행하면 두 번째는 새로 추가 0건, 변경 0건이 나옵니다. 두 번 실행해도 명부가 망가지지 않습니다.


면접에서 짧게 답하기

이 과제가 뭐였나요 2022년과 2023년 사업장 명부를 사업자등록번호 기준으로 합쳐, 회사당 한 줄인 최신 명부를 만드는 자동 파이프라인입니다. Airflow로 연도별로 한 회차씩 돌리고 결과는 DuckDB에 담았습니다.

가장 고민한 부분은요 2023년 파일에서 주소 칸이 빈 2,249건입니다. 그중 2,093건은 2022년에 값이 있던 회사인데, 빈 값이 최신 상태인지 추출 누락인지 확정할 수 없었습니다. 과제 지시대로 지우는 쪽을 기본으로 하고, 지키는 쪽을 설정으로 남겨 두 경로 모두 검산을 통과하게 했습니다.

결과가 맞다는 걸 어떻게 확인했나요 갱신 후에 8가지 검산을 돌립니다. 명부가 늘어난 수가 새로 추가한 수와 같은지, 파일의 모든 회사가 추가·변경·그대로 셋 중 하나로 분류됐는지, 명부의 실제 값이 규칙대로 계산한 값과 같은지를 봅니다. 하나라도 틀리면 그 회차 전체를 되돌립니다.

2023년에 없어진 회사는 어떻게 했나요 지우지 않았습니다. 폐업인지 이번 공시에서 빠진 것인지 구분할 근거가 없고, 지우면 되돌릴 수 없습니다. 9,426건에 "최근 명부에 없음" 표시와 사라진 연도만 기록했습니다.

데이터가 지금보다 훨씬 많아지면요 값 정리 단계가 한 해 분량을 메모리에 올려두는 구조라 거기가 먼저 걸립니다. 정리를 나눠서 처리하거나 데이터베이스 쪽으로 내려야 합니다. 지금 구조는 연 1회 3만 건 배치에 맞춘 선택입니다.


외울 숫자

2022년   파일 30,513  →  명부 30,513
2023년   파일 23,261  =  신규 2,174 + 변경 4,000 + 그대로 17,087
         명부 32,687  =  30,513 + 2,174
         구성         =  최근 있음 23,261 + 없음 9,426
주소 빈칸  2,249 (지움) / 156 (지킴),  차이 2,093
검산       두 회차 모두 8개 전부 통과