[TIL] 2025-03-10_영속성과_트랜잭션

Yuri·2025년 3월 10일

TIL

목록 보기
57/59
post-thumbnail

✏️ JPA 영속성과 트랜잭션에 대해 학습한 내용을 정리합니다.

JPA(Java Persistence API)

Java에서 ORM 기술 표준으로 사용되는 인터페이스

ORM

Object Relational Mapping

  • 직접적인 SQL query 작성이 아닌 코드로 개발함으로써 객체 지향 프로그래밍에 집중할 수 있음 → JPA 메서드

Hibernate

  • 자바 언어를 위한 ORM 프레임워크
  • JPA의 구현체로, JPA 인터페이스를 구현하고 내부적으로 JDBC API를 사용함

Spring Data JPA

  • Spring Data JPA는 개발자가 JPA를 더 쉽고 편하게 사용할 수 있도록 도와주는 Spring 에서 제공하는 모듈 중 하나

Persistence Context

영속성 컨텍스트

Entity LifeCycle

  • 엔티티 객체가 생성, 관리, 소멸 되기까지 데이터베이스와 상호작용하는 모든 과정

EntityManagerFactory

EntityManager를 생성하고 관리하는 팩토리 객체

EntityManager

Thread-safe 하지 않다. → 일관성을 보장하지 않는다.

EntityManagerFactory emf;

@Transactional
public void saveBook(Book book) {
	EntityManager em = emf.createEntityManager();
	EntityTransaction tx = em.getTransaction();
	
	try {
		tx.begin();
		
		Book book = new Book();
		em.persist(book);
		em.flush();
		
		tx.commit();
	} catch (Exception e) {
		tx.rollback();
	}
	em.close();
}
  • @Transactional : Spring
  • EntityManager : JPA

서로 영역이 다르기 때문에 EntityManager 에 @Transactional 을 사용할 수 없다.

OSIV(Open Session In View)

영속성 컨텍스트를 View 렌더링이 끝날 때까지 개방된 상태로 유지하는 방식
→ Entity의 생명주기를 Service 까지만 살아있을 수 있게 설정할 수 있다.

default 값은 true 이지만 false로 하는게 성능적으로 효율이 좋다.
→ 사용하지 않는 서버 자원을 바로 반납

= 굳이 사용하지 않을 Entity를 컨트롤러까지 살려두는건 성능 이슈가 발생

Proxy

프록시(Proxy): 실제 엔티티 객체 대신, 그 객체를 감싸고 있는 대리 객체

@Transactional

내부적으로 AOP로 구현되어있으며 Proxy를 생성하여 돌아가기 때문에 접근 제어자가 public으로 열러있어야 한다.

Transaction

  • 트랜잭션의 기본 특성: ACID
  • 설정 가능한 옵션 제공
    • propagation, isolation, timeout, readOnly, rollbackFor, noRollbackFor
    • readOnly = true로 설정하여 성능상 이점을 가질 수 있음

Isolation

동시에 실행되는 트랜잭션들이 서로에게 얼마나 영향을 미칠지를 정의하는 방법

  • READ_COMMITTED (default)

  • SQL에서 발생할 수 있는 여러 트랜잭션 문제 (Dirty Read, Non-Repeatable Read, Phantom Read)를 방지하기 위해 설정
profile
안녕하세요 :)

0개의 댓글