Post

JPA 엔티티 매니저

엔티티 매니저에 대해 알아보고 JpaRepository와의 차이 파악하기

이때까지 아래처럼 JpaRepository를 사용해서 CRUD를 구현했었다.

1
2
3
public interface BookRepository extends JpaRepository<Book, Integer> {
    Optional<Book> findByIsbn(String isbn);
}

그런데 실전! 스프링 부트와 JPA 활용1 강의에서 엔티티 매니저를 사용하길래 이게 무엇인지 알아보고자 한다.


엔티티 매니저(EntityManager)와 JpaRepository는 둘 다 JPA(Java Persistence API)를 사용하여 데이터베이스와 상호작용하는 도구이지만, 사용 방식과 목적이 다르다.

엔티티 매니저란?

엔티티 객체의 라이프사이클을 관리하고 데이터베이스 작업을 수행하는 데 사용된다.

🤔 TODO 라이프사이클 관리란?

엔티티 매니저는 보다 낮은 수준의 API로, 다음과 같은 작업을 할 수 있다.

  • persist(): 엔티티를 데이터베이스에 저장
    • JpaRepository의 save인 것 같다. 아래에서 더 자세히 알아보자.
  • find(): 데이터베이스에서 엔티티를 조회
  • merge(): 엔티티 업데이트
  • remove(): 엔티티 삭제
  • JPQL: 엔티티 객체를 기반으로 한 쿼리 작성과 실행 지원

JpaRepository와의 차이점

추상화 수준

JpaRepository 는 더 높은 수준의 추상화를 제공하여 개발자가 데이터베이스 작업을 쉽게 수행할 수 있게 한다. 반면, 엔티티 매니저는 개발자가 직접 데이터베이스 작업의 세부 사항을 관리할 수 있다.

자동화

JpaRepository 를 사용하면 Spring Data JPA가 자동으로 리포지토리 메서드를 구현해 주며, 개발자는 단지 인터페이스만 정의하면 된다. 엔티티 매니저를 사용하면 개발자가 모든 데이터베이스 연산을 직접 구현해야 한다.

결론적으로, 엔티티 매니저와 JpaRepository 는 둘 다 JPA를 사용하는 방법이지만 단순한 CRUD 작업을 주로 할 경우 JpaRepository 를 사용하는 것이 편리하고 생산성이 높으며, 복잡한 쿼리나 트랜잭션 관리가 필요한 경우 엔티티 매니저를 사용하는 것이 적합할 수 있다.

이미 엔티티 매니저를 사용하고 있었다!

JpaRepository 인터페이스의 구현체 SimpleJpaRepository를 보면 save 메서드가 있는데, 이 코드에서 이미 엔티티 매니저의 persist를 사용하고 있었다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class SimpleJpaRepository<T, ID> implements JpaRepositoryImplementation<T, ID> {
    private static final String ID_MUST_NOT_BE_NULL = "The given id must not be null";
    private final JpaEntityInformation<T, ?> entityInformation;
    private final EntityManager entityManager;
    // ...
		@Transactional
		public <S extends T> S save(S entity) {
		    Assert.notNull(entity, "Entity must not be null");
		    if (this.entityInformation.isNew(entity)) {
		        this.entityManager.persist(entity);
		        return entity;
		    } else {
		        return this.entityManager.merge(entity);
		    }
		}
}

이를 통해 JpaRepositoryEntityManager 기반으로 만들어진 걸 알 수 있다.


그런데 엔티티 매니저 방식을 실무에서 더 많이 사용하는건가? 아직 8강까지밖에 못 본 상태인데, 왜 강의에서 엔티티 매니저를 선택했는지 궁금하다.

This post is licensed under CC BY 4.0 by the author.