본문 바로가기

SPRING/Spring

[스프링| 스프링 입문 | 코드로 배우는 스프링] JPA

package hello.hellospring.repository; // 패키지 선언

import hello.hellospring.domain.Member; // Member 도메인 클래스 임포트
import jakarta.persistence.EntityManager; // JPA의 EntityManager 임포트

import java.util.List; // List 컬렉션 임포트
import java.util.Optional; // Optional 클래스 임포트

public class JpaMemberRepository implements MemberRepository{ // MemberRepository 인터페이스를 구현하는 JpaMemberRepository 클래스 선언

    private final EntityManager em; // EntityManager 인스턴스를 저장할 필드 선언, final로 선언되어 생성자에서만 초기화 가능

    public JpaMemberRepository(EntityManager em) { // 생성자, EntityManager를 주입받음
        this.em = em;
    }

    @Override
    public Member save(Member member) { // 회원 정보를 저장하는 메소드
        em.persist(member); // EntityManager를 사용하여 member 엔티티를 영속화
        return member; // 저장된 member 반환
    }

    @Override
    public Optional<Member> findById(Long id) { // ID를 이용해 회원을 찾는 메소드
        Member member = em.find(Member.class, id); // EntityManager의 find 메소드로 ID에 해당하는 Member 엔티티 조회
        return Optional.ofNullable(member); // 조회된 Member 객체를 Optional로 감싸서 반환
    }

    @Override
    public Optional<Member> findByName(String name) { // 이름으로 회원을 검색하는 메소드
        List<Member> result = em.createQuery("select m from Member m where m.name = :name", Member.class)
                .setParameter("name", name) // 쿼리에 파라미터 바인딩
                .getResultList(); // 결과 리스트 가져오기
        return result.stream().findAny(); // 결과 리스트에서 첫 번째 요소를 Optional로 반환
    }

    @Override
    public List<Member> findAll() { // 모든 회원 조회 메소드
        return em.createQuery("select m from Member m", Member.class).getResultList(); // JPQL을 사용해 모든 Member 조회 후 리스트로 반환
    }
}

JPA (Java Persistence API) 기능 설명

1. EntityManager: JPA의 중심이 되는 부분으로, 엔티티의 생명주기를 관리합니다. 엔티티를 저장, 수정, 삭제, 조회 등의 작업을 할 때 사용합니다.

2. 영속성 컨텍스트: EntityManager를 통해 엔티티들이 관리되는 내부적인 환경입니다. 엔티티를 영구 저장하는 환경으로 이해할 수 있으며, 이 공간을 통해 엔티티의 동일성과 트랜잭션을 보장받을 수 있습니다.

3. JPQL (Java Persistence Query Language): SQL을 추상화한 객체 지향 쿼리 언어입니다. 엔티티 객체를 대상으로 쿼리를 수행할 수 있어 데이터베이스 구조의 변경이 엔티티 코드에 미치는 영향을 줄일 수 있습니다.

4. 트랜잭션 관리: JPA는 선언적 트랜잭션 관리를 지원하여, 트랜잭션의 시작과 종료를 자동으로 관리할 수 있게 해줍니다. 이는 코드의 신뢰성과 일관성을 높여줍니다.

5. CRUD 작업의 간소화: EntityManager의 메소드들을 통해 CRUD 작업을 간편하게 수행할 수 있습니다. persist(), find(), merge(), remove() 메소드 등이 이에 해당합니다.

 

EntityManager

EntityManager는 Java Persistence API (JPA)의 핵심 컴포넌트 중 하나로, 애플리케이션과 데이터베이스 사이의 상호작용을 관리하는 역할을 합니다. EntityManager를 통해 엔티티의 생명주기를 관리하며, 엔티티들이 데이터베이스에 영속화(persist), 조회(find), 업데이트(merge), 삭제(remove)되는 과정을 총괄합니다. 주요 기능과 작동 원리를 상세히 설명하겠습니다.

엔티티 매니저의 주요 기능

  1. 영속성 관리: 엔티티를 영속성 컨텍스트에 저장, 관리합니다. 영속성 컨텍스트는 엔티티를 일시적으로 저장하며, 트랜잭션이 완료될 때까지 엔티티의 상태를 관리하고, 트랜잭션이 종료되면 이 변경사항을 데이터베이스에 반영합니다.
  2. 트랜잭션 관리: EntityManager는 트랜잭션의 시작과 종료를 관리할 수 있습니다. begin(), commit(), rollback() 메소드를 사용하여 데이터베이스 트랜잭션을 제어합니다.
  3. 쿼리 실행: EntityManager는 JPQL(Java Persistence Query Language) 또는 Criteria API를 사용하여 데이터베이스에 쿼리를 실행할 수 있습니다. 이를 통해 복잡한 조회를 수행하고 다양한 조건에 따른 데이터 처리가 가능합니다.
  4. 엔티티 상태 전환: persist(), merge(), remove(), detach() 등의 메소드를 통해 엔티티의 상태를 제어할 수 있습니다. 예를 들어, persist() 메소드는 새로운 엔티티를 영속 상태로 만들며, remove()는 엔티티를 삭제 상태로 전환합니다.

엔티티 매니저의 작동 원리

EntityManager의 가장 중요한 개념은 영속성 컨텍스트입니다. 영속성 컨텍스트는 엔티티를 일시적으로 저장하는 장소로, 엔티티의 상태를 관리하고 JPA의 다양한 생명주기 이벤트를 처리합니다. 이 컨텍스트 내에서 엔티티들은 다음과 같은 상태를 갖습니다:

  • 비영속 (New): 영속성 컨텍스트와 관계없이 새로 생성된 상태
  • 영속 (Managed): 영속성 컨텍스트에 저장된 상태
  • 분리 (Detached): 영속성 컨텍스트에 저장되었다가 분리된 상태
  • 삭제 (Removed): 삭제를 위해 표시된 상태

EntityManager는 이러한 상태의 엔티티에 대해 적절한 데이터베이스 작업을 수행합니다. 예를 들어, 트랜잭션이 커밋될 때 영속 상태의 엔티티는 데이터베이스에 반영됩니다. 분리된 엔티티는 영속성 컨텍스트의 관리를 받지 않으므로, 변경 사항이 데이터베이스에 자동으로 반영되지 않습니다.

EntityManager와 영속성 컨텍스트의 이러한 관리는 데이터베이스 작업의 일관성을 유지하고, 데이터 접근을 최적화하는 데 중요한 역할을 합니다. 이는 애플리케이션의 성능을 향상시키고, 복잡한 트랜잭션 관리를 간소화하는 데 기여합니다.