Spring-Boot/스프링핵심원리 - 고급편
-
Spring 핵심 원리 고급편 - 13. 스프링 AOP - 실무 주의사항Spring-Boot/스프링핵심원리 - 고급편 2022. 6. 10. 10:07
프록시와 내부 호출 - 문제 - 스프링은 프록시 방식의 AOP를 사용한다 - 따라서 AOP를 적용하려면 항상 프록시를 통해서 대상 객체(Target)을 호출한다 - 이렇게 해야 프록시에서 먼저 어드바이스를 호출하고, 이후에 대상 객체를 호출 - 만약 프록시를 거치지 않고 대상 객체를 직접 호출하게 되면 AOP가 적용되지 않고, 어드바이스도 호출되지 않는다 - AOP를 적용하면 스프링은 대상 객체 대신 프록시를 스프링을 등록 - 따라서 스프링은 의존관계 주입시에 항상 프록시 객체를 주입한다 - 프록시 객체가 주입되기 때문에 대상 객체를 직접 호출하는 문제는 일반적으로 발생 X - 하지만 대상 객체의 내부에서 메서드를 호출하면 프록시를 거치지 않고 대상 객체를 직접 호출하는 문제가 발생한다 @Slf4j @C..
-
Spring 핵심 원리 고급편 - 11. 스프링 AOP - 포인트컷Spring-Boot/스프링핵심원리 - 고급편 2022. 6. 9. 11:19
- AspectJ는 포인트컷을 편리하게 표현하기 위한 특별한 표현식을 제공한다 ㆍ예 ) @Pointcut(" execution( * hello.app.order..*(..)) ") - 포인트컷 표현식은 AspectJ pointcut expression 즉 AspectJ가 제공하는 포인트컷 표현식을 줄여서 말하는 것이다 * 포인트컷 지시자 * - 포인트컷 표현식은 ' execution ' 같은 포인트컷 지시자( Pointcut Designator ) 로 시작한다. 줄여서 PCD라 한다. 포인트컷 지시자의 종류 - execution : 메소드 실행 조인 포인트를 매칭한다. 스프링 AOP에서 가장 많이 사용하고, 기능도 복잡하다 - within : 특정 타입 내의 조인 포인트를 매칭한다 - args : 인자가..
-
Spring 핵심 원리 고급편 - 10. 스프링 AOP 구현Spring-Boot/스프링핵심원리 - 고급편 2022. 6. 9. 09:03
//테스트에서 lombok 사용 testCompileOnly 'org.projectlombok:lombok' testAnnotationProcessor 'org.projectlombok:lombok' - 테스트에서 롬복 사용 시 Gradle 추가 * 참고 * - @Aspect 를 사용하려면 @EnableAspectJAutoProxy 를 스프링 설정에 추가해야 하지만, 스프링 부트를 사용하면 자동으로 추가된다. @Slf4j @Aspect public class AspectV1 { @Around("execution(* hello.aop.order..*(..))") public Object doLog(ProceedingJoinPoint joinPoint) throws Throwable { log.info("[..
-
Spring 핵심 원리 고급편 - 9. 스프링 AOP 개념Spring-Boot/스프링핵심원리 - 고급편 2022. 6. 8. 17:06
- 애플리케이션 로직은 크게 *핵심 기능* 과 *부가 기능*으로 나눌 수 있다 ㆍ핵심기능 : 해당 객체가 제공하는 고유의 기능 → 예를 들어 OrderService의 핵심 기능은 주문 로직이다. ㆍ부가기능 : 핵심 기능을 보조하기 위해 제공되는 기능 → 예를 들어 로그 추적로직, 트랜잭션 기능이 있다. - 예를 들어서 로그 추적 기능은 어떤 핵심 기능이 호출되었는지 로그를 남기기 위해 사용한다 - 부가기능은 이름 그대로 핵심 기능을 보조하기 위해 존재한다. 부가 기능 적용 문제 - 부가 기능을 적용할 때 아주 많은 반복이 필요하다 - 부가 기능이 여러 곳에 퍼져서 중복 코드를 만들어 낸다 - 부가 기능을 변경할 때 중복 때문에 많은 수정이 필요하다 - 부가 기능의 적용 대상을 변경할 때 많은 수정이 필요..
-
Spring 핵심 원리 고급편 - 8. @Aspect AOPSpring-Boot/스프링핵심원리 - 고급편 2022. 6. 8. 15:59
- 스프링 애플리케이션에 프록시를 적용하려면 포인트컷과 어드바이스로 구성되어 있는 어드바이저 ( ' Advisor ' )를 만들어서 스프링 빈으로 등록하면 된다. - 그러면 나머지는 앞서 배운 자동 프록시 생성기가 모두 자동으로 처리해준다. - 자동 프록시 생성기는 스프링 빈으로 등록된 어드바이저들을 찾고, 스프링 빈들에 자동으로 프록시를 적용해준다. ( 물론 포인트컷에서 매칭되는 경우에 프록시를 생성 ) - 스프링은 @Aspect 애노테이션으로 매우 편리하게 포인트컷과 어드바이스로 구성되어 있는 어드바이저 생성 기능을 지원한다 * 참고 * - @Aspect는 관점 지향 프로그래밍(AOP)을 가능하게 하는 AspectJ 프로젝트에서 제공하는 애노테이션이다 - 스프링은 이것을 차용해서 프록시를 통한 AOP..
-
Spring 핵심 원리 고급편 - 7. 빈 후처리기Spring-Boot/스프링핵심원리 - 고급편 2022. 6. 8. 10:33
- @Bean 이나 컴포넌트 스캔으로 스프링 빈을 등록하면, 스프링은 대상 객체를 생성하고, 스프링 컨테이너 내부의 빈 저장소에 등록한다. - 그리고 그 이후에는 스프링 컨테이너를 통해 등록한 스프링 빈을 조회해서 사용하면 된다 * 빈 후처리기 - BeanPostProcessor * - 스프링이 빈 저장소에 등록할 목적으로 생성한 객체를 빈 저장소에 등록하기 직전에 조작하고 싶으면 빈 후처리기를 사용하면 된다. - 빈 포스트 프로세서 ( BeanPostProcessor ) 는 번역하면 빈 후처리기인데, 이름 그대로 빈을 생성한 후에 무언가를 처리하는 용도로 사용한다 * 빈 후처리기 기능 * - 빈 후처리기의 기능은 막강하다 - 객체를 조작할 수도 있고, 완전히 다른 객체로 바꿔치기 하는 것도 가능하다 *..
-
Spring 핵심 원리 고급편 - 6. 스프링이 지원하는 프록시Spring-Boot/스프링핵심원리 - 고급편 2022. 6. 7. 16:47
프록시 팩토리 - 스프링은 유사한 구체적인 기술들이 있을 때, 그것들을 통합해서 일관성 있게 접근할 수 있고, 더욱 편리하게 사용할 수 있는 추상화된 기술을 제공한다. - 스프링은 동적 프록시를 통합해서 편리하게 만들어주는 프록시 팩토리( ProxyFactory ) 라는 기능을 제공한다 - 프로시 팩토리는 인터페이스가 있으면 JDK 동적 프록시를 사용하고, 구체 클래스만 있다면 CGLIB를 사용한다. 그리고 이 설정은 변경할 수도 있다. - 부가 기능을 적용할 때 Advice라는 새로운 개념을 도입했다 - 개발자는 InvocationHandler 나 MethodInterceptor를 신경쓰지않고 Advice만 만들면 된다. - 결과적으로 InvocationHandler 나 MethodInterceptor..
-
Spring 핵심 원리 고급편 - 5. 동적 프록시 기술Spring-Boot/스프링핵심원리 - 고급편 2022. 6. 7. 13:42
- 자바가 기본으로 제공하는 JDK 동적 프록시 기술이나 CGLIB 같은 프록시 생성 오픈소스 기술을 활용하면 프록시 객체를 동적으로 만들어 낼 수 있다. - 프록시를 적용할 코드를 하나만 만들어두고 동적 프록시 기술을 사용해서 프록시 객체를 찍어내면 된다. - JDK 동적 프록시를 이해하기 위해서는 먼저 자바의 리플렉션 기술을 이해해야 한다. 리플렉션 - 리플렉션 기술을 사용하면 클래스나 메서드의 *메타정보*를 동적으로 획득하고, 코드도 동적으로 호출할 수 있다. * 참고 * - 람다를 사용해서 공통화하는 것도 가능! @Test void reflection1() throws Exception { // 클래스 정보 // 클래스 메타정보를 획득한다. 참고로 내부 클래스는 구분을 위해 $를 사용한다. Cla..