[부트캠프] TIL - JPA
JPA
JPA는 자바 ORM 기술에 대한 API 표준입니다, ORM (Object Relational Mapping) 은 객체와 관계형 데이터베이스를
매핑해줍니다,
JPA를 사용함으로써 객체지향 중심적으로 개발을 할 수 있고 데이터베이스에 종속되지 않게됩니다.
기본적인 구조입니다, 기존에 사용하던 JDBC API를 통해 DB와 상호작용을 했으나, 이 방식은 직접 SQL 쿼리를 작성해서 데이터를 불러오고, 데이터를 넣고 하며 그 과정에서 오고가는 데이터를 DTO 클래스로 래핑한다던지 하는 불편한 점이 있었고 그 부분을 해결하고자 나왔습니다.
JPA는 ORM 기술의 표준 명세로 인터페이스입니다, 따라서 구현체를 사용하게되는데 대표적으로 Hibernate, EclipseLink, DataNucleus, OpenJpa 등이 있고 주로 Hibernate를 사용합니다.
JPA 동작 방식
Entity Manager Factory는 Entity Manager 인스턴스 를 관리합니다, Entity Manager Factory는 애플리케이션 실행 시
단 하나의 인스턴스만 생성되며 요청이 들어올시 Entity Manager를 생성합니다.
Entity Manager는 Persistence Context(영속성 컨택스트)에 접근하여 엔티티에 대한 DB 작업을 제공합니다.
내부적으로 데이터베이스 커넥션을 사용하여 데이터베이스에 접근한다고 하는데 JDBC를 사용했던 그 방식을 생각해보면 이해가 될 것 같습니다(Connection, PreparedStatement, Resultset ... etc)
사용하는 메소드
- find() : 영속성 컨텍스트에서 엔티티를 검색하고 영속성 컨텍스트에 없을 경우 데이터베이스에서 데이터를 찾아 영속성 컨텍스트에 저장합니다.
- persist() : 엔티티를 영속성 컨텍스트에 저장합니다.
- remove() : 엔티티 클래스를 영속성 컨텍스트에서 삭제합니다. -> find()를 생각하면 이게 결국 DB에서 지워지는게아닐것입니다.
- flush() : 영속성 컨텍스트에 저장된 내용을 데이터베이스에 반영합니다.
- New(비영속) : new 키워드를 통해 생성된 상태로 영속성 컨텍스트와 관련이 없는상태
- Managed(영속) : 엔티티가 영속성 컨텍스트에 저장된 상태, 영속성 컨텍스트에 의해 관리되는 상태로 아직 데이터베이스에 반영되지않았으며, 트랜잭션 Commit() 시점에 데이터베이스에 반영합니다.
- Detached(준영속 상태) : 영속성 컨텍스트에 엔티티가 저장되었다가 분리된 상태.
- Removed(삭제) : 영속성 컨텍스트와 데이터베이스에서 삭제된 상태.
이렇게 동작하는 이유는 영속성 컨텍스트가 애플리케이션과 데이터베이스 사이의 중간 계층이기 때문.