(JPA) Entity와 EntityManager와 EntityManagerFactory

Entity

DB의 테이블과 매칭이 되는 개념이라고 보면 된다.그렇다면 왜 이름이 Table이 아니라 Entity일까…?

만약 DB에 member라는 테이블이 있고, 해당 테이블의 스키마가 아래와 같다고 해보자.

CREATETABLE `Member` (
  `id` BIGINT(20) unsignedNOTNULL AUTO_INCREMENT,
  `name` varchar(255)NOTNULL,
  `age` int(11)NOTNULL,
  PRIMARY KEY (`id`)
)

그렇다면 엔티티는 아래와 같이 만들 수 있다.

@Entity
publicclassMember {
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column(nullable = false)
	privatelong id;
	
	@Column(nullable = false)
	private String name;
	
	@Column(nullable = false)
	privateint age;

	publiclonggetId() {
		return id;
	}
	
	publicvoidsetId(long id) {
		this.id = id;
  }
	
	public StringgetName() {
		return name;
  }
	
	publicvoidsetName(String name) {
		this.name = name;
  }
	
	publicintgetAge() {
		return age;
  }
	
	publicvoidsetAge(int age) {
		this.age = age;
  }
}

기본적으로 JPA는 모든 필드를 불러오게 끔 구현돼있다.하지만 모든 케이스에서 id, name, age 필드를 다 다루지 않는다.어떤 경우에는 id, name 필드만 다루는 경우도 있을 수 있다.그런 경우에 대비해서 다음과 같이 엔티티 클래스를 하나 더 만들 수 있다.

@Entity
@Table(name = "Member")
publicclassMemberOnlyName {
  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  @Column(nullable = false)
	privatelong id;

  @Column(nullable = false)
	private String name;

	publiclonggetId() {
		return id;
	}
	
	publicvoidsetId(long id) {
		this.id = id;
	}
	
	public StringgetName() {
		return name;
	}
	
	publicvoidsetName(String name) {
		this.name = name;
	}
}

따라서 테이블은 한 개지만, 엔티티는 경우에 따라서 여러 개를 만들 수 있다.혹은 JPA를 좀 더 잘 다룬다면 하나의 엔티티로도 충분히 커버를 할 수 있기도 하다.

EntityManager

위에 언급한 엔티티를 관리하는 역할을 수행하는 클래스이다.그럼 어떤 방식으로 엔티티 매니저는 엔티티들을 관리할까?엔티티 매니저 내부에 **영속성 컨텍스트(Persistence Context)**라는 걸 두어서 엔티티들을 관리한다.

영속성 컨텍스트(Persistence Context)

https://perfectacle.github.io/2018/01/14/jpa-entity-manager-factory/entity-manager.png

영속성: 기본적으로 컴퓨터 공학에서 영속성이라고 하면 비휘발성이라고 보면 될 것 같다.휘발성은 프로그램이 꺼지거나 전원이 나가면 데이터가 날아가는 경우를 휘발성이라 하고, 그 반대가 비휘발성이다.하지만 휘발성과 비휘발성 이란 단어는 저장 장치(메인 메모리나 플래시 메모리 등등)의 특징을 나타낼 때 많이 쓰고,영속성이란 단어는 DB에 관해 설명할 때 많이 사용하는 것 같다.

컨텍스트: 직역하면 맥락, 문맥이란 뜻인데 프로그래밍 쪽에선 좀 다른 뜻으로 쓰이는 것 같다.내가 알기로는 하나의 환경, 공간? 쯤으로 이해하고 사용하고 있다.

영속성 컨텍스트는 엔티티를 영구히 저장하는 환경이다. 출처: 자바 ORM 표준 JPA 프로그래밍(김영한 저) 92P, 3.2 영속성 컨텍스트란?

하지만 개발자가 직접 영속성 컨텍스트를 뜯어보거나 그 내부를 들여다 볼 수는 없어서 약간은 논리적이거나 추상적인 개념으로 바라봐야한다.

여러 엔티티 매니저가 하나의 영속성 컨텍스트를 공유할 수도 있다고 한다.그리고 영속성 컨텍스트를 책의 저자는 엔티티를 영구히 저장하는 환경이라고 했는데 내가 봤을 때는 영속성 컨텍스트를 관리하는 모든 엔티티 매니저가 초기화 및 종료되지 않는 한 엔티티를 영구히 저장하는 환경 이라고 정정해야할 것 같다. 그냥 영구히 저장 된다고 하면 프로그램을 껐다 켜도 영속성 컨텍스트는 항상 살아 있을 것 같다는 생각이 든다. 하지만 프로그램을 끄기도 전에 엔티티 매니저를 초기화 및 종료 시키는 코드를 만나면 해당 영속성 컨텍스트는 소멸된다.

엔티티 매니저와 영속성 컨텍스트의 엔티티 관리