@target vs @within @target은 인스턴스의 모든 메서드를 조인 포인트로 적용하고, @within은 해당 타입 내에 있는 메서드만 조인 포인트로 적용한다. 이를 풀어서 이야기하면, @target은 부모 클래스의 메서드까지 어드바이스를 다 적용하고, @within은 자기 자신의 클래스에 정의된 메서드에만 어드바이스를 적용한다는 것이다. Test code @Slf4j @Import({AtTargetAtWithinTest.Config.class}) @SpringBootTest public class AtTargetAtWithinTest { @Autowired Child child; @Test void success() { log.info("child Proxy={}", child.getClas..
포인트컷 지시자 포인트컷 표현식은 execution같은 포인트컷 지시자(Pointcut Designator)로 시작한다. 줄여서 PCD라 한다. 포인트컷 지시자 종류 execution : 메소드 실행 조인 포인트를 매칭한다. 스프링 AOP에서 가장 많이 사용하고, 기능도 복잡하다. within : 특정 타입 내의 조인 포인트를 매칭한다. args : 인자가 주어진 타입의 인스턴스인 조인 포인트 this : 스프링 빈 객체(스프링 AOP 프록시)를 대상으로 하는 조인 포인트 target : Target 객체(스프링 AOP 프록시가 가르키는 실제 대상)를 대상으로 하는 조인 포인트 @target : 실행 객체의 클래스에 주어진 타입의 애노테이션이 있는 조인 포인트 @within : 주어진 애노테이션이 있는 ..
Advice 종류 @Around : 메서드 호출 전후에 수행, 가장 강력한 어드바이스, 조인 포인트 실행 여부 선택, 반환 값 변환, 예외 변환 등이 가능 @Before : 조인 포인트 실행 이전에 실행된다. @AfterReturning : 조인 포인트가 정상 완료후 실행된다. @AfterThrowing : 메서드가 예외를 던지는 경우 실행된다. @After : 조인 포인트가 정상 또는 예외에 관계없이 실행(finally)된다. 아래 예제를 살펴보면서 좀 더 깊이 학습해보자! @Slf4j @Aspect public class AspectAdvice { @Around("com.hyuuny.advanced.order.aop.Pointcuts.orderAndService()") public Object doT..
AOP 용어는 보고 또 봐도 낯설기만하다. 이 기회에 AOP 용어를 정리해보자! 조인 포인트(Join point) 어드바이스가 적용될 수 있는 위치(메서드 실행 지점, 생성자 호출, 필드 값 접근, static 메서드 접근 등) 조인 포인트는 추상적인 개념이다. AOP를 적용할 수 있는 모든 지점이라 생각하면 된다. 스프링 AOP는 프록시 방식을 사용하므로 조인 포인트는 항상 메소드 실행 지점으로 제한된다. 포인트컷(Pointcut) 조인 포인트 중에서 어드바이스가 적용될 위치를 선별하는 기능 주로 AspectJ 표현식을 사용해서 지정 프록시를 사용하는 스프링 AOP는 메서드 실행 지점만 포인트컷으로 선별 가능 타켓(Target) 어드바이스를 받는 객체 어드바이스(Advice) 부가 기능 특정 조인 포인..
AOP를 사용하면 핵심 기능과 부가 기능이 코드상 완전히 분리되어서 관리된다. 그렇다면 AOP를 사용할 때 부가 기능 로직은 어떤 방식으로 실제 로직에 추가되는걸까? AOP가 적용되는 방식으로는 크게 3가지 방법이 있다. 컴파일 시점 : 실제 대상 코드에 애스팩트를 통한 부가 기능 호출 코드가 포함된다. AspectJ를 직접 사용해야 한다. 클래스 로딩 시점 : 실제 대상 코드에 애스팩트를 통한 부가 기능 호출 코드가 포함된다. AspectJ를 직접 사용해야 한다. 런타임 시점(프록시) : 실제 대상 코드는 그대로 유지된다. 따라서 프록시를 통해 부가 기능을 사용할 수 있다. 스프링 AOP는 이 방식을 사용한다. 컴파일 시점 .java 소스 코드를 컴파일러를 사용해서 .class를 만드는 시점에 부가 기..
@Aspect 프록시 스프링 애플리케이션에 프록시를 적용하려면 포인트컷과 어드바이스로 구성되어 있는 어드바이저(Advisor)를 만들어서 스프링 빈으로 등록하면 된다. 그러면 자동 프록시 생성기가 모두 자동으로 처리해준다. @Aspect는 관점 지향 프로그래밍(AOP)을 가능하게 하는 AspectJ 프로젝트에서 제공하는 애노테이션이다. 스프링은 @Aspect 애노테이션으로 매우 편리하게 포인트컷과 어드바이스로 구성되어 있는 어드바이저 생성 기능을 지원한다. Example code @Slf4j @RequiredArgsConstructor @Aspect public class LogTraceAspect { private final LogTrace logTrace; @Around("execution(* com..
스프링이 제공하는 빈 후처리기 이전 포스트에서 빈 후처리기가 무엇인지 직접 적용해보면서 알아보았다. 이번에는 BeanPostProcessor를 직접 구현하지 않고 스프링이 제공하는 빈 후처리기를 알아볼 것인데, 이를 사용하기 위해서는 build.gradle에 해당 라이브러리를 추가해주어야 한다. implementation 'org.springframework.boot:spring-boot-starter-aop' 이 라이브러리를 추가하면 aspectjweaver라는 aspectJ 관련 라이브러리를 등록하고, 스프링 부트가 AOP 관련 클래스를 자동으로 스프링 빈에 등록한다. 스프링 부트가 없던 시절에는 @EnableAspectJAutoProxy를 직접 사용해야 했는데, 이제는 스프링 부트가 ..
메시지 컨버터 메시지 컨버터는 XML이나 JSON을 이용한 AJAX 기능이나 웹 서비스를 개발할 때 사용할 수 있다. HTTP 요청 프로퍼티를 모델 오브젝트의 프로퍼티에 개별적으로 바인딩하고 모델 오브젝트를 다시 뷰를 이용해 클라이언트로 보낼 콘텐트로 만드는 대신 HTTP 요청 메시지 본문과 HTTP 응답 메시지 본문을 통째로 메시지로 다루는 방식이다. 메시지 컨버터는 파라미터의 @RequestBody와 메소드에 부여한 @ResponseBody를 이용해서 쓸수있다. 메시지 방식의 컨트롤러를 사용하는 방법은 두 가지로 구분한다. HTTP 요청 메소드에 따라서 GET과 POST로 나누는 것이다. GET의 경우는 요청정보가 URL과 쿼리 스트링으로 제한되므로 @RequestBody를 사용하는 대신 @Reque..
빈 후처리기 빈 후처리기는 빈을 생성한 후에 무언가를 처리하는 용도로 사용하는데, 객체를 조작하거나, 다른 객체로 바꿔치기 하는 기능을 제공하므로 스프링이 생성한 객체를 빈 저장소에 등록하기 직전에 조작하고 싶다면 빈 후처리기를 사용하면 된다. public interface BeanPostProcessor { Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException } 빈 후처리기를 사용하려면 BeanPostProcessor 인터페이스를 구현..
포인트컷 포인트컷은 어디에 부가 기능을 적용할지 판단하는 필터링 로직으로, 주로 클래스와 메서드 이름으로 필터링한다. 어떤 포인트(Point)에 기능을 적용할지 하지 않을지 잘라서(cut) 구분하는 것이라 이해하면 된다. public interface Pointcut { ClassFilter getClassFilter(); MethodMatcher getMethodMatcher(); } public interface ClassFilter { boolean matches(Class clazz); } public interface MethodMatcher { boolean matches(Method method, Class targetClass); //.. } 포인트컷은 크게 ClassFilter 와 Met..
- Total
- Today
- Yesterday
- 자료구조
- 노마드코더
- MySQL
- 김영한
- 구현
- 알고리즘
- kotlin
- 노마드
- 북클럽
- 코틀린
- 코테
- 파이썬
- leetcode
- 문자열
- mysql 8.0
- 데이터베이스
- 스프링부트
- 정렬
- 백준
- 인프런
- Spring
- webflux
- 리팩토링
- Real MySQL
- 릿코드
- Algorithm
- 스프링 부트
- spring boot
- 그리디
- 스프링
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |