카테고리 없음

#13 Spring 입문주차 <2주차 - 1>

kmsoon 2024. 5. 17. 16:48

영속성

Persistence를 한글로 번역하면 영속성, 지속성 이라는 뜻이 됩니다.

객체가 생명(객체가 유지되는 시간)이나 공간(객체의 위치)을 자유롭게 유지하고 이동할수 있는 객체의 성질을 의미합니다.
영속성 컨텍스트를 좀 더 쉽게 표현해 보자면 Entity 객체를 효율적으로 쉽게 관리하기 위해 만들어진 공간입니다.

 

 

 

트랜잭션

 트랜잭션은 DB 데이터들의 무결성과 정합성을 유지하기 위한 하나의 논리적 개념입니다.
 쉽게 표현하자면 DB의 데이터들을 안전하게 관리하기 위해서 생겨난 개념입니다.
가장 큰 특징은 여러 개의 SQL이 하나의 트랜잭션에 포함될 수 있다는 점입니다.
이때, 모든 SQL이 성공적으로 수행이 되면 DB에 영구적으로 변경을 반영하지만 SQL 중 단 하나라도 실패한다면 모든 변경을 되돌립니다.

 

 

트랜잭션의 기본 속성 (ACID)

트랜잭션은 ACID라는 네 가지 속성을 만족해야 합니다:

  1. 원자성 (Atomicity): 트랜잭션 내의 모든 작업들이 전부 성공하거나, 전부 실패하여 시스템 상태가 트랜잭션 전 상태로 되돌아가야 합니다. 부분적인 성공은 허용되지 않습니다.
  2. 일관성 (Consistency): 트랜잭션이 성공적으로 완료된 후 데이터베이스는 일관성 있는 상태를 유지해야 합니다. 이는 데이터베이스의 무결성 제약 조건이 항상 유지됨을 의미합니다.
  3. 격리성 (Isolation): 동시에 실행되는 트랜잭션들이 서로 간섭하지 않도록 보장해야 합니다. 이는 한 트랜잭션이 완료되기 전까지 다른 트랜잭션이 해당 트랜잭션의 중간 상태를 볼 수 없도록 합니다.
  4. 지속성 (Durability): 트랜잭션이 완료되면 그 결과가 영구적으로 저장되어야 합니다. 시스템이 충돌하거나 재시작되더라도 결과는 유지됩니다.

 

 

 

**Transaction 에서 contains ()는 해당 데이터가 관리 상태가 어떤지 알려주는 메서드
영속상태일때만 변경감지 dirty checking이 진행된다


detach()를 호출하면 분리가 된다-> 준영속 상태
detach()는 특정 entity를 준영속 상태로 전환 해준다

 


spring boot 에서 transactional 애노테이션 달아주면 readOnly = true 옵션이 붙는다
그러나 한번더 transactional 달아주면 덮어 씌워져서 readOnly = false 가 된다

 

 

 

*쓰기 지연 저장소 (ActionQueue)

JPA는 구현하기 위해 쓰기 지연 저장소를 만들어 SQL을 모아두고 있다가 트랜잭션 commit 후 한번에 DB에 반영합니다.

 

 

*비영속(Transient)

쉽게 말하자면 new 연산자를 통해 인스턴스화 된 Entity 객체를 의미합니다.

아직 영속성 컨텍스트에 저장되지 않았기 때문에 JPA의 관리를 받지 않습니다.

 

 

 

*영속(Managed)

persist(entity) : 비영속 Entity를 EntityManager를 통해 영속성 컨텍스트에 저장하여 관리되고 있는 상태로 만듭니다.

 

 

 

*준영속(Detached)

영속성 컨텍스트에 저장되어 관리되다가 분리된 상태를 의미합니다.

 

 


spring boot에서 제공해주는 EntityManager를 주입 받아 오고 싶을 때는 @PersistanceContext를 사용


@Transactional (propagation =  Propagation.REQUIRED)
default가 REQUIRED

 

 

 

 

  • 작은 범위의 트랜잭션: 트랜잭션의 범위는 가능한 작게 유지하여 잠금 경합을 최소화하고 성능을 향상시켜야 합니다.
  • 적절한 격리 수준 설정: 격리 수준은 트랜잭션 간의 상호 작용을 제어하며, 적절한 격리 수준을 설정하여 성능과 일관성의 균형을 맞춰야 합니다.
  • 예외 처리: 예외가 발생할 경우 적절히 롤백하고 자원을 해제하여 시스템이 일관된 상태를 유지하도록 해야 합니다.

트랜잭션 관리의 적절한 구현은 데이터베이스의 무결성과 애플리케이션의 신뢰성을 유지하는 데 매우 중요합니다. 트랜잭션의 개념과 자바에서 이를 어떻게 활용하는지를 이해하면 더욱 안정적이고 신뢰성 있는 애플리케이션을 개발할 수 있습니다.