JDBC 기반 데이터 액세스 계층(3) - Spring Data JDBC 기반의 도메인 엔티티 및 테이블 설계

Backend kwon·2023년 8월 31일
0

DDD(Domain Driven Design)란?


DDD(Domain Driven Design)는 도메인 주도 설계로, 용어의 의미 그대로 도메인 위주의 설계 기법을 의미합니다.

도메인(Domain)이란?


도메인이란 용어는 주로 비즈니스적인 어떤 업무 영역과 관련이 있습니다.
도메인 지식(Domain Knowledge)들을 서비스 계층에서 비즈니스 로직으로 구현해야 하는 것입니다.

애그리거트(Aggregate)란?


애그리거트(Aggregate)란 비슷한 업무 도메인들의 묶음을 말합니다.

즉, 한마디로 비슷한 범주의 연관된 업무들을 하나로 그룹화해놓은 그룹이라고 생각하면 됩니다.

애그리거트 루트(Aggregate Root)란?


애그리거트 안에는 1개 이상의 도메인들이 있는데, 각각의 애그리거트에는 해당 애그리거트를 대표하는 도메인이 존재합니다.

이처럼 하나의 애그리거트를 대표하는 도메인을 DDD에서는 애그리거트 루트(Aggregate Root)라고 합니다.

애그리거트 루트 선정 기준


각 애그리거트 내의 도메인들 중에서 다른 모든 도메인들과 직간접적으로 연관이 되어 있는 도메인들을 발견할 수 있습니다.

그러한 도메인이 애그리거트 루트가 됩니다.

데이터베이스의 테이블 간 관계로 보자면, 애그리거트 루트는 부모 테이블이 되고, 애그리거트 루트가 아닌 다른 도메인들은 자식 테이블이 되는 셈입니다.

즉, 애그리거트 루트(Aggregate Root)의 기본키 정보를 다른 도메인들이 외래키 형태로 가지고 있다고 볼 수 있습니다.

관계형 데이터베이스에서 A 테이블의 기본키를 B 테이블이 가지고 있다면 A는 부모 테이블이 되고, B는 자식 테이블이 됩니다. B인 자식 테이블이 가지고 있는 A 테이블의 기본키를 외래키라고 합니다.

 

애플리케이션 도메인 엔티티 및 테이블 설계

1. 도메인에서 애그리거트 루트 찾기

2. 애그리거트 간의 관계

  • 회원 정보(Member)와 주문 정보(Orders)의 관계(1 대 N)
    • 한 명의 회원은 여러 번 주문을 할 수 있습니다.
  • 주문 정보(Orders)와 커피 정보의 관계(N 대 N)
    • 하나의 주문은 여러 종류의 커피를 가질 수 있습니다.
    • 하나의 커피는 여러 건의 주문에 속할 수 있습니다.
  • N 대 N의 관계는 일반적으로 1 대 N, N 대 1의 관계로 재 설계 되기 때문에 아래와 같이 변경됩니다.
    • 주문 정보(Orders)와 주문 커피 정보(Order_Coffee): 1 대 N
    • 주문 커피 정보(Order_Coffee)와 커피 정보(Coffee): N 대 1

3. 엔티티 클래스 간의 관계

데이터베이스 테이블 간의 관계는 외래키를 통해 맺어지지만 클래스 간의 관계는 객체의 참조를 통해 맺어집니다.

  • 회원(Member) 엔티티 클래스
    • Member 클래스와 Order의 관계는 1 대 N의 관계이기 때문에 Member 클래스에 List가 추가되었습니다.
    • 한 명의 회원은 여러 건의 주문을 할 수 있습니다. 따라서 하나의 Member 클래스에 여러 건의 주문이 포함된 List를 멤버 변수로 추가했습니다.
  • 주문(Order) 엔티티 클래스
    • Order 클래스와 Coffee 클래스는 N 대 N의 관계를 가지기 때문에 N 대 N의 관계를 1 대 N의 관계로 만들어주는 List를 멤버 변수로 추가했습니다.
  • 커피(Coffee) 엔티티 클래스
    • Coffee클래스와 Order 클래스는 N 대 N의 관계를 가지기 때문에 N 대 N의 관계를 1 대 N의 관계로 만들어주는 List를 멤버 변수로 추가했습니다.
  • 주문_커피(OrderCoffee) 테이블
    • Order 클래스와 Coffee 클래스가 N 대 N 관계이므로 두 클래스의 관계를 각각 1 대 N의 관계로 만들어주기 위한 OrderCoffee 클래스가 추가되었습니다.
    • 주문하는 커피가 한 잔 이상일 수 있기 때문에 quantity(주문 수량) 멤버 변수를 추가했습니다

애그리거트 루트(Aggregate Root)는 Spring Data JDBC가 DDD와 밀접한 관련이 있기 때문에 도메인 모델을 잘 정의하고 애그리거트 루트(Aggregate Root)를 찾아야 합니다.
이 애그리거트 루트(Aggregate Root)를 통해 프로그래밍 코드 상에서의 구현 방법이 달라집니다.

4. 데이터베이스 테이블 설계

도메인 엔티티 클래스 간의 관계는 객체의 참조로 이루어지지만 테이블 간의 관계는 여러분이 이미 알고 있는 외래키(Foreign key) 참조로 이루어집니다.

‘ORDER’는 SQL 쿼리문에서 테이블의 로우(Row)를 정렬하기 위해 사용하는 ‘ORDER BY’라는 예약어에 사용되기 때문에 테이블이 생성될 때 에러를 발생할 수 있습니다.

profile
백엔드개발자를 향해서

0개의 댓글