🤥개요
트랜잭션에 대한 이해를 바탕으로 왜 이 트랜잭션이라는 개념이 중요한지를 알게되고 더 나아가 활용의 범주까지 지식의 스펙트럼을 넓히며 면접 및 취업을 대비하기 위해 [10분 테코톡]을 시청 후 본 내용을 정리하고 내 것으로 만들기 위해 작성한 내용입니다.
들어가기
우리는 사용자가 제공한 데이터를 잘 전달받고, 저장해서 이 데이터를 기반으로 서비스를 운영한다. 그럼 과연 이 동작들이 어떻게? 어떠한 방식으로? 왜? 등 여러한 궁금증이 생길 수 있는데 그 속에는 트랜잭션이라는 무서운 놈이 숨어있다.
🤔목차
- 트랜잭션이란? 🧐
- 트랜잭션의 성질과 특징 💪
- 선언적 트랜잭션과 프로그래밍 트랜잭션 😶
- 마무리 😃
1). 트랜잭션이란? 🧐
트랜잭션은 요청한 작업이 진행되는 일련의 단위이다.
예를들어 내가 요청한 작업이 동시에 진행되어야 하는 작업임을 기대하고 요청했다.
이 때, 데이터베이스의 입장에서 작업의 단위를 묶어주지 않았더라면 그 요청들은 개별적인 요청이 될 것이고, 결국 내가 원하는, 내가 구상한 내용의 결과물이 아닐 수 있다.
이 속에는 애플리케이션의 내부 동작에 집중해야 하는데,
커넥션 풀을 이용해 커넥션 객체를 가지고 오고, 이 객체를 이용해 DB에 요청을 보낸다.
DB의 입장에선 이 커넥션이 하나의 세션으로 처리를 하는데 만약 예시로 설명한 부분처럼 작업을 하나로 묶지 않으면 결국 각 각 다른 커넥션으로 생각할 것이고, 이는 각 각의 세션을 처리하는, 개별 작업으로 처리해버릴 것이다
.
그래서 우리가 기대한 결과값이 나오지 않았을 것이며, 이를 해결하기 위해선 다음과 같다.
우선 먼저 우리가 기대한 행동에 대해 하나의 커넥션으로 만든 후 DB에 요청을 해야한다. 그럼 DB 입장에선 하나의 커넥션으로 생각하고, 세션을 처리하며 하나의 작업으로 처리할 것이다.
이 속에는 트랜잭션의 성질이자 특징이 반영되어있다.
2. 트랜잭션의 성질과 특징💪
- 원자성 (Atomicity) : 한 트랜잭션 내 실행한 작업들은 하나로 간주 ( 모두 성공 or 모두 실패)
- 일관성 (Consistency) : 일관성 있는 DB 상태를 유지해야 함
- 격리성 (Isolation) : 실행되는 동시에 트랜잭션들이 서로 영향을 미치지 않도록 격리해야함
- 지속성, 영속성 (Durability) : 결과를 항상 저장해야함.
3. 선언적 트랜잭션과 프로그래밍 트랜잭션😶
트랜잭션을 관리하는 방법엔 2가지 방법이 있다.
- 프로그래밍 방식 트랜잭션 관리
- 선언적 트랜잭션 관리
(오른쪽) → 직접 프로그래밍 방식 트랜잭션 관리
(왼쪽) → 선언적 트랜잭션 관리
Q : 만약 위 코드처럼 직접 프로그래밍을 통해 트랜잭션을 관리한다면? 어떤 문제가 발생할까?
먼저 코드 동작 순서는 다음과 같다.
dataSource를 통해 DB와 연결하고, setAutoCommit을 이용해 오토 커밋이 자동으로 커밋을 하지 못하게 false로 지정해준다
그 후 원하는 작업을 진행하고 save()를 이용해 데이터를 저장하는데, 이 때 매개변수로 connection을 전달하는데 이유는 결국 하나의 동작으로 만들기 위해선 하나의 커넥션으로 만들어야 하기 때문이다. 그 후 성공시 commit, 실패시 rollback을 콜하며 해당 메서드가 완료된다.
이렇게 코드를 작성하는데 발생하는 문제점은 다음과 같다
- 중복 코드
결국 트랜잭션을 필요로 하는 기능에서 이렇게 코드를 다 작성하면 코드 중복도가 높아질 것이다.
- 주된 관심사가 아닌 코드가 서비스 레이어에 담김
해당 기능이 요구하고 싶은 기능에 대한 관심사에 집중하지 못한다는 점
- 코드 작성에 문제가 발생할 가능성 커짐
- 특정 기술에 종속적인 코드
4. 마무리😃
위에서 예시를 통해 확인한 프로그래밍 트랜잭션을 확인하면 다음과 같다.
1)트랜잭션을 시작하고,
2)관심사 로직을 수행하며
3)마지막으로 성공 혹은 취소인 commit과 rollback의 흐름을 가지게 된다.
스프링에선 이러한 문제점을 프록시 객체를 빈에 등록해서 문제를 해결하고자 한다.
스프링에선 클래스, 메서드 위에 @Transactional이 추가가 되면, 이 클래스에 트랙잭션 기능이 적용된 프록시 객체 빈으로 등록되고, 이 프록시 객체는 @Transactional이 포함된 메서드가 호출 될 경우, PlatformTransactionManager을 사용해 트랜잭션을 시작하고, 정상 여부에 따라 Commit 또는 Rollback 한다. 이로서 종속된 코드를 분리할 수 있다.
이로서 확장적으로 더 알아볼 키워드는 다음과 같다.
- 트랜잭션 매니저
- 트랜잭션 동기화 매니저
- AOP
- JDK Dynamic Proxy
- CGLIB
'스프링' 카테고리의 다른 글
[#1] Spring Security - 시큐리티는 무엇이고, Filter는 무엇인지 (0) | 2022.12.29 |
---|---|
[10분 테코톡] - @JDK Dynamic Proxy & CGLIB (0) | 2022.12.22 |
Spring- Lombok의 이해와 @Annotation (계속 추가합니다.) (0) | 2022.12.14 |
스프링 AOP (0) | 2022.12.07 |
Controller, Service 왜 나눌까요? (2022.12.02 - 작성 중) (0) | 2022.12.02 |