티스토리 뷰
프록시 패턴이란?
원래 객체를 감싸고 있는 객체이며 원래 객체와 타입이 동일하다.
프록시 패턴을 쓰는 상황
원래 객체에 접근을 제어하고 싶거나, 부가 기능을 추가하여야 할때 사용된다
public interface ExampleService {
void firstEvent();
void secondEvent();
}
public class TestService implements ExampleService {
@Override
public void fristEvent(){
Sytem.out.printl("This is firstEvent");
}
@Override
public void secondEvent(){
System.out.printn("This is secondEvent");
}
}
만약 위의 코드에서 두 개의 메소드에 동일한 기능을 하는 코드를 넣고 싶을 때, 각각의 메소드에 동일한 로직의 코드를 넣어주는것은 원래 코드를 수정해야하는 불편함이 있다. 이럴 떄 프록시 패턴을 사용하면 된다. 프록시 객체를 만들어 원래의 객체를 주입받고 메소드들을 위임받아 원하는 코드를 추가하면 된다
@Primary //ExampleSerivce의 메소드를 호출하면 해당 어노테이션으로 인해 프록시 객체가 호출된다
@Service
public class ProxyTestService implements ExampleService {
@Autowired
TestService testService;
@Override
public void fristEvent(){
testService.firstEvent();
Sytem.out.printl("This is firstEvent-2"); //새로 추가한 기능
}
@Override
public void secondEvent(){
testService.secondEvent();
System.out.printn("This is secondEvent-2"); //새로 추가한 기능
}
}
이렇게 한다면 원래 코드를 수정하지 않고 기능을 추가할 수 있지만, 프록시 객체에 중복코드가 발생하게 되고, 다른 클래스에서도 동일한 기능을 사용하고자 할 때 매번 수정을 해주어야한다는 부분에서 비효율적이다. 이러한 문제를 해결해 주는 것이 스프링 AOP이다.
AOP란?
Aspect-Oriented Programming의 약자이다.
어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나워서 그 관점을 기준으로 각각 모듈화 하는 것을 뜻한다.
여기서 핵심적인 관점이란 - 우리가 적용하고자하는 핵심 비즈니스 로직
부가적인 관점이란 - 핵심 로직을 실행하기 위해 행해지는 데이터베이스 연결, 로깅, 파일 입출력 등이 있다
AOP 주요 개념
- Aspect : 흩어진 관심사(중복되는 코드들 - log, exception 등)를 모듈화 한 것, 주로 부가기능을 모듈화 한다
- Target : Aspect를 적용하는 곳(클래스, 메소드..)
- Advice : 실질적으로 어떤 일을 해야할 지에 대한 것, 부가기능을 담은 구현체
- JointPoint : Advice가 적용될 위치, 끼어드는 지점. 메소드 진입 지점, 생성자 호출 지점, 필드에서 값을 꺼내올 때 등 다양한 지점에 적용이 가능하다
- PointCut : JoinPoint의 상세한 스펙을 정의한 것. 더욱 구체적으로 Advice가 실행될 지점을 정할 수 있다
AOP의 특징
- 프록시 패턴 기반의 AOP 구현체, 프록시 객체를 쓰는 이유는 접근 제어 및 부가기능을 추가하기 위해서임
- 스프링 빈에만 AOP를 적용할 수 있다
- 스프링 IOC와 연동할 때 가장 흔한 문제에 대한 해결책을 지원하는 것이 목적이다
@Around 외에 타켓 메소드의 Aspect 실행 지점을 지정할 수 있는 어노테이션들
- @Before (이전) : 어드바이스 타겟 메소드가 호출되기 전에 어드바이스 기능을 수행
- @After (이후) : 타겟 메소드의 결과에 관계없이(즉 성공, 예외 관계없이) 타겟 메소드가 완료 되면 어드바이스 기능을 수행
- @AfterReturning (정상적 반환 이후)타겟 메소드가 성공적으로 결과값을 반환 후에 어드바이스 기능을 수행
- @AfterThrowing (예외 발생 이후) : 타겟 메소드가 수행 중 예외를 던지게 되면 어드바이스 기능을 수행
- @Around (메소드 실행 전후) : 어드바이스가 타겟 메소드를 감싸서 타겟 메소드 호출전과 후에 어드바이스 기능을 수행
▶ 참고 블로그
'BackEnd > SpringBoot' 카테고리의 다른 글
[Spring] - Spring Web MVC 동작 과정 (0) | 2021.01.18 |
---|---|
[Spring] - Spring & DispatcherServlet (0) | 2021.01.18 |
[Spring]-스프링부트 프로젝트 예외처리 전략 (0) | 2020.11.11 |
[Spring] - SpringBoot에서 Redis Cache 사용하기 (0) | 2020.10.15 |
[Spring Security] - SpringSecurity+Jwt 로그인 과정 (0) | 2020.10.10 |