실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
강의를 들으며 생각 정리 + "자바 ORM 표준 JPA 프로그래밍" 책 참고
요구사항 분석
회원, 주문, 배송 기능을 갖는 쇼핑몰 프로그램을 개발한다.
기능 목록
- 회원 기능
- 회원 등록
- 회원 조회
- 상품 기능
- 상품 등록
- 상품 수정
- 상품 조회
- 주문 기능
- 상품 주문
- 주문 내역 조회
- 주문 취소
도메인 모델과 테이블 설계
엔티티 설계
테이블 설계
엔티티 클래스 개발
엔티티 클래스를 설계한 코드를 깃허브에 등록했다.(domain 디렉토리)
엔티티 설계시 주의점
- 엔티티에는 가급적 Setter를 사용하지 말자. 최대한 수정이 될 가능성을 열어 놓지 않는게 좋다. 수정일 필요할 때는 편의 메서드를 따로 만들자. (이번 프로젝트에서는 편의를 위해 사용했다)
- 모든 연관관계는 지연로딩으로 설정하자. 즉시로딩은 N+1문제가 있고 어떤 SQL이 실행될지 예측이 어렵다. 기본적으로 지연로딩을 사용하고 필요에 따라 fetch join을 사용하자.
- 컬렉션은 필드에서 초기화하자.
Member member = new Member();
System.out.println(member.getOrders().getClass());
em.persist(member);
System.out.println(member.getOrders().getClass());
//출력 결과
class java.util.ArrayList
class org.hibernate.collection.internal.PersistentBag
하이버네이트는 엔티티를 영속화 할 때, 컬랙션을 감싸서 하이버네이트가 제공하는 내장 컬렉션으로 변경한다. 만약 필드에서 컬렉션을 초기화하지 않고 setter 등을 통해 잘못된 컬렉션을 저장하면 하이버네이트 내부 메커니즘에 문제가 발생할 수 있다. 따라서 필드레벨에서 생성하는 것이 가장 안전하고, 코드도 간결하다.
'java > jpa' 카테고리의 다른 글
[JPA] 회원 도메인 개발 (0) | 2021.02.12 |
---|---|
[JPA] 애플리케이션 구현 준비 (0) | 2021.02.11 |
[JPA] 프로젝트 환경설정 (0) | 2021.02.10 |
[JPA] 객체지향 쿼리 언어2 - 중급 문법 (0) | 2021.02.08 |
[JPA] 객체지향 쿼리 언어1 - 기본 문법 (0) | 2021.02.03 |