Spring

[Spring] 트랜잭션의 이해

dev-hahm 2023. 2. 18. 17:37

너무 오랜만에 글을.. 최근들어 프로젝트가 너무 바빠서...자기 개발보다 업무처리에 정신이 하나도 없었다..(핑계가득..^^)

 

오늘은 Spring에서 제공하는 트랜잭션에 대해 정리해보려 한다.

 

스프링을 사용하다보면 기본적으로 트랜잭션 관리를 스프링에서 알아서(?) 처리해주기 때문에 개발자들이 크게 신경쓰지 않고 개발하는 경우가 많다. 

 

하지만 최근에 비지니스 로직에서 에러가 발생했을때 트랜잭션의 문제로 일부 데이터만 생성되는 일이 있었다.

이때 어? 트랜잭션 처리가 왜 이러지? 라는 의문은 들었지만 명확하게 알지 못해 내용을 찾아 정리하게 됬다.

(ㅎㅎㅎㅎㅎㅎ 내 자신 너무 부족함이 넘친다)

 

트랜잭션이란?

나름 쉽게 얘기하면 트랜잭션(Transaction)이란 데이터베이스에서 수행하는 작업 단위를 의미한다. 여러 작업을 하나의 논리적 단위로 묶어, 모두 성공하거나 모두 실패할 때까지 실행을 유보하는 것이다. - 원자성(Atomicity)

 

트랜잭션을 실행하기 전과 실행한 후의 데이터베이스의 일관성이 있어야한다. 트랜잭션이 수행되기 전 데이터베이스 제약 조건은 트랜잭션 종료 이후에도 만족되어야 한다. - 일관성(Consistency)

 

여러 개의 트랜잭션이 동시에 실행될 때 하나의 트랜잭션이 다른 트랜잭션에 영향을 미치지 않아야 한다. - 격리성(Isolation)

 

트랜잭션에 커밋 결과는 영구적으로 데이터베이스에 반영되어야 한다. - 지속성(Durability)

 

이 4가지를 통칭하여 "ACID" 특성이라 한다. 이 특성을 통해 데이터베이스는 안정적인 데이터 처리를 보장한다.

Spring의 트랜잭션

출처 : https://hongchangsub.com/db-jdbctospring-transactional/

 

그럼 이러한 트랜잭션을 위해 스프링에서는 AOP(Aspect-Oriented Programming) 기능을 사용하여 구현되며,

선언적 트랜잭션 관리프로그램 방식의 트랜잭션 관리 두 가지 방법을 지원한다.

 

AOP설정은 XML, 어노테이션 또는 자바 구성 클래스로 구성할 수 있다. XML을 사용하는 경우, aop:aspect 태그를 사용하여 Aspect를 정의한다. Aspect는 포인트컷과 어드바이스로 구성되며,

포인트컷은 특정 메서드나 클래스에 적용할 트랜잭션을 선택하는 데 사용된다.

어드바이스는 트랜잭션 시작, 커밋 또는 롤백을 구현한다.

 

선언적 트랜잭션 관리는 XML 또는 어노테이션(@Transaction)을 사용하여 트랜잭션을 정의하는 것을 이야기한다.

메서드를 실행할 때 Spring은 메서드가 실행되는 동안 트랜잭션을 시작하고, 메서드의 실행이 완료되면 트랜잭션을 커밋 or 롤백을 진행한다.

 - 이 방법은 트랜잭션 관리부를 비지니스 로직과 분리할 수 있어 재사용성과 유지보수성을 높일 수 있다.

 

프로그램 방식의 트랜잭션 관리는 개발자가 트랜잭션의 시작, 커밋, 롤백하는 코드를 직접 작성하는 것을 의미한다.

 - 이 방법은 수동적으로 번거로울 수 있지만 더 세밀한 제어가 가능하다.

 

트랜잭션의 활용

그럼 이러한 트랜잭션을 실제로 어떻게 활용하며 좋을까? 일반적으로는 비지니스 로직을 구현하는(ServiceImpl)의 서비츠 계층(Service)와 결합하는게 좋다. 이유는 실제 데이터베이스와 통신은 DAO 혹은 MAPPER에서 이루어지지만 가져온 데이터를 사용하고 변경하는 일은 service단위로 이루어지기 때문이다. 

 

흔히들 service단을 통해 메소드에 접근하는게 좋다, 혹은 mapper/dao에 바로 접근하는건 바람직하지 않다라고 이야기 하는 이유가 여기에 있다.

 

※ 수정이 필요한 내용에 대해선 댓글 남겨주시면 수정토록 하겠습니다.