Skip to content

Clean Spring ‐ JPA and Domain Model Patterns

woojin edited this page Aug 22, 2026 · 1 revision

JPA 모델과 도메인 모델은 다른지?

  • 도메인 모델은 DB와 매핑되는 데이터 모델과는 다르며 이를 분리해야 한다.
    • 어댑터 계층에 JPA 엔티티 등의 모델을 따로 만들고
    • Repository를 구현한 어댑터를 이용해 도메인 오브젝트와 JPA 오브젝트를 매핑해준다.
    • Member 외에 MemberEntity 클래스를 만들어 JPA 관련 설정을 모두 이곳으로 옮긴다.
    • MemberRepository를 구현한 MemberRepositoryJpaAdapter에서 이 2가지 오브젝트를 서로 매핑해주는 코드를 작성한다.

위와 같은 접근 방법을 선호하는 이유

  • 데이터 모델과 도메인 모델이 너무 다른 경우 - 레거시 DB에 도메인 모델 설계를 적용해야 하는 경우
  • 복잡한 도메인 모델이 데이터 모델과 간단하게 매핑되지 않는 경우 - JPA 모델과는 다른 도메인 모델이 존재한다면
  • 데이터 저장 기술이 바뀌는 경우
  • 코드에 등장하는 JPA 어노테이션이 기술 의존적 - 이런 어노테이션이 코드 실행에 어떤 영향을 주는지
  • 도메인 코드에 관심사가 다른 JPA 매핑 어노테이션, DB 정보가 포함되기에 - 가독성 또는 취향

JPA 기술의 정체성

  • ORM : 패러다임이 다른 관계형 DB와 객체지향 모델의 불일치를 해결하는 기술이다. SQL 매핑과는 다르다.
  • JPA의 기술적 목표는 자바 애플리케이션 개발자가 관계형 데이터베이스를 관리하기 위해 자바 도메인 모델을 활용할 수 있는 객체/관계 매핑 기능을 제공하는 것이다.
  • 결국 JPA의 엔티티는 경량 영속 도메인 오브젝트이다.

도메인 모델 패턴

  • 단순 도메인 모델은 테이블과 클래스가 1 : 1로 매핑된다.
  • 복잡한 도메인 모델의 경우 DB 매핑이 어렵다는 문제가 있다. 이걸 해결해주는 것이 바로 JPA이다.
  • JPA가 매핑을 통해서 해결하려는 패러다임 불일치 문제는 다음과 같다.
    • 세분성 불일치(Granularity)
    • 상속 불일치(Subtype)
    • 정체성 불일치(Identity)
    • 연관 불일치(Association)
    • 데이터 탐색 불일치(Navigation)
  • 다양한 데이터 저장소에 대한 데이터 접근을 단순하고 일관된 프로그래밍 모델로 제공한다.
    • 일관된 프로그래밍 모델 : 저장소의 종류와 상관없이 동일한 방식으로 데이터에 접근하도록 한다.
    • 보일러 플레이트 코드 감소
    • 데이터 저장소 특성 유지
    • 확장성과 유연성
  • Repository<T, ID> : T : 도메인 타입 = 엔티티 = 애그리거트 루트

도메인 모델과 JPA 모델을 반드시 분리해야 한다는 주장에 대한 반박 정리

  • 대부분 데이터 모델과 도메인 모델은 다르지 않다.
  • 복잡한 도메인 모델의 매핑은 JPA가 충분히 지원한다.
  • 모델 변환 로직과 유사한 2가지 클래스로 인한 불필요한 복잡성이 증가한다.
  • JPA는 근본적으로 도메인 오브젝트의 매핑을 위해서 설계된 기술이다.
  • JPA는 도메인 계층을 침범하지 않는다.
  • 복잡한 쿼리 로직은 커스텀 리포지토리와 어댑터 구현을 통해서 충분히 개발 가능하다.
  • 도메인 계층과 데이터 계층의 결합은 불가피하다. 이 둘이 완전히 독립적인 경우는 매우 드물다.

성급한 분리는 오히려 복잡성만 초래할 뿐이고 JPA는 도메인 모델 중심의 개발을 충분히 잘 지원하고 있다.

📖 Java🔥

📖 Kotlin⭐

📖 Coroutine📎

📖 Spring🔥

📖 Spring Security⭐

📖 Spring Security OAuth2⭐

📖 Spring Batch📎

📖 Database🔥

📖 MySQL🔥

📖 Redis⭐

📖 JPA⭐

📖 QueryDsl📎

📖 MSA⭐

📖 Kafka⭐

📖 Apache Flink📎

  • [Apache Flink - Apache Flink Architecture]
  • [Apache Flink - Stream Processing]
  • [Apache Flink - Data Stream API & Window]
  • [Apache Flink - State Management]

