스프링의 핵심 개념 중 하나로서, 어플리케이션 전체에 걸쳐 사용되는 공통된 기능을 재사용하도록 지원하는 것이다. AOP란 단어를 번역하면 관점 지향 프로그래밍이다. 자체적인 언어라기 보다는 기존의 OOP언어를 보완하는 확장 형태로 사용되고 있다.
OOP에서는 공통된 기능을 재사용하는 방법으로 상속이나 위임을 사용하는데, 전체 어플리케이션에서 여기저기에서 사용되는 부가기능들을 상속이나 위임으로 처리하기에는 깔끔하게 모듈화가 어렵다. 그래서 이 문제를 해결하기 위해 AOP가 등장하게 된다.
제일 먼저 보이는 @Around는 어드바이스이다. 앞서 설명드린것 처럼 어드바이스는 애스펙트가 "무엇을", "언제" 할지를 의미하고 있다. 이 언제 라는 시점의 경우 @Around만 존재하지 않고 총 5가지의 타입이 존재한다.
@Before (이전)
: 어드바이스 타겟 메소드가 호출되기 전에 어드바이스 기능을 수행
@After (이후)
: 타겟 메소드의 결과에 관계없이(즉 성공, 예외 관계없이) 타겟 메소드가 완료 되면 어드바이스 기능을 수행
@AfterReturning (정상적 반환 이후)
: 타겟 메소드가 성공적으로 결과값을 반환 후에 어드바이스 기능을 수행
@AfterThrowing (예외 발생 이후)
: 타겟 메소드가 수행 중 예외를 던지게 되면 어드바이스 기능을 수행
@Around (메소드 실행 전후)
: 어드바이스가 타겟 메소드를 감싸서 타겟 메소드 호출전과 후에 어드바이스 기능을 수행
예를 들어 타겟 메소드의 이전 시점에서만 어드바이스 메소드를 수행하고 싶다면,
@Before("포인트컷 표현식")
public void 어드바이스메소드() {
....
}
식으로 작성하시면 된다.
여기서 주의하실 점은 @Around의 경우 반드시 proceed() 메소드가 호출되어야 한다는 것이다. proceed() 메소드는 타겟 메소드를 지칭하기 때문에 proceed 메소드를 실행시켜야만 타겟 메소드가 수행이 된다는것을 잊으시면 안된다.
언니 파이팅 고마워요