
@Transactional을 적용하면 프록시 객체가 요청을 먼저 받아서 트랜잭션을 처리하고, 실제 객체를 호출해준다. 때문에 트랜잭션을 적용하려면 항상 프록시를 통해서 대상 객체(Target)을 호출해야 한다. 이렇게 해야 프록시에서 먼저 트랜잭션을 적용하고, 이후에 대상 객체를 호출하게 된다. 만약 프록시를 거치지 않고 대상 객체를 직접 호출하게 되면 AOP가 적용되지 않고, 트랜잭션도 적용되지 않는다. AOP를 적용하면 스프링은 대상 객체 대신에 프록시를 스프링 빈으로 등록한다. 따라서 스프링은 의존관계 주입시에 항상 실제 객체 대신에 프록시 객체를 주입한다. 프록시 객체가 주입되기 때문에 대상 객체를 직접 호출하는 문제는 일반적으로 발생하지 않지만, 대상 객체의 내부에서 자신의 다른 메서드 호출이 ..

AOP 용어는 보고 또 봐도 낯설기만하다. 이 기회에 AOP 용어를 정리해보자! 조인 포인트(Join point) 어드바이스가 적용될 수 있는 위치(메서드 실행 지점, 생성자 호출, 필드 값 접근, static 메서드 접근 등) 조인 포인트는 추상적인 개념이다. AOP를 적용할 수 있는 모든 지점이라 생각하면 된다. 스프링 AOP는 프록시 방식을 사용하므로 조인 포인트는 항상 메소드 실행 지점으로 제한된다. 포인트컷(Pointcut) 조인 포인트 중에서 어드바이스가 적용될 위치를 선별하는 기능 주로 AspectJ 표현식을 사용해서 지정 프록시를 사용하는 스프링 AOP는 메서드 실행 지점만 포인트컷으로 선별 가능 타켓(Target) 어드바이스를 받는 객체 어드바이스(Advice) 부가 기능 특정 조인 포인..

@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를 직접 사용해야 했는데, 이제는 스프링 부트가 ..

빈 후처리기 빈 후처리기는 빈을 생성한 후에 무언가를 처리하는 용도로 사용하는데, 객체를 조작하거나, 다른 객체로 바꿔치기 하는 기능을 제공하므로 스프링이 생성한 객체를 빈 저장소에 등록하기 직전에 조작하고 싶다면 빈 후처리기를 사용하면 된다. public interface BeanPostProcessor { Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException } 빈 후처리기를 사용하려면 BeanPostProcessor 인터페이스를 구현..

프록시 팩토리 스프링은 유사한 구체적인 기술들이 있을 때, 그것들을 통합해서 일관성 있게 접근할 수 있고 편리하게 사용할 수 있도록 추상화된 기술을 제공한다. 동적 프록시를 통합해서 프록시 팩토리라는 기능을 제공하는데, 프록시 팩토리는 인터페이스가 있으면 JDK 프록시를 사용하고, 구체 클래스가 있다면 CGLIB를 사용한다. 이 내용은 설정을 통해 변경할 수도 있다. Advice Advice는 프록시에 적용하는 부가 기능 로직이다. JDK 동적 프록시가 제공하는 InvocationHandler와 CGLIB가 제공하는 MethodInterceptor의 개념과 유사한데, 이 둘을 추상화 한 것이다. 프록시 팩토리를 사용한다면 이 둘 대신에 Advice를 사용하면 된다. Advice를 만드는 방법은 다양하지만..

리플렉션 리플렉션은 클래스나 메서드의 메타정보를 동적으로 획득하고, 코드도 동적으로 호출할 수 있도록 하는 API이다. 리플렉션 적용 전 @Slf4j public class ReflectionTest { @Test void reflection0() { Hello target = new Hello(); // 공통 로직1 시작 log.info("start"); String result1 = target.callA(); // 호출하는 메서드가 다름, 동적 처리 필요 log.info("result={}", result1); // 공통 로직1 종료 // 공통 로직2 시작 log.info("start"); String result2 = target.callB(); // 호출하는 메서드가 다름, 동적 처리 필요 lo..
- Total
- Today
- Yesterday
- 그리디
- MySQL
- spring boot
- 스프링부트
- 리팩토링
- 자료구조
- 노마드코더
- 구현
- 스프링
- 스프링 부트
- 노마드
- leetcode
- 파이썬
- 김영한
- 릿코드
- 북클럽
- 코틀린
- 문자열
- 데이터베이스
- 인프런
- Algorithm
- Real MySQL
- webflux
- 알고리즘
- mysql 8.0
- Spring
- kotlin
- 백준
- 코테
- 정렬
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |