티스토리 뷰

BackEnd/SpringBoot

[Spring] - 프록시 패턴과 스프링 AOP

영지는 달리는중 2020. 11. 16. 18:44

프록시 패턴이란?

원래 객체를 감싸고 있는 객체이며 원래 객체와 타입이 동일하다. 

 

프록시 패턴을 쓰는 상황

원래 객체에 접근을 제어하고 싶거나, 부가 기능을 추가하여야 할때 사용된다 

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 (메소드 실행 전후) : 어드바이스가 타겟 메소드를 감싸서 타겟 메소드 호출전과 후에 어드바이스 기능을 수행



참고 블로그

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
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
글 보관함