Skip to content

[FIX] HOME API 연습 날짜 조회 타입 변환 오류 수정 - #150

Merged
ownue merged 2 commits into
developfrom
fix/#147-home-api
Aug 5, 2026
Merged

[FIX] HOME API 연습 날짜 조회 타입 변환 오류 수정#150
ownue merged 2 commits into
developfrom
fix/#147-home-api

Conversation

@ownue

@ownue ownue commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

📍 개요

HOME API 연습 날짜 조회 타입 변환 오류 수정

⛓️‍💥 관련 이슈


🛠️ 작업 내용

  • PostgreSQL date() 반환 타입을 java.sql.Date로 처리
  • 서비스 계층에서 LocalDate로 명시적 변환
  • HOME 서비스 회귀 테스트 수정

🔥 리뷰 요청 사항

리뷰어가 중점적으로 확인해주었으면 하는 내용을 작성해주세요.

  • 연습 날짜 타입 변환 및 스트릭 계산 동작 확인

✅ 체크리스트

  • 코드 컨벤션을 준수했습니다.
  • 불필요한 코드 및 import를 제거했습니다.
  • 예외 처리를 적용했습니다.
  • 테스트를 완료했습니다.
  • 관련 Issue를 연결했습니다.

📎 참고 사항

  • 배포 후 PostgreSQL 환경에서 GET /api/home 확인 필요

Summary by CodeRabbit

  • 버그 수정
    • 연습 종료일 조회 시 날짜 형식 변환 문제를 수정했습니다.
    • 연속 연습일, 장기 스트릭, 전일 연습 및 중복 날짜 계산의 안정성을 개선했습니다.
  • 테스트
    • 다양한 연습 날짜 시나리오에 대한 검증을 최신 날짜 형식에 맞게 보완했습니다.

@coderabbitai

coderabbitai Bot commented Aug 5, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: cb21b926-12c9-4b7f-ba50-8b041c8aa6ec

📥 Commits

Reviewing files that changed from the base of the PR and between ab889e1 and 39504bb.

📒 Files selected for processing (3)
  • src/main/java/com/mr/domain/home/service/HomeService.java
  • src/main/java/com/mr/domain/playing/repository/PlayingRepository.java
  • src/test/java/com/mr/domain/home/service/HomeServiceTest.java

📝 Walkthrough

Walkthrough

PlayingRepository의 날짜 조회 반환 타입을 java.sql.Date로 변경했습니다. HomeService는 결과를 LocalDate로 변환해 집합으로 수집합니다. 연속 연습일, 장기 스트릭, 전일 연습, 중복 날짜 테스트도 새 타입에 맞게 갱신했습니다.

Changes

HOME 날짜 처리

Layer / File(s) Summary
저장소 날짜 반환 타입 변경
src/main/java/com/mr/domain/playing/repository/PlayingRepository.java
findDistinctEndedDatesByUserAndStatus의 반환 타입을 List<LocalDate>에서 List<Date>로 변경했습니다.
서비스 변환 및 테스트 갱신
src/main/java/com/mr/domain/home/service/HomeService.java, src/test/java/com/mr/domain/home/service/HomeServiceTest.java
HomeServiceDate::toLocalDate로 날짜를 변환하고 Collectors.toSet()으로 수집합니다. 관련 테스트는 java.sql.Date 데이터를 사용합니다.

Estimated code review effort: 2 (Simple) | ~10 minutes

Possibly related PRs

  • Musereview/BE#63: HomeServicePlayingRepository의 기존 날짜 처리 로직과 직접 연결됩니다.

Poem

날짜는 SQL에서 와서
LocalDate로 다시 피고
중복은 집합에서 잠들고
스트릭은 이어진다
HOME도 평온해진다.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Linked Issues check ⚠️ Warning 날짜 반환 타입 변환과 회귀 테스트는 반영했지만, nullable 점수 및 null·비정상 데이터 방어와 관련 테스트는 확인되지 않습니다. nullable 점수와 null·비정상 데이터를 방어하는 로직을 추가하고, 학습 기록 없음 및 null 점수 사용자 회귀 테스트를 추가하세요.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed 제목이 HOME API의 연습 날짜 타입 변환 오류 수정이라는 핵심 변경을 정확히 설명합니다.
Out of Scope Changes check ✅ Passed 저장소의 날짜 타입 변경, 서비스 변환 처리, 관련 테스트 수정이 모두 HOME API 오류 수정 범위에 포함됩니다.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/#147-home-api

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@p1001q p1001q left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

💡 참고

  • java.sql.Date.toLocalDate()를 쓰신 선택은 좋습니다. toInstant()를 거치는 방식과 달리 타임존 변환 없이 내부에 저장된 연/월/일을 그대로 읽어오는 방식이라, DB 서버와 JVM의 타임존이 다를 때 흔히 생기는 "하루 밀림" 버그를 피할 수 있습니다.
  • Collectors.toSet()으로 바꾼 것도 기존 new HashSet<>(...) 래핑과 동작은 동일하니 문제없습니다.

