개발 slecs

결제 송금 알림 메시지 빌더를 분리해 가독성 개선

목차

왜 손댔나

연락처 송금 메시지 유틸이 너무 비대해졌음. 결제 플랫폼에서 파트너끼리 잔액을 옮길 때 알림 문구를 만드는 부분인데, 한 메서드 안에 분기가 켜켜이 쌓여 있었음.

  • 송금 성공/실패/대기/취소 4종
  • 파트너 등급별 호칭 표기 차이
  • 결제대행사 결과코드에 따른 문구 분기
  • 다국어 금액 포맷 분기

새 메시지 한 줄 추가하려고 200라인짜리 메서드를 위에서 아래로 다 읽어야 했음. 후배가 PR 리뷰에서 "이거 어디 끼워야 됨?" 물어보길래, 갈아엎기로 함.

어떻게 잘랐나

기준은 단순함. "메시지 종류""포맷팅" 을 분리. 타입별로 빌더를 따로 두고, 공통 컨텍스트만 주입하도록 바꿈.

[Before]
buildMessage(type, status, partner, result) {
  if (type == "SEND")    { ... 50줄 ... }
  else if (type == "RECV") { ... 50줄 ... }
  else if ...
}

[After]
MessageBuilder.of(type).render(ctx)
항목 Before After
메서드 길이 200+ 평균 30
신규 타입 추가 분기 추가 빌더 신설만
단위 테스트 거대 fixture 1개 빌더별 분리
가독성 스크롤 무한 한 화면

삽질 포인트

  • 처음엔 enum 안에 템플릿을 다 박으려 했는데, 결제대행사별 결과코드를 상수로 표현하기 어려워서 포기. 빌더로 우회함.
  • 금액 포맷이 파트너 지역에 따라 달랐음. 이건 별도 Formatter 로 빼서 빌더가 주입받도록 함.
  • 호출부가 30곳 넘어서 한 번에 못 바꿈. 기존 시그니처를 어댑터로 남겨두고 호출부를 한 주에 5~6개씩 점진 전환했음.

회고

리팩터링 자체보다 "왜 200줄이 됐는지" 추적하는 게 더 오래 걸렸음. 커밋 로그 따라가 보니 메시지 한 줄 추가가 2년치 쌓인 결과였음. 처음 짠 사람이 잘못한 게 아니라, 매번 손쉽게 if 한 줄 더 넣을 수 있는 구조가 문제였음.

검증은 단위 테스트로 빌더별 출력 스냅샷을 떠서 비교했고, 스테이징에서 실제 송금 시나리오 4종을 돌렸음. 메시지 문구 자체가 바뀌면 안 되는 작업이라, 디프 0 을 목표로 잡고 끝까지 맞췄음.

다음엔 분기 5개 넘어가는 시점에 미리 잘라낼 것. 끝

댓글 0

첫 댓글 달아줘.