우아한테크코스 테코톡
리차드의 @Transactional
카테고리 : 우아한테크코스 테코톡
리차드의 @Transactional
트렌젝션이란?
- 데이터베이스에 모두 반영되거나 모두 반영 되지 않아야 되는 이런 하나의 작업 단위를 트랜젝션이라고 말한다.
- 작업 단위를 묶어주지 않았을 경우
- 서로 다른 요청일 경우 데이터베이스 입장에서 하나의 작업 단위로 다룰 수가 없다.
- 이유는 애플리케이션에서는 커넥션풀을 통해서 커넥션 객체를 가져오고 커넥션 객체를 통해서 데이터베이스에 요청을 보내는데 데이터베이스는 이런 하나의 커넥션을 하나의 세션으로 할당해서 처리를 하게 되기 때문에 완전히 별개의 작업으로 처리가 된다.
- 작업 단위를 트랜젝션으로 묶었을 경우
- 먼저 커넥션 객체를 통해서 setAutoCommit(false)를 주면서 요청을 보내면 즉시 반영 안 하게 설정한다. 그후 요청을 보내고 문제 없으면 데이터베이스에 반영해 달라고 보내야한다.
- 하나의 커넥션 객체를 이용해서 하나의 세션으로 할당돼서 하나의 작업으로 처리가 가능해진다.
- 코드로 옮기면
- 코드 작성에 실수가 발생할 여지가 많아진다.
- 중복성 코드가 많아진다.
- 주된 관심사가 아닌 코드가 서비스 레이어에 담긴다.
- 특정 기술에 종속적인 코드가 되어버린다.
AOP의 등장
- 트렌젝션의 시작 -> 관심사 로직 수행 -> 커밋 또는 롤백
- 프록시 객체의 주입
- 컨트롤러 -> 서비스(프록시) -> 타켓 소스
- 트랜잭션 시작 -> 타겟 메서드 실행 -> 트랜젝션 종료
요약
- 빈 생성 시, @Transactional 애노테이션이 잇으면, 프록시 객체가 빈으로 등록된다.
- 스프링이 제공하는 선언적 트랜젝션 관리를 통해, 서비스 레이어에 트랜젝션 코드 혹은 특정 기술에 종속된 코드를 분리했다.