Skip to content

Conversation

@chaiminwoo0223
Copy link
Contributor

@chaiminwoo0223 chaiminwoo0223 commented Dec 15, 2025

📌 작업 내용 및 특이사항

✅ Java → Kotlin 마이그레이션 개요

  • Pomodoro, StudyLog 전반을 Java → Kotlin으로 마이그레이션했습니다.
  • 단순 문법 변환이 아니라, Kotlin–Java 혼용 환경에서도 안정적으로 동작하도록 구조를 정리하는 데 초점을 맞췄습니다.
  • 마이그레이션 과정에서 기존 로직의 의미가 변경되지 않도록, 정적 팩토리 메서드(of)도메인 책임 구조(Factory, Policy, Service, Facade)를 최대한 유지했습니다.

✅ 테스트 코드 Kotlin 마이그레이션

  • Java로 작성된 Pomodoro/StudyLog 테스트 코드를 Kotlin으로 전환했습니다.
  • 단순히 코드를 옮기는 데 그치지 않고, Kotlin의 간결한 문법을 활용해 테스트 구조를 정리하고 누락된 케이스(완료 상태 검증)를 추가했습니다.
  • Kotlin–Java 혼용 환경에서 발생할 수 있는 접근자 차이(getter 인식 문제, record → data class 전환에 따른 호출 방식 변화 등)를 테스트 단계에서 먼저 확인했습니다.
  • Pomodoro와 StudyLog 도메인 전반에 대해 단위 테스트와 통합 테스트를 Kotlin 기준으로 정비했습니다.
  • Fixture는 object 사용을 지양하고, class + DSL(withXXX) 패턴으로 통일하여 테스트 간 상태 공유 문제를 해결했습니다.
  • 마이그레이션의 기준은 컴파일 성공이 아니라 모든 테스트 통과이며, 테스트가 통과하는 상태를 확인한 후에야 마이그레이션을 완료했습니다.

✅ Kotlin–Java 혼용 환경에서 발생한 주요 이슈 및 대응

  • Java + Lombok 기반 엔티티를 Kotlin에서 접근하는 과정에서 필드 접근 오류 및 getter 인식 문제가 다수 발생했습니다.
  • 특히, private / protected 필드를 Lombok에 의존하던 구조에서, Kotlin 컴파일러가 필드 접근으로 오해하여 컴파일 에러가 발생했습니다.
  • 도메인 엔티티, BaseTimeEntity명시적 getter를 직접 추가하여 문제를 해결했습니다.
  • 또한, 삭제 여부 판단을 위해 isDeleted() 메서드를 BaseTimeEntity에 추가했습니다.
  • Kotlin 기준에서 도메인 캡슐화를 명확히 드러내는 방향으로 개선했습니다.

✅ record → data class 전환 시 주의사항 반영

  • Java recordKotlin data class로 전환하면서, 기존 x() 방식 접근이 Kotlin/Java 혼용 환경에서는 getX() 접근으로 변경되어야 했습니다.
  • Facade, Service, DTO 전반에서 접근 방식을 점검하고 수정했으며, 혼용 환경에서도 동일한 호출 방식이 유지되도록 정리했습니다.

✅ 도메인 엔티티 및 QueryDSL 리포지토리를 마이그레이션하지 않은 이유

  • 현재 프로젝트는 Java-Kotlin 혼용 환경에서 compileJavacompileKotlin이 함께 동작합니다.
  • 이 상태에서 도메인 엔티티를 Kotlin으로 전환할 경우, QueryDSL Q 클래스 생성 시점에 컴파일 충돌이 발생하여 빌드가 실패했습니다.
  • 해당 문제를 회피하기 위해, 도메인 엔티티, QueryDSL 리포지토리는 Kotlin 전환 대상에서 제외했습니다.
  • 도메인 엔티티와 QueryDSL은 Kotlin 마이그레이션의 마지막 단계에서 한 번에 전환할 예정입니다.

✅ Pomodoro 도메인 Kotlin 마이그레이션

  • PomodoroQueryService, PomodoroCommandService Kotlin 전환
  • PomodoroRepository, PomodoroJpaRepository, PomodoroRepositoryAdapter Kotlin 전환
  • PomodoroErrorCode, PomodoroPolicy, PomodoroFactory Kotlin 전환

✅ StudyLog 도메인 Kotlin 마이그레이션

  • StudyLogController, StudyLogFacade Kotlin 전환
  • StudyLogQueryService, StudyLogCommandService Kotlin 전환
  • StudyLogRepository, StudyLogJpaRepository, StudyLogRepositoryAdapter Kotlin 전환
  • StudyLogErrorCode, StudyLogPolicy, StudyLogFactory Kotlin 전환

✅ DTO Kotlin 마이그레이션

  • Pomodoro Application DTO: CreatePomodoroRequest, PomodoroInfo Kotlin 전환
  • StudyLog Presentation Request: CreateStudyLogRequest, PresignStudyLogImageRequest, ConfirmStudyLogImageRequest Kotlin 전환
  • StudyLog Presentation Response: CreateStudyLogResponse, PresignedStudyLogImageResponse, LoadStudyLogsSliceResponse Kotlin 전환
  • StudyLog Application DTO: StudyLogInfo, StudyLogDetail, StudyLogSliceInfo, PresignedStudyLogImageInfo Kotlin 전환

