개발/Spring, Spring Data JPA, Querydsl

JPA - 기본 동작 방식, 아키텍처

잇(IT) 2023. 8. 1. 15:15
728x90

- JPA 사용 시 장점

1. 특정 데이터베이스에 종속되지 않음

2. 객체지향적 프로그래밍

3. 생산성 향상

- JPA 사용 시 단점

1. 복잡한 쿼리 처리

2. 성능 저하 위험

3. 학습 시간

- ORM : Object Relational Mapping의 약자로 객체와 관계형 데이터베이스를 매핑해주는 것을 말한다.

 - 객체지향과 관계형 데이터베이스 간의 패러다임이 불일치하기 때문에 이를 해결하기 위해 나온 기술이 ORM이다.

 - 객체는 객체지향적으로, 데이터베이스는 데이터베이스 대로 설계를 한다. ORM은 중간에서 2개를 매핑하는 역할을 한다. 

 

- JPA 동작 방식

1. 엔티티

 1.1. 데이터베이스의 테이블에 대응하는 클래스

 1.2. @Entity가 붙은 클래스는 JPA에서 관리하며 엔티티라고 한다.

 

2. 엔티티 매니저 팩토리

 2.1. 엔티티 매니저 인스턴스를 관리하는 주체이다.

 2.2. 애플리케이션 실행 시 한 개만 만들어지며 사용자로부터 요청이 오면 엔티티 매니저 팩토리로부터 엔티티 매니저를 생성한다.

 

3. 엔티티 매니저

 3.1. 엔티티 매니저란 영속성 컨텍스트에 접근하여 엔티티에 대한 데이터베이스 작업을 제공한다.

 3.2. 내부적으로 데이터베이스 커넥션을 사용해서 데이터베이스에 접근한다.

 3.3.

  3.3.1. find() : 영속성 컨텍스트에서 엔티티를 검색하고 영속성 컨텍스트에 없을 경우 데이터베이스에서 데이터를 찾아 영속성 컨텍스트에 저장한다.

  3.3.2. persist() : 엔티티를 영속성 컨텍스트에 저장한다.

  3.3.3. remove() : 엔티티 클래스를 영속성 컨텍스트에서 삭제한다.

  3.3.4. flush() : 영속성 컨텍스트에 저장된 내용을 데이터베이스에 반영한다.

 

4. 영속성 컨텍스트

엔티티를 영구 저장하는 환경으로 엔티티 매니저를 통해 영속성 컨텍스트에 접근한다.

 

* 엔티티 매니저는 데이터 변경 시 데이터의 무결성을 위해 반드시 트랜잭션을 시작해야 한다.

 

- 영속성 컨텍스트 사용 시 이점

1. 영속성 컨텍스트라는 중간 계층을 만들면 버퍼링, 캐싱 등을 할 수 있는 장점이 있다.

1. 1차 캐시 : 영속성 컨텍스트에는 1차 캐시가 존재하면 Map<Key, Value>로 저장된다. entityManager.find() 호출 시 영속성 컨텍스트의 1차 캐시를 조회한다. 엔티티가 존재할 경우 해당 엔티티를 반환하고, 엔티티가 없으면 데이터베이스에서 조회 후 1차 캐시에 저장 및 반환한다.

 

2. 동일성 보장 : 하나의 트랜잭션에서 같은 키값으로 영속성 컨텍스트에 저장된 엔티티 조회 시 같은 엔티티 조회를 보장한다. 바로 1차 캐시에 저장된 엔티티를 조회하기 때문에 가능하다.

3. 트랜잭션을 지원하는 쓰기 지연

 3.1. 영속성 컨텍스트에는 쓰기 지연 SQL 저장소가 존재한다. entityManager.persist()를 호출하면 1차 캐시에 저장되는 것과 동시에 쓰기 지연 SQL 저장소에 SQL문이 저장된다.

 3.2. SQL을 쌓아두고 트랜잭션을 커밋하는 시점에 저장된 SQL문들이 flush되면서 데이터베이스에 반영된다.

 3.3. 이렇게 모아서 보내기 때문에 성능에서 이점을 볼 수 있다.

 

4. 변경 감지

 4.1. JPA는 1차 캐시에 데이터베이스에서 처음 불러온 엔티티의 스냅샷 값을 가지고 있다. 그리고 1차 캐시에 저장된 엔티티와 스냅샷을 비교 후 변경 내용이 있다면 UPDATE SQL문을 쓰기 지연 SQL 저장소에 담아준다

 4.2. 그리고 데이터베이스에 커밋 시점에 변경 내용을 자동으로 반영한다. 즉, 따로 update문을 호출할 필요가 없다.

728x90