
Spring Boot & JPA에서 Java와 Kotlin을 함께 사용하기
두줄요약
JPA 친화적인 Entity는 Java로, 비즈니스 로직은 Kotlin으로 분리한 이유와 구성을 소개했습니다. 자체 nullability 어노테이션과 ArchUnit으로 Java-Kotlin 간 null 안전성을 보완했습니다.
선택 이유
- Java의 JPA·QueryDSL 친화성과 Kotlin의 null safety·편의 문법 동시 활용
- TypeScript 중심 개발 경험을 가진 구성원의 Kotlin 학습 부담 완화
- Kotlin 단독 사용 시 JPA의 변경 감지·지연 로딩과 불변성 지향의 충돌 고려
구조와 흐름
- Entity를 포함한 core 모듈은 Java, 비즈니스 로직 모듈은 Kotlin으로 분리
- Java Entity의 Lombok getter를 Kotlin에서 참조하지 않도록 core 내부 의존 방향 제한
- JPA Entity와 복잡한 조회 영역의 Java 기반 호환성 유지
해결 방법
- Java Entity의 필드·메서드·인자에 자체
@NonNull·@Nullable어노테이션 적용 - RUNTIME retention으로 Kotlin의 Platform Type null 안전성과 Fixture Monkey의 null 주입 동시 지원
- ArchUnit 테스트로
@Column필드와 Entity 메서드의 nullability 어노테이션 누락 검증
주의할 점
- JetBrains nullability 어노테이션은 CLASS retention이어서 런타임 리플렉션 기반 도구에서 확인 불가
- Java와 Kotlin 혼합 모듈에서 Lombok 어노테이션 처리보다 Kotlin 컴파일이 먼저 실행되는 순서 문제
- 공통 core 모듈의 Spring 등 외부 패키지 의존 최소화 필요



