Skip to content

[feat] 은퇴 목표 기본값 설정 API, 은퇴 목표 금액 계산 API, 주거 목표 금액 계산 API, 목표 생성 API 구현#35

Merged
rlqor9688 merged 15 commits intodevfrom
feature/kiback-goal
Jun 14, 2025
Merged

[feat] 은퇴 목표 기본값 설정 API, 은퇴 목표 금액 계산 API, 주거 목표 금액 계산 API, 목표 생성 API 구현#35
rlqor9688 merged 15 commits intodevfrom
feature/kiback-goal

Conversation

@rlqor9688
Copy link
Copy Markdown
Collaborator

@rlqor9688 rlqor9688 commented Jun 13, 2025

📌 관련 이슈

✨ 변경 사항

    1. GoalController : getEstimateRetirementGoal(은퇴 기본 설정값 반환), calculateRetirementTargetAmount(은퇴 목표 금액 계산), calculateHousingTargetAmount(주거 목표 금액 계산), createGoal(목표 생성)
    1. GoalDateHelper : 기대수명과 생년을 입력하면 사망 예상 연도를 반환하는 Helper 서비스
    1. GoalHousingApartmentCalculateService : 주거 목표 중 '아파트'의 목표 가격을 계산하는 서비스
    1. GoalHousingCalculateService : 주거 목표의 목표 가격을 계산하기 위한 메서드(아파트/빌라/오피스텔 등 주거 타입에 따라 사용하는 DB와 계산이 달라짐)
    1. GoalServiceImpl : 목표 생성, 수정, 삭제, 조회 로직을 지원하는 서비스
    1. JsonApartmentPriceService : DB와 연동해 아파트 가격을 반환하는 메서드
    1. RetirementReferenceValueService : DB와 연동해 은퇴 목표 입력 값의 평균값을 반환해주는 서비스

📷 Postman

  • RetirementReferenceValueServiceTest (은퇴 기본 설정값 반환 메서드)
    image

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

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

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

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

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

✅ 체크리스트

  • 관련 이슈에 연결됨
  • 기능이 정상적으로 동작함
  • 코드 리뷰를 받았음
  • 불필요한 로그/코드 제거됨

💬 기타 참고 사항

  • 테스트 방법, 추가 설명 등 필요한 경우 작성해 주세요.

rlqor9688 added 14 commits June 11, 2025 15:18
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;
}
}
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

getter가 있는데 get메서드가 있는 것 같습니다.

Copy link
Copy Markdown
Collaborator Author

@rlqor9688 rlqor9688 Jun 13, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

확인해주셔서 감사합니다! 이 부분은 시작일과 종료일 조건을 프론트에서 검증할 목적으로 HasGoalPeriod 인터페이스를 상속 받도록 했습니다! Validator의 구조는 아래와 같습니다.

  1. Support 패키지 -> HasGoalPeriod : startAt, endAt 속성을 갖는 dto(createGoal, retirementCalculate, housingCalculate)들이 상속 받습니다
  2. Validator 패키지 -> GoalPeriodValidator : 실제 검증 로직을 담고 있는 ConstraintValidator 구현 클래스입니다. @ValidGoalPeriod 어노테이션이 적용된 클래스 중 HasGoalPeriod 타입을 가진 DTO에 대해 다음 조건을 검증합니다
  1. 시작일<종료일
  2. 시작일>현재 시점
  1. 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
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

GoalRepository 뒤에 , CustomShareGoalRepository 이거 추가 해주셔야 합니다

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

CustomShareGoalRepository는 repository 패키지에 인터페이스로 만들어두면 될까요? JPA 설정 다음 콤마를 찍고 CustomShareGoalRepository를 쓰니 빨간줄이 나오네요

Copy link
Copy Markdown
Collaborator

@byeongtaek12 byeongtaek12 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

일단 보이는 부분은 이정도 인 것 같습니다. 크게 수정이 필요해보이는 건 없습니다

1. CalculateDto 내 startAt 속성 추가, HasGoalPeriod 상속 후 프론트 검증(@ValidGoalPeriod) 적용 및 입력 조건 추가
2. GoalRepository interface 내 @repository 어노테이션 삭제
Copy link
Copy Markdown
Collaborator

@EZRANDO EZRANDO left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

승인하겠습니다!

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

if-else 같은 분기 처리 로직이 예외처리 등에서는 불가피하게 사용되는 경우도 있지만 복잡한 분기 처리가 필요한 로직에서는 다음과 같은 방법들로 개선하는 경우가 많습니다.
전략 패턴(Strategy Pattern)
Enum 활용
다형성(Polymorphism)
람다 표현식 및 함수형 인터페이스
명령 패턴(Command Pattern)
가드 절(Guard Clauses)
저도 아직 완전히 깊게 알고 있는 것은 아니지만, 다양한 블로그에서 일반적으로 새로운 기능을 추가할 때마다 기존 if-else 코드를 계속 수정해야 하기 때문에 OCP 원칙에 어긋난다고 작성되어있긴 합니다.
현재 로직 흐름에 문제가 없다면 추후 유지보수나 확장성을 고려할 때 고민해보시는 것도 좋을 것 같아 조심스럽게 추천드려봅니다. (https://ducktopia.tistory.com/129 이 블로그에서 If-Else 문을 줄이는 전략에 대해 코드로 다루고 있습니다.)

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

오! 감사합니다! 말씀주신 것처럼 GoalServiceImpl이 클래스에서 saveGoalDetail 부분에 if-else 부분을 쓰고 있는데 공유해주신 내용과 블로그 글 자세히 살펴보고, 다음번 커밋 시 반영해보겠습니다!

@rlqor9688 rlqor9688 merged commit cc802a0 into dev Jun 14, 2025
@rlqor9688 rlqor9688 mentioned this pull request Jun 16, 2025
2 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Goal] Entity 설계

3 participants