DBMS 에도 여러 종류가 있는 것처럼 ORM에도 여러 종류가 있습니다.
자바에서는 JPA(java persistence API) 를 표준으로 사용합니다.
JPA 는 자바에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스 인데요, 인터페이스이므로 실제 사용을 위해서는 ORM 프레임워크 를 추가로 선택해야 합니다.
대표적으로는 하이버네이트(hibernate) 를 많이 사용하죠. 하이버네이트는 JPA 인터페이스를 구현한 구현체이자 자바용 ORM 프레임워크 입니다.내부적으로 JDBC API 를 사용하죠...
하이버네이트의 목표는 자바 객체를 통해 데이터베이스 종류에 상관없이 데이터베이스를 자유자재로 사용할 수 있게 하는 데 있습니다.
- JPA(Java Persistence API) : 자바 객체와 데이터베이스를 연결해 데이터를 관리합니다. 객체 지향 도메인 모델과 데이터베이스의 다리 역활을 합니다.
- 하이버네이트(Hibernate) : JPA의 인터페이스를 구현합니다. 내부적으로는 JDBC API를 사용합니다.
JPA와 하이버네이트에 대해서 알아보았으니, JPA의 중요한 컨셉 중 하나인 엔티티 매니저와 영속성 컨텍스트를 알아보자.
- 엔티티
엔티티(Entity)는 데이터베이스의 테이블과 매핑되는 객체를 의미합니다. 엔티티는 본질적인 자바 객체이므로 일반 객체와 다르지 않습니다. 하지만 데이터베이스의 테이블과 직접 연결된다는 아주 특별한 특징이 있어 구분지어 부릅니다. 즉, 엔티티는 객체이긴 하지만 데이터베이스에 영향을 미치는 쿼리를 실행하는 객체인 것이죠.
- 엔티티매니저
- 엔티티 매니저(Entity Manager) : 엔티티를 관리해 데이터베이스와 애플리케이션 사이에서 객체를 생성, 수정, 삭제하는 등의 역할.
- 엔티티 매니저 팩토리(Entity manager factory) : 엔티티 매니저를 만드는 곳
앞서 데이터베이스에 여러 사용자가 접근 할 수 있다고 했죠?
ex) 회원 2명이 동시에 회원 가입을 하려는 경우 엔티티 매니저는 다음과 같이 업무를 처리합니다. 회원 1의 요청에 대해서 가입 처리를 할 엔티티 매니저 팩토리가 생성하면 이를 통해 가입 처리해 데이터베이스에 회원 정보를 저장하는 것이죠 회원 2도 마찬가지 입니다.
그리고 회원 1,2를 위해 생성된 엔티티 매니저는 필요한 시점에 데이터베이스와 연결한 뒤에 쿼리 합니다.
@PersistenceContext EntityManager em; // 프록시 엔티티 매니저. 필요할 때 진짜 엔티티 매니저 호출
문제발생
- 동시성 : 부트는 기본적으로 빈 하나만 생성해 공유하므로 동시성 문제 발생
해결방법
- 프록시 사용 : 실제 엔티티 매니저와 연결하는 프록시(가짜) 엔티티 매니저를 사용
- 필요시 : 데이터베이스 트랜잭션과 관련된 실제 엔티티 매니저를 호출
결론
엔티티 매니저는 Spring Data JPA에서 관리하므로 여러분이 직접 생성하거나 관리할 필요가 없다.