[스프링 핵심원리 - 고급] 스프링 AOP 실무 주의사항
Back-End/Spring2025. 4. 27. 21:06[스프링 핵심원리 - 고급] 스프링 AOP 실무 주의사항

이 글은 인프런 김영한님의 Spring 강의를 바탕으로 개인적인 정리를 위해 작성한 글입니다.프록시와 내부 호출문제점스프링은 프록시 방식의 AOP를 사용한다.따라서 AOP를 적용하려면 항상 프록시를 통해서 대상 객체(Target)을 호출해야 한다.이렇게 해야 프록시에서 먼저 어드바이스를 호출하고, 이후에 대상 객체를 호출한다.만약 프록시를 거치지 않고 대상 객체를 직접 호출하게 되면 AOP가 적용되지 않고, 어드바이스도 호출되지 않는다.AOP를 적용하면 스프링은 대상 객체 대신에 프록시를 스프링 빈으로 등록한다. 따라서 스프링은 의존관계 주입시에 항상 프록시 객체를 주입한다.프록시 객체가 주입되기 때문에 대상 객체를 직접 호출하는 문제는 일반적으로 발생하지 않는다.하지만 대상 객체의 내부에서 메서드 호출..

[Spring 핵심원리 - 고급] 포인트컷 지시자(PCD)
Back-End/Spring2025. 4. 27. 20:21[Spring 핵심원리 - 고급] 포인트컷 지시자(PCD)

이 글은 인프런 김영한님의 Spring 강의를 바탕으로 개인적인 정리를 위해 작성한 글입니다.애스펙트J는 포인트컷을 편리하게 표현하기 위한 특별한 표현식을 제공한다.예) @Pointcut(“execution(* hello.aop.order..*(..))”) 포인트컷 표현식은 AspectJ pointcut expression 즉 애스펙트J가 제공하는 포인트컷 표현식을 줄여서 말하는 것이다.포인트컷 표현식은 execution 같은 포인트컷 지시자(Pointcut Designator)로 시작한다. 줄여서 PCD라 한다. 포인트컷 지시자의 종류execution : 메소드 실행 조인 포인트를 매칭한다. 스프링 AOP에서 가장 많이 사용하고, 기능도 복잡하다.within : 특정 타입 내의 조인 포인트를 매칭한다...

[Spring 핵심원리 - 고급] 스프링 AOP 구현
Back-End/Spring2025. 4. 21. 16:23[Spring 핵심원리 - 고급] 스프링 AOP 구현