📖 HTTP🔥

📖 AWS⭐

📖 Docker⭐

📖 Kubernetes⭐

📖 Github Actions📎

📖 Jenkins📎

📖 Nginx⭐

📖 Monitoring📎

📖 Test(feat. Load Testing)📎

📖 Test(feat. Java)⭐

📖 Spring AI📎

📖 gRPC📎

  • [gRPC - Writing .proto Files with Protocol Buffers]
  • [gRPC - Various Communication Patterns in gRPC]
  • [gRPC - gRPC Optimization Techniques and Advanced Features]

📖 Spring Cloud Microservice Application📎

📖 TDD(Test-Driven-Development)⭐

📖 PostgreSQL📎

  • [PostgreSQL - Docker만을 사용하는 경량화된 환경 구성 방법]
  • [PostgreSQL - PostgreSQL에서 제공하는 데이터 타입]
  • [PostgreSQL - PostgreSQI의 JSONB, 역인덱싱과 활용 방법]
  • [PostgreSQL - 데이터베이스 성능을 위한 최적화 패턴 및 전략]
  • [PostgreSQL - 트랜잭션과 ACID, Isolation 수준별 차이]
  • [PostgreSQL - Database Lock 교착상태와 읽기/쓰기 성능을 보장하는 MVCC 모델]
  • [PostgreSQL - pgvector와 벡터 저장, 유사도 검색 패턴 개념]
  • [PostgreSQL - 벡터 인덱스 최적화와 벡터 검색과 전문 검색 결합 패턴]
  • [PostgreSQL - PostgreSQL 플러그인]
  • [PostgreSQL - PostGIS - 공간 쿼리와 GIST 인덱스, 지리 타입과 공간 쿼리를 위한 타입과 기본 함수]
  • [PostgreSQL - pg_search - 검색 엔진 없이 텍스트 검색 구현과 주의사항]
  • [PostgreSQL - 단일 인스턴스 한계를 극복하는 분산 패턴과 스케줄링, 분산 환경 구축 방법]
  • [PostgreSQL - Citus - 분산 테이블과 분산 쿼리를 위한 Extension과 데이터 분산 처리]
  • [PostgreSQL - pg_cron - PostgreSQL로 구성하는 CronJob]
  • [PostgreSQL - 스케줄러 + 분산 처리를 동시에 도입하는 주기적 집계 쿼리 패턴]

📖 Workflow-Driven Techniques for Large-Scale Traffic Processing📎

  • [Workflow-Driven Techniques for Large-Scale Traffic Processing - Kafka + Debezium을 활용한 CDC 패턴 설계]
  • [Workflow-Driven Techniques for Large-Scale Traffic Processing - Temporal을 활용한 워크플로우 패턴]
  • [Workflow-Driven Techniques for Large-Scale Traffic Processing - Docker와 경량 이미지를 활용한 환경 구축 방법]
  • [Workflow-Driven Techniques for Large-Scale Traffic Processing - Kafka에서의 메시지 Delivery Guarantee]
  • [Workflow-Driven Techniques for Large-Scale Traffic Processing - 실시간 동기화의 핵심 CDC]
  • [Workflow-Driven Techniques for Large-Scale Traffic Processing - MySQL Binary Log 기반의 CDC]
  • [Workflow-Driven Techniques for Large-Scale Traffic Processing - Binary Log 기반의 CDC 구현 플랫폼 Debezium이란?]
  • [Workflow-Driven Techniques for Large-Scale Traffic Processing - Debezium Architecture]
  • [Workflow-Driven Techniques for Large-Scale Traffic Processing - Debezium Architecture Best Practice와 주의사항]

📖 Reactive Programming📎

📖 ElasticSearch📎

📖 Design Pattern📎

📖 Clean Spring📎

  • [Real MySQL 8.0 - 인덱스]
  • [Real MySQL 8.0 - 실행 계획]
  • [Real MySQL 8.0 - 아키텍처]
  • [Real MySQL 8.0 - 트랜잭션과 잠금]
  • [도메인 주도 설계의 사실과 오해 - DDD 요약]
  • [도메인 주도 설계의 사실과 오해 - Preface, Entity & VO]
  • [도메인 주도 설계의 사실과 오해 - 연관 관계와 애그리거트]
  • [도메인 주도 설계의 사실과 오해 - 애그리거트 구현]
  • [도메인 주도 설계의 사실과 오해 - 레포지토리와 기타 패턴]
  • [도메인 주도 설계의 사실과 오해 - 통찰력을 향한 리팩터링]
  • [도메인 주도 설계의 사실과 오해 - 유연한 설계를 향한 리팩터링]
  • [도메인 주도 설계의 사실과 오해 - 모델의 경계를 긋고, 핵심에 집중하라]

Clone this wiki locally