2022.08.27 TIL [자바 ORM 표준 JPA 프로그래밍]

서승원·2022년 8월 27일
0

TIL

목록 보기
68/68

Chapter 1.JPA 소개



의문점

  • persist(), 거의 쓴적이 없는 것 같은데 ?

persist()는 JPA에서 쓰레드 증가에 따라 EntityManagerFactory 에서 생성되는 EntityManager 의 메소드.

void persist(Object entity)
// Make an instance managed and persistent.

리턴 타입이 void로, 저장된 객체의 id, 객체 등이 리턴되지 않는다.

내가 평소에 많이 사용하던 save()는 Spring Data JPA에서 제공하는 CrudRepository의 메소드.

<S extends T> S save(S entity)
// Saves a given entity. Use the returned instance for further operations as the save operation might have changed the entity instance completely.

Spring Data JPA 역시 내부적으로 EntityManager를 사용하기 때문에 그 동작 방식은 동일하다고 볼 수 있다고 한다. 하지만 해당 Entity를 리턴하고, EntityManager와는 PersistentContext를 공유하지 않는다.

  • 지연로딩, FetchType ??

항상 @ManyToOne Annotation에 덧붙이지만 정확한 사용은 하지 않고있었던 것 같아서 든 의문, 책의 설명과 같은 방식으로 사용하고 있던 것은 맞았고, @ManyToOne 컬럼의 주인인 경우 사용이 가능하며, 로딩 시점에 FetchType이 LAZY인 객체는 프록시로 가져와서 실제 객체를 사용할 때 데이터베이스에 접근하여 조회하게 된다. 반대는 즉시로딩, FetchType=EAGER로, 1개의 쿼리로 인해 N개의 쿼리가 추가로 발생하는 N+1 Problem이 발생한다. default가 EAGER이기 때문에 실무에서는 일반적으로 LAZY로 사용하는 것이 효율적이다.

정리

  • 1장답게 간략한 소개, 실제로 많이 사용 중이라서 익숙하지만, 완전히 다가오지는 않던 개념들을 갈무리 하는 느낌.
  • 패러다임의 불일치. 재밌는 것 같다. 일단은.. JPA가 다른 두 언어, 패러다임 간의 통역사이자, 번거로운일을 대신 해주는 비서같은 느낌
profile
2년차 백엔드 개발자, crimy

0개의 댓글