Group Study (2020-2021)/Spring Boot

[Spring boot] 4주차 스터디 - AOP

mazayong 2020. 11. 9. 18:27

스프링 부트 강의를 들으면서, AOP에 관련된 내용이 문제 상황에 적용하는 방법에 대한 강의 위주로 나와 있어서 AOP에 대한 개념과 틀을 잡고 싶어서 글을 쓰게 되었습니다.

1. AOP?

인프라 혹은 부가 기능의 모듈화(로깅, 트랜잭션..etc)

Aspect Oriented Programming의 약자로, **관점 지향 프로그래밍**이란 뜻입니다.

프로그래밍 과정에서 공통 기능을 모든 모듈에 효율적으로 적용하기 위해 개발된 방법입니다. 상속이나 위임을 통해 공통 기능을 모듈에 적용할 수 있지만, JAVA에서는 다중 상속이 불가능해서 한계가 있고, 기능을 구현하는 부분에서 핵심코드와 공통 기능 코드가 섞여 있어서 모듈화가 되지 않아 가독성/유지보수성이 좋지 않습니다.

그래서 공통 기능을 모듈화한 후, 공통 기능을 필요로 하는 핵심 기능에 연결함으로써 유지/보수, 재사용에 용이하도록 프로그래밍하는 것을 의미합니다.

즉, 어플리케이션의 핵심적인 기능에서 부가적인 기능을 분리해 Aspect라는 모듈로 만들어 설계/개발하는 방법입니다.

2. AOP의 장점

  • 어플리케이션 전체에 흩어진 공통 기능이 1개의 장소에서 관리 가능.
  • 다른 서비스 모듈들이 본인의 목적, 기능에만 충실하고 그 외 사항은 신경쓰지 않아도 됨.

3. AOP가 사용되는 예시

  • 간단한 메소드 성능 검사
  • 트랜잭션 처리(try~catch부분 코드)
  • 예외 반환
  • 아키텍처 검증
  • 기타(ex-로깅, 인증, 권한..etc)

4. AOP에서 사용되는 용어 정리

  • Aspect(Advisor) : 핵심기능에 부가되어 의미를 갖는 모듈. Advice + PointCut을 가진다.
  • Advice(intercepter) : 부가 기능을 담는 구현체.(Aspect가 무엇을 언제할지 정의)
  • PointCut : 부가기능이 적용될 대상(method) 선정하는 방법. Advice 적용할 joinpoint 선별하는 기능을 정의한 모듈.
  • JoinPoint : Advice가 적용될 수 있는 위치.
  • Weaving(crossCutting) : 지정된 객체에 aspect를 적용해 새로운 proxy 객체를 생성하는 과정. (= 공통 기능을 적용하는 행위)
  • primary(Core) Concern : 핵심 기능.
  • Cross-cutting Concern : 부가적인 기능으로 시스템 전반에서 공통적으로 사용되는 기능.(보안/인증/로그..etc)

++ 스프링은 JoinPoint의 경우, method단위로만 지정해서 method JoinPoint라고 불리기도 한다. 그래서 스프링에서의 JoinPoint는 method를 가리킨다고 생각하면 된다.

++ AOP 이전과 이후의 어플리케이션 비교 : 기존은 Core Concern과 Cross-Cutting Contern이 함께 존재해서 비효율적이었지만, AOP는 Core Concern과 Cross-cutting Concern이 모듈화되어 구현되고, 최종적으로 Code와 Advise를 연결하는 설정 정보인 PointCut을 이용해 Weaving되어 완성되는 것이다.

5. 스프링에서 AOP

  • Proxy Pattern 기반의 AOP 구현체.
  • 스프링 빈에만 AOP 적용 가능.
  • 모든 AOP 기능을 제공하는 것이 아닌 스프링 IoC와 연동하여 엔터프라이즈 애플리케이션에서 가장 흔한 문제(중복코드, 객체들 간 복잡도 증가..etc)에 대한 해결책을 지원하는 것이 목적.

++ Proxy : 타겟을 감싸서 타겟의 요청을 대신 받아주는 Wrapping 오브젝트. 호출을 가로챈 후, advice에 등록된 기능을 수행 후 타겟 메소드를 호출한다.

++ Proxy Pattern : 프록시 객체가 원래 객체를 감싸서 Client의 요청을 처리하게 하는 패턴이다.

++ Proxy Pattern을 사용하는 이유: 기존 코드의 변경 없이 접근을 제어하고 싶거나 부가 기능을 추가하고 싶을 때 사용되기 때문이다.

Proxy Pattern에 대한 링크 : https://sabarada.tistory.com/20

proxy 그림설명

<fig 1. AOP 상에서 proxy의 모습> 이 경우 proxy가 호출을 가로채서 advice의 기능을 수행한 후 타겟 메소드를 호출하기 때문에 타겟은 호출자로부터 간접적으로 호출을 받게 됩니다.
(Client가 proxy에게 요청해서 공통기능을 실행. -> proxy가 다시 target으로 가서 핵심기능을 실행 -> 다시 공통기능을 실행하기 위해, proxy로 와서 공통기능 실행)
그림 출처: [https://jojoldu.tistory.com/71]

5-1. Spring AOP 구현 방식


1. XML 기반의 POJO 클래스를 이용한 AOP 구현
부가기능을 제공하는 Advice class를 작성한 후, XML 설정 파일에 aop:config를 이용해 Aspect를 설정한다.

2. @Aspect Annotation을 이용한 AOP 구현
@Aspect Annotation을 이용해 부가기능을 제공하는 Aspect 클래스를 작성한 후, XML 설정 파일에 <aop:aspectj-autoproxy />를 설정한다. (단, Aspect Class는 Advice를 구현하는 method, PointCut을 포함한다.)

더 추가로 공부해야 할 것

AOP 사례 실습
Proxy pattern
OOP와 AOP의 차이

출처

https://jojoldu.tistory.com/71
https://m.blog.naver.com/cncn6666/221784973026
https://cornswrold.tistory.com/422
https://isstory83.tistory.com/90