JPA (Java Persistence API)
JPA 란 ?
- 자바 ORM 기술에 대한 API 표준 명세 => 인터페이스를 모아둔 것
- 애플리케이션과 JDBC API 사이에서 동작한다.
- 반복되는 코드 제거, 객체 설계 중심 개발
- 유연하고 유지보수하기 좋음
ORM (Object-Relational Mapping)
- 데이베이스는 객체 구조와 다른 데이터 중심의 구조를 가진다.
- 객체와 관계형 데이터베이스를 매핑한다.
- 패러다임 불일치 문제를 개발자 대신 해결
- 하이버네이트가 가장 많이 사용된다.
패러다임 불일치
- 객체지향 프로그래밍은 추상화, 캡슐화, 정보은닉, 상속, 다형성 등 시스템의 복잡성을 제어할 수 있는 다양한 장치들을 제공한다.
- 관계형 데이터베이스는 데이터 중심으로 구조화 되어있어 집합적인 사고를 요구하고 객체지향에서의 추상화, 상속, 다형성과 같은 개념이 없다.
- 객체와 관계형 데이터베이스는 지향하는 목적이 서로 다르므로 둘의 기능과 표현 방법도 다르다. => 패러다임 불일치
JPA가 제공하는 기능
- 엔티티와 테이블을 매핑하는 설계 부분
- 매핑한 엔티티를 실제 사용하는 부분
매핑한 엔티티를 실제 사용하는 부분
엔티티 매니저 팩토리와 엔티티 매니저
엔티티 매니저
- 엔티티를 CRUD 하는 일을 처리하고 엔티티를 관리하는 관리자
- 개발자 입장에서는 엔티티 매니저를 엔티티를 저장하는 가상의 데이터베이스로 생각하면 된다.
- 여러 스레드가 동시에 접근하면 동시성 문제가 발생하여 공유하면 안 된다.
- 엔티티 매니저를 생성하기 위해서는 엔티티 매니저 팩토리가 필요하다.
- 생성 비용이 거의 들지 않는다.
엔티티 매니저 팩토리
- 엔티티 매니저를 만드는 공장이다.
- 공장을 만드는 비용이 상당히 크기때문에 한 개만 만들어서 애플리케이션 전체에서 공유하도록 설계되어 있다. => 여러 스레드가 동시에 접근해도 안전
- 팩토리 생성시 커넥션풀도 생성됨
EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpa_practice");
<persistence-unit name="jpa_practice">
<properties>
<property jdbc~/>
<property jdbc username/>
<property jdbc password/>
<property jdbc url/>
...
</persistence-unit>
EntityManager em = emf.createEntityManager();
커넥션 풀(Connection pool)
- 데이터베이스와 연결된 일정수의 connection 객체를 미리 만들어 pool에 저장해두고 있다가 요청이 오면 connerction 객체를 넘겨주고 사용이 끝나면 다시 풀에 반환
- 만약 pool의 connection 객체가 없다면 사용자를 대기상태로 전환시켜놓는다.
- 엔티티 매니저는 트랜잭션을 시작할 대 커넥션을 획득한다.