ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JPA 개념 정리 - 영속성 컨텍스트, 트렌젝션, 1차 캐시, Flush, 쓰기 지연
    Spring Boot 2022. 1. 16. 05:12

    오늘은 간단한 Spring Data JPA의 내부에서 어떻게 작동 하는지를 기록 해본다.

    기본적으로 서버가 할 수 있는 일은 한계가 있다. CPU를 100% 사용 중이라던지, 메모리가 full이라던지, 쓰레드가 전부 일하는 중이라던지 서버 컴퓨터가 맛탱이 가는 일이 일어난다. 

     

    이를 방지하려고, AWS 로드밸런서로 서버를 여러대로 scale out 한다던지, 

    다른 놀고 있는 컴퓨터를 찾아서 코딩으로 분산 처리를 해준다던지,,,를 백엔드 개발자가 한다고 한다. 

     

    오늘 정리하는 영속성 컨텍스트도 이러한 일을 초점으로 공부하면 좋을 것 같다.

     

    목차

    • 엔티티 매니저
    • 영속성 컨텍스트
    • 1차 캐시
    • 트렌젝션, 쓰기 지연, Flush()

     


    엔티티 매니저 

    JPA가 제공하는 기술은 크게 2가지 이다. 

     

         1) 엔티티와 DB 테이블을 매핑하는 설계 

     

         2) 맵핑한 엔티티를 실제 사용하는 부분

     

    복습) JPA는 결국 자바의 ORM기술 표준, 자바와 DB를 중간에서 연결해주는 기술.

     

    여기서, 2번 실제 사용하는 부분을 엔티티 매니저 EntiryManager에서 해준다. 

    즉, 엔티티를 저장, 조회, 수정, 삭제 등 엔티티의 모든 일을 관리해주는 일을 한다. 

     

    좀 자세하게 들어가면, JPA 웹 어플리케이션에서는

    엔티티 매니저 팩토리라는게 있고 -> 이게 엔티티 매니저를 생성 -> 엔티티의 DB 연결이 필요할 때 "커넥션 풀"에서 연결을 얻는다. 

     

    기본적으로 서버가 DB에 접근 한다는 것은 굉장히 무거운 작업이다.

    스프링의 WAS 톰캣-JDBC에서 미리 커넥션 풀이라는 객체를 생성해 두고 필요할때 마다 재사용하며 연결해서 물리적인 데이터베이스 connection(연결) 부하를 줄이고 관리 한다고 한다. <- 와우...

    출처 : 자바 ORM 표준 JPA

     


    영속성 컨텍스트

    영속성 컨텍스트란? 엔티티를 영구 저장하는 환경이라는 뜻이다. 

    더쉽게 말하면 엔티티 저장/관리하는 공간

     

    엔티티 매니저를 통해, 엔티티를 저장, 조회, 수정, 삭제를 할 수 있다는 뜻 이다.

     

    왜 필요한가? 아래의 장점이 있다.

     

    1. 1차 캐시 기능

    2. 트렌젝션을 지원하는 쓰기 지연 기능

     


     

    1차 캐시

    영속성 컨텍스트에는 내부에 캐시를 가지고 있는데 이를 "1차 캐시"라고 부른다. 

    쉽게 말하면, 영속성 컨텍스트 내에 Map 구조 공간이 있는데, 

    @Id 값과 Entity값을 맵핑한 구조로 저장할 수 있다. 

    저장된 값을, find(), findById(), save(), update() 등으로 사용한다고 볼 수 있다.

    이게 무슨말이냐, DB에 접근하지 않고 Entity를 조회, 수정, 삭제를 할 수 있다는 말이다. (DB에 직접 접근 안하니까 어마어마한 성능 이점)

     

    만약 1차 캐시에 찾는 데이터가 없으면, DB 조회하여 새로운 객체를 생성한다.


     

    트렌젝션 

    위에서 언급 한것 처럼, 서버가 DB에 접근하는 것은 무거운 작업이다. 

    그래서 연관된 SQL 작업끼리 DB 접근 할때 한번에 작업하는데, 작업의 단위를 트렌젝션이라고 한다.

     

    하나의 트렌젝션이 성공했다 == commit,

    하나의 트렌젝션이 비정상 종료했다 == rollback

     

    JPA 역시, 영속성 컨텍스트에서 트렌젝션에 필요한 SQL 작업들을 모아두고 한번에 작업하는데

    SQL을 모아두는 것을 쓰기 지연, 

    트렌젝션이 commit 하는 순간 엔티티 컨텍스트의 엔티티를 DB에 반영하는 작업을 Flush 라고 한다. 

    그래서 @Transactional 어노테이션을 사용하면 연관된 엔티티 작업들, 즉 하나의 트렌젝션이 rollback 되는 것이다. 

     

    출처: 자바 ORM 표준 JPA


     

    Resource

    커넥션 풀

    https://linked2ev.github.io/spring/2019/08/14/Spring-3-%EC%BB%A4%EB%84%A5%EC%85%98-%ED%92%80%EC%9D%B4%EB%9E%80/

     

    [Spring] 커넥션 풀(Connection pool)이란?

    커넥션 풀(Connection pool)에 대해서 그래도 알고 사용하자. 쉽게 알고 갔으면 좋겠습니다.

    linked2ev.github.io

     

    트렌젝션 

    https://mommoo.tistory.com/62 

     

    트랜잭션(Transaction)이란?

    트랜잭션이란? 트랜잭션(Transaction 이하 트랜잭션)이란, 데이터베이스의 상태를 변화시키기 해서 수행하는 작업의 단위를 뜻한다. 데이터베이스의 상태를 변화시킨다는 것은 무얼 의미하는 것일

    mommoo.tistory.com

     

    참고 서적 : 자바 ORM 표준 JPA 프로그래밍

    참고 강의: 스파르타코딩 Spring 심화 강의

    반응형
Designed by Tistory.