@Transactional을 적용하면 프록시 객체가 요청을 먼저 받아서 트랜잭션을 처리하고, 실제 객체를 호출해준다. 때문에 트랜잭션을 적용하려면 항상 프록시를 통해서 대상 객체(Target)을 호출해야 한다. 이렇게 해야 프록시에서 먼저 트랜잭션을 적용하고, 이후에 대상 객체를 호출하게 된다. 만약 프록시를 거치지 않고 대상 객체를 직접 호출하게 되면 AOP가 적용되지 않고, 트랜잭션도 적용되지 않는다. AOP를 적용하면 스프링은 대상 객체 대신에 프록시를 스프링 빈으로 등록한다. 따라서 스프링은 의존관계 주입시에 항상 실제 객체 대신에 프록시 객체를 주입한다. 프록시 객체가 주입되기 때문에 대상 객체를 직접 호출하는 문제는 일반적으로 발생하지 않지만, 대상 객체의 내부에서 자신의 다른 메서드 호출이 ..
스프링은 POJO 프로그래밍을 손쉽게 할 수 있도록 IoC/DI, AOP, PSA 세 가지 기술을 제공한다. 이 세 가지 모두 스프링이 있기 이전에도 여러 가지 형태로 시도됐고, 발전하고 있던 기술이었다. 다만 스프링은 통일성 있고, 세련된 방법으로 자바 엔터프라이즈 개발의 전 영역에 걸쳐 효과적으로 적용될 수 있도록 프레임워크 형태로 제공한다. 제어의 역전 (IoC)과 의존관계 주입 (DI) 왜 두 개의 오브젝트를 분리해서 만들고, 인터페이스를 두어 느슨하게 결합한 뒤, 실제 사용할 대상은 DI를 통해 외부에서 지정하는걸까? DI 방식이 직접 new 연산자를 사용해서 강한 결합을 쓰는 방법보다 나은 점이 무엇일지 의문을 가져본 적이 있을 것이다. 바로 유연한 확장이 가능하게 하기위해서 라고 할 수 있다..
@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 : 주어진 애노테이션이 있는 ..
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..
포인트컷 포인트컷은 어디에 부가 기능을 적용할지 판단하는 필터링 로직으로, 주로 클래스와 메서드 이름으로 필터링한다. 어떤 포인트(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
- 파이썬
- leetcode
- 자료구조
- 노마드코더
- 리팩토링
- 스프링
- 데이터베이스
- mysql 8.0
- webflux
- 문자열
- 구현
- 백준
- Real MySQL
- 코틀린
- Spring
- 그리디
- 정렬
- 알고리즘
- 코테
- 인프런
- kotlin
- spring boot
- Algorithm
- 북클럽
- 스프링부트
- 스프링 부트
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |