스프링 Service의 @Transactional이란?

마코레·2022년 4월 15일
0

백엔드개발

목록 보기
3/18

🍀 내가 작년에 스프링을 처음 배울때, 리드분들이 쓰시니까 그냥 아무생각없이 모든 Service 클래스의 함수에 @Transactional 어노테이션을 붙였던 기억이있다.
사실 지금도 이 어노테이션의 역할에 대해 잘 몰라서 이번기회에 공부해놓으려고한다.


트랜잭션의 필요성


MySQL때 배웠던거랑 똑같다. 데이터 수정 도중에 예외가 발생된다면 수정 전으로 돌아가야할텐데, 여러 작업 진행하다가 문제가 생겼을때 이전상태로 롤백하기 위해 사용되는거시 트랜잭션이다.
이게 비단 MySQL속에서만 나오는 개념이 아니었다. Spring에서도 할수있다는거~

Spring에서 제공하는 트랜잭션

  1. 개발식 트랜잭션
    • 트랜잭션 매니저에서 트랜잭션을 얻어오는 방법
    • 가독성을 떨어뜨리고, 휴먼에러가 유발될 수 있으므로 잘 사용하지 않음.
  2. 선언적 트랜잭션 (어노테이션)
    • 스프링의 AOP를 적극적으로 체감가능
    • xml에서 AOP 설정으로 트랜잭션을 선언하는 방법
    • 어노테이션 사용방법(@Transactional)

@Transactional이란?


개별 메소드나 클래스에 붙을 수 있는 트랜잭션 특성.
class레벨의 어노테이션은 선언된 클래스와 그의 서브클래스 내부에 있는 모든 메소드에 적용된다.
조상 클래스로 올라가 적용되지는 않는다고 한다!

정확히 어떻게 구현이 되는거나면,
1. 스프링은 해당 메소드를 감싼 프록시 객체를 생성
2. 메소드 앞뒤에 트랜잭션 로직을 삽입(begin-commit/rollback)
3. public method에만 프록시 객체 생성

특성들로는,

  • 커스텀 롤백 룰이 적용되지 않았다면, 트랜잭션은 기본적으로 RuntimeException과 Error가 발생했을시 롤백된다.
  • 그러니까, 실제로 에러는 아닌데, 우리에게는 에러인 그런것들을 롤백이 안된다는 소리. (시간차로 뭔가 꼬여서 다른값이 들어가버린다든가 그런거)
  • 일반적으로 PlatformTransactionManager에 의해 관리되는, thread종속적인 트랜잭션으로 수행된다.
  • 해당 thread안에서 수행되는 데이터 접근 연산들에 트랜잭션이 노출된다.
  • @transactional이 적용된 메소드 내부에서 새롭게 시작되는 thread에는 트랜잭션이 전파되지 않음.

어노테이션 사용방법


어노테이션이 가질 수 있는 특성들

  • isolation : 격리성
    • 그 트랜잭션 성질 ACID에서 I부분. 트랜잭션들이 서로 얼마나 격리되었는지 나타냄.
    • read_uncommitted부터 serializable까지 격리수준이 다양한데, 다 어느정도 문제가 발생할 수 있음.
  • propagation : 전파규칙
    • 전파옵션을 고를 수 있고, required같은 경우는 부모의 트랜잭션에 참여하고, 없으면 새로운 트랜잭션을 시작한다는 뜻.
    • 그외에도 supports부터 nested까지 다양함
  • readOnly : 읽기 전용 모드 - false가 기본
  • noRollbackFor : 해당 예외 발생시 롤백안함
  • rollbackFor : 해당 예외 발생시 롤백함
  • timeout : 타임아웃 설정 가능(기본은 -1로 없음)
  • value : 트랜잭션 매니저 설정

정리


내가 생각했던것보다 고급개념이 정말 많이 들어가는거같다^^... 공부가 더 필요하겠구나 싶다.

일단, 결론적으로 @transactional은

  • DB에서 공부할때 나오는 트랜잭션과 같이, 한가지 일을 하는 일련의 코드들을 한 단위로 묶어서 작업을 처리하는 방법
  • 중간에 오류가 생겼을 경우에 작업 이전으로 되돌려주는 역할을 한다.

실제로 어떻게 구동이 되는건지는 나중에 또 정리해야겠다. 일단 이 블로그가 도움이 돼보인다. → 트랜잭션 사용 예제

profile
새싹 백엔드 개발자

0개의 댓글