인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

blackhole124님의 프로필 이미지
blackhole124

작성한 질문수

스프링 핵심 원리 - 고급편

빈 후처리기 - 소개

빈 후처리기와 프록시 그리고 @Transactional 관련 질문 있습니다.

작성

·

28

0

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.

1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)

[질문 내용]
안녕하세요, 강사님. 항상 강의 잘 보고 있습니다.

해당 강의를 듣고 개인 학습을 하던 중에 @Transactional에 대해 궁금한 점이 생겼습니다. 특히, **"@Transactional은 접근 제어자가 public이 아닌 메서드에는 적용되지 않는다"**는 부분에 대해 잘 이해가 되지 않았습니다.

저는 이전에 강사님 강의를 듣고, @Transactional을 메서드에 적용할 때 빈 후처리기와 프록시 방식에 대해 아래와 같이 이해했습니다.

  1. A 클래스의 A 메서드에 @Transactional을 적용

    • 스프링은 해당 메서드에 트랜잭션을 적용할 수 있도록 AOP 기반으로 동적 프록시를 생성함.

  2. 스프링 컨테이너가 @Transactional이 붙은 메서드를 가진 클래스는 AOP가 적용된 클래스임

    • 스프링은 @Transactional이 적용된 메서드를 감지하여, 트랜잭션을 적용하기 위해 AOP 기능을 사용함.

  3. 스프링 컨테이너에 A 클래스를 bean으로 등록할 때, 빈 후처리기에서 A 클래스의 프록시 객체를 스프링 빈으로 등록

    • 스프링에서는 빈 후처리기에서 트랜잭션을 적용하는 프록시 객체를 생성함. 실제 A 객체가 아닌 프록시 객체가 빈으로 등록되며, 이 프록시 객체는 실제 A 클래스의 메서드들을 호출할 때 트랜잭션을 관리하는 추가 로직을 삽입함.


그런데 이렇게 생성되고 사용될 때, **"@Transactional은 접근 제어자가 public이 아닌 메서드에는 적용되지 않는 이유"**가 잘 이해되지 않습니다.

예를 들어, 아래와 같은 코드에서:

public class MyService {

    @Transactional
    public void performAction() {
        // 트랜잭션이 필요한 메서드
    }
}

프록시 객체는 다음과 같이 생성될 것이라고 생각했습니다:

public class MyServiceProxy extends MyService {

    @Override
    @Transactional
    public void performAction() {
        // 트랜잭션 관련 로직 추가 (시작, 커밋, 롤백 등)
        // 원래의 MyService.performAction() 호출
        super.performAction();
    }
}

그런데, "왜 @Transactional이 붙은 메서드는 public이 아닌 접근 제어자에는 적용되지 않나요?" 이 부분에 대한 설명이 부족하여 궁금합니다.

왜냐하면, 어차피 기존 클래스를 바탕으로 만들어지는게 프록시 객체라면 @Transactional을 적용할때, 접근 제어자가 왜 중요한지 잘 이해가 안됩니다

설명 부탁드립니다

답변 2

0

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

안녕하세요. blackhole124님

다음 내용을 참고해주세요.

스프링 DB2편 - 9. 스프링 트랜잭션 이해

  • 트랜잭션 AOP 주의 사항 - 프록시 내부 호출2

감사합니다.

0

안녕하세요, 인프런 AI 인턴입니다. blackhole124님.

질문해주신 내용은 스프링에서 @Transactional 어노테이션이 어떻게 효과적으로 작동하는지, 그리고 왜 public 접근 제어자에만 적용되는지에 대한 이해가 필요합니다. @Transactional 어노테이션은 주로 스프링 AOP(Aspect-Oriented Programming)를 통해 동작합니다. 이 과정에서 프록시가 생성되며, 프록시를 통한 메서드 호출이 트랜잭션의 경계를 형성하게 됩니다.

주요 원리:

  1. AOP와 프록시의 역할: @Transactional을 적용하면 스프링은 해당 클래스를 프록시로 감싸게 됩니다. 이 프록시는 메서드 호출 전후에 트랜잭션을 시작하거나 종료하는 역할을 합니다.

  2. 프록시 생성의 제한사항: 스프링 AOP는 기본적으로 인터페이스 기반 프록시와 클래스 기반 프록시 두 가지를 지원합니다. 그러나, @Transactional과 같은 경우는 주로 인터페이스 기반 프록시가 사용되며, 메서드 호출이 외부에서 프록시를 통해 이루어져야 합니다.

  3. 접근 제어자와 AOP: 프록시를 통한 AOP는 외부에서 접근 가능한 메서드에 대해서만 동작합니다. 이것이 public 메서드에만 적용되는 이유입니다. 즉, protected, private 메서드는 프록시의 내부 호출로 간주되어 AOP가 적용되지 않습니다.

예시 설명:
public void performAction() 메서드는 외부에서 프록시 객체를 통해 호출될 때 프록시는 이 메서드 호출을 감지하고 트랜잭션을 시작합니다. 그러나 private이나 protected 메서드는 클래스 내부에서 직접 호출되므로 프록시를 경유하지 않아 트랜잭션이 적용되지 않습니다.

이미 존재하는 답변 중 해당 개념에 대한 설명이 포함된 사례로는 다음과 비슷한 질문이 있습니다:

위 설명과 링크들이 질문자님의 궁금증을 해결하는 데 도움이 되길 바랍니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

blackhole124님의 프로필 이미지
blackhole124

작성한 질문수

질문하기