Message기반의 이벤트 처리를 위해 Spring Integration을 적용하였습니다.
Command는 DB를 조작할때 사용했고, Event는 DB이후에 데이터를 처리할때 사용하려고 합니다.
원하는것은 DB관련 로직의 Transaction이 성공적으로 커밋되면 Event를 발행하여 Event채널로 보내는 것입니다.
🎯데이터 베이스의 Trigger와 비슷한 개념입니다!
검색해보니 TransactionSynchronizationManager가 동기화 작업을 등록하고 이후의 처리한다는 것을 알았고
바로 적용해 보았습니다.
전체 흐름도

트랜잭션 동기화
하나의 실행 단위에서 모든 작업은 모두 성공하거나 실패해야 합니다.
이것을 원자성이라고부릅니다.
원자성을 지킬수 있게 하나의 Connection으로 모든 작업을 처리하고
마지막에 Commit 또는 Rollback을 하는것을 트랜잭션 동기화라고 합니다.
TransactionSynchronizationManager
스프링에서 제공하는 트랜잭션 동기화 관리 클래스 입니다.
기능
트랜잭션 동기화 관리
트랜잭션 내에서 실행되는 작업을 관리하고 동기화합니다.
이를 통해 트랜잭션 내에서 여러 개의 작업이 수행될 때 작업들이 트랜잭션과 일관된 방식으로 처리될 수 있습니다.
트랜잭션 상태 관리
TransactionSynchronizationManager는 현재 트랜잭션의 상태를 추적하고 관리합니다.
트랜잭션이 활성 상태인지, 읽기 전용인지 등을 판단할 수 있습니다.
🎯동기화 작업 등록
TransactionSynchronization 객체를 등록하는 데 사용됩니다.
TransactionSynchronization 객체는 트랜잭션이 커밋되거나 롤백될 때 특정 작업을 수행할 수 있도록 콜백을 제공합니다. TransactionSynchronization 인터페이스를 구현한 클래스를 등록하여 커밋 또는 롤백 시에 원하는 작업을 실행할 수 있습니다.
메서드
인터넷에는 토비의 스프링에서 나온 예제들이 많은것 같습니다.
그러니 저는 제가 사용한 메서드만 기록해 보겠습니다.
registerSynchronization(TransactionSynchronization synchronization)
TransactionSynchronization 객체를 등록하여 트랜잭션이 커밋되거나 롤백될 때 수행할 작업을 지정합니다.
AOP를 통해 특정 서비스가 실행되기 전 registerSynchronization으로 TransactionSynchronization객체를 등록하고
성공적으로 트랜잭션이 동작하면 affterCommit 메서드를 통해 이후 작업을 수행할 수 있습니다.
코드
Spring Integration은 이 글에서 중요하지 않으니 생략하겠습니다.
Service
@Transactional
@CommandAop //Annotation기반 Aop
@ServiceActivator(inputChannel = COMMAND_GATEWAY_COMMENT_CREATE_CHANNEL)
public void comment(Message<CommentCreate> message) {
// 로직 수행
Events.register(saveComment);
}
CommandHandlerAspect
@Aspect
@Component
public class CommandHandlerAspect {
@Before("@annotation(com.example.sns_project.config.aop.CommandAop)")
public void before(JoinPoint joinPoint) {
log.info("---------------AOP CommandHandlerAspect with TransactionSynchronizationManager start!---------------");
TransactionSynchronizationManager.registerSynchronization(new EventsTransactionSynchronization());
}
public class EventsTransactionSynchronization implements TransactionSynchronization {
@Override
public void afterCommit() {
log.info("---------------Transaction Success!!---------------");
// Event채널로 Event등록
}
}
}
느낀점
AOP를 적용하면서 스프링에서 @Transaction, 로깅 등 AOP기능이 정말 많이 사용된다는 것을 알게되었습니다.
또한 Transaction, ThreadLocal에대해 더 잘알게되는 시간이였습니다.
무엇보다 이벤트 주도 개발을 조금 이해할 수 있는것 같아 기분이 좋았습니다.
참고
docs.spring.io TransactionSynchronizationManager
TransactionSynchronizationManager이란?
Spring Transaction 기본 원리와 TransactionSynchronizationManager 사용기
'Project > 개인프로젝트' 카테고리의 다른 글
[Error] Multi Module 적용 에러 (0) | 2023.10.19 |
---|---|
Spring Integration 적용하기 (0) | 2023.10.07 |
ThreadLocal적용하여 Thread 안에서의 값을 공유하기 (0) | 2023.10.07 |
[Spring Integration] Direct Channel과 Executor Channel 차이 (0) | 2023.10.07 |
ThreadLocal 초기화 에러 (0) | 2023.10.02 |
Message기반의 이벤트 처리를 위해 Spring Integration을 적용하였습니다.
Command는 DB를 조작할때 사용했고, Event는 DB이후에 데이터를 처리할때 사용하려고 합니다.
원하는것은 DB관련 로직의 Transaction이 성공적으로 커밋되면 Event를 발행하여 Event채널로 보내는 것입니다.
🎯데이터 베이스의 Trigger와 비슷한 개념입니다!
검색해보니 TransactionSynchronizationManager가 동기화 작업을 등록하고 이후의 처리한다는 것을 알았고
바로 적용해 보았습니다.
전체 흐름도

트랜잭션 동기화
하나의 실행 단위에서 모든 작업은 모두 성공하거나 실패해야 합니다.
이것을 원자성이라고부릅니다.
원자성을 지킬수 있게 하나의 Connection으로 모든 작업을 처리하고
마지막에 Commit 또는 Rollback을 하는것을 트랜잭션 동기화라고 합니다.
TransactionSynchronizationManager
스프링에서 제공하는 트랜잭션 동기화 관리 클래스 입니다.
기능
트랜잭션 동기화 관리
트랜잭션 내에서 실행되는 작업을 관리하고 동기화합니다.
이를 통해 트랜잭션 내에서 여러 개의 작업이 수행될 때 작업들이 트랜잭션과 일관된 방식으로 처리될 수 있습니다.
트랜잭션 상태 관리
TransactionSynchronizationManager는 현재 트랜잭션의 상태를 추적하고 관리합니다.
트랜잭션이 활성 상태인지, 읽기 전용인지 등을 판단할 수 있습니다.
🎯동기화 작업 등록
TransactionSynchronization 객체를 등록하는 데 사용됩니다.
TransactionSynchronization 객체는 트랜잭션이 커밋되거나 롤백될 때 특정 작업을 수행할 수 있도록 콜백을 제공합니다. TransactionSynchronization 인터페이스를 구현한 클래스를 등록하여 커밋 또는 롤백 시에 원하는 작업을 실행할 수 있습니다.
메서드
인터넷에는 토비의 스프링에서 나온 예제들이 많은것 같습니다.
그러니 저는 제가 사용한 메서드만 기록해 보겠습니다.
registerSynchronization(TransactionSynchronization synchronization)
TransactionSynchronization 객체를 등록하여 트랜잭션이 커밋되거나 롤백될 때 수행할 작업을 지정합니다.
AOP를 통해 특정 서비스가 실행되기 전 registerSynchronization으로 TransactionSynchronization객체를 등록하고
성공적으로 트랜잭션이 동작하면 affterCommit 메서드를 통해 이후 작업을 수행할 수 있습니다.
코드
Spring Integration은 이 글에서 중요하지 않으니 생략하겠습니다.
Service
@Transactional
@CommandAop //Annotation기반 Aop
@ServiceActivator(inputChannel = COMMAND_GATEWAY_COMMENT_CREATE_CHANNEL)
public void comment(Message<CommentCreate> message) {
// 로직 수행
Events.register(saveComment);
}
CommandHandlerAspect
@Aspect
@Component
public class CommandHandlerAspect {
@Before("@annotation(com.example.sns_project.config.aop.CommandAop)")
public void before(JoinPoint joinPoint) {
log.info("---------------AOP CommandHandlerAspect with TransactionSynchronizationManager start!---------------");
TransactionSynchronizationManager.registerSynchronization(new EventsTransactionSynchronization());
}
public class EventsTransactionSynchronization implements TransactionSynchronization {
@Override
public void afterCommit() {
log.info("---------------Transaction Success!!---------------");
// Event채널로 Event등록
}
}
}
느낀점
AOP를 적용하면서 스프링에서 @Transaction, 로깅 등 AOP기능이 정말 많이 사용된다는 것을 알게되었습니다.
또한 Transaction, ThreadLocal에대해 더 잘알게되는 시간이였습니다.
무엇보다 이벤트 주도 개발을 조금 이해할 수 있는것 같아 기분이 좋았습니다.
참고
docs.spring.io TransactionSynchronizationManager
TransactionSynchronizationManager이란?
Spring Transaction 기본 원리와 TransactionSynchronizationManager 사용기
'Project > 개인프로젝트' 카테고리의 다른 글
[Error] Multi Module 적용 에러 (0) | 2023.10.19 |
---|---|
Spring Integration 적용하기 (0) | 2023.10.07 |
ThreadLocal적용하여 Thread 안에서의 값을 공유하기 (0) | 2023.10.07 |
[Spring Integration] Direct Channel과 Executor Channel 차이 (0) | 2023.10.07 |
ThreadLocal 초기화 에러 (0) | 2023.10.02 |