JPA ) 자바 ORM 표준 JPA 프로그래밍 - 8

GoRuth·2025년 4월 27일

JPA

목록 보기
8/8

프록시

  • 엔티티를 조회할 때, 연관된 엔티티들이 항상 사용되는 것은 아님
    -> DB에서 함께 조회해두는 것은 비효율!
  • 해당 문제 해결을 위해 엔티티가 실제 사용 전까지 DB 조회를 지연하는 방법 제공
    -> 지연 로딩!
  • 지연로딩을 사용하기 위해서는 조회 지연을 위한 가짜 객체가 필요
    -> 프록시 객체

특징


초기화

Member member = em.getReference(Member.class, "id1");
member.getName();

**내부 예상 로직**
1. 초기화 요청
2. DB 조회
3. 실제 Entity 생성 및 참조 보관
4. 실제 값 return

프록시와 식별자

  • 엔티티를 프록시로 조회 시, 식별자 값을 파라미터로 전달
    -> 프록시 객체는 해당 식별자값을 보관

💡 연관관계 설정할 때는 식별자 값만 사용하므로 프록시를 사용하면 DB 접근 횟수를 줄일 수 있다.

즉시로딩, 지연로딩

개념

  • 즉시로딩
    • 엔티티를 조회할 때 연관된 엔티티도 함께 조회.
    • @ManyToOne(fetch = FetchType.EAGER)
  • 지연로딩
    • 연관된 엔티티를 실제 사용할 때 조회.
    • @ManyToOne(fetch = FetchType.LAZY)

즉시로딩

SELECT
 M.MEMBER_ID AS MEMBER_ID,
 M.TEAM_ID AS TEAM_ID,
 M.USERNAME AS USERNAME,
 T.TEAM_ID AS TEAM_ID,
 T.NAME AS NAME
FROM
 MEMBER M LEFT OUTER JOIN TEAM T
 ON M.TEAM_ID=T.TEAM_ID
WHERE
 M.MEMBER_ID='member1'

지연로딩

유의점

Lazy 로딩되는 Entity에 즉시 로딩이 있다면 해당 Entity도 로딩!

  • Porxy 객체는 실제 자신이 사용될 때까지 DB를 조회하지 않음
  • 컬랙션 래퍼
    • 하이버네이브는 Entity를 영속 상태로 만들 때, Entity에 컬랙션이 있으면 컬랙션 추적 및 관리 목적으로 하이버네이트로의 내장 컬랙션으로 변경
    • 지연로딩 시, 컬랙션은 컬랙션 래퍼가 지연 로딩 처리

JPA 기본 전략

  • ManyToOne, OneToOne (즉시로딩)
  • OneToMany, ManyToMany (지연로딩)

💡 추천은 모든 연관관계를 지연로딩 후, 상황에 따라서 변동!

즉시로딩 시, 주의점

  1. 컬렉션 하나 이상 즉시 로딩은 권장 ❌
  2. 컬렉션 즉시 로딩은 항상 외부조인!

영속성 전이

  • 특정 엔티티를 영속 상태로 만들 때, 연관된 엔티티도 함께 영속 상태로 만들고 싶을 때 사용함

  • JPA에서는 엔티티를 저장할 때, 연관된 모든 엔티티는 영속 상태여야 함

    • 영속성 전이 ❌ : 부모 영속 후 자식도 각각 영속으로 만들어야 했음
    • 영속성 전이 ⭕ : 부모 영속만 영속상태로 만들어도 자식도 영속상태가 됨

CASCADE 옵션

  • ALL, // 모두 적용
  • PERSIST, // 영속
Child child1 = new Child();
Child child2 = new Child();

Parent parent = new Parent();
child1.setParent(parent);
child2.setParent(parent);

parent.getChildren().add(child1);
parent.getChildren().add(child2);

//부모 저장, 연관된 자식들 저장
em.persist(parent);
  • MERGE, // 병합
  • REMOVE, // 삭제
Parent findParent = em.find(Parent.class, 1L);
부모와 연관 자식도 모두 제거
em.remove(findParent);
  • REFRESH,
  • DETACH

고아객체

  • JPA는 부모 엔티티와 연관관계가 끊어진 자식 엔티티를 자동으로 삭제하는 기능을 제공
    -> orphanRemoval = true

💡 참조하는 곳이 하나일 때만 사용해야 함!
💡 @OneToMany에만 사용 가능

영속성 전이 + 고아객체 -> 생명주기 Controll

  • 일반적으로 엔티티는 persist로 영속, remove를 통해 제거
    -> 엔티티 스스로 생명주기를 관리한다는 뜻!

  • CascadeType.ALL + orphanRemoval = true
    -> 부모 엔티티를 통해서 자식의 생명주기를 관리할 수 있다는 뜻

profile
Backend Developer

0개의 댓글