Skip to content

Comments

refactor: 스탬프 엔티티 필드 추가 및 관련 작업 리팩토링 (#83)#84

Merged
hisonghy merged 1 commit intodevelopfrom
refactor/83
Oct 15, 2025
Merged

refactor: 스탬프 엔티티 필드 추가 및 관련 작업 리팩토링 (#83)#84
hisonghy merged 1 commit intodevelopfrom
refactor/83

Conversation

@hisonghy
Copy link
Contributor

@hisonghy hisonghy commented Oct 15, 2025

📌 작업 내용 및 특이사항

✅ Stamp 엔티티 새로운 필드 추가

  • 요구사항 변경에 따라 Stamp 엔티티에 end_date(종료일), total_missions(총 미션 수), completed_missions(완료된 미션 수) 필드를 추가했습니다.

✅ DB 마이그레이션 파일 추가

  • V4__add_columns_to_stamp.sql 파일을 추가했습니다.
  • end_date 필드는 선택 항목으로 NULL 값을 허용하고, total_missionscompleted_missions 필드는 INT 타입으로 NOT NULL 제약과 기본값 DEFAULT(0)을 설정해주었습니다.

✅ 스탬프 end_date 검증 메서드 및 에러코드 추가

  • StampPolicy.validateEndDate() 메서드를 추가해, 요청한 스탬프 종료일이 과거 날짜인지/속한 여행의 종료일 이후인지를 검증하도록 구성했습니다.
  • 과거 날짜일 경우 StampErrorCode.STAMP_END_DATE_CANNOT_BE_IN_PAST, 속한 여행의 종료일 이후일 경우 StampErrorCode.STAMP_END_DATE_AFTER_TRIP_END_DATE_NOT_ALLOWED 에러 코드를 정의하고, 상황에 맞게 체계적으로 처리했습니다.

✅ 스탬프 total_missions, completed_missions 값을 증가/감소하는 메서드 구현

  • total_missions 값을 1 증가하는 increaseTotalMissions(T t) 메서드를 추가했습니다.
  • total_missions 값을 1 감소하는 decreaseTotalMissions(T t) 메서드를 추가했습니다.
  • completed_missions 값을 전달받은 완료된 미션 개수 만큼 증가시키는 increaseCompletedMissions(T t, int count) 메서드를 추가했습니다.

✅ 스탬프 상세 및 목록 조회 응답 DTO 리팩토링

  • 스탬프 상세 조회 응답 DTO인 LoadStampDetailResponseend_date, total_missions, completed_missions 필드를 추가했습니다.
  • 스탬프 목록 조회 응답 DTO인 LoadStampInfoResponseend_date, total_missions, completed_missions 필드를 추가했습니다.

✅ 스탬프 생성/수정 로직 리팩토링

[ 생성 ]

  • CreateStampRequest DTOendDate 필드를 추가했습니다.
  • 엔티티 저장 시 end_date는 요청 값으로, total_missionscompleted_missions0으로 지정해 저장되도록 구성했습니다.

[ 수정 ]

  • UpdateStampRequest DTOendDate 필드를 추가했습니다.
  • 스탬프 종료일을 수정할 때 '없음'으로 변경할 수도 있기 때문에, 혼동을 줄이고자 관련 내용을 API 설명에 자세히 명시했습니다.
특정 스탬프의 이름과 종료일을 수정합니다.
- 이름과 종료일 중 변경하지 않는 필드는 요청 바디에서 생략해도 됩니다.
- 종료일을 '없음'으로 변경하려면 endDate: null로 명시적으로 전달해야 합니다.

✅ 미션 생성/삭제 로직 리팩토링

[ 생성 ]

  • 미션을 생성할 때, 미션이 포함된 스탬프의 total_missions 필드의 값을 증가하도록 리팩토링 했습니다.

[ 삭제 ]

  • 미션을 삭제할 때, 미션이 포함된 스탬프의 total_missions 필드의 값을 감소하도록 리팩토링 했습니다.

✅ 학습 로그 생성 로직 리팩토링

  • 미션의 완료 여부를 학습 로그 생성 로직에서 결정짓기 때문에 해당 로직을 리팩토링했습니다.
  • 학습 로그를 생성할 때 사용하던 DailyMission 목록 조회 로직을 getValidDailyMissionsWithMissionAndStampByIds()로 변경했습니다.
    해당 로직 내에서 여러 개의 Mission과 각 Mission에 연결된 Stamp 정보가 필요하기 때문에, Fetch Join을 활용해 한 번의 쿼리로 필요한 데이터를 효율적으로 가져오도록 구현했습니다.
  • 이후, 각 Mission을 동일한 Stamp로 집계해 연결된 Stampcompleted_missions 값을 미션 수 만큼 증가되도록 리팩토링했습니다.
  • 현재는 데이터/트래픽이 많지 않아 for문을 순회하며 각 미션들에 대한 검증/완료 처리를 수행하고, 스탬프의 completed_missions 필드는 집계해 증가하는 방식으로 설계했지만,
    벌크 연산 + 재연산 방법으로 성능을 개선할 수 있는 방법도 있다고 해서 추후 리팩토링하면 좋을 것 같습니다.

🌱 관련 이슈


🔍 참고사항(선택)

  • 해당 PR이 적용되면, 배포 환경에서는 이미 스탬프별 미션 및 완료된 미션 데이터가 존재하기 때문에 Stamp 엔티티의 total_missions, completed_missions 필드가 0으로 초기화되면서 데이터 정합성 문제가 발생할 가능성이 있습니다.
    이 부분은 PR 적용 이후에, 모든 Stamp 엔티티의 total_missionscompleted_missions 값을 재계산하는 쿼리를 통해 해결해놓겠습니다.

📚 기타(선택)

@hisonghy hisonghy self-assigned this Oct 15, 2025
@hisonghy hisonghy added the 🪄refactor 기능 개선 및 리팩토링 label Oct 15, 2025
* feat: 스탬프 엔티티 end_date, total_missions, completed_missions 필드 추가
* feat: Flyway V4__add_columns_to_stamp.sql 파일 추가

* feat: 스탬프 종료일 검증 Policy 메서드 구현
* feat: 스탬프 종료일 ErrorCode 추가

* refactor: 스탬프 생성/수정 로직 리팩토링
* refactor: 미션 생성/삭제 로직 리팩토링
* refactor: 학습 로그 생성(미션 완료 기능 포함) 로직 리팩토링
* refactor: LoadStampDetailResponse DTO 리팩토링
* refactor: LoadStampInfoResponse DTO 리팩토링

* test: 스탬프 생성/수정, 미션 생성/삭제, 학습 로그 생성 테스트 코드 수정
@hisonghy hisonghy added the ✨feature 구현, 개선 사항 관련 부분 label Oct 15, 2025
Copy link
Contributor

@chaiminwoo0223 chaiminwoo0223 left a comment

Choose a reason for hiding this comment

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

고생하셨습니다. 머지 부탁드립니다!

@hisonghy hisonghy merged commit 37981eb into develop Oct 15, 2025
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

✨feature 구현, 개선 사항 관련 부분 🪄refactor 기능 개선 및 리팩토링

Projects

None yet

Development

Successfully merging this pull request may close these issues.

🪄[REFACTOR]: 스탬프 엔티티 필드 추가 및 관련 로직 리팩토링

2 participants