JPA 알아보기


JPA 를 알아보기 이전에, 먼저 알아둘 내용이 있다.


자바를 통해서 데이터를 접근하는 방법은 아래와 같이 구분된다.


○ JDBC API

○ iBatis(MyBatis)

○ 스프링 JdbcTemplate : SQL Mapper


위의 내용을 사용하게 되면, 데이터베이스의 CRUD 연산에 대해서 SQL 이 반복된다. 이러한 객체와 데이터베이스 간의 차이를 해결하기 위한 방법ORM 프레임워크이고, 자바 진영에서 만든 ORM 의 표준 기술이 JPA 이다.


ORM (Object-Relational Mapping)

객체와 관계와의 설정을 의마한다. ORM 에서 말하는 객체는 우리가 OOP 관점에서 즉, 객체지향 관점에서 바라보는 그 객체를 의미한다. 이러한 것을 사용하는 이유는 "기본에 충실(Back to basics)"  하기 위함이다. 보다 OOP 스러운 프로그래밍을 시작하자는데 그 의미가 있다. 


하지만 ORM 의 사용에 우려되는 부분이 있다. 바로 OOP 스럽게 설계되지 않은 데이터베이스에서 ORM 을 도입하여 이점을 얻을 수 있겠지만 개발자의 Learning Curve 혹은 기존에 존재하는 레거시를 걷어내고 새롭게 작업하고 리팩토링 및 개선하는 측면 등을 고려하지 않을 수 없다.


따라 전체적인 시스템의 기획, 분석, 설계 단계에 있어서 OOP 의 객체와 데이터베이스를 서로 별개의 영역으로 바라보기 보다는 같은 영역안에 두고 양쪽 모두를 고려한 기획, 분석, 설계 단계가 필요하다. 특히 설계단계에서 말이다.


ORM 사용에 대한 장점

☞ ORM 을 사용하게 되면 매핑정보가 명확하여 ERD 를 보는 의존도를 낮출 수 있다. 

☞ DBMS 에 대한 종속성이 줄어든다. 이 말인 즉슨 등록코드가 변경되더라도 개발자는 SQL 을 작성하는 것이 아닌 JPA 가 제공하는 API 를 사용하면 되는 것이다.

☞ 구현방법에 대한 종속성도 줄어들뿐더러 추가로 자료형에도 그 종속성은 줄어든다.


ORM 사용에 대한 단점

☞ 완벽한 것은 이 세상에 없기 때문에 ORM에 대한 설계는 신중해야 한다. 

☞ 프로젝트의 규모가 커지고 복잡해질수록 ORM 설계와 서비스는 난이도가 올라갈 수 있다.


EntityManagerFactory & EntityManager


엔티티매니저란, 엔티티들을 관리하는 역할을 맡고 있다. 이를 위해서 자신이 관리해야하는 엔티티 객체들을 영속 컨텍스트에 넣어두고, 객체들의 라이프 사이클을 관리하게 된다.


- Hibernate 에서는 SessionFactory(EntityManagerFactory), Session(EntityManager) 으로 불리운다.

- 엔티티매니저팩토리(EntityManagerFactory = SessionFactory) 는 여러 스레드가 동시에 접근해도 안전하다. (thread -safe)

- 엔티티매니저(EntityManager = Session) 는 여러 스레드가 동시에 접근하면 동시성 문제가 발생하기 때문에 스레드 간에 절대 공유하면 안된다.


아래는 실제 JPA 가 동작하는 방식을 나타낸다.


LifeCycle of an entity


영속성 컨텍스트

영속성 컨텍스트란, 엔티티를 영구 저장하는 환경을 의미한다. 엔티티 매니저로 엔티티를 저장하거나 조회하면 엔티니 매니저는 영속성 컨텍스트에 엔티티를 보관하고 관리한다.


☞ 영속성 컨텍스트는 엔티티 매니저(Session)를 생성할 때 하나 생성된다. 그리고 엔티티 매니저(Session)을 통해서 영속성 컨텍스트에 접근할 수 있고, 영속성 컨텍스트를 관리할 수 있다.


☞ 결국 여러 엔티티 매니저(Session)가 영속성 컨텍스트에 접근할 수 있다. 


  1. New/Transient(비영속성) : 영속성 컨텍스트와 전혀 관계가 없는 상태
    - 자바에서만 존재하는 순수 자바 객체
    - 데이터베이스와 연동된 적이 없음

  2. Managed (영속)
    - 데이터베이스에 저장되고, 메모리 상에서도 같은 상태로 존재하는 객체 (영속성 컨텍스트에 저장된 상태)
    - id (Primary Key) 값을 통해 필요한 엔티티 객체를 꺼내어 관리할 수 있음

  3. Removed (삭제) : 삭제된 상태
    - 데이터베이스에서 삭제된 객체
    - 더 이상 영속성 컨텍스트에 속하지 않음

  4. Detached (준영속) : 영속성 컨텍스트에 저장되었다가 분리된 상태)
    - 영속성 컨텍스트에서 엔티티 객체를 꺼내어 사용하는 상태
    - 아직 데이터베이스와 동기화가 이루어지지 않은 상태를 의미

위의 내용에서 영속과 비영속이라는 표현이 나온다. 영속은 영속성 컨텍스트가 관리하는 엔티티를 영속상태라고 칭한다. 그리고 ORM 을 사용해서 조회한 엔티티도 영속성 컨텍스트가 관리하는 영속 상태이다.

비영속은 순수한 객체로써, 영속성 컨텍스트와 관련이 없으며 추가로 데이터베이스와 관련이 없는 상태를 의미한다.



Posted by doubler
,