코드스테이츠_국비교육/[Section3]

47.01_[Spring MVC] Spring Data JDBC_JDBC 기반 설계(DDD)_22.10.28

생각없이 해도 생각보다 좋다. 2022. 10. 30. 01:08

Spring Data JDBC 기반의 도메인 엔티티 및 테이블 설계
>데이터베이스의 테이블과 도메인 엔티티 클래스의 설계
: Spring Data JDBC를 사용하기 위해 가장 먼저 할 일

>DDD(Domain Driven Design)
: 도메인 주도 설계
: 도메인이란, 각 분야 혹은 비즈니스적인 업무 영역같은 개념으로 알고 있으면 된다. 예를 들면, 나는 대학에서 ~~전공을 이수했으니 ~~도메인을 갖고 있는 사람이다.
: 만들고자하는 애플리케이션이 사용되는 도메인에 대한 지식, 즉 도메인 지식이 뛰어나다면 퀄리티가 높은 애플리케이션을 만들 수 있다.
: 도메인 주도 설계(DDD)는 애플리케이션의 전체적인 도메인과 내부 기능들 각각의 도메인도 고려하며 설계하는 구현 기법이다. (내부 기능을 구현하는 내부 기능 및 정보들도 각각의 도메인을 고려할 수도 있음)

>Aggregate
: 애그리거트라고도함.
: 애플리케이션의 기능을 도메인 기준으로 구분(1)하고, 구분한 기능들의 내부 요소도 도메인 기준으로 구분(2)했을 때, Aggregate라는 표현을 쓸 수 있다.
: Aggregate는 하위 수준의 도메인을 묶을 수 있는 상위 수준의 도메인 영역이다.
: 즉, (2)을 포함하는 도메인 영역인 (1)이 Aggregate이다.

>Aggregate Root
: 애그리거트 루트라고도 한다.
: 애그리거트 루트는 애그리거트를 대표하는 하위 도메인을 의미한다.
: 즉, 여러 개의 (2) 요소를 포함하는 것이 (1)이고, (1)은 애그리거트라고 한다. 그런데 (2) 요소 중에 (1)의 도메인과 제일 직결되는 도메인을 갖는 하위 도메인 요소를 Aggregate Root 라고 한다.
: 예를 들어 회원이라는 Aggregate가 있고, 하위 도메인으로 '회원 정보', '회원 포인트'가 있다고 하자. 그렇다면 Aggregate Root는 '회원 정보'가 될 것이다.
: 조금 자세히는 회원 포인트를 알려면 회원 정보가 필요한 것처럼 Aggregate의 하위 도메인들 중에서도 의존하는 관계가 발생한다. 이런 관계는 DB table 내에서는 부모, 자식관계로 이어지는데 이 때 부모 테이블이 Aggregate Root 가 된다.

>DB table 부모, 자식 관계
: 관계형 데이터베이스에서 A 테이블의 PK 를 B 테이블에서 FK 형태로 가지고 있다면, A가 부모 테이블이고 B가 자식 테이블이다.

>도메인 엔티티 클래스
: 엔티티 클래스를 Aggregate 기준으로 만들 수 있다.
: 엔티티 클래스명, 엔티티 멤버 필드를 Aggregate 를 생각하며 구현할 수 있다. (다이어그램으로 먼저 표현하면 편하다)
: Aggregata 간 관계는 FK(외래키) 관계로 이어지고, Entity 클래스 간 관계는 객체의 참조를 통해 관계를 잇는다.
: '1:N', 'N:N' 관계일 때, N을 표현하기 위한 필드의 참조형을 List로 묶는 것이 일반적이다.

>domain entity class와 aggregate의 필요성
: ORM 기반 기술을 사용하기 때문이다.
: ORM은 객체와 테이블을 매핑하는 기술이기 때문에 domain entity class를 만들어 관계를 정의하고, aggregate를 구분하고 aggregate root를 찾는 것이 중요하다.