성장일기

내가 보려고 정리하는 공부기록

백엔드/JPA

[JPA] 강의 추가학습 기록(3) - 스프링부트와 JPA활용1

와나나나 2024. 3. 1. 01:48
728x90

인프런 김영한 강사님의 스프링부트와 JPA활용1 강의를 듣고 추가로 학습한 내용을 정리한 게시물입니다.

 

지난 게시물과 마찬가지로 강의를 들으면서 이해하지 못했던 것들을 기록하며 공부해보려고 한다. 

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-JPA-%ED%99%9C%EC%9A%A9-1

 

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발 강의 - 인프런

실무에 가까운 예제로, 스프링 부트와 JPA를 활용해서 웹 애플리케이션을 설계하고 개발합니다. 이 과정을 통해 스프링 부트와 JPA를 실무에서 어떻게 활용해야 하는지 이해할 수 있습니다., 스프

www.inflearn.com

 

추가학습 내용은 다음과 같다.

  1. Entity Manager에 대하여
  2. cascadeType이란?
  3. 알아둬야 할 거 (Exception 테스트 관련)

1. Entity Manager에 대해

Entity Manager는 JPA에서 엔터티를 저장, 수정, 삭제 , 조회 등 엔터티와 관련된 모든 일을 처리하는 역할을 한다. 또, 영속성 컨텍스트를 통해 (PersistenceContext) 데이터의 상태 변화를 감지하고 필요한 쿼리를 자동으로 수행한다!

 

Entity Manager 내부에 Persistence Context를 두어서 엔터티를 관리하는 구조이다.

 

여기서 영속성은 비휘발성과 같은 뜻으로 영구저장 한다는 뜻으로 받아들이면 될 것 같다.

 

 

EntityManagerFactory

Entity Manager에 대해 찾아보다보니, EntityManagerFactory라는 것도 있었다. 

엔터티 매니저는 여러 스레드가 동시에 접근하면 동시성 문제가 발생하기 때문에 스레드 간 공유를 하면 안 된다. 한 개의 엔터티 매니저를 계속 쓰는 것이 아니라, 상황에 따라 (스레드마다) 엔터티 매니저를 계속 생성해야 하는데, 이 역할을 해주는 게 EntityManagerFactory라고 한다.

 

 

Entity Manager 메소드

메소드 중에서 자주 쓰는 거 같은 메소드를 간단하게 정리하려 한다.

 

  • find()
    • 영속 컨텍스트에서 엔터티를 검색한다. 없을 경우엔 DB에서 데이터를 찾아 영속 컨텍스트에 저장한다.
  • persist()
    • INSERT쿼리를 실행하는 메소드라고 보면 된다.
    • 트랜잭션 범위 내에서 실행해야한다.
  • remove()
    • 엔터티클래스를 영속 컨텍스트에서 삭제 후 DELETE 쿼리 실행
    • 마찬가지로 트랜잭션 범위 내에서 실행

 


2. cascadeType?

 

영속성 전이

어떤 Entity를 영속성 컨텍스트에 등록할 때, 연관 객체도 함께 등록하는 기능이다. 

Ex ) 부모 Entity를 영속성 컨텍스트에 저장할 때, 자식 Entity도 함께 저장되도록 하는 것

 

맵핑관계 (@OneToMany, @ManyToMany등)에 CascadeType을 지정해서 사용한다.

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

 

cascade를 사용하면, Parent객체를 persist() 할 때, 연관 객체를 모두 등록한다.

 

Cascade 대표 옵션

  • CascadeType.ALL
    • 모든 연관 객체를 영속화
    • 가장 많이 사용
  • CascadeType.PERSIST
    • 연관 객체 등록할 때만 Cascade 옵션 적용
    • 영속화 객체를 삭제할 땐 Cascade 옵션 작동 X
  • CascadeType.REMOVE
    • 어떤 객체를 삭제 (비영속화) 할 때, 모든 연관 객체를 함께 삭제

 

 

그러나 잘 모르면 안 쓰는 게 낫다고 하셨다!

 


3. 알아둘 거

이건 그냥 개인 기록..

 

테스트 할 때 에러가 뜨는 걸 체크할 경우 @Test(expected = ~) 는 이제 지원하지 않기 때문에 assertThrow(Exception명, () -> 조건) 으로 테스트코드를 작성해야 함!

 


24.2.25 추가학습 기록 끗