[Spring] 스프링 AOP이란? - 적용방법 | 관점지향 프로그래밍 | AOP 어노테이션 :: 매운코딩
728x90
300x250

굉장히 오랜만에 개발관련 포스팅..

Spring이나 Spring기반 FW에서 쓰이는 AOP 에 대해 간단히 알아보려고 한다.

1. AOP ( Aspect Oriented Programming) 이란?

관점 지향 프로그래밍이다.
관점이란 여러 곳에서 사용되는 동일한 코드를 의미 한다.
동일한 코드가 여러 Class 파일에 혼재되어 중복사용되는 경우 관심사가 흩어졌다고 한다.
공통으로 사용하는 부분들은 모듈화시키고 각 파일은 자기의 비즈니스 로직만 딱 수행하도록 분리하는 방법이다.

결론적으로 Aspect로 모듈화하고 핵심적인 비즈니스 로직에서 분리하여 재사용하겠다는 것이 AOP의 취지다.

2. AOP 주요 개념

  • Aspect : 위에서 설명한 흩어진 관심사를 모듈화 한 것. 주로 부가기능을 모듈화함.
  • Target : Aspect를 적용하는 곳 (클래스, 메서드 .. )
  • Advice : 실질적으로 어떤 일을 해야할 지에 대한 것, 실질적인 부가기능을 담은 구현체
  • JointPoint : Advice가 적용될 위치, 끼어들 수 있는 지점. 메서드 진입 지점, 생성자 호출 시점, 필드에서 값을 꺼내올 때 등 다양한 시점에 적용가능
  • PointCut : JointPoint의 상세한 스펙을 정의한 것. 'A란 메서드의 진입 시점에 호출할 것'과 같이 더욱 구체적으로 Advice가 실행될 지점을 정할 수 있음

개념만 봐서는 잘 안와닿는다... 어노테이션과 같이 보면서 알아보자.



3. AOP 관련 어노테이션


@Aspect : 공통 코드가 모여있는 Class위에 선언하여 해당 Class가 관점 클래스라는 것을 가리킨다.
Bean이 생성되지 않기때문에 @Component 도 같이 사용해준다.
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
@Around("@PointCut") : Advice의 한 종류로 @PointCut 조건에 해당하는 로직들의 실행 전/후에 실행되기를 원하는 Function위에 선언한다.

@Before("@PointCut") : @PointCut 조건에 해당하는 로직들의 실행 에 실행되기를 원하는 Function위에 선언한다.

@After("@PointCut") : @PointCut 조건에 해당하는 로직들의 실행 에 실행되기를 원하는 Function위에 선언한다.

@AfterReturing("@PointCut") : @PointCut 조건에 해당하는 로직들의 성공적인 실행이 끝난 후에 실행되기를 원하는 Function위에 선언한다.

@AfterThrowing("@PointCut") : @PointCut 조건에 해당하는 로직들이 예외가 발생했을 경우에 실행되기를 원하는 Function위에 선언한다.
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
@PointCut : @Around로 지정된 Function이 어떤 조건에 실행될지를 담는다. 표현식은 경우의 수에 따라 매우 다양하다.

예시를 보자.

@Around(execution(public void get*()))
public String fun() {
	alert('실행이닷');
}


위의 코드는 @PointCut 자리에 execution(public void get*()) 가 들어갔다.
그렇다면 Around로 지정된 fun이라는 함수는
public void형태이면서 함수명이 get으로 시작하고 파라미터가 존재하지 않는 함수들의 실행 전/후에 같이 실행된다는 것이다.

@Before("within(org.springframework.web.bind.annotation.RestController)")
public String fun() {
	alert('실행이닷');
}

within(경로) 는 패키지 내의 특정 타입에 속하는 함수를 명시할때 사용한다.
위의 코드는 패키지 내에서 @RestController라는 어노테이션을 사용한 모든 함수가 실행되기 전에! fun함수도 같이 실행된다.

@Around("within(com.board.web")
public String fun() {
	alert('실행이닷');
}

위의 코드는 com.board.web 패키지에 속하는 클래스들의 함수가 실행될때 fun함수도 같이 실행된다는 의미이다.

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
@Order(n) : n은 자연수, 2개 이상의 Aspect들을 관리할때 적용 순서를 부여할 수 있다.


종합적인 어노테이션의 예시를 보면서 마무리하자.~~

@Aspect
@Order(1) // 1번째로 적용할 Aspect
public class FirstAspect {

	@Before("within(org.springframework.web.bind.annotation.RestController)")
	public String fun() {
		alert('실행이닷');
	}

}

@Aspect
@Order(2) // 2번째로 적용할 Aspect
public class SecondAspect {

	@Before("execution(void *.run())")
	public String fun() {
		alert('run함수라면 날 거쳐가지');
	}

}





참고자료:
https://devlog-wjdrbs96.tistory.com/398
https://engkimbs.tistory.com/746
https://galid1.tistory.com/498

728x90

+ Recent posts