도메인이란 용어 자체는 한 마디로 우리가 실제로 현실 세계에서 접하는 업무의 한 영역이다.
애그리거트를 설명하기 위해 배달 주문 앱에서 필요한 업무, 즉 도메인에는 무엇이 있는지로 이해를 하고자 한다.
배달 주문 앱에서 필요한 업무 도메인을 대략적으로 뽑아보면 위 그림과 같다.
위에서 추려낸 업무 도메인을 세분화해보면,
위 그림처럼 세분화가 진행된다
애그리거트는 위 그림과 같이 비슷한 업무 도메인들의 묶음을 말하는데, 그림 3-41에서 애그리거트는 총 4개가 된다.
편의상 회원 애그리거트,주문 애그리거트,음식 애그리거트, 결제 애그리거트라고 부를 수 있다.
애그리거트는 한마디로 비슷한 범주의 연관된 업무들을 하나로 그룹화해놓은 그룹이라고 생각하면 이해가 쉽다.
외래키 참조 방식을 이용하려면 @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절의 조건으로 지정해 데이터를 조회할 수 있는 편리한 쿼리메서드입니다.
//