❑ Spring Data JDBC
Spring Data JDBC는 나온지 얼마안되서 아직은 Spring Data JPA를 현업에서 사용한다.
➤ DDD란?
도메인 주도 설계(Domain Driven Design)
모든 기능을 도메인 모델 위주로 돌아가는 설계 기법이다.
▶️ 도메인(Domain)이란?
도메인이란 엔티티의 속성들이 가질 수 있는 값들의 집합이다.
쉽게 생각하면 비즈니스적인 어떤 업무 영역이다.
도메인 지식(Domain knowledge)들을 서비스 계층에서 비즈니스 로직으로 구현해야 한다.
현실세계에서 접하는 업무의 한 영역이다.
도메인은 두가지 모델이 있다.
▶️ 빈약한 도메인 모델
편의상 완벽한 DDD를 완벽하게 적용하지 못하는 것을 빈약한 도메인 모델이라 부른다.
도메인 객체들에 비즈니스 로직이 거의 없거나 아예 없는 모델이다.
Service 클래스에 기능 집중 + 기능이 없는 빈약한 도메인 모델(Domain Entity Classs)
▶️ 풍부한(rich) 도메인 모델
서비스 클래스의 기능 축소 + 기능이 많은 풍부한 도메인 모델(rich Domain)
➡️ DDD
➤ Aggregate(애그리거트)란?
비슷한 업무 도메인들(하위 수준 도메인)의 묶음
비슷한 범주의 연관된 업무들을 하나로 그룹화 해놓은 그룹이다.
➤ Aggregate Root(애그리거트 루트)란?
aggregate안에는 1개 이상의 도메인이 있고
각각의 aggregate를 대표하는 도메인이 존재한다.
DDD에서 하나의 애그리거트를 대표하는 도메인을 애그리거트 루트(Aggregate Root) 라고 한다.
▶️ Aggregate Root 선정 기준
- 다른 모든 도메인들과 직간접적으로 연관되어 있는 도메인
- 데이터베이스의 테이블 간 관계에서 aggregate root 테이블은 부모 테이블이 되고 다른 도메인들은 자식 테이블이 된다.
➤ Aggregate 간의 관계
- 1:N (1 대 다)
- N:N (다 대 다)
애플리케이션에서 Domain Entity 클래스 간의 관계를 먼저 설계한다.
➡️ 도메인의 Aggregate Root를 찾는다.
ORM(Object-Relational Mapping)기반의 데이터 액세스 기술인 Spring Data JDBC에서는 엔티티 클래스 간의 관계를 정의하는 것이 필요하다.
ORM은 객체와 테이블을 매핑하는 기술이기 때문에 클래스 간의 연관 관계를 찾아야 한다.
데이터베이스 테이블 간의 관계는 외래키를 통해 맺어진다.
클래스끼리 관계는 객체의 참조를 통해 맺어진다.
❑ 도메인 엔티티 클래스 정의
➤ 애그리거트 객체 매핑 규칙
1. 모든 엔티티 객체의 상태는 aggrigate root를 통해서만 변경할 수 있다.
- 직접 엔티티 객체의 상태를 변경하지 않고 애그리거트 루트를 거쳐서만 엔티티 상태를 변경해야 한다.
2. 하나의 동일한 aggrigate 내에서의 엔티티 객체 참조
- 동일한 하나의 애그리거트 내에서는 엔티티 간에 객체로 참조된다.
3. 애그리거트 루트 대 애그리거트 루트 간의 엔티티 객체 참조
- 애그리거트 루트 간의 참조는 객체 참조 대신 ID로 참조한다.
- 1대1과 1대N 관계일 때는 테이블 간의 외래키 방식과 동일하다.
- N대N 관계일 때는 외래키 방식과 객체 참조 방식이 함께 사용된다.
➤ Entity 구현
▶️ @Entity
해당 클래스가 엔티티 클래스임을 알려준다.
해당 클래스는 데이터베이스 테이블과 매핑된다.
클래스명 위에 작성한다.
▶️ @Id
해당 멤버변수가 ID값 임을 알려준다.
애그리거트 간의 매핑에서 루트 간에는 객체로 직접 참조하는 것이 아니라 ID로 참조한다.
▶️ @Table(“”)
이 애너테이션을 추가하지 않으면 기본적으로 클래스명과 같은 테이블 이름과 매핑된다.
하지만 클래스명과 다른 테이블명을 가진 테이블과 매핑하려면 이 애너테이션을 사용하고 attribute로 이름을 지정해주어야 한다.
▶️ AggregateReference<T, ID>
1:N 관계에서 애그리거트 루트와 애그리거트 루트 간에 객체로 참조할 때 사용하는 객체이다.
ID로 참조한다.
직접적으로 객체를 참조하지 않고 AggregateRefence로 객체를 한 번 감싸준다.
▶️ N:N 관계에서의 매핑
N:N관계일 경우 직접 매핑할 수 없기 때문에 1:N, N:1 관계로 풀어줄 엔티티가 중간에 하나 필요하다.
데이터베이스에서 join table 해주는 것과 같다.
중간에서 매핑해줄 엔티티 클래스를 하나 작성해서 매핑해준다.
▶️ @MappingCollection(idColumn = “”)
엔티티 클래스 간에 연관 관계를 맺어주는 정보를 의미한다.
idColumn attribute 값으로 외래키에 해당하는 column명을 적어준다.
N:N 관계에서는 AggrementReference로 기본키를 감싸줄 필요 없다.
읽어주셔서 감사합니다. 좋은 하루 되세요
오개념에 대한 지적은 환영입니다. 😄
'TIL(Today I Learned)' 카테고리의 다른 글
7/5 (화) [Spring MVC] JPA 기반 데이터 액세스 계층 1️⃣ - JPA란? (0) | 2022.07.14 |
---|---|
7/4 (월) [Spring MVC] JDBC 기반 데이터 액세스 계층 2️⃣ (0) | 2022.07.12 |
6/30 (목) JDBC 기반 데이터 액세스 계층 - JDBC란? (0) | 2022.07.06 |
6/29 (수) [Spring MVC] 예외 처리 2️⃣ - 비즈니스 로직에 대한 예외 처리 (0) | 2022.07.04 |
6/28 (화) [Spring MVC] 예외 처리1️⃣ (0) | 2022.07.04 |