내용을 조금 들으니, 앞선 이론강의들에서 썼던 예제들을 그대로 실무로 적용한다.
그래서 강의를 듣기전 혼자 코딩을 해보고 들으며 놓쳤던 점 등을 잡는 쪽으로 하자.
계층형 구조 사용
Controller, web : 웹 계층
Service : 비즈니스 로직, 트랜잭션 처리
Repository : JPA를 직접 사용하는 계층, 엔티티 매니저 사용
Domain : 엔티티가 모여있는 계층, 모든 계층에서 사용
개발 순서: 서비스, 리포지토리 계층을 개발하고, 테스트 케이스를 작성해서 검증, 마지막에 웹 계층 적용
특이사항
주문과 상품은 다대다 관계다. 하지만 이런 다대다 관계는 관계형 데이터베이스는 물론이고 엔티 티에서도 거의 사용하지 않는다. 따라서 그림처럼 주문상품이라는 엔티티를 추가해서 다대다 관계를 일대 다, 다대일 관계로 풀어냈다.
상품은 도서, 음반, 영화로 구분되는데 상품이라는 공통 속성을 사용하므로 상속 구조로 표현했다.
특이사항
카테고리(Category): 상품과 다대다 관계를 맺는다. parent , child 로 부모, 자식 카테고리를 연결한다.
주소(Address): 값 타입(임베디드 타입)이다. 회원과 배송(Delivery)에서 사용한다.
특이사항
회원 엔티티의 Address 임베디드 타입 정보가 회원 테이블에 그대로 들어갔다. 이것은 DELIVERY 테이블도 마찬가지다.
ITEM: 앨범, 도서, 영화 타입을 통합해서 하나의 테이블로 만들었다. DTYPE 컬럼으로 타입을 구분한다.
테이블명이 ORDER 가 아니라 ORDERS 인 것은 데이터베이스가 order by 때문에 예약어로 잡고 있는 경우가 많다. 그래서 관례상 ORDERS 를 많이 사용한다.
Member
Order
Delivery
OrderItem
Item
Album, Book, Movie
동일 구조로 Album 이하 생략
Category
다대다 조인은 조인 테이블이 만들어진다.
하지만 이 생성된 조인 테이블의 속성의 유연성이 현저히 떨어져 실무에선 쓰기 힘들다.
수업을 위해 만든 것.
Address
값 타입은 변경 불가능하게 설계해야 한다.
그래서 Setter를 만들지 않고, 생성자를 통한 초기화를 해야 한다.
JPA 스펙상 엔티티나 임베디드 타입 @Embeddable
은 자바 기본 생성자(default constructor)를 public 또는 protected 로 설정해야 한다. public 으로 두는 것 보다는 protected 로 설정하는 것이 그나마 더 안전 하다.
@Column :
DB에 올라갈 속성의 이름을 설정해준다. 주로 Id 속성에 많이 사용 되었는데, Id 속성은 많은 엔티티에 중복되어 선언되어 있으므로, 직관적으로 알아볼 수 있게 이름을 지정해준다.
@JoinColumn : 어느 테이블에 조인하는지 알려줘야 한다. 내가 조인할 테이블의 PK 속성을 지정해준다. 주로 연관관계의 주인에게 알려주며, 반대쪽은 자연스럽게 mappedby 속성으로 매핑된다.
fetch : @xxxToOne 조인은 fetchType.LAZY
로 지정할 것.
Enum : Enum을 사용할 때는 EnumType.STRING
사용
1:1 조인에서의 주인 : 1:1 조인에서는 외래키를 어디에 둘 것인지, 고민을 해야한다. 어디에 두든 장단점이 있으나, 일반적으로 자주 액세스가 될 쪽으로 잡는 것이 이득인 경우가 많다.
컬렉션은 필드에서 초기화 : 하이버네이트는 엔티티를 영속화 할 때, 컬랙션을 감싸서 하이버네이트가 제공하는 내장 컬렉션으로 변경한다. 만약 getOrders()
처럼 임의의 메서드에서 컬력션을 잘못 생성하면 하이버네이트 내부 메커니즘에 문제가 발생할 수 있다. 따라서 필드레벨에서 생성하는 것이 가장 안전하고, 코드도 간결하다.
Setter : Setter가 모두 열려있다. 변경 포인트가 너무 많아서, 유지보수가 어렵다. 나중에 리펙토링으로 Setter 제거, 위 내용은 수업이기 때문에 일부로 모두 Setter를 열어 둔 것!