[JPA] 스프링 부트 JPA : 기본 개념
[JPA] 스프링 부트 JPA : 기본 개념
1. JPA
1-1. 개념
- JPA는 Java Persistence API의 약자, Java 관련 기술 스펙 중 하나다.
- [사전 지식] ORM (Object Relational Mapping) 이란 프로그램 언어의 객체 지향 개념과 DB의 테이블의 개체가 유사하다는 입장, 객체지향과 관계형 데이터베이스를 매핑시킨 추상화된 개념임 (vision)
- JPA는 ORM의 개념을 Java언어로 구현하기 위한 스펙임
1-2. 특징
-
JPA 스팩의 구조
[java code] <-> [JPA | {jpql} <-> {MySql API, Oracle API, DB2 API, ...} ] <-> [Database]
-
JPA 스펙을 구현한 프레임워크
- Hibernate : Spring Boot와 대응되는 프레임워크
- EclipseLink
- DataNucleus
- …
1-3 JPA 장단점
- JPA 장점 :
- 데이터베이스 관련 코드에 대해 유연함을 얻을 수 있다.
- 데이터베이스와 독립적 관계다.
- DB 설계와 Java 설계를 한번에 처리 할 수 있어서 생산성이 빠르다.
- DB에 독립적이기 때문에 DB의 변경에서 자유롭다.
- JPA 단점 :
- 러닝 커브가 길다.
- SQL 에서 JPA 기능 추가로 배워야 함 - 근본적인 객체지향 설계 사상이 반영되어야 한다.
- 어떻게 적합한 객체들의 관계를 작성할 것인가? - DB에서 제공하는 강력한 기능들을 활용하기 힘들다.
- 예를 들면 튜닝 등의 작업에 제약이 발생한다.
1-4 JPA 개발 구조
Application <-> JPA <-> JDBC <-> DataBase
2. 엔티티(Entity), 앤티티 매니저(EntityManager), 영속컨택스트(Persistence Context)
2-1. 엔티티(Entity)
- 데이터 베이스 상에서 데이터를 관리하는 대상을 지칭
- 일반적인 DB에서는 엔티티를 위해 테이블을 생성하고 해당 테이블에 데이터를 추가함, 이렇게 추가된 데이터들을 인스턴스 또는 레코드라고 부름
- JPA에서는 엔티티 타입의 클래스가 테이블에 대응함
- 엔티티라은 용어가 클래스를 의미할 수도 인스턴스를 의마할수도 있음 예를 들면 회원 엔티티 클래스, 회원 엔티티 인스턴스, 회원 엔티티 객체 이런식으로 혼용 되나 죄다 같은 말임
2-2. 엔티티 매니저(Entity Manager)
- 여러 엔티티 객체들을 관리하는 대상을 지칭
- 여기서 관리란 라이프 사이클을 지칭
- 엔티티매니저는 엔티티 객체들을 영속 컨택스트 라는 곳에 넣어두고 각각의 객체들의 생사를 관리하게 됨
2-3. 영속 컨택스트(Persistence Context)
- JPA의 엔티티 객체를 모아두는 공간
-
그림에서 처럼 화살표에 있는 메소드는 엔티티 매니저를 통해서 실행하는 매소드.
-
New(비영속) : Java 영역에 객체만 존재하고, 데이터베이스와 연동된 적이 없는 상태, 엔티티 메니저의 관리하에 있는 것이 아니기 때문에 순수한 Java 객체
-
Managed(영속) : 데이터베이스에 저장되고, 메모리상에서도 같은 상태로 전재하는 상태. 객체는 영속 컨택스트에 내에 들어가게 되고 id(PK) 값을 통해서 필요한 엔티티 객체를 꺼내 사용가능
-
Removed(삭제) : 데이터베이스상에서 삭제된 상태, 객체는 더 이상 영속 컨텍스트에 존제하지 않음
- Detached(준영속) : 영속컨택스트에서 엔티티 객체를 꺼내서 사용하는 상태. 준영속 상태의 객체는 고유한 id(PK)를 가지고 있지만, 아직 데이터베이스와 동기화가 이루어지지 않은 상태임
Comments