AOP란?
카테고리: Spring
태그: AOP
AOP란?
Aspect-Oriented Programming (관점 지향 프로그래밍)의 약자이다.
흩어진 Aspect들을 모아서 모듈화 해줘서 관심사 분리라는 개념을 갖고 객체지향 프로그래밍을 통해 더욱 객체지향적으로 만들어주는 기술이다.
서로 다른 클래스라고 하더라도 비슷한 기능을 하는 부분(ex 비슷한 메서드, 비슷한 코드)이 있다. 이 부분을 Concern이라고 한다.
만약 노란색 기능을 수정해야 하면 각각 클래스의 노란색 기능을 일일이 수정해줘야 하기 때문에 유지 보수 면에서 불리하다.
이것을 해결한 방법이 AOP이다.
흩어진 기능들을 모을 때 사용하는 것이 Aspect이다. 각각 Concern 별로 Aspect를 만들어주고,
어느 클래스에서 사용하는지 입력해주는 방식이다. 아래의 그림이 Aspect로 모듈화 한 것을 보여주는 것이다.
각 모듈에는 Advice와 Pointcut이 들어있다.
Advice란 해야 할 일, 기능을 나타내는 것이다.
Pointcut이란 어디에 적용해야 하는지를 나타내는 것이다.(ex A라는 클래스의 Go라는 메서드)
Target이란 각각 클래스를 나타내는 것이다.(클래스 A, B, C) 즉, 적용이 되는 대상을 뜻하는 용어이다.
Join point라는 용어는 끼어들 지점을 뜻한다.(ex 메서드를 실행할 때, 필드에서 값을 가져갈 때 등등)
객체지향 프로그래밍(OOP)은 비즈니스 로직의 모듈화라고 할 수 있고, 관점 지향 프로그래밍(AOP)은 인프라 혹은 부가기능의 모듈화라고 할 수 있다.
AOP 장점
- 어플리케이션 전체에 흩어진 공통기능이 하나의 장소에서 관리됨
- 다른 Service 모듈들이 본인의 목적에만 충실하고 그 외 사항들은 신경 쓰지 않아도 됨
AOP 용어
-
- Target
- 부가기능을 부여할 대상, 핵심 기능을 담당하는 Service
-
- Advice
- 실질적으로 부가기능을 담은 구현체로, Target 객체에 종속되지 않기 때문에 부가기능에만 집중할 수 있음.
Advice는 Aspect가 무엇을 언제할지를 정의한다.
-
- PointCut
- 부가기능이 적용될 대상(메소드)를 선정하는 방법을 말함. 즉, Advice를 적용할 Joint Point를 선별하는 기능을
정의한 모듈
-
- JointPoint
- Advice가 적용될 수 있는 위치를 말함. 다른 AOP 프레임워크와는 달리 Spring에서 메소드 JointPoint만 제공.
따라서, 메소드를 가리킨다고 생각해도 무방
-
- Aspect
- 부가기능 모듈이며, 핵심기능에 부가되어 의미를 갖는 특별한 모듈, 부가될 기능을 정의한 Advice와 Advice를
어디에 적용할지 결정하는 PointCut을 함께 지님
-
- Proxy
- Target을 감싸서 Target의 요청을 대신 받아주는 Wrapping 객체.
Client에서 Target을 호출하게 되면 Target이 아닌 Target을 감싸고 있는 Proxy가 호출되어, Target 메소드를
실행하기 전에 전 처리하고 Target메소드를 실행하고 후처리를 실행하도록 구성
AOP 어노테이션
- @Component
- 컴포넌트 어노테이션을 명시해 스프링 컨테이너가 객체 생성하도록 한다.
- @Aspect
- 스프링 컨테이너에 AOP 담당 객체임을 알린다.
- @Around
- 횡단 관심사항의 대상 지정과 적용 시점을 지정한다. (pointcut, advice)
@Around(“within(bit.your.prj.controller.*)”)
- Advice : 횡단 관심사항 적용 시점 ( ex. 메서드 실행 전, 후, 리 턴 시, 예외 발생 시)
- pointcut : 횡단 관심사항 적용 대상 지정 (execution, within, bean)
타겟 메서드의 Aspect 실행 시점을 지정할 수 있는 어노테이션
- @Before (이전) : 어드바이스 타겟 메소드가 호출되기 전에 어드바이스 기능을 수행
- @After (이후) : 타겟 메소드의 결과에 관계없이(성공, 예외 관계없이) 타겟 메소드가 완료되면 어드바이스 기능을 수행
- @AfterReturning (정상적 반환 이후)타겟 메소드가 성공적으로 결과값을 반환 후에 어드바이스 기능을 수행
- @AfterThrowing (예외 발생 이후) 타겟 메소드가 수행 중 예외를 던지게 되면 어드바이스 기능을 수행
- @Around (메소드 실행 전후) : 어드바이스가 타겟 메소드를 감싸서 타겟 메소드 호출 전과 후에 어드바이스 기능을 수행
댓글남기기