어느새 벌써 한주가 끝났다.

코드스테이츠 시작 전부터 5개월 동안
제대로 쉬지 못하고 공부를 지속하다보니 살짝 번아웃이
오긴하는 것 같다.. 공부는 즐겁고 얼른 이 기술을 습득해
적용하고 싶지만,, 너무 오랫동안 여행을 가지 못해서
어디론가 훌쩍 떠나고 싶다.












그래도 목표에 도달하기위해 열심히 해보자 !!


어제는 Spring data JDBC를 사용하는 연습을 해보았다.

몇일전까지는 이해가 되서 재밌었는데,,
급격한 난이도 상승으로 인한 즐거움과 어지러움이 공존했다.

요는 JDBC 사용법이 어려웠던 것 보다는
Database, Service, Dto, Mapper, Controller의 연동과
데이터 전달흐름을 정확히 캐치하기가 어려운게 너무 컷었다.

그도 그럴 것이 이 모든 내용을 일주일안에
전부 학습한 내용이라 그런 것 같다는 생각이 들었다.

그래도 오늘 배운 것을 차근차근 정리해보자


Domain Driven Design

Domain Driven Design는 DDD라고 줄여 불른다.
우리말로 도메인 주도 설계 정도로 해석할 수 있는데
용어의 의미 그대로 도메인 위주의 설계 기법을 의미한다.

Aggregate란?
관련 도메인을 하나의 군집으로 묶은 것을 의미한다.
예를들어 커피주문을 앱으로 만든다고 가정하 였을 경우

회원 (회원Id, 회원이름, 회원이메일 등..)
주문 (주문Id, 주문시간, 주문상태 등..)
음료 (음료Id, 음료종류, 음료가격, 음료조리시간 등..)

이렇게 3개의 군집(회원,주문,음료)로 나는 것을 Aggregate라고 한다.

Aggregate route란?
Aggregate route는 말그대로 군집중에 기준이 되는 뿌리. 즉 정보다
객체를 참조하기 위한 기준이되는 값이라고 생각하면 간단할 것 같다.
말 뜻에서 오듯이 변경이되지 않는 값으로 잡아야한다. (ex: id)

한마디 정리 : Aggregate의 대표다 !


Entity 설계

이전에 학습했던 RDBMS 챕터에서
ERD(Entity Relationship Diagram) 설계할때 잠깐 공부했었다.
1:1, 1:N, N:N 관계를 정의하고, 외래키(foreign key)로
다른 Entity를 Join해 값을 참조가 가능했었다.

우리가 예제로 만들 애플리케이션의 Entity의 관계를 정의하고
프로그램을 시작하는게 좋을 것 같다.

오늘 배운 것을 적어보자 !

1). AggregateReference
-. JDBC 라이브러리 안에 들어있는 인터페이스이다.
-. Table 왜래키처럼 다른 클래스의 Aggregate Route를 참조할 수 있는 방법이다.

2). @Table
-. Table의 이름을 정의하는 어노테이션이다.
-. .sql 파일에 정의된 테이블의 이름과 연결해준다고 생각하면 될 것 같다.
-. @Table이 설정이 안되어 있을 경우 클래스이름과 동일한 테이블을 연결해준다.

3). @MappedCollection
-. Entity 클래스 간의 연관 관계를 맺어주는 어노테이션이다.

1,2,3번에 대한 예제를 프로그램으로 살펴보자

CREATE TABLE IF NOT EXISTS ORDERS (
    ORDER_ID bigint NOT NULL AUTO_INCREMENT,
    MEMBER_ID bigint NOT NULL,
    PRIMARY KEY (ORDER_ID),
    FOREIGN KEY (MEMBER_ID) REFERENCES MEMBER(MEMBER_ID)
);

SQL구문으로 ORDERS 테이블을 만들었고
내부의 ORDER_ID, MEMBER_ID를 컬럼을 만들었다.
각각 기본키와 외래키로 등록하였다.


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

    private AggregateReference<Member, Long> memberId;

    @MappedCollection(idColumn = "ORDER_ID")
    private Set<CoffeeRef> orderCoffees = new LinkedHashSet<>();
}

우리가 DB와 연결하기위해 Repository 인터페이스를 만들었고
Spring data JDBC 기술을 이용하는 CrudRepository 인터페이스를 상속받아
DB에 접근하여 CRUD를 사용했었다.

Order 클래스는 우리가 객체를 만들어
값을 저장해둔다음. 해당 객체를 CrudRepository의
메서드를 이용해 .save();를하여 객체를 넘겨주면
우리가 위에서 정의해둔 테이블에 값이 저장되게 되어진다.

1). 여기서 @Table의 역할을 알 수 있다. .save();를 진행할떄, 어느 테이블에 저장을해야할지
알수가 없다. 그것을 지정해주는 애노테이션으로 Table이 ORDERS로 지정된 테이블을 연결해준다.
@Table을 안붙여줬을 경우 자동으로 클래스이름의 테이블을 찾아간다.

2). AggregateReference 타입으로 만든 memberId라는 값은
Member 클래스의 Long으로 지정된 Id값을 참조할 수 있게된다.

new AggregateReference.IdOnlyAggregateReference();

위의 코드를 이용해 Order 객체를 생성할 때, 어떤 Member가 선택했는지
전달받은 Id를 위의 메서드 안에 넣어 준 객체를 이용해서 만들어주면된다.

그렇게 만들어진 order클래스 객체의 memberId값으로
memberRepository에 접근해 Id를 이용해 객체를 찾고
다른 값들도 가져올 수 있게 되는 것이다.

3). @MappedCollection N:N 관계의 경우 중간 Entity 클래스가 하나 필요하다.
Order - OrderCoffee - Coffee (1 : N : 1)과 같은 그림이다.
그 중간 클래스는 CoffeeRef고 테이블은 ORDER_COFFEE로 정했다.

idColumn, keyColumn에 대한 설정이 필요하고 List를 사용할 경우 2개다 지정해야하며, Set을 싸용할 경우 IdColumn만 지정해도 사용가능하다.

idColumn은 CoffeeRef에서 사용할 외래키를 적어주면된다.
CoffeeRef(N): Order(1)이기 때문에
ORDER_ID를 참조하게 적어주면된다.

keyColumn은 외래키를 포함하고 있는 테이블의 기본키를 컬럼명을 지정하면된다.
현재 같은 경우 keyColumn = “ORDER_COFFEE_ID”로 적어주면 되는 것이다.


이렇게 오늘은 Spring data JDBC에 대해 알아보았다.
사실 몇개는 간단하게 느껴졌는데
연관 관계 Mapping은 아직 익숙치않아서 그런지
조금 많이 어렵게 느껴졌다.
다음주에 실습이 또 있는데 실습을 통해서 익숙해지도록 노력해야겠다.


오늘의 커피량: ☕️ ☕️ ☕️
오늘의 점심: 불고기, 계란부침, 밥