[feat] 은퇴 목표 기본값 설정 API, 은퇴 목표 금액 계산 API, 주거 목표 금액 계산 API, 목표 생성 API 구현#35
[feat] 은퇴 목표 기본값 설정 API, 은퇴 목표 금액 계산 API, 주거 목표 금액 계산 API, 목표 생성 API 구현#35
Conversation
Postman 검증, 단위테스트를 모두 마치지는 않았으나, 병합 후 주석처리된 컨트롤러, 서비스 레이어의 코드들을 복구하고 정상 동작하는 것을 확인함
번호에 맞게 줄 맞추기
dto 명칭 축약
API 구조 재설계를 위한 임시 커밋&푸시
1. GoalController : getEstimateRetirementGoal(은퇴 기본 설정값 반환), calculateRetirementTargetAmount(은퇴 목표 금액 계산), calculateHousingTargetAmount(주거 목표 금액 계산), createGoal(목표 생성) 2. GoalDateHelper : 기대수명과 생년을 입력하면 사망 예상 연도를 반환하는 Helper 서비스 3. GoalHousingApartmentCalculateService : 주거 목표 중 '아파트'의 목표 가격을 계산하는 서비스 4. GoalHousingCalculateService : 주거 목표의 목표 가격을 계산하기 위한 메서드(아파트/빌라/오피스텔 등 주거 타입에 따라 사용하는 DB와 계산이 달라짐) 5. GoalServiceImpl : 목표 생성, 수정, 삭제, 조회 로직을 지원하는 서비스 6. JsonApartmentPriceService : DB와 연동해 아파트 가격을 반환하는 메서드 7. RetirementReferenceValueService : DB와 연동해 은퇴 목표 입력 값의 평균값을 반환해주는 서비스
RetirementReferenceValueService: @RequiredArgConstructor Annotation과 기본 생성자 혼용으로 Bean 생성 실패 이슈 해결
| public LocalDateTime getEndAt() { | ||
| return endAt; | ||
| } | ||
| } |
There was a problem hiding this comment.
getter가 있는데 get메서드가 있는 것 같습니다.
There was a problem hiding this comment.
확인해주셔서 감사합니다! 이 부분은 시작일과 종료일 조건을 프론트에서 검증할 목적으로 HasGoalPeriod 인터페이스를 상속 받도록 했습니다! Validator의 구조는 아래와 같습니다.
- Support 패키지 -> HasGoalPeriod : startAt, endAt 속성을 갖는 dto(createGoal, retirementCalculate, housingCalculate)들이 상속 받습니다
- Validator 패키지 -> GoalPeriodValidator : 실제 검증 로직을 담고 있는 ConstraintValidator 구현 클래스입니다. @ValidGoalPeriod 어노테이션이 적용된 클래스 중 HasGoalPeriod 타입을 가진 DTO에 대해 다음 조건을 검증합니다
- 시작일<종료일
- 시작일>현재 시점
- Annotation 패키지 -> ValidGoalPeriod : 유효성 검증을 위한 커스텀 어노테이션입니다. GoalPeriodValidator를 통해 검증이 수행되도록 설정했습니다. (@constraint(validatedBy = GoalPeriodValidator.class))
저도 구조를 정확하게 이해하지 못하고 사용한 부분인데, 덕분에 깊이 들여다볼 수 있었네요! 감사합니다!
| Optional<Goal> findByIdAndUserId(Long id, Long userId); | ||
| // 추가적인 쿼리 메서드가 필요하면 여기에 선언하시면 됩니다. | ||
| Optional<Goal> findByIdAndStatus(Long id, Status status); | ||
| } No newline at end of file |
There was a problem hiding this comment.
GoalRepository 뒤에 , CustomShareGoalRepository 이거 추가 해주셔야 합니다
There was a problem hiding this comment.
CustomShareGoalRepository는 repository 패키지에 인터페이스로 만들어두면 될까요? JPA 설정 다음 콤마를 찍고 CustomShareGoalRepository를 쓰니 빨간줄이 나오네요
...java/org/example/lifechart/domain/goal/service/GoalHousingApartmentCalculateServiceTest.java
Show resolved
Hide resolved
1. CalculateDto 내 startAt 속성 추가, HasGoalPeriod 상속 후 프론트 검증(@ValidGoalPeriod) 적용 및 입력 조건 추가 2. GoalRepository interface 내 @repository 어노테이션 삭제
There was a problem hiding this comment.
if-else 같은 분기 처리 로직이 예외처리 등에서는 불가피하게 사용되는 경우도 있지만 복잡한 분기 처리가 필요한 로직에서는 다음과 같은 방법들로 개선하는 경우가 많습니다.
전략 패턴(Strategy Pattern)
Enum 활용
다형성(Polymorphism)
람다 표현식 및 함수형 인터페이스
명령 패턴(Command Pattern)
가드 절(Guard Clauses)
저도 아직 완전히 깊게 알고 있는 것은 아니지만, 다양한 블로그에서 일반적으로 새로운 기능을 추가할 때마다 기존 if-else 코드를 계속 수정해야 하기 때문에 OCP 원칙에 어긋난다고 작성되어있긴 합니다.
현재 로직 흐름에 문제가 없다면 추후 유지보수나 확장성을 고려할 때 고민해보시는 것도 좋을 것 같아 조심스럽게 추천드려봅니다. (https://ducktopia.tistory.com/129 이 블로그에서 If-Else 문을 줄이는 전략에 대해 코드로 다루고 있습니다.)
There was a problem hiding this comment.
오! 감사합니다! 말씀주신 것처럼 GoalServiceImpl이 클래스에서 saveGoalDetail 부분에 if-else 부분을 쓰고 있는데 공유해주신 내용과 블로그 글 자세히 살펴보고, 다음번 커밋 시 반영해보겠습니다!
📌 관련 이슈
✨ 변경 사항
📷 Postman
RetirementReferenceValueServiceTest (은퇴 기본 설정값 반환 메서드)

JsonApartmentPriceServiceTest (Json 데이터 기반 아파트 가격 반환 메서드)

GoalHousingApartmentCalculateServiceTest (아파트 목표 가격 계산 메서드)

GoalRetirementCalculateServiceTest (은퇴 목표 가격 계산 메서드)

GoalServiceImplTest (목표 메서드-현재 생성만 있음)

GoalDateHelperTest (예상 사망일 반환 메서드)

✅ 체크리스트
💬 기타 참고 사항