우아한테크코스 테코톡

리차드의 @Transactional

https://youtu.be/taAp_u83MwA

리차드의 @Transactional

트렌젝션이란?

  • 데이터베이스에 모두 반영되거나 모두 반영 되지 않아야 되는 이런 하나의 작업 단위를 트랜젝션이라고 말한다.
  • 작업 단위를 묶어주지 않았을 경우
    • 서로 다른 요청일 경우 데이터베이스 입장에서 하나의 작업 단위로 다룰 수가 없다.
    • 이유는 애플리케이션에서는 커넥션풀을 통해서 커넥션 객체를 가져오고 커넥션 객체를 통해서 데이터베이스에 요청을 보내는데 데이터베이스는 이런 하나의 커넥션을 하나의 세션으로 할당해서 처리를 하게 되기 때문에 완전히 별개의 작업으로 처리가 된다.
  • 작업 단위를 트랜젝션으로 묶었을 경우
    • 먼저 커넥션 객체를 통해서 setAutoCommit(false)를 주면서 요청을 보내면 즉시 반영 안 하게 설정한다. 그후 요청을 보내고 문제 없으면 데이터베이스에 반영해 달라고 보내야한다.
    • 하나의 커넥션 객체를 이용해서 하나의 세션으로 할당돼서 하나의 작업으로 처리가 가능해진다.
    • 코드로 옮기면
      • img.png
      • 코드 작성에 실수가 발생할 여지가 많아진다.
      • 중복성 코드가 많아진다.
      • 주된 관심사가 아닌 코드가 서비스 레이어에 담긴다.
      • 특정 기술에 종속적인 코드가 되어버린다.

AOP의 등장

  • 트렌젝션의 시작 -> 관심사 로직 수행 -> 커밋 또는 롤백
  • 프록시 객체의 주입
    • 컨트롤러 -> 서비스(프록시) -> 타켓 소스
  • 트랜잭션 시작 -> 타겟 메서드 실행 -> 트랜젝션 종료

요약

  • 빈 생성 시, @Transactional 애노테이션이 잇으면, 프록시 객체가 빈으로 등록된다.
  • 스프링이 제공하는 선언적 트랜젝션 관리를 통해, 서비스 레이어에 트랜젝션 코드 혹은 특정 기술에 종속된 코드를 분리했다.

© 2020. All rights reserved.

SIKSIK