회원 기능
회원 등록
회원 조회
상품 기능
상품 등록
상품 수정
상품 조회
주문 기능
상품 주문
주문 내역 조회
주문 취소
기타 요구사항
상품은 제고 관리가 필요
상품의 종류는 도서, 음반 영화
상품을 카테고리로 구분 가능
상품 주문시 배송 정보를 입력할 수 있다.
회원-주문-상품 관계 : 회원은 여러 상품을 주문 가능, 한 번 주문할 때 여러 상품 선택 가능
jpa 에서 @manytomany 사용하지 않기
@onetomany,@manytoone 으로 풀어내기
회원과 주문 : 주문에서 fk 를 가짐, 일대다 에서는 다가 fk를 가짐
주문과 아이템 : 아
외래 키가 있는 곳을 연관관계의 주인으로 정해라
실무에서는 가급적 Getter는 열어두고 Setter는 꼭 필요한 경우에만 사용
@OneToOne 같은 경우에는 fk를 어디에 둬도 상관 없음
자주 access 하는 곳에 두면 좋음
ManyToMany 쓰면 가능은 하지만 필드를 더 추가하고 그런것이 안됨
등록한 날짜나 그런거 추가해주는 것이 안됨
@Setter 대신 생성자에서 초기화 해주는 것이 좋음
JPA 스펙상 자바 기본 생성자를 protected로 만들어 줘야함 (public 도 가능하지만 다른곳에서 호출 막 못하도록 하기 위함)
엔티티에서는 앵간하면 Setter 사용 금지
Setter가 열려있으면 변경포인트가 많아서 유지 보수가 어렵다
모든 연관관계는 지연로딩으로 설정
즉시로딩(EAGER)(조회시 연관된 엔티티 다 가져오는 것)은 예측이 여렵고 어떤 SQL이 실행될지 추적하기 어려움
특히 JPQL(jpa가 제공하는 쿼리)을 실행할때 N+1문제가 자주 발생함
연관된 엔티티를 함께 DB에서 조회해야하면 fetch join 또는 엔티티 그래프 기능을 사용
@OneToOne, @ManyToOne 은 디폴트 값이 EAGER이므로 따로 (fetch = FetchType.LAZY) 로 설정해줘야 한다.
컬렉션은 필드에서 초기화
컬렉션은 필드에서 바로 초기화 하는 것이 안전하다
null문제에서 안전하고
하이버네이트는 엔티티를 영속화 할 때, 컬랙션을 감싸서 하이버네이트가 제공하는 내장 컬렉션으로 변경한다. 따라서 필드가 아닌 생성자나 다른 메서드에서 초기화를 하게 되면 하이버네이트 내부 메커니즘에 문제가 발생할 수 있다.
테이블, 컬럼명 생성 전략
기존의 하이버네이트에서는 기본적으로 엔티티의 필드명을 그대로 테이블 명으로 사용했음
스프링 부트 신규 설정은 자바의 카멜케이스를 스네이크케이스로 바꾸고 .을 _으로 대문자는 소문자로 바꾼다