🖤 Book Study/자바 ORM 표준 JPA 프로그래밍

16장. 트랜잭션과 락, 2차 캐시

드림살구잼 2023. 7. 25. 22:41

트랜잭션과 락

트랜잭션은 ACID (원자성, 일관성, 격리성, 지속성을 보장해야 함)

  • 원자성 : 트랜잭션 내에서 실행한 작업들은 하나의 작업인 것처럼 모두 성공 또는 모두 실패여야 한다.
  • 일관성 : 모든 트랜잭션은 일관성있는 데이터베이스르 상태를 유지해야 한다. 예) DB에서의 무결성 제약 조건 항상 만족
  • 격리성 : 동시에 실행되는 트랜잭션은 서로에게 영향이 미치치 않도록 격리해야한다. 동시에 같은 데이터를 수정하지 못하게 해야한다. 
  • 지속성 : 트랜잭션이 성공적으로 끝나면 항상 결과가 기록되어야 하고, 문제가 생겨 중간에 실패하면 로그 등을 통해 복구해야 한다.

문제는 격리성으로, 격리성을 완전히 보장하려면 트랜잭션을 순서대로 실행해야 하고, 그러면 동시성 처리 성능이 너무 나빠진다. 따라서 ANSI 표준은 트랜잭션의 격리 수준을 4단계로 나누어 정의했다.

격리수준이 높을수록 데이터 일관성은 보장되지만 동시성이 낮아질 수 있으며, 반대로 격리수준이 낮을수록 동시성은 높아지지만 데이터 일관성에 문제가 발생할 가능성이 높아진다. 격리수준이 낮을수록 더 많은 문제가 발생한다. 

Read Uncommitted 의 격리 수준이 가장 낮고, Serializable 의 격리 수준이 가장 높다. 

 

낙관적 락과 비관적 락

JPA는 낙관적 락(애플리케이션이 지원하는 락)과 비관적 락(데이터베이스 트랜잭션 락 메커니즘에 의존함)을 지원한다. 

 

낙관적 락 (Optimistic Locking)

낙관적 락은 트랜잭션이 데이터를 변경하기 전에는 락을 걸지 않고, 트랜잭션의 작업이 끝날 때 충돌이 발생하지 않았다고 가정하는 방식.

즉, 트랜잭션은 데이터를 변경할 때까지 다른 트랜잭션과 충돌하지 않는다고 믿고 진행한다.

그러나 트랜잭션이 데이터를 변경하려고 할 때 실제로 변경 가능한지를 확인하는 단계가 있다. 다른 트랜잭션에서 해당 데이터를 변경하였다면, 낙관적 락은 충돌이 발생하였다는 것을 인식하고 해당 트랜잭션을 롤백시키거나 재시도하게 된다.

 

비관적 락 (Pessimistic Locking)

비관적 락은 트랜잭션의 작업이 충돌할 가능성이 높다고 가정하고, 데이터를 변경하기 전에 락을 거는 방식.

즉, 트랜잭션이 데이터를 읽거나 변경하려고 할 때, 락을 획득한 후 해당 트랜잭션이 작업을 완료하기 전까지 다른 트랜잭션들은 해당 데이터에 접근할 수 없다. 데이터의 일관성을 보장할 수 있으며, 충돌이 발생할 확률을 낮출 수 있다.

 

* "락을 획득한다"는 말은 데이터베이스에서 트랜잭션이나 프로세스가 특정 데이터나 자원에 대한 접근 권한을 얻는다는 의미.

 

 

 

@Version

JPA가 제공하는 낙관적 락을 사용하려면 @Version 어노테이션을 사용하여 버전 관리 기능을 추가해야 한다. 

@Version 어노테이션은 일반적으로 프로그래밍 언어의 주석(comment)과는 다른 기능을 가진, 특별한 주석 형태의 기능이다. 주로 소스 코드의 버전 정보를 기록하고 표시하는데 사용된다. 

버전은 엔티티의 값을 변경하면 증가한다. 

 

 

 

2차 캐시

2차 캐시를 사용하여 애플리케이션의 조회 및 시스템 성능을 극적으로 향상시킬 수 있다. 

 

- 캐시(Cache)란?

캐시는 데이터를 더 빠르게 접근할 수 있도록 임시로 저장하는 메모리 영역.

컴퓨터 시스템은 프로세서와 주 메모리(RAM) 사이에서 데이터를 주고받는데, 이때 캐시는 주 메모리로부터 가져온 데이터를 임시로 저장하여 프로세서가 필요할 때 더 빠르게 접근할 수 있도록 돕는다.

1차 캐시와 2차 캐시 프로세서가 데이터를 요청하면, 우선 1차 캐시(일반적으로 L1 캐시라고도 함)에서 데이터를 찾는다. 1차 캐시는 프로세서와 가장 가까운 곳에 위치하며, 매우 빠르게 데이터에 접근할 수 있다. 하지만 1차 캐시의 용량은 제한적이어서 모든 데이터를 저장할 수는 없다. 

이때, 2차 캐시(일반적으로 L2 캐시라고도 함)는 1차 캐시보다는 느리지만, 주 메모리보다는 훨씬 빠르게 데이터에 접근할 수 있는 중간 지점에 위치한다. 1차 캐시보다 큰 용량을 가지므로 더 많은 데이터를 저장할 수 있다. 

 

캐시 동작 원리

1. 프로세서가 데이터를 요청하면, 우선 1차 캐시를 확인하여 해당 데이터가 있는지 검사함.

2. 1차 캐시에 데이터가 없으면 2차 캐시로 이동하여 데이터를 찾음.

3. 2차 캐시에도 없으면 결과를 2차 캐시에 보관한다.

4. 마지막으로 주 메모리에서 데이터를 가져와서 캐시에 저장하고, 프로세서에게 반환함.

이렇게 함으로써 프로세서가 데이터를 필요로 할 때마다 주 메모리까지 접근하는 시간을 절약할 수 있다.

 

 

책의 더 자세한 내용들은 아직 잘 모르겠어서 챗gpt에게 개념들을 알아보았다.

 

[퀴즈만들어 스터디팀원들과 공유하기]

Q. 낙관적 락과 비관적 락 중 어떤 락 방식을 선택해야 하는지 결정하는데 영향을 미치는 요소는?