본문 바로가기

Spring/Core

(43)
[Core] AOP - 개념 이전 장(링크) 에서는 @Aspect에 대해서 알아보았다. 이번 장에서는 스프링 AOP란 무엇인지 개념에 대해서 알아보도록 한다. 모든 코드는 깃허브(링크) 에 올려두었다. APO 소개 - 핵심 기능과 부가 기능 애플리케이션 로직은 크게 핵심 기능과 부가 기능으로 나눌 수 있다. 핵심 기능: 해당 객체가 제공하는 고유의 기능이다. 예를 들어, OrderService의 핵심 기능은 주문 로직이다. 부가 기능: 핵심 기능을 보조하기 위해 제공되는 기능이며, 대표적으로 "로그 추적 로직", "트랜잭션"과 같은 기능이 있다. 이런 부가 기능은 단독으로 사용되지 않고, 핵심 기능과 함께 사용된다. 예를 들어, 로그 추적 기능은 어떤 핵심 기능이 호출되었는지 기록을 남기기 위해 사용된다. 주문 로직을 실행하기 직전..
[Core] @Aspect 이전 장(링크) 에서는 스프링이 제공하는 빈 후처리기에 대해서 알아보았다. 이번 장에서는 @Aspect AOP에 대해서 알아보도록 한다. 모든 코드는 깃허브(링크) 에 올려두었다. @Aspect 프록시 - 적용 스프링 애플리케이션에 프록시를 적용하려면 포인트컷과 어드바이스로 구성되어 있는 어드바이저(Advisor)를 만들어서 스프링 빈으로 등록하면 된다. 그러면 나머지는 자동 프록시 생성기가 모두 자동으로 처리해준다. 자동 프록시 생성기는 스프링 빈으로 등록된 어드바이저들을 찾고, 스프링 빈들에 자동으로 프록시를 적용해준다. 스프링은 @Aspect 애너테이션으로 매우 편리하게 포인트컷과 어드바이스로 구성되어 있는 어드바이저 생성 기능을 지원한다. @Aspect는 관점 지향 프로그래밍(AOP)을 가능하게 ..
[Core] 스프링이 제공하는 빈 후처리기 이전 장(링크) 에서는 빈 후처리기는 무엇이며 어떠한 문제를 해결할 수 있는지 알아보았다. 이번 장에서는 스프링이 제공하는 빈 후처리기에 대해서 알아보도록 한다. 모든 코드는 깃허브(링크) 에 올려두었다. 스프링이 제공하는 빈 후처리기 스프링이 제공하는 빈 후처리기를 사용하기 위해서는 aop 의존성이 필요하다. 아래와 같이 build.gradle 파일에 의존성을 추가해준다. implementation 'org.springframework.boot:spring-boot-starter-aop' 의존성을 추가하면 aspectjweaver라는 aspectJ관련 라이브러리를 등록하고, 스프링 부트가 AOP 관련 클래스를 자동으로 스프링 빈으로 등록한다. 스프링 부트를 사용하기 이전에는 @Enable..
[Core] 빈 후처리기(Bean Post Processor) 이전 장(링크) 에서는 프록시 팩토리를 적용해보면서 너무 많은 설정과 컴포넌트 스캔을 사용하는 경우 적용 불가라는 단점을 알게되었다. 이번 장에서는 이러한 단점을 해결할 수 있는 빈 후처리기에 대해서 알아보도록 한다. 모든 코드는 깃허브(링크) 에 올려두었다. 빈 후처리기(BeanPostProcessor) - 소개 @Bean이나 컴포넌트 스캔으로 스프링 빈을 등록하면, 스프링은 대상 객체를 생성하고 스프링 컨테이너 내부의 빈 저장소에 등록한다. 이후 스프링 컨테이너를 통해 등록한 스프링 빈을 조회해서 사용하면 된다. 스프링이 빈 저장소에 등록할 목적으로 생성한 객체를 빈 저장소에 "등록하기 직전"에 조작하고 싶다면 빈 후처리기를 사용하면 된다. Bean Post Processor를 번역하면 빈 후처리기이..
[Core] Pointcut 이전 장(링크) 에서는 어드바이저(Advisor)에 대해서 알아보았다. 이번 장에서는 포인트컷(Pointcut)에 대해서 알아보도록 한다. 모든 코드는 깃허브(링크) 에 올려두었다. 포인트컷(Pointcut) 포인트컷을 통해서 원하는 메서드에만 어드바이스 로직을 적용하는 방법에 대해서 알아본다. 어드바이스 코드에 분기처리를 통해서 필터링을 해도 되지만 이렇게 번거로운 작업을 편리하게 해주는 것이 포인트컷이다. 스프링에서 제공하는 Pointcut, ClassFilter, MethodMatcher 인터페이스의 코드를 확인해본다. Pointcut public interface Pointcut { ClassFilter getClassFilter(); MethodMatcher getMethodMatcher(); ..
[Core] Proxy Factory - 적용 이전 장(링크) 에서는 포인트컷(Pointcut)에 대해서 알아보았다. 이번 장에서는 프록시 팩토리를 조금 더 깊게 알아보도록 한다. 모든 코드는 깃허브(링크) 에 올려두었다. 프록시 팩토리 적용 및 활용 Version 1 프록시 팩토리를 사용해서 애플리케이션에 프록시를 만들어보도록 한다. 인터페이스가 있는 version 1 애플리케이션에 LogTrace 기능을 프록시 팩토리를 통해서 프록시를 만들어 적용해본다. 아래는 사용될 어드바이스 코드이다. LogTraceAdvice public class LogTraceAdvice implements MethodInterceptor { private final LogTrace logTrace; public LogTraceAdvice(LogTrace logTrac..
[Core] Advisor 이전 장(링크) 에서는 프록시 팩토리에 대해서 알아보았다. 이번 장에서는 어드바이저(Advisor)에 대해서 알아보도록 한다. 모든 코드는 깃허브(링크) 에 올려두었다. 포인트컷, 어드바이스, 어드바이저 요약 포인트컷(Pointcut): 어디에 부가 기능을 적용하고 어디에 부가 기능을 적용하지 않을지 판단을 위한 필터링 역할을 한다. 주로 클래스와 메서드 이름으로 필터링한다. 이름과 같이 어떤 포인트(Point) 에 기능의 적용 여부를 잘라서(cut) 구분하는 것이다. 어드바이스(Advice): 프록시가 호출하는 부가 기능이다. 단순하게 프록시 로직이라고 생각하면 된다. 어드바이저(Advisor): 하나의 포인트컷과 하나의 어드바이스를 가지고 있는 것을 의미한다. 포인트컷 1 + 어드바이스 1 로 볼 수..
[Core] Proxy Factory - 기본 이전 장(링크) 에서는 CGLIB에 대해서 알아보았다. 이번 장에서는 프록시 팩토리에 대해서 알아보도록 한다. 모든 코드는 깃허브(링크) 에 올려두었다. Proxy Factory Basics 동적 프록시를 사용하는 경우 아래와 같은 의문이 생길 수 있다. Q. 인터페이스가 있는 경우에는 JDK 동적 프록시를 적용하고, 그렇지 않은 경우에는 CGLIB를 적용하려면 어떻게 해야하는가. 스프링은 유사한 구체적인 기술들이 있을 때, 그것들을 통합해서 일관성 있게 접근할 수 있고, 더욱 편리하게 사용할 수 있도록 추상화된 기술을 제공한다. 스프링은 동적 프록시를 통합해서 편리하게 만들어주는 프록시 팩토리(ProxyFactory)라는 기능을 제공한다. 이전에는 상황에 따라서 JDK 동적 프록시를 사용하거나 CGLI..