Skip to content
게으른 엔지니어의 기술 블로그
Go back

폴더 하나에 노트가 천 개씩 쌓이길래 나누려다가, 12월 29일이 다음 해 1주차라는 걸 알게 됐다

/ingest가 새 노트를 wiki/{연도}/Q1~Q4/ 형태의 분기 폴더에 만드는데, 문서 하나를 여러 노트로 쪼개는 방식이 잘 자리 잡으면서 이 문제가 눈에 띄기 시작했다. 분기 하나에 노트가 계속 쌓이면 폴더 하나에 수천 개까지 몰릴 수 있었다. 더 잘게 나누는 방법을 찾다가, 생각보다 날짜 계산이 까다롭다는 걸 두 번 연달아 배웠다.

후보를 하나씩 지웠다

가장 먼저 떠오른 건 주제(토픽)별 폴더였다. 이미 /refactor의 클러스터링 기능이 노트끼리 유사도를 계산하고 있으니 그걸 재활용할 수 있어 보였다. 그런데 생각해보니 이건 분류 체계 자체를 새로 설계해야 하는 문제였고, 노트 하나가 어느 폴더에 속하는지 경계가 애초에 모호했다 — 토픽 분류는 이 문제에 맞는 방향이 아니었다.

다음 후보는 주(week) 단위였다. 분기보다 훨씬 잘게 쪼갤 수 있으니 자연스러운 선택이었다. 그런데 “매달 1일마다 주차를 1부터 다시 센다”는 규칙을 적용하면 바로 문제가 생겼다. 7월 31일(금)과 8월 1일 (토)은 연속된 이틀인데, 전자는 “7월 다섯째 주”고 후자는 “8월 첫째 주”가 된다. 폴더가 갈라지는 것 자체는 큰 문제가 아니지만, 연속된 날짜가 서로 다른 폴더로 쪼개진다는 게 마음에 걸렸다.

ISO 주차로 바꿨다가, 더 이상한 걸 만났다

“그럼 연 단위의 절대 주차(ISO 8601 주차, 8월 첫째 주가 아니라 그냥 ‘31주차’ 같은 식)를 쓰면 어떨까?”로 방향을 바꿨다가, 확인차 날짜 계산을 직접 돌려보고서 전혀 다른 함정을 만났다.

2025년 12월 29일(월)의 ISO 주차를 계산해보니 “2026년 1주차”로 나왔다. 아직 12월인데 벌써 내년 1주차라는 게 처음엔 계산이 잘못된 줄 알았다. 확인해보니 ISO 8601 표준 자체의 규칙이었다 — 그 해의 첫 목요일이 포함된 주를 1주차로 정의한다. 2026년 1월 1일이 마침 목요일이었고, 그 주(월요일 12/29 ~ 일요일 1/4)는 목요일을 포함하고 있으니 통째로 “2026년 1주차”가 된 것이다. 반대로 1월 1일이 금·토· 일요일에 걸리는 해는 그 해의 마지막 며칠이 전년도 주차로 남기도 한다.

절대 주차를 쓰면 첫 번째 문제(월 경계에서 폴더가 갈라짐)는 없어지지만, 이번엔 폴더명(연도)과 실제 날짜의 연도가 어긋나는 새로운 혼란이 생기는 셈이었다.

결국 “그 주의 월요일”로 정했다

두 시행착오를 거치고 나서, 더 단순한 기준으로 정리했다. 그 날짜가 속한 주의 월요일 날짜를 그대로 연/월/일로 써서 폴더를 정하기로 했다 — ISO 주차 번호도, ISO 주차-연도도 아예 계산하지 않는 방식이다.

이렇게 하면 7월 31일과 8월 1일은 둘 다 그 주의 월요일인 7월 27일을 기준으로 같은 폴더에 들어간다. 12월 29일과 1월 1일도 마찬가지로, 그 주의 월요일인 2025년 12월 29일 기준 폴더에 함께 들어간다 — ISO 표준이 “내년 1주차”라고 부르는 것과 무관하게, 그냥 그 주가 시작하는 날짜의 달력 연/월을 그대로 쓰는 것이다. 실제 날짜 몇 개를 손으로 계산해서 두 경계 케이스 모두 확인했다.

구현하다 보니 숨어있던 게 드러났다

정작 핵심 로직(어느 폴더에 넣을지 계산하는 함수 하나)은 몇 줄 안 됐다. 오히려 손이 많이 간 건 기존 테스트였다. 신규 파일 경로를 결정하는 로직을 실제로 바꾸고 나니, 테스트 코드 여기저기에 “오늘 날짜 기준 분기”를 직접 계산해서 하드코딩해 둔 파일 경로가 여러 개 있었다는 게 드러났다. 그 경로들이 실제 결과와 안 맞으면서 테스트가 무더기로 실패하기 시작했고, 그 실패 하나하나를 보면서 비로소 이 로직이 코드베이스 안에서 정확히 어디까지 영향을 미치는지 다시 확인할 수 있었다. 계획할 땐 안 보이던 연결점들이 실행해보고 나서야 드러난 셈이다.

남는 생각

“주 단위로 나누면 되겠지”라는 첫 생각은 절반만 맞았다. 날짜를 어떤 단위로 쪼개든, 그 경계에서 뭔가 어긋나는 경우가 항상 있었다. 첫 번째는 내가 만든 규칙(매달 리셋되는 주차)이 만든 문제였고, 두 번째는 이미 널리 쓰이는 표준(ISO 8601) 안에 원래 있던 규칙 때문이었다. 표준을 따랐다고 해서 저절로 직관적인 결과가 나오는 것도 아니라는 걸 이번에 실제 날짜로 계산해보고서야 알았다. 결국 가장 단순한 기준(그 주가 시작하는 날짜)으로 돌아가고 나서야 두 경계 문제가 동시에 사라졌다.


Share this post:

Previous Post
재현율을 다시 쟀더니 5배가 나왔다 — 그런데 그 이유를 설명하다가, 설명부터 틀렸다
Next Post
확인됐다고 적혀있었는데, 확인한 적이 없었다