본문 바로가기
개발자 일지/JPA

[JPA 기초] Entity와 EntityManager 개념, 관계

by 네빌링 2024. 9. 21.
반응형

JPA 기초 중에서도 Entity와 EntityManager에 대해 알아보려고 합니다. JPA는 실무에서 적극적으로 사용하지 않으면 배워도 금방 까먹게 되는데 이번 기회에 다시 공부해보려고 합니다. 작년 초까지 좀 공부하고 이후에 제대로 못했네요. 우선 개념별로 간단하게 공부해보고 심화 포스팅을 이어나가야겠습니다.

 

JPA-기초-썸네일

 

[목차]

 

[참고 블로그 포스팅]

Swagger와 Spring Data JPA를 활용한 예제 학습

Java ORM 표준 JPA 프로그래밍 정리1(김영한 강사님)

Java ORM 표준 JPA 프로그래밍 정리2(김영한 강사님)


1.Entity란

 

JPA에서 가장 많이 나오는 개념이 Entity(엔티티)입니다. ORM(객체-관계 매핑) 기술을 Java API로 구현한 JPA에서 Entity는 DB의 테이블과 대응되는 클래스입니다. Entity는 실제로 데이터베이스 관계 매핑을 위한 객체이기 때문에 테이블과 같이 pk, 타입 등을 정의하고 사용할 수 있습니다.

 

아래는 Entity 예제입니다.

 

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;

@Entity
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) // 기본 키 생성 전략
    private Long id; // 기본키(PK)

    private String name; // 사용자명
    private String email; // 사용자 이메일

    // 기본 생성자
    public User() {}

    // 생성자
    public User(String name, String email) {
        this.name = name;
        this.email = email;
    }

    // Getter 및 Setter 메서드
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

 

위에 코드에서 보듯 @Entity 어노테이션을 통해 해당 객체가 JPA의 Entity임을 나타냅니다. 그 외에 @Id, @GeneratedValue 등 어노테이션을 조합해서 테이블과 대응되도록 구성할 수 있습니다.

 

2.EntityManager란

 

EntityManager(엔티티매니저)는 Entity를 관리하는 객체입니다. 영속성 컨텍스트의 생성 및 관리, Entity의 생명주기(영속, 비영속, 준영속, 삭제)를 관리하고, 쿼리 실행, 트랜잭션 관리, 변경 감지, 캐싱, 단일 조회, 연관 관계 관리 등의 다양한 기능을 제공합니다. EntityManager는 JPA를 통해 데이터베이스와 객체 간의 매핑을 도와줍니다. 

 

여기서 영속성 컨텍스트, 영속, 비영속, 준영속, 삭제 등의 개념이나 변경 감지, 캐싱 등의 용어를 모두 풀어서 정의하면 글이 굉장히 길어지기 때문에 간단하게만 정의해보려고 합니다.

 

영속성 컨텍스트란 엔티티 상태를 관리하는 메모리 영역입니다. 엔티티의 생명주기를 관리하고 데이터베이스 반영 역할을 합니다.

 

그리고 생명주기에 대해 알아보자면, 

 

우선 비영속은 Entity가 EntityManager에 의해 관리되지 않는 단순 자바 객체입니다.

 

영속은 EntityManager의 persist() 메서드를 통해 관리하게 되며 캐싱, 변경 감지(Dirty Checking)의 대상이 됩니다. 그래서 속성을 바꾸면 변경 감지가 되어 명시적 업데이트(update)를 하지 않아도 됩니다.

 

준영속은 이전에 영속 상태였던 Entity로 지금은 영속 상태가 아닌 객체입니다. 그래서 엔티티 속성을 변경해도 데이터베이스에 자동적으로 반영되지 않습니다.

 

삭제는 remove()를 호출 후 트랜잭션을 커밋하면 영속성 컨텍스트가 더 이상 엔티티를 관리하지 않습니다. 즉, 준영속 상태가 됩니다.

 

간단한 예제를 보겠습니다.

 

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class UserService {

    //해당 어노테이션으로 내부적으로 EntityManagerFactory가 작동하고 EntityManager를 생성 및 관리해줌
    @PersistenceContext
    private EntityManager entityManager;

    @Transactional
    public void addUser(String name) {
        User user = new User(name);
        
        //persist()를 통해 User는 영속상태가 됨
        entityManager.persist(user);
    }

    // 다른 메서드들도 유사
}

 

3. Entity와 EntityManager의 관계

 

EntityManager는 Entity 객체 생성, 삭제, 조회 등을 할 수 있으며 이를 통해 데이터베이스 상태를 변경합니다. persist(), merge() 등을 사용해 Entity 상태를 컨트롤할 수 있습니다.


JPA 기초 개념인 Entity와 EntityManager에 대해 알아봤습니다. 사실 간단히 훑어본 정도이기 때문에 여러 중요한 내용들은 앞으로 공부하면서 포스팅해보려고 합니다.

 

감사합니다.

반응형