![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/Gbdnm/btrDlj3rpY8/AAeqKcHUrdNYnr3KbO7dL0/img.png)
Advice 종류 @Around : 메서드 호출 전후에 수행, 가장 강력한 어드바이스, 조인 포인트 실행 여부 선택, 반환 값 변환, 예외 변환 등이 가능 @Before : 조인 포인트 실행 이전에 실행된다. @AfterReturning : 조인 포인트가 정상 완료후 실행된다. @AfterThrowing : 메서드가 예외를 던지는 경우 실행된다. @After : 조인 포인트가 정상 또는 예외에 관계없이 실행(finally)된다. 아래 예제를 살펴보면서 좀 더 깊이 학습해보자! @Slf4j @Aspect public class AspectAdvice { @Around("com.hyuuny.advanced.order.aop.Pointcuts.orderAndService()") public Object doT..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/2HnXX/btrDk7ULN4p/ggwIMzAt3EkbOBw45KctY1/img.png)
Safe Call null이 아니면 실행하고, null이면 실행하지 않는다.(그대로 null) str 변수에 "ABC"를 대입했지만, 실제로는 null이 들어갈 수도 있는 변수이기 때문에 str.length처럼 .으로 바로 호출할 수 없다. 이때 ?.(Safe Call)을 사용하면 호출이 가능해진다. ?.의 의미는 앞에 있는 변수가 null이 아니면 뒤의 함수나 프로퍼티 등을 실행시키고, null이면 값 그대로 null이 된다. 실제로 null이 들어갈 수 있는 변수를 ?.를 사용하지 않고, 실행해보면 Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type String? 메시지가 출력된다. Elvi..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/bTDSBZ/btrC2Zv5IXa/LJLQGmbHjwmOjBxVKNN7Gk/img.png)
AOP 용어는 보고 또 봐도 낯설기만하다. 이 기회에 AOP 용어를 정리해보자! 조인 포인트(Join point) 어드바이스가 적용될 수 있는 위치(메서드 실행 지점, 생성자 호출, 필드 값 접근, static 메서드 접근 등) 조인 포인트는 추상적인 개념이다. AOP를 적용할 수 있는 모든 지점이라 생각하면 된다. 스프링 AOP는 프록시 방식을 사용하므로 조인 포인트는 항상 메소드 실행 지점으로 제한된다. 포인트컷(Pointcut) 조인 포인트 중에서 어드바이스가 적용될 위치를 선별하는 기능 주로 AspectJ 표현식을 사용해서 지정 프록시를 사용하는 스프링 AOP는 메서드 실행 지점만 포인트컷으로 선별 가능 타켓(Target) 어드바이스를 받는 객체 어드바이스(Advice) 부가 기능 특정 조인 포인..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/XVXOn/btrC4g5fyjX/F0PTTVetE4SSEJ1lV1e2oK/img.png)
AOP를 사용하면 핵심 기능과 부가 기능이 코드상 완전히 분리되어서 관리된다. 그렇다면 AOP를 사용할 때 부가 기능 로직은 어떤 방식으로 실제 로직에 추가되는걸까? AOP가 적용되는 방식으로는 크게 3가지 방법이 있다. 컴파일 시점 : 실제 대상 코드에 애스팩트를 통한 부가 기능 호출 코드가 포함된다. AspectJ를 직접 사용해야 한다. 클래스 로딩 시점 : 실제 대상 코드에 애스팩트를 통한 부가 기능 호출 코드가 포함된다. AspectJ를 직접 사용해야 한다. 런타임 시점(프록시) : 실제 대상 코드는 그대로 유지된다. 따라서 프록시를 통해 부가 기능을 사용할 수 있다. 스프링 AOP는 이 방식을 사용한다. 컴파일 시점 .java 소스 코드를 컴파일러를 사용해서 .class를 만드는 시점에 부가 기..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/eyoHRV/btrCMXezdgL/VLFgAibr4dBbSZsRvHir6k/img.png)
@Aspect 프록시 스프링 애플리케이션에 프록시를 적용하려면 포인트컷과 어드바이스로 구성되어 있는 어드바이저(Advisor)를 만들어서 스프링 빈으로 등록하면 된다. 그러면 자동 프록시 생성기가 모두 자동으로 처리해준다. @Aspect는 관점 지향 프로그래밍(AOP)을 가능하게 하는 AspectJ 프로젝트에서 제공하는 애노테이션이다. 스프링은 @Aspect 애노테이션으로 매우 편리하게 포인트컷과 어드바이스로 구성되어 있는 어드바이저 생성 기능을 지원한다. Example code @Slf4j @RequiredArgsConstructor @Aspect public class LogTraceAspect { private final LogTrace logTrace; @Around("execution(* com..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/Pf7Qm/btrCKkHUFgX/ubPwme3ejnVJnL6kbUNC11/img.png)
스프링이 제공하는 빈 후처리기 이전 포스트에서 빈 후처리기가 무엇인지 직접 적용해보면서 알아보았다. 이번에는 BeanPostProcessor를 직접 구현하지 않고 스프링이 제공하는 빈 후처리기를 알아볼 것인데, 이를 사용하기 위해서는 build.gradle에 해당 라이브러리를 추가해주어야 한다. implementation 'org.springframework.boot:spring-boot-starter-aop' 이 라이브러리를 추가하면 aspectjweaver라는 aspectJ 관련 라이브러리를 등록하고, 스프링 부트가 AOP 관련 클래스를 자동으로 스프링 빈에 등록한다. 스프링 부트가 없던 시절에는 @EnableAspectJAutoProxy를 직접 사용해야 했는데, 이제는 스프링 부트가 ..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/T6veY/btrCLj9d1mQ/nsDPlhdoi0FdAC2GZA09yk/img.jpg)
메시지 컨버터 메시지 컨버터는 XML이나 JSON을 이용한 AJAX 기능이나 웹 서비스를 개발할 때 사용할 수 있다. HTTP 요청 프로퍼티를 모델 오브젝트의 프로퍼티에 개별적으로 바인딩하고 모델 오브젝트를 다시 뷰를 이용해 클라이언트로 보낼 콘텐트로 만드는 대신 HTTP 요청 메시지 본문과 HTTP 응답 메시지 본문을 통째로 메시지로 다루는 방식이다. 메시지 컨버터는 파라미터의 @RequestBody와 메소드에 부여한 @ResponseBody를 이용해서 쓸수있다. 메시지 방식의 컨트롤러를 사용하는 방법은 두 가지로 구분한다. HTTP 요청 메소드에 따라서 GET과 POST로 나누는 것이다. GET의 경우는 요청정보가 URL과 쿼리 스트링으로 제한되므로 @RequestBody를 사용하는 대신 @Reque..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/8CVd9/btrCKju7XgX/NeItkwpIso6LFkB5O5XpD0/img.png)
빈 후처리기 빈 후처리기는 빈을 생성한 후에 무언가를 처리하는 용도로 사용하는데, 객체를 조작하거나, 다른 객체로 바꿔치기 하는 기능을 제공하므로 스프링이 생성한 객체를 빈 저장소에 등록하기 직전에 조작하고 싶다면 빈 후처리기를 사용하면 된다. public interface BeanPostProcessor { Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException } 빈 후처리기를 사용하려면 BeanPostProcessor 인터페이스를 구현..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/DxPQH/btrCAvRcOaU/MZjzEfuKxAuxNKtRnZc4cK/img.png)
포인트컷 포인트컷은 어디에 부가 기능을 적용할지 판단하는 필터링 로직으로, 주로 클래스와 메서드 이름으로 필터링한다. 어떤 포인트(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..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/96XtD/btrCpUXaH2t/f1wrybo0em535qk2ufTBqK/img.png)
프록시 팩토리 스프링은 유사한 구체적인 기술들이 있을 때, 그것들을 통합해서 일관성 있게 접근할 수 있고 편리하게 사용할 수 있도록 추상화된 기술을 제공한다. 동적 프록시를 통합해서 프록시 팩토리라는 기능을 제공하는데, 프록시 팩토리는 인터페이스가 있으면 JDK 프록시를 사용하고, 구체 클래스가 있다면 CGLIB를 사용한다. 이 내용은 설정을 통해 변경할 수도 있다. Advice Advice는 프록시에 적용하는 부가 기능 로직이다. JDK 동적 프록시가 제공하는 InvocationHandler와 CGLIB가 제공하는 MethodInterceptor의 개념과 유사한데, 이 둘을 추상화 한 것이다. 프록시 팩토리를 사용한다면 이 둘 대신에 Advice를 사용하면 된다. Advice를 만드는 방법은 다양하지만..
- Total
- Today
- Yesterday
- 인프런
- 코테
- Real MySQL
- 리팩토링
- Algorithm
- 그리디
- 김영한
- kotlin
- 알고리즘
- 북클럽
- 릿코드
- 정렬
- 문자열
- Spring
- 데이터베이스
- 파이썬
- 코틀린
- 구현
- 백준
- MySQL
- webflux
- 스프링
- mysql 8.0
- leetcode
- 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 |