스택큐힙리스트

봄 - @Transactional - 배경에서는 무슨 일이 일어날까요? 본문

카테고리 없음

봄 - @Transactional - 배경에서는 무슨 일이 일어날까요?

스택큐힙리스트 2023. 10. 27. 12:44
반응형

나는 실제로 메소드에 @Transactional을 어노테이션한다면 무슨 일이 일어나는지 알고 싶습니다?
물론, Spring이 그 메소드를 트랜잭션 안에 랩핑한다는 것을 압니다.


하지만, 저는 다음과 같은 의문이 있습니다:



  1. Spring이 프록시 클래스를 생성한다는 것을 들어보았습니다. 더 자세히 설명해주실 수 있나요? 그 프록시 클래스에는 실제로 어떤 것이 있는 건가요? 실제 클래스는 어떻게 될까요? 그리고 Spring이 생성한 프록시 클래스를 어떻게 볼 수 있을까요?

  2. 또한 Spring 문서에서 다음과 같이 읽었습니다:



참고: 이 메커니즘은 프록시에 기반하기 때문에, 프록시를 통해 들어오는 '외부' 메소드 호출만 가로채게 됩니다. 이는 대상 객체 내에서 발생하는 '자체 호출', 즉 대상 객체의 다른 메소드를 호출하는 경우에도 실제로는 트랜잭션이 실행되지 않습니다. 실제로는 @Transactional이 지정되어 있는 invoked 메소드조차도!


소스: http://static.springsource.org/spring/docs/2.0.x/reference/transaction.html


왜 외부 메소드 호출만 트랜잭션에 포함되고, 자체 호출 메소드는 포함되지 않을까요?

답변 1

관찰한 대로, 프록시 메커니즘은 다른 외부 객체에서 호출이 있을 때만 작동합니다. 객체 내에서 내부 호출을 할 때에는 실제로는 this 참조를 통해 호출하므로 프록시는 우회됩니다. 그러나 이 문제를 해결할 수 있는 방법이 있습니다. 저는 이 포럼 게시물에서 한 가지 접근법을 설명하고 있습니다. 이 접근법에서는 BeanFactoryPostProcessor를 사용하여 자기 참조 클래스에 프록시 인스턴스를 런타임에 주입합니다. 저는 이를 me라는 멤버 변수에 저장합니다. 그런 다음 스레드의 트랜잭션 상태를 변경해야하는 내부 호출을해야하는 경우, 호출을 프록시를 통해 직접 수행합니다 (예 : me.someMethod()). 포럼 게시물에서 자세한 내용을 설명하고 있습니다.

주의해야 할 사항은 BeanFactoryPostProcessor 코드가 약간 다를 수 있다는 것입니다. 이 코드는 Spring 1.x 시점에 작성되었습니다. 하지만 업데이트된 버전이 있으며 얼마든지 이용하실 수 있습니다.

답변 2

@Transactional은 스프링 프레임워크에서 제공하는 어노테이션 중 하나로, 메서드나 클래스에 지정하여 데이터베이스 트랜잭션을 관리하는 데에 사용됩니다. 트랜잭션은 데이터베이스 상태를 변화시키는 연산들의 논리적 단위로, 데이터 정합성과 일관성을 보장하기 위해 필요합니다.
@Transactional 어노테이션을 사용하면 자동으로 트랜잭션을 시작하고 종료할 수 있으며, 예외가 발생하면 롤백(Rollback)하여 이전 상태로 되돌릴 수도 있습니다. 이를 통해 데이터베이스 작업에 대한 안전성과 신뢰성을 높일 수 있습니다.
@Transactional 어노테이션을 메서드에 적용하면, 해당 메서드 내에서 실행되는 데이터베이스 작업은 하나의 트랜잭션으로 처리됩니다. 예를 들어, 하나의 메서드에서 여러 개의 데이터베이스 조작이 일어나고, 그 중 하나라도 실패하면 모든 작업이 롤백되어 이전 상태로 회복됩니다. 이는 데이터의 무결성을 유지해주는 중요한 기능입니다.
@Transactional 어노테이션은 메서드의 선언부 위에 추가됩니다. 옵션으로는 속성(propagation), 격리 옵션(isolation level), 제한시간(time limit), 읽기 전용(read-only) 등이 제공됩니다. 각각의 옵션은 트랜잭션 처리 방식에 영향을 미치며, 개발자는 상황에 맞게 적절한 옵션을 선택해야 합니다.
트랜잭션의 시작과 종료는 개발자가 직접 관리할 수도 있지만, @Transactional 어노테이션을 이용하면 스프링이 자동으로 처리해줍니다. 일반적으로 서비스 클래스 내의 메서드에 @Transactional을 적용하여 데이터베이스 작업을 트랜잭션 단위로 묶습니다.
이런식으로 @Transactional 어노테이션을 사용함으로써, 스프링은 내부적으로 데이터베이스 연결, 트랜잭션 시작 및 롤백, 결과의 커밋 등과 같은 작업을 수행합니다. 이러한 작업은 개발자에게 숨겨져 있으며, 개발자는 편리하게 데이터베이스 작업에 집중할 수 있습니다.
올바르게 작성된 @Transactional 어노테이션은 검색 엔진 최적화에도 긍정적인 영향을 줄 수 있습니다. 트랜잭션 단위로 작업을 묶으면 데이터의 일관성과 정확성이 보장되므로, 검색 엔진은 신뢰도가 높은 페이지를 선호하여 노출시키는 경향이 있습니다. 또한, 스프링 프레임워크가 제공하는 다양한 기능들을 이용하여 웹 애플리케이션을 최적화할 수 있으므로, 검색 엔진에서의 노출성 또한 향상될 수 있습니다.
결론적으로, @Transactional 어노테이션은 스프링 프레임워크에서 데이터베이스 트랜잭션을 관리하기 위한 강력한 도구입니다. 이를 올바르게 활용하면 데이터 정합성과 일관성을 보장하면서 효율적인 웹 애플리케이션을 구현할 수 있습니다. 또한, 검색 엔진 최적화를 통해 더 많은 사용자들에게 노출되는 성과를 얻을 수 있습니다. 스프링의 @Transactional 어노테이션을 잘 이해하고 적절히 활용하여 안정적이고 성능 우수한 웹 애플리케이션을 개발하는 것이 중요합니다.

반응형
Comments