스프링 - AOP (개념, 용어)

산하·2021년 12월 14일
0

Spring

목록 보기
3/6
post-thumbnail

스코프 프로젝트에서 팀원이 log를 Spring AOP를 사용해 모듈화 시킨걸 보고
21-10-09에 3줄로 정리한 spring AOP 설명에 추가!


AOP란!

Aspect-Oriented Programming의 약자로 번역하면 관점 지향 프로그래밍이 된다!

AOP는 OOP(Object Oriented Programming)의 개념과 상충되는 개념이 아니라 OOP를 보완하는 개념이다.

OOP에서 모듈화의 단위는 Class지만,
AOP에서 모듈화의 단위는 Aspect다!

이를 개념적으로 풀어서 표현하면,
로직을 기준으로 핵심기능 - 부가기능 으로 나누고
그 관점을 기준으로 부가기능들을 모듈화 하는 것이다.
물론 분리한 모듈들을 적재적소에 사용할 수 있다!

예시!


위의 그림을 예시로 이해해보자!
Class A,B,C에 있는 부가기능을 AOP 기반으로 모듈화 하면
Class의 주 기능을 제외한 부가기능들을 Class에서 분리,
Aspect X,Y,Z로써 동작하게 된다.

AOP를 이해할 때 Aspect를 번역해서 관점이 최소 단위라고 이해하면 나중에 어지러울 수 있다....(경험담)
문자 그대로 이해하는 것이 전체적인 개념 이해에 더 도움이 된다!

더욱 구체적인 예로 SCOPE 프로젝트에서 Controller의 method 마다 있던 log를 출력하는 코드들을 분리한 것이 있다!


AOP에서 사용되는 용어 및 개념

Aspect

여러 클래스에서 사용되는 공통 기능을 모듈화
Spring에서는 분리한 모듈(클래스) 위에 @Aspect 어노테이션을 추가한다.

Join Point

모듈이 실행되는 포인트
예외 발생 시, 메소드 실행 시, 필드 값 조회 시 등 다양한 동작이 join Point가 될 수 있다.

Advice

특정 join Point에서 Aspect에 의해 실행 되는 동작
단순한 예로 A에서 B기능을 실행시켜줘! 라는 모듈이 있다면
B가 Advice가 된다!
Aspect의 구현체며 실행되는 시점을 기준으로 around, before, after의 유형으로 나눌 수 있다.
Spring AOP는 Advice를 intercepter로 모델링!
(자세한 유형은 밑에서 다시 설명!)

Pointcut

Join Point의 서술
Pointcut == Advice가 실행되는 Join Point

Target object

하나 이상의 Aspect에 의해 Advice 되는 객체
Spring AOP는 런타임 프록시를 사용하여 구현되므로 Target object는 항상 프록시된 객체다.

AOP proxy

Aspect의 Advice을 구현하기 위해 AOP 프레임워크에 의해 생성된 객체

Advice 유형

Before advice

Join Point 이전에 실행
실행 중 예외가 발생하지 않는 한 중지되지 않고 Join Point의 로직 수행

After returning advice

Join Point가 정상적으로 완료된 후 실행
예외를 던지지 않는다면 실행 됨

After throwing advice

예외를 throw하며 메서드가 종료된 후 실행

After (finally) advice

Join Point가 어떤 방식으로든 종료될 때 실행
예외 유무 관계 없이 실행 됨

Around advice

메소드 호출과 같은 Join Point를 둘러 쌈
메서드 호출 전, 후에 실행될 로직을 사용자가 정의할 수 있음
메서드 반환 값을 자체적으로 설정하거나 예외를 던져 메서드 실행을 단축하는 등을 정의해야 함

Around advice는 가장 일반적인 종류의 Advice이다. 
위의 유형들의 기능 모두 동작할 수 있다.
** spring docs에서는 오류 가능성이 적은 프로그래밍을 위해서 
가장 구체적인 Advice 유형을 사용하기를 권장하고 있다.

[참고자료] docs.spring.io 중 aop
Ver. 2.5.x
Ver. 4.3.12

profile
반갑습니다 :) 백앤드 개발자 산하입니다!

0개의 댓글