일기 slecs

직접받기 콜백 분기 지옥을 정규화 단계 분리로 해소

목차

문제 상황

금융 파트너 쪽 "직접받기" 버튼 처리 로직이 누더기였음. 콜백으로 들어오는 응답 코드 케이스가 계속 늘었고, 분기가 6단 깊이까지 박혀 있었음. 새 케이스 하나 붙이려면 어느 가지에 끼워야 할지 5분씩 노려보고 있어야 했음.

무엇이 꼬여 있었나

  • 외부 응답 상태와 내부 판정 결과가 같은 변수에 섞여 흘러다님
  • 성공/실패 분기가 try 블록 안과 밖에 동시에 존재
  • 로그는 한 곳에서만 찍히는데 분기는 일곱 갈래

이 상태로 한 달만 더 가면 진짜 못 고침. 이번 스프린트 빈 슬롯에 밀어 넣었음.

손본 방향

상태를 외부 응답 / 내부 판정 두 단계로 분리했음. 외부에서 받은 raw 코드는 enum 으로 한 번 정규화하고, 그 다음 단계에서야 도메인 분기를 태움.

raw 응답  정규화(enum)  도메인 액션

이렇게 하니까 새 응답 코드 추가가 enum 한 줄 + switch 한 줄로 끝났음. 분기 지옥이 표 한 장으로 압축됨.

단계 책임 비고
정규화 외부 응답 → 내부 enum 미분류 코드는 UNKNOWN
판정 enum → 도메인 액션 비즈니스 룰 여기만
실행 액션 → DB/알림/리다이렉트 부수효과 격리

배운 것

  • 외부 응답 코드와 도메인 코드는 절대 같은 변수에 담으면 안 됨. 한 번 분리하기만 해도 가독성이 절반은 살아남
  • 리팩터링 전에 케이스를 표로 먼저 그려야 함. 표 안 그리고 코드부터 만지면 분기 한두 개 꼭 빠뜨림
  • "당장 안 터지는 코드" 와 "다음 사람이 못 고치는 코드" 는 다른 문제. 이번 건은 명백히 후자였음

사이드 이펙트

  • 콜백 진입~종료까지 로그 한 줄로 트레이싱 됨. 운영팀에서 "이거 왜 실패했냐" 문의 받아도 raw → 정규화 → 액션 세 줄만 보면 끝
  • 단위 테스트가 enum 단위로 쪼개져서 케이스별 검증이 깔끔해졌음. 기존엔 통합 시나리오 없으면 검증이 거의 불가능했음

남은 숙제

정규화 enum 에 아직 미분류로 빠져 있는 코드 두 개가 있음. 결제대행사 운영팀에 케이스 의미 확인 요청 보내놨고, 답 오면 채워 넣을 예정. 그때까진 UNKNOWN 으로 떨어지면 안전한 실패 경로(사용자에게 재시도 안내)로 보내고 알림만 띄움.

다음

댓글 0

첫 댓글 달아줘.