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 가 동작하는 방식을 나타낸다.
영속성 컨텍스트
☞ 영속성 컨텍스트란, 엔티티를 영구 저장하는 환경을 의미한다. 엔티티 매니저로 엔티티를 저장하거나 조회하면 엔티니 매니저는 영속성 컨텍스트에 엔티티를 보관하고 관리한다.
☞ 영속성 컨텍스트는 엔티티 매니저(Session)를 생성할 때 하나 생성된다. 그리고 엔티티 매니저(Session)을 통해서 영속성 컨텍스트에 접근할 수 있고, 영속성 컨텍스트를 관리할 수 있다.
☞ 결국 여러 엔티티 매니저(Session)가 영속성 컨텍스트에 접근할 수 있다.
New/Transient(비영속성) : 영속성 컨텍스트와 전혀 관계가 없는 상태
- 자바에서만 존재하는 순수 자바 객체
- 데이터베이스와 연동된 적이 없음Managed (영속)
- 데이터베이스에 저장되고, 메모리 상에서도 같은 상태로 존재하는 객체 (영속성 컨텍스트에 저장된 상태)
- id (Primary Key) 값을 통해 필요한 엔티티 객체를 꺼내어 관리할 수 있음Removed (삭제) : 삭제된 상태
- 데이터베이스에서 삭제된 객체
- 더 이상 영속성 컨텍스트에 속하지 않음Detached (준영속) : 영속성 컨텍스트에 저장되었다가 분리된 상태)
- 영속성 컨텍스트에서 엔티티 객체를 꺼내어 사용하는 상태
- 아직 데이터베이스와 동기화가 이루어지지 않은 상태를 의미
'Spring > Spring JPA' 카테고리의 다른 글
20201001 [jpa] JPA N+1 문제를 만들어보고 해결해보기. (수정 2020-10-05) (0) | 2020.10.01 |
---|---|
20190919 [jpa] 스프링 테스트 코드 상에서 DB 에 데이터 적재. (0) | 2019.09.19 |
20190720 [문제해결] Infinite recursion (StackOverflowError) (3) | 2019.07.20 |
20190710 [jpa] JPA 알아보기 03 : TestEntityManager 살펴보기 (수정 20190817) (0) | 2019.07.10 |
20190602 [jpa] JPA 알아보기 02 : JPA & Hibernate & Spring Data JPA (0) | 2019.06.02 |