Skip to content

JPA Entity와 schema.sql의 불일치로 인한 잠재적 위험 (jOOQ DSL codegen으로 인한 순환 참조 문제) #164

@LeeHanEum

Description

@LeeHanEum

Describe

배경

기존에는 schema.sql 기반으로 jOOQ DSL을 생성했지만, 이 방식으로 인해 JPA Entity와 DSL 간 불일치가 발생하고,
개발자가 schema.sql을 직접 관리하는 데 리소스가 중복으로 투입되는 문제가 있었습니다.
이를 개선하기 위해 JPA Entity 기반 DSL 생성으로 전환을 고려하게 되었습니다.

기존 방식의 문제점

  • schema.sql을 기반으로 jOOQ DSL을 생성 → JPA Entity와 불일치 발생 → 런타임 에러 위험 증가
  • 개발자가 수동으로 schema.sql을 관리해야 함 → 생산성 저하 및 유지보수 비용 증가

jOOQ 공식 문서에서의 제약

"You cannot put your JPA entities in the same module as the one that runs the jOOQ code generator."

즉, 모놀리식 아키텍처에서 JPA 엔티티와 Codegen을 같은 모듈에 두면 안 됨

  • Codegen → Entity 참조 필요
  • Entity → DSL 참조 필요 → 잠재적인 순환 참조 문제 발생

따라서 Codegen Plugin과 애플리케이션은 분리가 필요합니다.

단순히 Codegen을 분리하는 것을 넘어, 레이어드 기반의 멀티 모듈 구조를 도입할 것을 제안합니다

Image

1. 관심사 분리

  • DSL은 persistence 모듈에서만 사용
  • 도메인 계층은 인프라 세부사항에 의존하지 않도록 유지
  • 클린 아키텍처 원칙 준수

2. 순수 도메인 유지

  • Domain 모듈에서 비즈니스 규칙과 유즈케이스 관리
  • 쿼리, DSL, DB 설정 등 인프라 관련 요소를 격리

3. 의존성 흐름 강제

  • Query Command 모델이 잘못된 계층에 주입되는 문제 방지
  • 비즈니스 로직, 예외, 도메인 규칙의 분리를 강제

4. 테스트 용이성 확보

  • 순수 도메인을 단위 테스트하기 쉬워짐
  • infra 의존성이 제거된 상태에서 테스트 가능

Tasks

선행 작업

본 작업

  • 멀티 모듈 구조 도입
  • JPA Entity와 DSL 간의 불일치 해결

ETC

CI 과정에서 검증할 수는 없는가?
./gradlew build 시 일반적인 빌드 순서는 다음과 같습니다:

  1. compileKotlin – Kotlin/Java 소스 코드 컴파일
  2. generateJooq – jOOQ DSL 생성
  3. 나머지 빌드 – 테스트, jar 생성 등

DSL과 JPA Entity 간의 불일치 검증은 Codegen task가 완료된 이후에 수행되어야 합니다.
하지만 문제는 불일치로 인한 순환 참조가 이미 검증 이전 단계에서 발생할 수 있다는 것입니다.

즉, CI에서 검증을 시도하더라도 Codegen 실행 전이나 실행 중 발생하는 순환 참조를 막을 수 없기 때문에,
근본적인 문제를 예방하려면 멀티 모듈 구조와 JPA Entity 기반 DSL 생성과 같은 구조적 해결이 필요합니다.

Metadata

Metadata

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions