스프링 부트와 JPA 활용1 - 도메인 분석 설계 4 & 영속성 컨텍스트

JOY·2022년 3월 23일
0
post-thumbnail

📌 스프링 부트와 JPA 활용1 - 도메인 분석 설계 4 & 영속성 컨텍스트

인프런 - 스프링 부트와 JPA 활용1 by 김영한 을 기반으로 작성된 글입니다.
실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발


도메인 분석 설계 목차

1. 요구사항 분석

2. 도메인 모델과 테이블 설계

3. 엔티티 클래스 개발1

4. 엔티티 클래스 개발2

5. 엔티티 설계시 주의점


도메인 분석 설계

5. 엔티티 설계시 주의점

1) 엔티티에는 가급적 setter 사용하지 말자

변경포인트가 많으면 유지보수가 어렵다

2) 모든 연관관계는 지연 로딩으로 설정하자

실무에서 즉시 로딩을 사용하지 말자

  • 엔티티 조회 시점 선택
  1. 즉시 로딩 (EAGER LOADING)
    @ManyToOne(fetch = FetchType.EAGER) , @OneToOne(fetch = FetchType.EAGER)
    엔티티를 조회 시 연관된 엔티티도 함께 조회
    JPQL을 실행할 때 N+1 문제 자주 발생
  1. 지연 로딩 (LAZY LOADING)
    @ManyToOne(fetch = FetchType.LAZY) , @OneToOne(fetch = FetchType.LAZY)
    연관된 엔티티 실제 사용 시 조회
    즉, 해당 클래스만 DB에서 조회가 가능

@ManyToOne @OneToOne 의 default는 즉시 로딩 👉 직접 지연 로딩 설정
@OneToMany @ManyToMany 의 default는 지연 로딩

3) 컬렉션은 필드에서 초기화 하자

NullPointerException 문제에서 안전
하이버네이트가 영속화 하여 하이버네이트가 관리하는 내장 컬렉션으로 변경
👉 하이버네이트 내부 매커니즘에 문제 발생
이럴때는?! 해당 커넥션을 객체 생성시 초기화 하고 변경하지 않는 것이 안전

💻 코드1

private List<Order> orders;    
    public Member(){
        orders = new ArrayList<>();
    }

💻 코드2

private List<Order> orders = new ArrayList<>();

코드1처럼 사용하지 말고 코드2 처럼 사용하는 것이 안전

4) 테이블, 컬럼명 생성 전략

  • 하이버네이트 기존 구현 : 엔티티의 필드명을 그대로 테이블의 컬럼명으로 사용 SpringPhysicalNamingStrategy
  • 스프링 부트 신규 설정 (엔티티(필드) 👉 테이블(컬럼))
  1. 카멜 케이스 언더스코어(memberPoint 👉 member_point)
  2. .(점) _(언더스코어)
  3. 대문자 소문자

추가 코드 (Order.java)

1) cascade

  • 엔티티 당 각각 persist 호출 해야 한다
    그러나 cascade를 입력하면
    컬렉션에 있는 모든 엔티티들을 한번에 persist 해준다

💻 코드 (Order.java)

public class Order {
	/*(생략)*/

    @OneToMany(mappedBy = "order", cascade = CascadeType.ALL)
    private List<OrderItem> orderItems = new ArrayList<>();

    @OneToOne(fetch = LAZY, cascade = CascadeType.ALL )
    @JoinColumn(name="delivery_id")
    private Delivery delivery;

2) 연관 관계 메서드

💻 코드 (Order.java)

    public void setMember(Member member) {
        this.member = member;
        member.getOrders().add(this);
    }

    public void addOrderItem(OrderItem orderItem){
        orderItems.add(orderItem);
        orderItem.setOrder(this);
    }

    public void setDelivery(Delivery delivery){
        this.delivery = delivery;
        delivery.setOrder(this);
    }

3) 연관 관계 메서드

💻 코드 (Category.java)

    public void addChildCategory(Category child){
        this.child.add(child);
        child.setParent(this);

💡 영속성 컨텍스트가 무엇인데?

영속화 된다는 말이 잘 이해가 되지 않아 뜻을 정확하게 정리하기 위해 찾아보았다
간단하게 정리해보자!

영속성 컨텍스트 (Persistence Context) : 영속성 + 컨텍스트

  • 영속성 : 어떤 데이터를 영구적으로 저장
  • 컨텍스트 : 저장소
    간단하게 정리해서 Entity를 영구적으로 저장해주는 저장소 라고 생각하자!

영속성 컨텍스트는 엔티티 매니저를 통해 접근 할 수 있다
EntityManagerFactory 에서 생성된 EntityManager
Entity를 관리 할 때 영속성 컨텍스트에 엔티티를 보관하고 관리한다

엔티티 생명주기

EntityManager 메소드 이용

  • 영속 : 영속성 컨텍스트에 Entity가 저장되어 관리되는 상태 - persist(), find()
  • 비영속 : 영속성 컨텍스와 관계가 없는 상태
  • 준영속 : 영속 상태 엔티티를 영속성 컨텍스트에서 제거한 상태 - detach()
  • 삭제 : Entity를 영속성 컨텍스트와 DB에서 제거한 상태 - remove()
profile
Just Do IT ------- 🏃‍♀️

0개의 댓글