이 글은 인프런 김영한님의 Spring 강의를 바탕으로 개인적인 정리를 위해 작성한 글입니다.리포지토리 & 서비스import lombok.extern.slf4j.Slf4j;import org.springframework.stereotype.Repository;@Slf4j@Repositorypublic class OrderRepository { public String save(String itemId) { log.info("[orderRepository] 실행"); //저장 로직 if (itemId.equals("ex")) { throw new IllegalStateException("예외 발생!"); } return..

[Spring 핵심원리 - 고급] @Aspect AOP
Back-End/Spring2025. 4. 17. 15:21[Spring 핵심원리 - 고급] @Aspect AOP

이 글은 인프런 김영한님의 Spring 강의를 바탕으로 개인적인 정리를 위해 작성한 글입니다.@Aspect - 코드스프링은 @Aspect 애노테이션으로 매우 편리하게 포인트컷과 어드바이스로 구성되어 있는 어드바이저 생성 기능을 지원한다.import proxy.proxy.trace.TraceStatus;import proxy.proxy.trace.logtrace.LogTrace;import lombok.extern.slf4j.Slf4j;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.Around;import org.aspectj.lang.annotation.Aspect;@Slf4j@Aspectpublic class..

[Spring 핵심원리 - 고급] 빈 후처리기(BeanPostProcessor)
Back-End/Spring2025. 4. 16. 15:35[Spring 핵심원리 - 고급] 빈 후처리기(BeanPostProcessor)

이 글은 인프런 김영한님의 Spring 강의를 바탕으로 개인적인 정리를 위해 작성한 글입니다.빈 후처리기스프링이 빈 저장소에 등록할 목적으로 생성한 객체를 빈 저장소에 등록하기 직전에 조작하고 싶다면 빈 후처리기를 사용하면 된다.빈 포스트 프로세서(BeanPostProcessor)는 번역하면 빈 후처리기인데, 이름 그대로 빈을 생성한 후에 무언가를 처리하는 용도로 사용한다.객체를 조작할 수도 있고, 완전히 다른 객체로 바꿔치기 하는 것도 가능하다. 빈 후처리기 과정생성: 스프링 빈 대상이 되는 객체를 생성한다. (@Bean, 컴포넌트 스캔 모두 포함)전달: 생성된 객체를 빈 저장소에 등록하기 직전에 빈 후처리기에 전달한다.후 처리 작업: 빈 후처리기는 전달된 스프링 빈 객체를 조작하거나 다른 객체로 바꿔..

[Spring 핵심원리 - 고급] 프록시 팩토리(Proxy Factory)
Back-End/Spring2025. 4. 15. 16:22[Spring 핵심원리 - 고급] 프록시 팩토리(Proxy Factory)

이 글은 인프런 김영한님의 Spring 강의를 바탕으로 개인적인 정리를 위해 작성한 글입니다.프록시 팩토리인터페이스가 있는 경우에는 JDK 동적 프록시를 적용하고, 그렇지 않은 경우에는 CGLIB를 적용하려면 어떻게 해야할까?-> 프록시 팩토리를 사용하면 된다. 프록시 팩토리는 인터페이스가 있으면 JDK 동적 프록시를 사용하고, 구체 클래스만 있다면 CGLIB를 사용한다.그리고 이 설정을 변경할 수도 있다. 두 기술을 함께 사용할 때 부가 기능을 적용하기 위해 JDK 동적 프록시가 제공하는 InvocationHandler와 CGLIB가 제공하는 MethodInterceptor를 각각 중복으로 따로 만들어야 할까?스프링은 이 문제를 해결하기 위해 부가 기능을 적용할 때 Advice라는 새로운 개념을 도입했..

[Spring 핵심원리 - 고급] 동적 프록시(Dynamic Proxy)
Back-End/Spring2025. 4. 15. 13:53[Spring 핵심원리 - 고급] 동적 프록시(Dynamic Proxy)

이 글은 인프런 김영한님의 Spring 강의를 바탕으로 개인적인 정리를 위해 작성한 글입니다.리플렉션JDK 동적 프록시를 이해하기 위해서는 먼저 자바의 리플렉션 기술을 이해해야 한다.리플렉션 기술을 사용하면 클래스나 메서드의 메타정보를 동적으로 획득하고, 코드도 동적으로 호출할 수 있다.import lombok.extern.slf4j.Slf4j;import org.junit.jupiter.api.Test;import java.lang.reflect.Method;@Slf4jpublic class ReflectionTest { @Slf4j static class Hello { public String callA() { log.info("callA"); ..

[Spring 핵심원리 - 고급] 프록시 및 데코레이터 패턴(디자인 패턴)
Back-End/Spring2025. 4. 11. 21:44[Spring 핵심원리 - 고급] 프록시 및 데코레이터 패턴(디자인 패턴)

이 글은 인프런 김영한님의 Spring 강의를 바탕으로 개인적인 정리를 위해 작성한 글입니다.프록시프록시 개념클라이언트와 서버 개념에서 일반적으로 클라이언트가 서버를 직접 호출하고, 처리 결과를 직접 받는다. 이것을 직접 호출이라 한다. 그런데 클라이언트가 요청한 결과를 서버에 직접 요청하는 것이 아니라 어떤 대리자를 통해서 대신 간접적으로 서버에 요청할 수 있다.예를 들어서 내가 직접 마트에서 장을 볼 수도 있지만, 누군가에게 대신 장을 봐달라고 부탁할 수도 있다.여기서 대신 장을 보는 대리자를 영어로 프록시(Proxy)라 한다. 객체에서 프록시가 되려면, 클라이언트는 서버에게 요청을 한 것인지, 프록시에게 요청을 한 것인지 조차 몰라야 한다.쉽게 이야기해서 서버와 프록시는 같은 인터페이스를 사용해야 ..

image