Skip to content

feat: 학습 로그 관련 기능 구현(#28)#49

Merged
hisonghy merged 1 commit intodevelopfrom
feature/28
Aug 8, 2025
Merged

feat: 학습 로그 관련 기능 구현(#28)#49
hisonghy merged 1 commit intodevelopfrom
feature/28

Conversation

@hisonghy
Copy link
Contributor

@hisonghy hisonghy commented Aug 6, 2025

📌 작업 내용 및 특이사항

✅ StudyLogDailyMission 도메인 모델 구현

  • 데일리 목표(DailyGoal)를 생성하고 학습을 완료한 후, 학습 로그(StudyLog)를 생성할 때 학습을 완료한 데일리 미션(DailyMission)(사용자가 선택한 데일리 미션)을 관리하기 위해 StudyLogDailyMission 엔티티를 추가했습니다.
  • StudyLogDailyMission 사이의 중간 엔티티로 설계했습니다.
  • 특정 여행의 학습 로그를 조회할 때, 해당 학습 로그에 포함된 미션들의 내용이 필요하기 때문에 StudyLogDailyMission 엔티티로 구분해 관리하도록 설정했습니다.

✅ 학습 로그 관련 application.dto 구성

  • StudyLogInfo: 학습 로그의 정보만 담는 응답 DTO
  • StudyLogDetail: 학습 로그와 연관된 데일리 미션 정보를 함께 포함하는 상세 응답 DTO
  • StudyLogDailyMissionInfo: 학습 로그에 포함된 각 데일리 미션의 정보를 담는 DTO

✅ 학습 로그 생성 API 구현

  • 학습 완료 후 기록 저장을 위한 API를 구현했습니다.
    사용자가 데일리 목표를 생성하고 뽀모도로 세션을 완료하면, 해당 미션들에 대한 학습 로그를 작성할 수 있도록 구성했습니다.
  • 요청으로 전달받은 totalFocusTimeInSeconds 값을 기반으로, Pomodoro 엔티티의 총 집중시간 필드를 업데이트합니다.
    요청한 총 집중시간 필드가 음수일 경우 예외를 처리하도록 구성했습니다.
  • selectedDailyMissionIds 리스트를 기반으로, StudyLogDailyMission 엔티티를 함께 생성해 학습 로그에 연결된 미션들을 관리합니다.
  • 생성된 학습 로그의 ID를 응답하도록 구성했습니다.

✅ 학습 로그 제목(title) 설정 로직

  • 피그마를 참고했을 때, 학습 로그의 제목(title)은 완료한 미션들의 스탬프 이름으로 설정하는 요구사항이 있어 여행 카테고리에 따라 다음과 같이 처리하도록 구성했습니다.
1. 코스형 여행 : 모든 미션이 하나의 스탬프에 속하므로 해당 스탬프의 이름을 그대로 사용합니다.
- 완료한 미션들의 스탬프가 모두 동일한지 검증을 수행합니다.

2. 탐험형 여행 : 여러 스탬프의 미션이 섞여있을 수 있으므로 다음 기준에 따라 대표 스탬프 이름을 결정합니다.
- 완료한 미션들이 속한 스탬프를 그룹화해 가장 많이 등장한 스탬프 선택
- 만약 동일한 개수를 가진 스탬프가 있을 경우 createdAt 필드를 기준으로 먼저 생성된 스탬프를 선택
  • DailyMission -> Mission -> Stamp 간 연관 관계가 LAZY 로딩으로 설정되어 있어 스탬프를 조회할 경우 N+1 문제가 발생할 수 있어 DailyMission 목록을 조회할 때, DailyMission, Mission, Stamp를 한 번의 쿼리로 가져오는 Fetch Join 쿼리를 구성했습니다.

✅ 특정 여행 학습 로그 목록 조회 API 구현

  • 특정 여행의 ID로 학습 로그 목록을 조회하는 API를 구현했습니다.
  • 페이지 번호(page), 페이지 내 데이터 개수(size)를 요청받아 Slice를 활용한 페이징 처리를 적용했습니다.
  • 최신순으로 정렬해 응답하고, 다음 페이지의 데이터 존재 유무 정보를 함께 응답합니다.
  • 먼저 StudyLog 목록을 페이징해 조회하고, 각 StudyLog에 포함된 StudyLogDailyMission 목록을 그룹화해 응답하도록 구성했습니다.

✅ 테스트 코드

  • StudyLogController 통합 테스트를 추가해 전체 흐름을 검증했습니다.
  • StudyLogService, StudyLogDailyMission 단위 테스트를 추가해 핵심 로직을 검증했습니다.
  • 학습 로그 테스트에 필요한 Fixture, Helper 클래스를 구성했습니다. (StudyLogFixture, StudyLogDailyMissionFixture, CreateStudyLogRequestFixture, StudyLogTestHelper, StudyLogDailyMissionTestHelper)
  • StampService 단위 테스트에 여행 카테고리별 대표 스탬프 이름을 조회하는 테스트(getStampNameByTripCategory)를 추가했습니다.
  • MissionService 단위 테스트에 미션을 완료하는 테스트(updateCompleted)를 추가했습니다.
  • PomodoroService 단위 테스트에 총 집중시간을 업데이트하는 테스트(updateTotalFocusTime)를 추가했습니다.

🌱 관련 이슈


🔍 참고사항(선택)


📚 기타(선택)

@hisonghy hisonghy self-assigned this Aug 6, 2025
@hisonghy hisonghy added the ✨feature 구현, 개선 사항 관련 부분 label Aug 6, 2025
@hisonghy hisonghy requested a review from chaiminwoo0223 August 6, 2025 09:37
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.

고생하셨습니다. 코드 리뷰 남겼습니다. 피드백 부탁드려요~^^

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.

고생하셨습니다. 수정된 내용 모두 확인했습니다. 머지 부탁드려요!

* feat: StudyLogDailyMission 도메인 모델 구현

* feat: 학습 로그 생성 기능 구현 (뽀모도로 총 집중시간 업데이트, 스탬프 이름 추출, 학습 로그 미션 생성, 미션 완료 처리)
* feat: 특정 여행의 학습 로그 목록을 조회하는 기능 구현 (슬라이스, 최신순 정렬, 포함된 학습 로그 미션까지 함께 조회)

* test: StudyLogController 통합 테스트 추가
* test: StudyLogService, StudyLogDailyMissionService 단위 테스트 추가
* test: StudyLog 관련 Fixture, Helper 클래스 추가

* test: StampService, MissionService, PomodoroService 테스트 추가
@hisonghy hisonghy merged commit 4c35709 into develop Aug 8, 2025
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

✨feature 구현, 개선 사항 관련 부분

Projects

None yet

Development

Successfully merging this pull request may close these issues.

✨[FEAT]: 공부기록(학습로그) 관련 기능 구현

2 participants