Gidhub BE Developer

Spring 프레임워크 핵심 기술 - 스프링 AOP : 개념 소개

2019-09-06
goodGid

이 글의 코드 및 정보들은 강의를 들으며 정리한 내용을 토대로 작성하였습니다.

AOP란?

  • Aspect-oriendted Programming (AOP)은 OOP를 보완하는 수단이다.

  • 흩어진 Aspect를 모듈화 할 수 있는 프로그래밍 기법이다.


Concerns이란?

  • 여러 클래스 혹은 여러 메소드에 나타나는 비슷한 코드들을 말한다.

  • 예를 들어보자.

만약 A,B,C 클래스에서 모두 트랜잭션 처리가 필요한 상황이라면
일반적으로 다음과 같은 Flow를 갖게 된다.

1. setAutoCommit을 false로 설정
2. Query 실행
3. Commit / RollBack

그리고 위의 코드가 A,B,C 클래스에 있는 서비스를 감싸야한다.
즉 A,B,C 클래스에는 비슷한 코드가 중복으로 사용이 된다.

만약 Concerns의 변경이 일어나게 된다면 어떻게 될까?
해당 Concerns을 사용한 모든 소스코드들을 찾아 수정을 해야한다.
다시말해 유지 보수가 쉽지 않다.

AOP : Aspect

  • 위와 같은 상황을 방지하기 위해

  • AOPAspect라는 개념을 이용하여 해결한다.


  • Aspect로 흩어진 것들을 한 곳으로 모은다.

  • Aspect를 만드는 기준은

  • 각각의 Concerns별로 생성을 한다.


  • 그리고 A,B,C 클래스에

  • 트랜잭션 처리를 위해 들어있던 코드들(=Concerns)을 제거하고

  • 그 Aspect안에

  • Concerns을 정의하고

  • Concerns들이 어디에 적용되어야하는지 개발자가 명시해준다.

  • ex) 두번째 그림의 Aspect Y 는 A,B 클래스에 적용해야한다를 뜻한다.

  • 해야할 일적용해야할 대상 을 묶어 모듈화를 해놓는다.


AOP : 주요 개념

Aspect

  • Aspect = Advice + PointCut

  • 모듈화 그 자체

Target

  • Aspect가 갖고 있는 Advice를 적용하는 대상들

  • ex) A,B,C 클래스


  • PointCut보다 상위 개념 느낌이다.

  • ex) A 클래스의 B 메소드에 적용이라면

  • Target : A 클래스

  • PointCut : B 메소드

Advice

  • What to do = 해야할 일

  • ex) 로깅을 한다.

  • ex) Hello를 출력한다. 등등

Join Point

  • 가장 흔하게 사용하는 Join Point는 메소드 실행 시점이다.

  • 해당 메소드를 실행할 때

  • 이 Advice를 끼워 넣어라

  • ex) 해당 메소드를 실행하기 전에 ‘Hello를 출력’(= Adivce)하라.


  • 여기서 끼워 넣을 수 있는 지점이

  • Joint Point이다.

  • 굉장히 다양한 합류점(= Join Point)가 있다.

    • 생성자 호출 직전

    • 생성자 생성 시

    • 필드에 접근하기 전

    • 필드에서 값을 가져갈 때

  • 즉 Join Point는 Spec이라 생각하면 된다.

PointCut

  • 어디에 적용해야하는지에 대한 정보

  • ex) A 클래스의 B 메소드에 적용이라면

  • ex) Target : A 클래스

  • ex) PointCut : B 메소드


Reference


Recommend

Index