작성
·
93
·
수정됨
0
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.
1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)
질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)
[질문 내용]
안녕하세요 항상 강의 잘 보고 있습니다.
강의에서
1.생성 : 스프링이 스프링 빈 대상이 되는 객체를 생성함
2.전달 : 생성된 객체를 빈 저장소에 등록하기 직전에 빈 후처리기에 전달함
~ 그 후에
프록시 적용대상인 클래스가 있으면
3.프록시 생성 : 프록시 적용 대상이고, 프록시를 생성하고 반환해서 프록시를 스프링 빈으로 등록한다. 라고 말씀하셨습니다.
그 후에,
생성된 프록시와 어드바이저의 동작 과정을 설명하실 때 ,
client -> ( proxy <-> advisors ) -> target 이런 동작 과정이라고말씀하셨는데 이 부분에서 이해가 안되는 부분이 있습니다.
1.프록시 객체를 생성했는데 target을 호출하는 이유가 무엇인가요?
예를 들어,
프록시 객체는 target을 기반으로 만들어진 클래스라고 이해를 했습니다.
그러면 프록시 객체는 target의 구현체로서 target의 메소드도 가지고 있고, advisor 메소드도 가지고 있는 것 아닌가요?
그래서 그냥 타겟을 호출할 필요없이, 프록시 객체에서 모든 요청을 처리하면 되는것 아닌가요??
왜 프록시 객체는 advisor을 호출하고, 다시 타겟을 통해서 메서드를 또 실행하는건가요?
즉, 전 프록시 객체를 만든다는 것을 아래와 같은 예시로 이해를 했습니다. 그래서 굳이 target을 다시 호출하지 않고, 프록시 객체가 모든 요청을 처리하는게 맞는거 같은데 왜 target을 다시 호출하는건가요??
// AClass
public class AClass {
public void say() {
System.out.println("Hello from AClass!");
}
}
// LoggingAspect
ㅇ@Aspect
@Component
public class LoggingAspect {
@Before("execution(* com.example.AClass.say(..))")
public void logBefore() {
System.out.println("Before calling say method");
}
}
//Proxy
public class AClassProxy extends AClass {
@Override
public void say() {
logBefore(); // 로그 출력
super.say(); // 실제 AClass의 say 메서드 호출
}
public void logBefore() {
System.out.println("Before calling say method");
}
}
감사합니다.
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
blackhole124님께서 질문하신 스프링의 프록시와 어드바이저, 그리고 타겟 호출에 관한 부분은 AOP(Applied Aspect Oriented Programming)의 기본 원리와 관련이 깊습니다. 프록시는 단순히 타겟 객체의 대리 역할을 하는 것이 아니라, 추가된 어드바이스 로직(님께서 언급하신 advisor 메소드)을 실행하는 기능을 수행합니다. 이를 이해하기 위해선 다음과 같은 개념들이 필요합니다.
프록시의 역할: 프록시는 실제 타겟 객체에 대한 모든 메서드 호출을 가로채고 관리합니다. 이때, 프록시는 자신이 직접 비즈니스 로직을 수행하는 것이 아니라, 추가된 어드바이스(로그 작성, 트랜잭션 관리 등)를 실행 후, 필요 시 타겟 객체의 메서드를 호출하여 비즈니스 로직을 수행하게 합니다.
어드바이저와의 상호작용: 프록시는 어드바이저를 통해 지정된 포인트컷(Pointcut)에 따라 특정 메서드에 대한 조언(Advice)을 적용합니다. 예를 들어, 로깅, 트랜잭션 처리 같은 부가 작업들이 여기에 포함됩니다. 이는 메서드 호출 전, 후, 또는 예외 발생 시점에 적용될 수 있습니다.
타겟 객체 호출의 이유: 프록시는 타겟 객체의 메서드를 직접 정의하는 것이 아니라, 타겟 객체의 메서드를 호출하는 방식으로 비즈니스 로직을 수행합니다. 이는 프록시가 비즈니스 로직을 수정하거나 오버라이드하는 것이 아니라, 원본 객체의 메서드를 보존하면서 추가적인 로직만을 필요할 때 실행하도록 합니다.
스프링 프레임워크의 AOP는 이렇게 프록시를 통해 비즈니스 로직을 보호하고, 중복을 줄이면서 다양한 부가 로직을 쉽게 적용할 수 있도록 돕습니다.
좀 더 구체적으로 이해를 원하신다면 관련된 기존 질문들을 참고해보시면 도움이 될 것입니다:
해당 글에서는 this
와 target
지시자의 차이를 이해하기 위해 프록시와 실제 타겟 객체의 관계를 설명하고 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.