대니
danny's blog@dannywon_dev
발행 55 · 대기 75

1인 개발자. 클로드 코드를 팀처럼 굴린다. 매일 겪은 것만 쓴다.

버그와 함정

age_range 가 이미 있었다 — 연령 구간 매핑은 한 방향만

채팅에 연령 구간 넷을 붙이려다 가입 쪽 여섯 칸을 발견했다. 양방향 매핑을 만들지 않은 이유.

새 기능에 사용자 정보를 하나 받으려고 화면을 설계한다. 구간을 몇 개로 나눌지, 버튼을 몇 개 둘지 정하고 계획서를 쓴다. 승인이 난다. 그리고 코드를 여는 순간, 이미 같은 걸 묻고 있는 화면을 발견한다. 규격이 다른 채로.

2026-08-09, 전시 관람 서비스의 AI 도슨트에 연령대별 눈높이를 붙이는 작업이었다. QR 을 찍고 들어온 사람이 초등학생일 수도 60대일 수도 있는데 답변 톤이 하나뿐이었다.

계획서에는 연령 구간을 네 칸으로 제안했다. 초등학생 이하 / 10대 / 20~40대 / 50대 이상. 그림 앞에 서 있는 사람이 한 번에 고를 수 있어야 하니 짧게. 승인이 났고, 구현하려고 코드를 여는데 회원가입 온보딩에서 이게 나왔다.

export const AGE_OPTIONS = ['~19', '20-29', '30-39', '40-49', '50-59', '60~'];

이미 묻고 있었다. 여섯 칸으로. members.age_range 에 저장되고 있었고, 지금 가입한 회원은 전부 답을 해 둔 상태였다.

그대로 넷으로 갔으면

같은 값에 규격이 두 벌이 된다. 그러면 두 가지가 깨진다.

첫째, 통계가 갈린다. "관람객 연령 분포"를 물었을 때 어느 표를 봐야 하는지 알 수 없다. 둘을 합치려면 매번 변환을 거쳐야 하고, 변환 규칙이 코드 두 곳에 생기면 그때부터 조용히 어긋난다.

둘째, 회원에게 두 번 묻는다. 가입할 때 답한 사람에게 채팅방에서 또 묻는 건, "우리가 당신을 기억한다"고 광고하면서 기억 못 하는 걸 보여주는 셈이다.

세 갈래를 놓고 봤다.

  • 채팅도 여섯 칸으로 통일 — 규격은 하나가 되는데, 그림 앞에서 여섯 개 버튼은 많다
  • 가입을 네 칸으로 줄임 — 이미 쌓인 데이터를 버리게 된다
  • 넷 유지 + 매핑 — 규격은 둘인데 변환이 생긴다

진짜로 갈린 건 매핑의 방향이었다

세 번째로 가기로 하고 나서, 실제로 판단이 갈린 지점은 매핑을 몇 방향으로 만들 것인가였다.

양방향을 만들면 편하다. 어느 쪽에서 들어와도 상대 규격으로 바꿀 수 있으니까. 그런데 양방향은 만드는 순간 어느 쪽이 원본인지가 사라진다. 20~40대를 여섯 칸으로 되돌리면 20-29인지 30-39인지 알 수 없는데, 코드는 아무거나 고를 것이고 그 값이 통계로 들어간다.

그래서 한 방향만 만들었다. 여섯 → 넷. 반대는 아예 함수가 없다.

// 가입 여섯 칸 → 채팅 네 칸. 반대 방향은 만들지 않는다 —
// 그걸 만들면 통계가 두 벌이 되고 어느 쪽이 참인지 알 수 없어진다.
'~19'                        → 'teen'
'20-29' | '30-39' | '40-49'  → 'adult'
'50-59' | '60~'              → 'senior'

이렇게 하니 세 가지가 한꺼번에 정리됐다.

  • 통계의 주인은 가입 쪽 하나뿐이다. 채팅 쪽 값은 말투를 정하는 데만 쓴다
  • 로그인한 회원에겐 안 묻는다. 가입 때 값을 접어서 바로 쓴다
  • 접힘이 손실인 자리(~19 는 초등학생과 10대가 섞여 있다)는 주석에 명시했다. 둘 중 덜 어긋나는 쪽으로 두되, 그게 판단이었다는 걸 남긴다

순서가 틀렸던 것

기능을 새로 붙일 때 "이미 비슷한 걸 받고 있나"를 먼저 보는 게 맞다. 그런데 이번엔 계획서를 쓰고 승인까지 받은 뒤에야 발견했다.

승인이 났다고 해서 코드가 그 계획에 동의한 건 아니었다.

← 목록으로