영속성 전이, 고아 객체

2022. 3. 2. 20:44·개발/JPA
반응형

2023. 02.07 16:30 복습 시작

이번 시간에는 영속성 전이와 고아 객체에 대해 학습해보겠다.

영속성 전이 : CASCADE

특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만들고 싶으면 영속성 전이 기능을 사용해야 한다.

JPA는 CASCADE 옵션으로 영속성 전이를 제공한다.

쉽게 말해서 영속성 전이를 사용하면 부모 엔티티를 저장할 때 자식 엔티티도 함께 저장할 수 있다.

예를 들어 일대다 단방향 부모와 자식 연관 관계가 있다고 생각해보자.

코드는 아래와 같다. (부모 : 자식, 1 : N)

@Entity
public class Parent{
    @Id @GeneratedValue
    private Long id;

    @OneToMany(mappedBy = "parent")
    private List<Child> children = new ArrayList<Child>();
}

@Entity
public class Child{
    @Id @GeneratedValue
    private Long id;

    @ManyToOne
    private Parent parent;
}

만약 부모 1명에 자식 2명을 저장한다면 아래와 같은 코드를 작성해야 한다.

//부모 저장
Parent parent = new Parent();
em.persist(parent);

//1번 자식 저장
Child child1 = new Child();
child1.setParent(parent);
parent.getChildren().add(child1);
em.persist(child1);

//2번 자식 저장
Child child2 = new Child();
child2.setParent(parent);
parent.getChildren().add(child2);
em.persist(child2);

JPA에서 엔티티를 저장할 때 연관된 모든 엔티티를 영속 상태여야 한다.

따라서 부모, 자식 엔티티도 영속 상태로 만들어야 한다.

이럴 때 영속성 전이를 사용하면 부모, 자식 엔티티를 한 번에 영속 상태로 만들 수 있다.

 

이제 위 Parent 코드에 영속성 전이를 활성화하는 CASCADE 옵션을 적용해보자.

@Entity
public class Parent{

	@OneToMany(mappedBy = "parent", cascade = CascadeType.PERSIST) //이 부분을 추가
	private List<Child> children = new ArrayList<Child>();
}

부모를 영속화할 때 자식들도 함께 영속화하라고 cascade = CascadeType.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); //부모, 자식들 저장

아래는 CASCADE의 종류다.

 

  • ALL : 모두 적용
  • PERSIST : 영속
  • REMOVE : 삭제
  • MERGE : 병합
  • REFRESH : REFRESH
  • DETACH : DETACH

고아 객체

고아 객체 제거란 부모 엔티티와 연관 관계가 끊어진 자식 엔티티를 자동으로 삭제하는 기능이다.

고아 객체 제거 기능을 활용한 코드는 아래와 같다.

@Entity
public class Parent{
    @Id @GeneratedValue
    private Long id;

    @OneToMany(mappedBy = "parent", orphanRemoval = true) //고아 객체 제거 활성화
    private List<Child> children = new ArrayList<Child>();
}

고아 객체 기능을 활성화하기 위해 컬렉션에 orphanRemoval = true를 설정했다.

Parent parent1 = em.find(Parent.class, id);
parent1.getChildren().remove(0); //자식 엔티티를 컬렉션에서 제거

컬렉션에서 첫 번째 자식을 제거했다.

고아 객체 제거 옵션으로 인해 컬렉션에서 엔티티를 제거하면 DB의 데이터도 삭제된다.

고아 객체 제거 기능은 영속성 컨텍스트를 플러시 할 때 적용되므로 플러시 시점에 DELETE SQL이 실행된다.

 

고아 객체 내용을 정리해보자.

 

  • 고아 객체 제거란 참조가 제거된 엔티티는 다른 곳에서 참조하지 않는 고아 객체로 보고 삭제하는 기능이다.
  • 이 기능은 참조하는 곳이 하나일 때만 사용해야 한다. 즉 특정 엔티티가 개인 소유하는 엔티티에만 이 기능을 적용한다.
  • 만약 삭제한 엔티티를 다른 곳에서 사용하면 당연히 문제 발생.
  • @OneToOne, @OneToMany만 사용 가능.
  • 부모를 제거하면 자식은 고아가 된다. 따라서 이 기능을 쓰면 부모를 제거하면 자식들도 제거된다.

영속성 전이 + 고아 객체, 생명 주기

CascadeType.ALL + orphanRemoval = true를 동시에 사용한다면, 부모 엔티티를 통해 자식의 생명주기를 관리할 수 있다.

 

 

참고자료

자바 ORM 표준 JPA 프로그래밍 - 김영한

자바 ORM 표준 JPA 프로그래밍 강의 - https://www.inflearn.com/course/ORM-JPA-Basic/dashboard

 

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의

JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., - 강의 소개 | 인프런

www.inflearn.com

 

2023. 02.07 17:00 복습 및 정리 마무리

반응형
'개발/JPA' 카테고리의 다른 글
  • JPQL 기본 문법
  • 값 타임
  • 프록시, 즉시 로딩과 지연 로딩
  • 고급 매핑
Debin
Debin
공부 기록을 남기며 게시글 리팩토링을 진행하는 블로그입니다.
  • Debin
    리팩토링하는 블로그
    Debin
  • 전체
    오늘
    어제
    • 분류 전체보기
      • DB
        • DB 기초
        • MySQL
        • SQL 튜닝
      • OS
      • Network
      • Git
      • 디지털콘텐츠기획
      • 소프트웨어공학
      • 코딩테스트
        • 프로그래머스
        • 백준
        • 인프런
      • 공부 일지
      • 독서
        • 클린코드
        • 일상 속 사물이 알려주는 웹 API 디자인
        • 토비의 스프링
        • 객체지향의 사실과 오해
        • 자바 잘 읽는 법
      • 기록 및 회고
      • Cloud
        • AWS
      • 개발
        • Java
        • Spring Core
        • Spring MVC
        • Spring DB
        • Spring Boot
        • Spring Security
        • Spring Batch
        • JPA
        • Test
        • Android
      • 대외활동
        • UMC SERVER
        • 카엔프 SW 아카데미
      • 프로젝트
      • Docker
      • Gradle
      • ELK
      • 실무 이야기
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 깃허브
  • 공지사항

    • 본인 깃허브입니다!
  • 인기 글

  • 태그

    Java
    스프링
    코딩 #개발자 #노마드북클럽 #노개북
    AOP
    test
    도커
    컨테이너
    인덱스
    ORM
    SQL
    트랜잭션
    spring
    spring boot
    데이터베이스
    리눅스
    스프링 부트
    innodb
    mysql
    spring mvc
    container
    토비의 스프링
    객체
    객체지향
    JPA
    AWS
    docker
    프록시
    자바
    운영체제
    redis
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
Debin
영속성 전이, 고아 객체
상단으로

티스토리툴바