[Spring] 도메인 엔티티 및 테이블 설계

Minit88·2023년 4월 20일
0

Spring

목록 보기
9/16
post-thumbnail

DDD(Domain Driven Design)란?

  • 도메인 주도 설계로 도메인 위주의 설계 기법을 의미한다.
  • 성능, 생산성,안정성 면에서 뛰어난 애플리케이션을 만들기 위해 가장 중요한 영역인 애플리케이션의 설계는 구현보다 더 어렵다. 이를 보완하기 위해 나온 결과물 중 하나가 DDD이다.

도메인이란?

도메인이란 용어 자체는 한 마디로 우리가 실제로 현실 세계에서 접하는 업무의 한 영역이다.

  • 애플리케이션 개발에서 흔하게 사용하는 도메인이란 용어는 주로 비즈니스 적인 어떤 업무 영역과 관련이 있다.
  • 앱의 기능, (기획의) 요구사항을 개발하는 영역을 도메인
  • ex) 택시 앱이라면, 도메인은 기사님께 콜을 요청하고,탑승하고,요금을 지불하는 과정을 포함하고 있다
  • 도메인 레이어으 결과를 도메인 모델이라 하며, 도메인 모델을 가지고 기획자와 개발팀이 요구사항을 올바르게 이해했는지 확인할 수 있고, 의사소통의 도구로도 사용
    참조

애그리거트(Aggregate)란?

애그리거트를 설명하기 위해 배달 주문 앱에서 필요한 업무, 즉 도메인에는 무엇이 있는지로 이해를 하고자 한다.


배달 주문 앱에서 필요한 업무 도메인을 대략적으로 뽑아보면 위 그림과 같다.

위에서 추려낸 업무 도메인을 세분화해보면,


위 그림처럼 세분화가 진행된다

  • 회원,주문,음식,결제는 상위 수준의 도메인이고, 이 상위 수준의 도메인 하위에 있는 각각의 정보들을 하위 수준의 도메인이라고 부른다.

애그리거트는 위 그림과 같이 비슷한 업무 도메인들의 묶음을 말하는데, 그림 3-41에서 애그리거트는 총 4개가 된다.

편의상 회원 애그리거트,주문 애그리거트,음식 애그리거트, 결제 애그리거트라고 부를 수 있다.

애그리거트는 한마디로 비슷한 범주의 연관된 업무들을 하나로 그룹화해놓은 그룹이라고 생각하면 이해가 쉽다.

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

  • 회원 애그리거트의 경우, '회원 포인트'가 얼마인지 알려면 해당 포인트를 가지는 '회원 정보'를 알아야 한다.
  • 애그리거트 루트의 기본키 정보를 다른 도메이들이 외래키 형태로 가지고 있다고 볼 수 있다.

애그리거트 객체 매핑 규칙

  • 모든 엔티티 객체의 상태는 애그리거트 루트를 통해서만 변경할 수 있다.
  • 하나의 동일한 애그리거트 내에서의 엔티티 객체 참조
    • 동일한 하나의 애그리거트 내에서는 엔티티 간에 객체로 참조한다.
  • 애그리거트 루트 대 애그리거트 루트 간의 엔티티 객체 참조
    • 애그리거트 루트 간의 참조는 객체 참조 대신에 ID로 참조한다
    • 1대1과 1대 N관계일 떄는 테이블 간의 외래키 방식과 동일하다
    • N대 N 관계일 때는 외래키 방식인 ID 참조와 객체 참조 방식이 함께 사용된다.

@AggregateReference

외래키 참조 방식을 이용하려면 @AggregateReference 애너테이션을 붙여 외래키 참조 방식을 적용한다.

@Getter
@Setter
@Table("ORDERS")  // (1)
public class Order {
    // (2)
    @Id
    private long orderId;

    // (3) 테이블 외래키처럼 memberId를 추가해서 참조하도록 한다.
    private AggregateReference<Member, Long> memberId;

    ...
		...
}

Order 테이블은 Member 클래스의 memberId를 외래키로 참조하고 있음을 알 수 있다.

//////////
코드 3-91은 CoffeeRepository 인터페이스의 코드입니다.

✔ CoffeeRepository 코드 설명

(1)은 WHERE 절에서 COFFEE_CODE를 조건으로 질의하게 해주는 쿼리 메서드입니다.

(2)에서는 COFFEE 테이블에 질의하기 위해 @Query라는 애너테이션을 사용했습니다.

@Query 애너테이션은 쿼리 메서드명을 기준으로 SQL 쿼리문을 생성하는 것이 아니라 개발자가 직접 쿼리문을 작성해서 질의를 할 수 있도록 해줍니다.

@Query에 작성된 쿼리문에서 :coffeeId는 findByCoffeeId(Long coffeeId)의 coffeeId 변수 값이 채워지는 동적 쿼리 파라미터(named parameter)입니다.

@Query 애너테이션을 이용하면 SQL 쿼리문을 직접 작성할 수 있기 때문에 복잡한 쿼리문의 경우 @Query 애너테이션을 이용해서 직접 쿼리문을 작성할 수 있습니다.

하지만 단순한 쿼리의 경우 Spring Data JDBC에서 지원하는 Query Method를 정의해서 사용하는 것이 간결한 코드 유지와 생산성 면에서 바람직하다고 생각합니다.

코드 3-91 (2)의 경우 여러분들에게 쿼리로 작성하는 방법이 있다는 것을 보여주기 위해서 쿼리문을 직접 작성한 것이고, 실제로는 CrudRepository 인터페이스에 내장되어 있는 findById(ID id)를 사용하면 됩니다.

findById(ID id)는 테이블에서 기본키를 WHERE절의 조건으로 지정해 데이터를 조회할 수 있는 편리한 쿼리메서드입니다.
//

profile
" To be BE "

0개의 댓글