Programming/JPA & Spring Data JPA 기초

03. 엔티티 단위 CRUD 처리

JKROH 2023. 2. 21. 16:38
반응형
해당 강의는 코드 위주로 진행됩니다. 실질적인 객체 처리를 담당하는 코드는 링크에서 확인하시길 바랍니다.

* 시작전에 보조 클래스 만들기

  • EntityManagerFactory를 static으로 담고있는 EMF 클래스를 생성한다.
  • EMF 내에 init()메소드를 통해 초기화, close()를 통해 emf를 닫는다.
  • EntityManager가 필요할 때는 createEntityManager() 메소드를 통해 생성한다.

* 엔티티 단위 CRUD 처리

- EntityManager가 제공하는 메소드 이용

  • persist()
  • find()
  • remove()
  • merge()

 

* 저장

- EntityManager#persist(Object entity)

  • persist()는 @Entity로 매핑한 객체를 인자로 받는다
  • NewUserService 객체에서는 EM을 만들고 트랜잭션을 시작한 뒤 유저를 저장(persist)하고 커밋한다.

 

* 조회

- EntityManager#find(Class<T> entityClass, Object parimaryKey)

  • find()는 특별한 식별자를 갖는 객체를 찾을 때 사용한다.
  • Class 는 @Entity로 매핑한 클래스가 된다.
  • primariKey는 식별자에 해당하는 값을 전달한다.
  • 'em.find(User.class, email)' 코드는 User와 매핑된 테이블에서 id가 email인 데이터를 읽어와서 user로 반환한다.
  • 이 때 null인지의 여부를 판단해야 한다.
  • 이 때 Entity로 매핑하지 않은 클래스를 첫 번째 parameter로 전달하거나 @Id로 매핑한 식별자 타입과 같지 않은 값을 두 번째 parameter로 전달하면 예외가 발생한다.
    • String str = em.find(String.class, "1");
    • User user = em.find(User.class, 11);

 

* 수정

- 트랜잭션 범위 내에서 변경된 값을 자동 반영

  • 영속 컨텍스트는 트랜잭션 범위(tx.begin() ... tx.commit()) 내에서 유지된다.
  • DB에서 find()메소드를 통해 객체를 읽어오고 해당 객체의 상태를 변경하면 트랜잭션 커밋 시 변경된 값이 자동으로 DB에 반영된다.

 

* 삭제

- EntityManager#remove(Object entity)

  • remove()메소드에 find()메소드로 읽어온 객체를 전달하면 삭제가 가능하다.
  • find()로 읽어오지 않은 객체를 전달하면 에러가 발생한다.
  • 트랜잭션 범위 외에서 remove()를 전달해도 에러가 발생한다.

- 삭제 대상이 존재하지 않으면

  • 찾아온 user 객체를 remove()에 전달했는데 커밋하기 이전에 다른 process가 해당하는 객체를 DB에서 삭제하면 예외가 발생한다.
  • 따라서 예외 처리를 통해 내가 삭제를 시도하려는 데이터가 없을 때에 대비할 수 있다.

 

* 정리

  • EntityManager를 사용해서 Entity 단위로 CRUD 처리
  • 변경은 트랜잭션 범위 안에서 실행
    • persist()
    • 수정
    • remove()
반응형