ORM란
- ORM은 데이터베이스 객체를 자바 객체로 매핑 함으로써 객체 간의 관계를 바탕으로 SQL을 자동으로 생성해준다.
- ORM(Object-Relational Mapping), 객체-관계 매핑
- 데이터베이스 데이터 <—매핑—> Object 필드
- 객체를 통해 간접적으로 데이터베이스 데이터를 다룬다.
- 객체와 관계형 데이터베이스의 데이터를 자동으로 매핑(연결)해주는 것을 말한다.
- ORM을 이용하면 SQL Query가 아닌 직관적인 코드(메서드)로 데이터를 조작할 수 있다.
- 객체 간의 관계를 바탕으로 SQL을 자동으로 생성한다.
- Persistant API라고도 할 수 있다.
JPA란?
- 자바 ORM 기술에 대한 API 표준 명세로, Java에서 제공하는 API이다.
- 자바 플랫폼 SE와 자바 플랫폼 EE를 사용하는 응용프로그램에서 관계형 데이터베이스의 관리를 표현하는 자바 API이다.
- 즉, JPA는 ORM을 사용하기 위한 표준 인터페이스를 모아둔 것 이다.
- 기존에 EJB에서 제공되던 엔터티 빈(Entity Bean)을 대체하는 기술 이다.
- JPA 구성 요소
javax.persistance
패키지로 정의된 API 그 자체
- JPQL(Java Persistence Query Language)
- 객체/관계 메타데이터
- 사용자가 원하는 JPA 구현체를 선택해서 사용할 수 있다.
- JPA의 대표적인 구현체로는
Hibernate
, EclipseLink, DataNucleus, OpenJPA, TopLink Essentials 등이 있다.
- 이 구현체들을
ORM Framework
라고 부른다.
엔티티의 상태(생명주기)에 대해서 설명해주세요
- 비영속 : 영속성 컨텍스트와 전혀 관계 없는 상태
- 영속 : 영속성 컨텍스트에 관리되는 상태
- 준영속 : 영속성 컨텍스트에서 저장되었다가 불리된 상태
영속성 컨텍스트가 무엇인가?
- 엔티티를 영구 저장하는 환경
- 엔티티 매니저를 통해 영속성 컨텍스트에 접근 가능
영속성 컨텍스트의 장점은 무엇인가?
- 엔티티의 동일성을 보장
- 트랜잭션을 지원하는 쓰기 지연 -> 트랜잭션 커밋시점에 쿼리 날라감
- 변경 감지(더티 체킹) 기능
- 지연 로딩 기능
jpa 동작과정을 설명해주세요(저장할때)
- 객체를 통해 간접적으로 데이터베이스 데이터를 다룬다.
- ORM을 이용하면 SQL Query가 아닌 직관적인 코드(메서드)로 데이터를 조작할 수 있다.
- 객체 간의 관계를 바탕으로 SQL을 자동으로 생성한다.
- 자바 플랫폼 SE와 자바 플랫폼 EE를 사용하는 응용프로그램에서 관계형 데이터베이스의 관리를 표현하는 자바 API이다.
- 즉, JPA는 ORM을 사용하기 위한 표준 인터페이스를 모아둔 것 이다.
- 기존에 EJB에서 제공되던 엔터티 빈(Entity Bean)을 대체하는 기술 이다.
javax.persistance
패키지로 정의된 API 그 자체- JPQL(Java Persistence Query Language)
- 객체/관계 메타데이터
- JPA의 대표적인 구현체로는
Hibernate
, EclipseLink, DataNucleus, OpenJPA, TopLink Essentials 등이 있다. - 이 구현체들을
ORM Framework
라고 부른다.
jpa의 경우 트랜잭션 실행 단위안에서 동작한다. 객체를 생성하고 엔티티 매니저에 의해서 생성된 객체를 영속성 컨텍스트에 등록한다. 이때 해당 객체는 영속상태가 된다 즉 1차 캐시에 저장된다는 말. 또한 insert 쿼리는 쓰기지연 SQL저장소에 저장이된다. 트랜잭션이 끝나는 시점에 쓰기 지연 SQL 저장소에 있는 쿼리문들이 flush가 되고 트랜잭션 커밋이 된다.
jpa 동작과정을 설명해주세요(수정할때)
우선 수정할 엔티티를 찾는다. 이때 1차 캐시에 올라가고 영속상태가 된다. 즉 영속성 컨텍스트가 관리하는 상태가 된다. 그리고 set~~()으로 데이터를 수정한다. 이때 JPA는 데이터베이스 트랜잭션 커밋 시점에 내부적으로 flush가 되는데 영속성 컨텍스트 기능중 변경감지 기능이 있어서 이 것이 현재 1차 캐시의 엔티티와 최소 1차 캐시에 등록된 상태의 스냅샷과 비교해서 변경내역을 확인하고 update 쿼리를 쓰기지연 저장소에 저장하고 트랜잭션 커밋 끝나기 전에 해당 쿼리를 날리고 커밋을 완료한다.