반응형
스프링은 프록시 방식의 AOP를 사용합니다. 스프링 AOP를 적용하면 스프링은 대상 객체 대신에 프록시를 스프링 빈으로 등록하고, 스프링은 의존관계 주입시에 항상 프록시 객체를 주입합니다. 프록시 객체가 주입되기 때문에 대상 객체를 직접 호출하는 문제는 일반적으로 발생하지 않지만 대상 객체의 내부에서 메서드 호출이 발생하면 프록시를 거치지 않고 대상 객체를 직접 호출하는 문제가 발생하게 됩니다. 어떤 문제가 발생하는지 간단한 예시를 통해 알아보겠습니다. CallService에서 external() 메서드를 호출하는데 그 안에서 CallService 자기 자신의 메서드인 internal()을 호출하는 상황 package hello.aop.internalcall.aop; ... @Slf4j @Componen..
스프링 AOP 적용법 스프링 AOP를 사용하기 위해서는 build.gradle에 아래의 라이브러리를 의존성 추가해줘야합니다. implementation 'org.springframework.boot:spring-boot-starter-aop' // aop 추가 스프링 AOP를 적용하기 위해서는 @Aspect 어노테이션을 사용합니다. @Slf4j @Aspect @Component public class AspectExample @Around("execution(* hello.aop.test..*(..))") // AspectJ 표현식 public Object doLog(ProceedingJoinPoint joinPoint) throws Throwable { log.info("[log] {}", joinPo..
AOP를 사용하지 않는다면 ?AOP에 대해 설명하기 전에 AOP를 사용하는 이유에 대해 먼저 알아 봅시다. 애플리케이션 로직은 크게 핵심 기능과 부가 기능으로 나눌 수 있습니다.핵심 기능 : 해당 객체가 제공하는 고유의 기능부가 기능 : 핵심 기능을 보조하기 위해 제공되는 기능 ( ex: 로그 추적 기능, 트랜잭션 기능 )보통 기존 프로젝트에 부가 기능을 추가하게 되면 하나의 클래스가 아닌 여러 클래스에 부가 기능을 추가하게 됩니다.예를 들어서 프로젝트의 모든 클래스에 로그 기능을 추가 한다면 하나의 부가 기능(로그 추적)을 여러 곳에 동일하게 사용하게 됩니다.이러한 부가 기능을 바로 횡단 관심사(cross-cutting concerns) 라고 합니다. 부가 기능 적용시 문제점그런데 이러한 기존 프로젝..
프록시 방식의 AOP 한계 @Transactional 어노테이션을 사용하는 트랜잭션 AOP는 프록시를 사용하는데 이 프록시를 사용하면 메서드 내부 호출에 프록시를 적용할 수 없는 한계를 갖습니다. 어떠한 한계가 생기는지 자세히 알아보기 위해 먼저 스프링 컨테이너에서 트랜잭션 프록시가 등록되는 것을 그림으로 봅시다. 스프링 컨테이너에 트랜잭션 프록시 등록 @Transactional 애노테이션이 특정 클래스나 메서드에 하나라도 있으면 있으면 트랜잭션 AOP는 위 그림처럼 프록시를 만들어서 스프링 컨테이너에 등록합니다. 이 때, 실제 TxService 객체 대신에 프록시인 TxService$$CGLIB 를 스프링 빈에 등록합니다. 그리고 프록시는 내부에 실제 TxService 를 참조합니다. 여기서 핵심은 실..
proxy의 사전적의미를 보면 "대리" 라는 뜻을 가집니다. Client와 Server가 직접 통신할 때, 보안상의 문제를 방지하기 위해서 직접 통신하지 않고 중계자를 거쳐 통신합니다. 이때 중계자는 바로 프록시 ( proxy ) 입니다. Client와 Server 사이에 프록시 서버가 중계를 할 떄, Client는 프록시 서버를 "Server"라고 인식하고, Server는 프록시 서버를 "Client"라고 인식합니다. 프록시 서버는 서버의 위치에 따라 "Forward 프록시"와 "Reverse 프록시" 2가지로 나뉩니다. Forward 프록시 클라이언트 편 ( 사용자들을 대신해 인터넷 연결 ) 클라이언트 대신 프록시 서버가 목적 서버에 통신해주는 구성을 "포워드 프록시"라고 합니다. Forward 프록..