refactor: 조립되는 커맨드를 빌더로 — 같은 타입이 인접한 곳부터 - #331
Conversation
- RecommendRegions 는 originLat·originLng 이 둘 다 double 로 나란히 있다. 위치 인수로 넘기면 뒤바뀌어도 컴파일이 통과하고, 출발지가 엉뚱한 곳에 찍혀 추천이 통째로 어긋난다 - DeviceRegistration 은 guestId·token 이 둘 다 String 이다. 뒤바뀌면 발송이 기기를 못 찾아 알림은 만들어지는데 푸시만 조용히 안 간다 — 예외도 로그도 없다. #280 이 닫은 그 실패 모양 그대로다 - 규약이 "여러 필드를 조립하는 커맨드는 @builder" 라고 적고 있는데 service/dto 에 실제로 쓰는 곳이 거의 없었다. 왜 빌더여야 하는지를 각 record javadoc 에 근거로 남겨, 다음 사람이 규칙인지 예외인지 헷갈리지 않게 한다
- GenerateCourse 는 인자가 열이고 그중 originLat·originLng 이 같은 타입으로 나란히 있다. 뒤바뀌면 출발지가 엉뚱한 곳에 찍혀 동선이 통째로 어긋난다 - first() 를 남기지 않았다. 인자 8개짜리 정적 팩토리라 커맨드와 똑같은 위험을 그대로 안고 있어, 빌더만 붙이고 그것을 두면 위험한 경로가 그대로 남는다. 호출부가 빌더를 직접 쓰고, 씨앗·제외 목록을 안 적으면 그대로 첫 생성이다 (seed 기본값 0 이 곧 FIRST_SEED) — 그 사실을 record javadoc 에 적었다 - withSeed 는 toBuilder 로 베낀다. 열 개를 손으로 다시 나열하던 자리라, 필드가 늘 때 여기 빠뜨리면 재생성만 조용히 옛 값을 쓴다 - new GenerateCourse( · GenerateCourse.first( · new RecommendRegions( · new DeviceRegistration( 을 전수 검색해 위치 인수 생성이 0건임을 확인했다
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (8)
Included review availability: Your plan provides up to 1 included review per hour; 0 remain after this review. 📝 WalkthroughWalkthrough서비스 커맨드 DTO에 Lombok 빌더를 추가했습니다. 요청 DTO와 통합 테스트의 객체 생성 코드를 빌더 방식으로 전환하고, Changes서비스 커맨드 빌더 전환
Estimated code review effort: 3 (Moderate) | ~20 minutes Merge Risk: ⚪ Minimal · up to This PR replaces positional command construction with builders and removes an equivalent factory path; no actionable merge-blocking risk remains beyond normal checks and review. 🚥 Pre-merge checks | ✅ 4✅ Passed checks (4 passed)
Full details: Linked Issues checkExplanation GenerateCourse, RecommendRegions, DeviceRegistration에 ✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Situation
규약은 커맨드를 빌더로 만들라고 한다.
그런데
toCommand()가 조립하는 커맨드 6개가 전부 위치 기반 생성자였다.Task
같은 타입이 인접한 곳부터 닫는다. 타입이 갈리면 컴파일러가 잡지만, 같은 타입이 나란히 있으면 뒤바뀌어도 통과하고 런타임에 조용히 틀린다.
Action
이슈가 적은 6개 중 3개는 이미 돼 있었다
이슈가 2026-08-18 에 작성된 뒤 그 사이에 처리됐다.
SocialLoginCommandAddLeaveUsage·UpdateLeaveUsageGenerateCourse·RecommendRegions·DeviceRegistration이슈 본문의
SocialLoginCommand필드 목록도 낡았다 —guestId를 적고 있는데 #280 이후 그건 사라지고authorizationCode가 들어왔다.남은 셋은 전부 실제 위험이 있었다
GenerateCoursedouble originLat, originLngRecommendRegionsdouble originLat, originLngDeviceRegistrationString guestId, tokenDeviceRegistration이 특히 그렇다. 그 실패는 예외도 로그도 남기지 않는다 — #280 이 닫은 그 모양 그대로다.이슈 밖에서 하나 더 —
GenerateCourse.first()를 없앴다인자 8개짜리 정적 팩토리라 커맨드와 똑같은 위험을 그대로 안고 있었다. 빌더만 붙이고 그것을 남기면 위험한 경로가 그대로 남는다.
호출부가 빌더를 직접 쓰고, 씨앗·제외 목록을 안 적으면 그대로 첫 생성이다 —
seed기본값0이 곧FIRST_SEED다. 그 사실을 record javadoc 에 적었다.withSeed도toBuilder로 바꿨다. 열 개를 손으로 다시 나열하던 자리라, 필드가 늘 때 여기 빠뜨리면 재생성만 조용히 옛 값을 쓴다.하지 않은 것
service/dto전체(35개)를 훑지 않았다. 조립되는 커맨드만 본다MyLeave처럼 도메인에서from()으로 나오는 것은 호출부가 조립하지 않아 인자 순서를 틀릴 자리가 없다Result
new GenerateCourse(·GenerateCourse.first(·new RecommendRegions(·new DeviceRegistration(을 전수 검색해 위치 인수 생성이 0건임을 확인했다.동작은 그대로다. 테스트를 더하지 않은 이유가 그것이다 — 빌더는 같은 생성자를 부르고, record 의 compact constructor(제외 목록 정규화·
startDayLeave기본값)도 그대로 탄다. 기존 1,834건이 그 경로를 이미 덮는다.작업을 마치기 전 자문 셋
GenerateCourse는 코스 생성의 입구라, 위경도가 뒤바뀌면 그 코스는 통째로 틀린다연관 이슈
Summary by CodeRabbit
리팩터링
테스트