본문 바로가기

Spring

Spring AOP

Aspect Oriented Programming (관점 지향 프로그래밍)

- 어플리케이션은 다양한 공통 기능을 필요로 한다.

- 어플리케이션에서 전반적으로 걸쳐 적용되는 공통 기능들 은 특정 모듈들에서만 적용 되는게 아니다.

- 이런 공통 기능들을 공통 관심 사항(cross-cutting concern) 으로 표현하고 공통 관심 사항을 제외한 핵심 로직을 핵심 관심 사항(core concern) 으로 표현한다. 

- AOP는 이런 공통 관심 사항과 핵심 관심 사항을 관점적으로 분리해서 보자는 의미이다.

 

사진 출처 : https://addio3305.tistory.com/86

 

AOP의 장점

1. 중복 코드 제거 에 따른 코드의 간결성

2. 생산성 향상

3. 공통기능 빠진 클래스는 재사용성 증가

4. 유지보수성 향상

 

 

AOP 용어 정리

 

Aspect : 여러 객체에 공통으로 적용되는 공통 관심사를 모듈화 한 것.

                큰 개념은 Aspect = Advice(시점) + PointCut(구체적인 지점)

 

 Target : Aspect를 적용하는 곳 (클래스, 메서드 등)

 

Advice : 언제 공통 관심 기능을 핵심 로직에 적용할지 정의하는 것.

               실질적으로 어떤 일을 해야할 지에 대한 것, 실질적인 부가기능을 담은 구현체.

          시점 (ex> 어떤method 호출전 트랜젝션을 시작한다.)

 

동작시점

  • Before : 메서드 실행 전에 동작.
  • After : 메서드 실행 후에 동작.
  • After-returning : 메서드가 예외 없이 정상적으로 실행된 후에 동작.
  • After-throwing : 예외가 발생한 후에 동작.
  • Around : 모든 시점에서 동작.(범용)

JointPoint : Advice가 적용될 위치, 끼어들 수 있는 지점. 메서드 진입 지점, 생성자 호출 시점,

                    필드에서 값을 꺼내올 때 등 다양한 시점에 적용가능.

 

PointCut : JointPoint의 상세한 스펙을 정의한 것. 'A란 메서드의 진입 시점에 호출할 것'과 같이

                  더욱 구체적으로 Advice가 실행될 지점을 정할 수 있음. (PointCut ⊂ JoinPoint)

 

-> AspectJ 문법(PointCut 표현식)

 execution([접근자제어패턴], 리턴타입패턴 [패키지패턴] 메서드이름패턴(파라미터패턴))

 

간단하게 설명하면 [ * ]은 모든 것 [ .. ]은 0개 이상이라는 의미이다. 아래 예시를 통해 이해해보자.

<aop:pointcut id="publicMethod"
	expression="execution(public * board..*(..))" />

 

 - 접근자제어패턴 : public

 - 리턴타입패턴 : *

 - 패키지패턴 : board.. 및 하위 패키지 (board 패키지만 포함할 시 board. 사용)

 - 메서드이름패턴 : * 

 - 파라미터패턴 : .. 

 


Weaving : Advice를 핵심 로직 코드에 적용하는 것. 행위

728x90
반응형