Comment on lines 81 to 91
@Query("""
select distinct function('date', p.endedAt) from Playing p
where p.user.userId = :userId
and p.status = :status
and p.deletedAt is null
and p.endedAt is not null
""")
List<LocalDate> findDistinctEndedDatesByUserAndStatus(
List<Date> findDistinctEndedDatesByUserAndStatus(
@Param("userId") Long userId,
@Param("status") PlayingStatus status
);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🔴 P1src/main/java/com/mr/domain/playing/repository/PlayingRepository.java:81-91 (그리고 CI 설정)

문제상황
이번 PR의 핵심 수정(function('date', p.endedAt)의 반환 타입을 LocalDate에서 java.sql.Date로 바꾼 것)은 PostgreSQL 런타임에서만 실제로 검증 가능합니다. 그런데 리포지토리를 다시 훑어보다가 .github/workflows/ci.yml을 열어봤는데:

# TODO: 테스트 코드 안정화 후 활성화
# - name: Run tests
#   run: ./gradlew clean test

- name: Build BootJar
  run: ./gradlew clean bootJar -x test

CI가 테스트를 아예 실행하지 않습니다 (-x test로 스킵). 게다가 build.gradle엔 H2나 Testcontainers 같은 테스트용 DB 의존성이 전혀 없고(org.postgresql:postgresqlruntimeOnly), @DataJpaTest/Testcontainers를 쓰는 파일도 프로젝트 전체에 하나도 없습니다.

문제가 되는 이유
이번 PR이 추가한 회귀 테스트(HomeServiceTest)는 리포지토리를 Mockito로 목킹해서 "만약 리포지토리가 java.sql.Date를 반환한다면 서비스가 잘 변환하는지"만 검증합니다. 정작 이슈 #147의 진짜 원인이었던 "PostgreSQL에서 function('date', ...)가 실제로 java.sql.Date를 반환하는가"라는 전제 자체는 어떤 자동화된 테스트로도 검증되지 않습니다. PR 설명에도 본인이 "배포 후 PostgreSQL 환경에서 GET /api/home 확인 필요"라고 적어두셨는데, 이게 정확히 이 공백을 스스로 인지하고 계신 거고요. 게다가 CI가 테스트 자체를 안 돌리니, 로컬에서 수동으로 확인 안 하면 이 PR이 머지된 후에도 아무도 자동으로 검증 못 하는 상태로 배포됩니다. 애초에 이슈 #147이 "테스트에선 안 걸리고 실제 Postgres에서만 터지는 버그"였다는 걸 생각하면, 같은 카테고리의 문제가 또 반복될 위험이 있습니다.

수정 방향
이번 PR 하나로 해결할 문제는 아니고 팀 차원의 인프라 문제라, 이 PR 자체를 블로킹할 사안은 아닙니다. 다만:

  1. 이 PR은 머지 전에 반드시 로컬 Postgres(docker-compose.local.yml)로 GET /api/home을 실제로 호출해서 확인하고 넘어가는 걸 강하게 권합니다(본인이 이미 계획하신 대로).
  2. 팀 전체적으로 CI의 Run tests 주석 처리를 언제 풀 계획인지, Postgres 전용 버그를 잡을 최소한의 통합 테스트(@DataJpaTest + Testcontainers 등)를 도입할지는 별도 이슈로 논의해볼 만합니다.

Tip
"로컬(H2/모킹)에선 되는데 배포 환경(Postgres)에서만 깨진다"는 이번 버그 자체가, 테스트 인프라가 실제 DB 방언(dialect) 차이를 못 잡아내고 있다는 신호예요. 지금 당장 안 고쳐도, 이런 패턴이 반복되면 팀 회고에서 한 번 짚어볼 가치가 있어 보입니다.

return new HashSet<>(
playingRepository.findDistinctEndedDatesByUserAndStatus(userId, PlayingStatus.COMPLETED));
return playingRepository.findDistinctEndedDatesByUserAndStatus(userId, PlayingStatus.COMPLETED).stream()
.map(java.sql.Date::toLocalDate)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🟡 P3src/main/java/com/mr/domain/home/service/HomeService.java:89

문제상황

.map(java.sql.Date::toLocalDate)

문제가 되는 이유
이 파일은 이미 import java.time.LocalDate;를 쓰고 있고 java.sql.Date와 이름이 겹치지 않아서(단순히 Date로 줄여쓰지만 않으면) 상단에 import java.sql.Date;를 추가해도 충돌이 없습니다. 굳이 전체 경로로 인라인 참조한 이유가 안 보이고, 팀 컨벤션(docs/컨벤션.md 와일드카드 import 지양 등)의 취지인 "import는 상단에 명시적으로"라는 스타일과도 살짝 어긋납니다.

수정 방향

import java.sql.Date;
...
.map(Date::toLocalDate)

Tip
PlayingRepository.java에서는 이미 import java.sql.Date;로 깔끔하게 쓰고 계셔서, HomeService.java도 똑같이 맞추면 일관성이 좋아질 것 같아요.

@rkdehdrbs7885-oss rkdehdrbs7885-oss left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

날짜 타입 불일치가 나지 않도록 java.sql.Date 타입으로 안전하게 먼저 받은 뒤, 비즈니스 로직에서 명시적으로 LocalDate로 잘 변환하는 것 같습니다. 수고하셨습니다!

@ownue
ownue merged commit 4152cfb into develop Aug 5, 2026
1 of 2 checks passed
@ownue
ownue deleted the fix/#147-home-api branch August 6, 2026 08:16
@coderabbitai coderabbitai Bot mentioned this pull request Aug 11, 2026
5 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

🐛 BugFix - HOME 조회 API 500 오류 수정

3 participants