JPA 기반 추가 고려사항
Entity
JPA에서 사용하는 도메인 엔티티 클래스.
애너테이션(@Entity, @Table 등)을 사용하여 데이터베이스와 매핑.
일반적으로
Domain
계층에 포함되지만, 명확한 분리를 원하면 별도로 관리.
Repository
JPA Repository 인터페이스.
Spring Data JPA의 기본 Repository 인터페이스를 확장하거나, 커스텀 메서드 정의.
Specification/Criteria
복잡한 쿼리를 생성하기 위한 JPA의
Criteria API
또는Specification
클래스.데이터 검색 로직을 깔끔하게 분리.
Entity Listener
JPA 엔티티와 관련된 이벤트(@PrePersist, @PostLoad 등)를 처리하는 리스너 클래스.
Mapping Layer
도메인 객체(Entity)와 DTO 간 변환.
MapStruct와 같은 라이브러리 또는 수동 매핑 구현.
명확한 책임 분리를 위해 도메인 계층 외부에 위치.
구조 예시
src
├── adapter
│ ├── persistence
│ │ ├── repository (JpaRepository 확장)
│ │ ├── entity (JPA Entity 클래스)
│ │ └── criteria (Specification, Criteria API 관련)
│ ├── api
│ └── messaging
├── application
│ ├── service (Application 서비스)
│ └── usecase (유스케이스별 클래스)
├── domain
│ ├── entity (도메인 엔티티 - JPA 의존성 제거 가능)
│ ├── valueobject
│ └── service (도메인 서비스)
├── dto
├── port
│ ├── inbound
│ └── outbound (Repository 인터페이스 포함)
├── configuration
├── event
├── exception
├── mapper
├── utils
└── test
주요 포인트
JPA Entity 분리:
JPA Entity는Domain
에 포함될 수 있지만, 데이터베이스 중심 설계와 도메인 중심 설계를 분리하려면Adapter
의Persistence
디렉터리에 위치시킬 수 있습니다.Repository와 Port 연결:
JPA Repository는Outbound Port
의 구현체로 위치하며, 도메인 서비스에서 Repository 인터페이스만 의존하도록 설계합니다.Entity Listener 및 이벤트:
JPA의@EntityListeners
를 활용하여 영속성 관련 이벤트를 처리할 수 있습니다.Specification 사용:
복잡한 쿼리를 작성해야 하는 경우, JPA의Specification
또는Criteria API
를 별도의 클래스로 구성해 Repository 로직을 깔끔하게 유지합니다.