- ORM : 객체와 데이터베이스 중간에서 2개를 매핑하는 역할
- JPA : 자바에서 제공하는 API, 인터페이스
구현체로 Hibernate, EclipseLink, DataNucleus, OpenJpa, TopLink 등이 있음
JPA 장점
1. 특정 데이터베이스에 종속되지 않음
2. 객체지향적 프로그래밍
3. 생산성 향상
JPA 단점
1. 복잡한 쿼리 처리, 보완하기 위해서 SQL과 유사한 기술인 JPQL 지원
2. 성능 저하 위험
3. 학습 시간이 오래 걸림
JPA 동작 방식
1) 엔티티(Entity) :
- 데이터베이스의 테이블에 대응하는 클래스
- @Entity가 붙은 클래스는 JPA에서 관리하며 엔티티라고 함
2) 엔티티 매니저 팩토리 :
- 엔티티 매니저 인스턴스를 관리하는 주체
- 애플리케이션 실행 시 한개만 만들어지며 사용자로부터 요청이 오면
- 엔티티 매니저 팩토리로부터 엔티티 매니저 생성
3) 엔티티 매니저 :
- 연속성 컨텍스트에 접근하여 엔티티에 대한 데이터베이스 작업을 제공
- 내부적으로 데이터베이스 커넥션을 사용해서 데이터베이스에 접근
- 몇 가지 메소드들
메소드 | 설명 |
find( ) | 영속성 컨테스트에서 엔티티를 검색하고 영속성 컨텍스트에 없을 경우 데이터베이스에서 데이터를 찾아 영속성 컨텍스트에 저장 |
persist( ) | 엔티티를 영속성 컨텍스트에 저장 |
remove( ) | 엔티티 클래스를 영속성 컨텍스트에서 삭제함 |
flush( ) | 영속성 컨텍스트에 저장된 내용을 데이터베이스에 반영함 |
4) 영속성 컨텍스트 : 엔티티를 영구 저장하는 환경, 엔티티 매니저를 통해 영속성 컨텍스트에 접근
엔티티 생명주기
생명주기 | 내용 |
비영속(new) | new 키워드를 통해 생성된 상태로 영속성 컨텍스트와 관련이 없는 상태 |
영속(managed) | 엔티티가 영속성 컨텍스트에 저장된 상태로 영속성 컨텍스트에 의해 관리되는 상태 영속 상태에서 데이터베이스에 저장되지 않으며, 트랜잭션 커밋 시점에 데이터베이스에 반영 |
준영속 상태(detached) | 영속성 컨텍스트에 엔티티가 저장되었다가 분리된 상태 |
삭제 상태(removed) | 영속성 컨텍스트와 데이터베이스에서 삭제된 상태 |
영속성 컨테스트에 저장 후 데이터베이스에 반영하는 코드
영속성 컨텍스트 사용시 이점
1) 1차 캐시 :
- 1차 캐시가 존재하면 Map<KEY, VALUE>로 저장됨.
- entityManager.find() 메소드 호출 시 영속성 컨텍스트의 1차 캐시를 조회
- 엔티티가 존재할 경우 해당 엔티티를 반환, 없으면 데이터베이스 조회 후 1차 캐시에 저장 및 반환
2) 동일성 보장 :
- 하나의 트랜잭션에 같은 키값으로 영속성 컨텍스트에 저장된 엔티티 조회 시 같은 엔티티 조회 보장
- 1차 캐시에 저장된 엔티티를 조회하기 때문에 동일함.
3) 트랜젝션을 지원하는 쓰기 지연
- 영속성 컨텍스트에 쓰기 지연 SQL 저장소가 존재,
- entityManager.persist()를 호출하면 1차 캐시에 저장되는 것과 동시에 쓰기 지연 SQL 저장소에 SQL문이 저장되며, 트랜잭션을 커밋하는 시점에 저장된 SQL문들이 flush되면서 데이터베이스에 반영. 모아서 보내기 때문에 성능에 이점이 됨
4) 변경 감지
- 1차 캐시에 저장된 엔티티와 스냅샷을 비교 후 변경 내용이 있다면 UPDATE SQL문을 쓰기 지연 SQL 저장소에 담아둠
- 데이터베이스에 커밋 시점에 변경 내용을 자동으로 반영(따로 update문을 호출할 필요 없음)
'기록하는 중 > Spring Boot' 카테고리의 다른 글
[Spring] tomcat (0) | 2023.12.03 |
---|---|
[@GeneratedValue] 기본키 생성 (0) | 2023.11.30 |
[@Column] 속성 (0) | 2023.11.30 |
[Entity] 어노테이션 (0) | 2023.11.25 |
[sts] application.properties 설정 - MySQL편 (0) | 2023.11.25 |