인프런 커뮤니티 질문&답변

Sunny님의 프로필 이미지
Sunny

작성한 질문수

스프링 핵심 원리 - 고급편

애노테이션 @Transactional의 위치 질문입니다.(AOP 관련)

해결된 질문

작성

·

542

0

안녕하세요 김영한님!

강의를 다 듣고나서 트랜잭션 AOP의 동작원리를 알 수있게 되어 정말 감사합니다.

다만 제가 궁금한건 애노테이션 @Transactional입니다. 주로 서비스의 메소드에 적용하는데 클래스에도 붙일 수 있더군요.

@Service
@Transactional(readOnly = true)
public class ProductService {

강의에서는 AOP 적용위치는 생성자, 필드 값 접근, static 메서드 접근, 메서드 실행 이라고 말씀하셨는데

저 애노테이션은 AOP와 관련이 없는건가요? 아님 내부적으로 클래스 단위에 붙일 때는 클래스 하위 메소드에도 전부 적용하도록 내부 코드에 설정이 되어있는건가요? (흑흑 강의를 다시 들어야하는 걸까요?)

질문 읽어주셔서 감사합니다!

답변 1

0

안녕하세요, Sunny 님. 공식 서포터즈 codesweaver 입니다.
.
AOP의 경우 각 서비스들의(컨트롤러, 서비스, 레포지터리 등등의 빈 객체들) 공통적인 관심사를 해결하기 위한 프로그래밍 방법을 말합니다. 강의의 예제처럼 모든 메서드가 호출될 때마다 로그를 남긴다던가 하는 작업이 AOP에서 다루고자 하는 관심사 입니다.

 

트랜잭션은 어떤 일을 하나로 묶은 단위라고 이해하시면 됩니다. 그리고 이렇게 묶인 일이 처리되고 있을때는 다른 프작업으로 방해를 받지 않습니다. 가령 은행에서 돈을 뽑는다고 하면, '잔고조회->출금가능여부 확인->잔고감소->인출' 을 하나의 단위로 묶어서 다루는 것이 트랜잭션의 관심사 입니다. 만약 위의 과정에서 잔고는 감소하였으나 그 다음 인출과정 중 오류가 발생해 고객이 돈을 뽑지 못했다고 하겠습니다. 그럼 고객은 돈을 받지 못한 채 재고만 감소하는 문제가 생깁니다. 이 과정을 트랜잭션으로 묶으면 어떻게 달라질까요? 돈을 뽑는 어떤 과정 중 하나라도 실패하게 되면 모든 과정을 실패로 처리합니다. 따라서 잔고감소는 무효 처리 됩니다.

.

애노테이션 위치에 따른 트랜잭션 적용은, @Transactional 애노테이션을 메소드에 붙일 경우 메소드에만 적용되며, 클래스에 붙일 경우 클래스가 소유한 메서드 전체에 적용됩니다.

감사합니다.

Sunny님의 프로필 이미지
Sunny
질문자

어.. 제가 알고싶은건 트랜잭션이 아닌 @Transactional 애노테이션이 메소드가 아닌 클래스에 붙였을 경우 어째서 클래스가 소유한 메서드 전체에 적용되는지 알고싶어 질문드렸습니다.

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. Sunny님 @Transactional을 처리는 전용 어드바이스, 포인트컷이 해당 기능을 가능하게 처리합니다. 예를 들어서 메서드에 @Transactional 에노태이션이 있는지 확인하고 없으면 클래스 레벨도 체크합니다.

이 부분에 대해서 다음 강의인 스프링 DB 접근 기술에서도 자세히 설명드릴 예정입니다.

감사합니다.

Sunny님의 프로필 이미지
Sunny
질문자

아 그렇군요 다음 강의 컨텐츠 질문이었군요 친절한 답변감사합니다!!

Sunny님의 프로필 이미지
Sunny

작성한 질문수

질문하기