✅ 빌드 및 포맷팅 환경 정리

  • build.gradle에 Kotlin 환경 설정 추가
  • Spotless Kotlin 포맷팅 설정 추가

🌱 관련 이슈


🔍 참고사항(선택)

  • Kotlin은 Lombok이 컴파일 시점에 생성하는 코드를 언어 차원에서 신뢰하지 않기 때문에, Lombok 기반 접근자는 Kotlin에서 안정적으로 인식되지 않을 수 있습니다.
  • Lombok 의존으로 인한 불확실성을 줄이기 위해, 명시적인 getter를 기준으로 Kotlin에서 안전하게 접근하도록 정리했습니다.
  • Kotlin 마이그레이션 완료 후, 기존 Java pomodoro, studyLog, 테스트 관련 패키지는 제거했습니다.

📚 기타(선택)

  • 본 PR은 기능 추가나 구조 리팩토링이 아닌, Pomodoro와 StudyLog 도메인의 Kotlin 마이그레이션 완료를 목표로 합니다.

* feat: PomodoroQueryService.kt, PomodoroCommandService.kt 구현
* feat: PomodoroRepository.kt, PomodoroJpaRepository.kt, PomodoroRepositoryAdapter.kt 구현
* feat: PomodoroErrorCode.kt, PomodoroPolicy.kt 구현
* feat: PomodoroFactory.kt 구현

* feat: StudyLogController.kt 구현
* feat: StudyLogFacade.kt 구현
* feat: StudyLogQueryService.kt, StudyLogCommandService.kt 구현
* feat: StudyLogRepository.kt, StudyLogJpaRepository.kt, StudyLogRepositoryAdapter.kt 구현
* feat: StudyLogErrorCode, StudyLogPolicy 구현
* feat: StudyLogFactory.kt 구현

* feat: CreatePomodoroRequest.kt DTO 추가
* feat: PomodoroInfo.kt DTO 추가
* feat: CreateStudyLogRequest.kt, PresignStudyLogImageRequest.kt, ConfirmStudyLogImageRequest.kt DTO 추가
* feat: CreateStudyLogResponse.kt, PresignedStudyLogImageResponse.kt, LoadStudyLogsSliceResponse.kt DTO 추가
* feat: StudyLogInfo.kt, StudyLogDetail.kt, StudyLogSliceInfo.kt, PresignedStudyLogImageInfo.kt DTO 추가

* refactor: Kotlin–Java 혼용 환경에서 안정적인 접근을 위해 도메인 엔티티에 명시적 getter 추가
* refactor: Kotlin–Java 혼용 환경에서 안정적인 접근을 위해 BaseTimeEntity에 명시적 getter 추가
* refactor: record → data class 전환에 따른 DTO 접근자 호출 방식(x() → getX()) 수정
* refactor: Policy에서 삭제 여부 판단을 위해 BaseTimeEntity에 isDeleted 메서드 추가

* refactor: java pomodoro presentation, application 패키지 제거 (Kotlin 마이그레이션 완료)
* refactor: java pomodoro domain factory, policy, error 패키지 제거 (Kotlin 마이그레이션 완료)
* refactor: java pomodoro infra jpa 패키지 제거 (Kotlin 마이그레이션 완료)
* refactor: java studyLog presentation 패키지 제거 (Kotlin 마이그레이션 완료)
* refactor: java studyLog application facade 패키지 제거 (Kotlin 마이그레이션 완료)
* refactor: java studyLog domain error, policy 패키지 제거 (Kotlin 마이그레이션 완료)

* test: PomodoroFixture.kt, CreatePomodoroRequestFixture.kt 추가
* test: PomodoroTestHelper.kt 추가
* test: PomodoroQueryServiceTest.kt, PomodoroCommandServiceTest.kt 단위 테스트 추가
* test: test java pomodoro 패키지 제거 (Kotlin 마이그레이션 완료)

* test: StudyLogFixture.kt, CreateStudyLogRequestFixture.kt, PresignStudyLogImageRequestFixture.kt, ConfirmStudyLogImageRequestFixture.kt 추가
* test: StudyLogTestHelper.kt 추가
* test: StudyLogQueryServiceTest, StudyLogCommandServiceTest 단위 테스트 추가
* test: StudyLogControllerIntegrationTest 통합 테스트 추가

* test: TokenFixture에 authorization 정적 메서드 추가
* test: StampTestHelper에 getStamp 정적 메서드 추가

* chore: build.gradle에 Kotlin 환경 설정 추가
* chore: build.gradle에 Spotless Kotlin 포맷팅 설정 추가
@chaiminwoo0223 chaiminwoo0223 self-assigned this Dec 15, 2025
@chaiminwoo0223 chaiminwoo0223 added the 🪄refactor 기능 개선 및 리팩토링 label Dec 15, 2025
Copy link
Contributor

@hisonghy hisonghy left a comment

Choose a reason for hiding this comment

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

정말 고생많으셨습니다!
코틀린으로 마이그레이션 하면서 마지막에 도메인 엔티티까지 마이그레이션하면 될 것 같아요!

@chaiminwoo0223 chaiminwoo0223 merged commit ace01e0 into develop Dec 17, 2025
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

🪄refactor 기능 개선 및 리팩토링

Projects

None yet

Development

Successfully merging this pull request may close these issues.

🪄[REFACTOR]: Pomodoro, StudyLog 기능 전반 Kotlin 마이그레이션

3 participants