[Code-State] SECTION-2 Spring AOP

유형찬·2022년 10월 17일
0

Code States

목록 보기
13/21

AOP란?

Spring의 주요 개념 중 관점 지향 프로그래밍이다.

용어

객체 지향 프로그래밍

AOP 는 OOP의 부족한 점을 보완하기 위해 나온 개념이다.

OOP의 목적은 다음과 같다.

  • 공통된 데이터 및 동작 방식을 가진 객체들을 하나의 클래스로 정의하여 재사용성을 높이고 유지보수를 용이하게 하는 것이다.
  • 객체를 재사용 하기 위해 관심사의 분리 (separation of concerns)를 통해 객체를 설계한다.
잠깐! 관심사의 분리란?
  • 객체지향 프로그래밍에서 객체를 설계하는 방법 중 하나이다.
  • 객체를 설계할 때 객체의 역할에 따라 객체를 분리하는 것을 의미한다.
  • 객체의 역할에 따라 객체를 분리하면 객체의 재사용성이 높아지고 유지보수가 용이해진다.

Spring MVC 의 기본 구조

기본적으로 다음과 같이 Spring MVC는 3가지의 큰 계층으로 나뉘어져 있다.

  • Controller : 클라이언트의 요청을 받아서 처리하는 계층이다.
  • Service : 비즈니스 로직을 처리하는 계층이다.
  • Repository : 데이터베이스에 접근하는 계층이다.

위처럼 각각의 계층을 나눠 관심사의 분리를 해놓은 것이다.

그런데 이런 비지니스 로직 내부나 표면 계층에 로그 기능을 추가하려면 어떻게 해야할까?

실제 코드에 그냥 로그 기능을 추가하면 되지 않을까? 라고 생각할 수 있지만,
실제 기능과는 상관 없는 기능이 추가되는 것이기 때문에 코드의 복잡도가 증가하고 유지보수가 어려워진다.

그래서 이런 기능을 부가 기능이라고 하고, 이 부가 기능을 AOP를 통해 분리하여 관리한다.

본론 AOP

Aspect

관점 지향 프로그래밍에서 공통적으로 사용되는 기능을 의미한다.

aspect는 부가 기능과 해당 부가 기능을 어느 곳에 사용할지 정의 한 것이다.

먼저 들어가기에 앞서서 중요한 기본 개념을 집고 넘어가자

  • 핵심기능 : 핵심기능은 핵심기능을 수행하는 클래스를 의미한다. 비지니스 로직 등이 핵심기능에 해당한다.
  • 부가기능 : 부가기능은 핵심기능을 수행하는 클래스에 추가적으로 수행되는 기능을 의미한다. 로그 등이 부가기능에 해당한다.
  • Aspect : 부가 기능 클래스 (advice) + 부가 기능을 어느 위치에 적용할지 (pointcut)를 의미한다.

Advice and Pointcut

위 그림은 AOP의 구조를 나타낸다.

특정 클래스에 부가 기능을 적용하기 위해서는 AdvicePointcut이 필요하다.

  • Advice : 부가 기능을 정의한 클래스이다. 언제 어떤 부가 기능을 적용할지 정의한다.
  • Pointcut : Advice를 적용할 위치를 선별하는 기능
  • Weaving : Advice와 Pointcut을 합쳐서 핵심 기능에 부가 기능을 적용하는 것을 의미한다.
  • Target : Advice를 적용할 대상이다.

Advice의 순서

Advice는 기본적으로 순서를 보장 하지 않는다. 순서를 보장하려면 @Order 어노테이션을 사용해야 한다.

여러개가 존재할 경우에는 @Order 어노테이션의 숫자가 낮은 순서대로 실행된다.
Advice는 5가지 종류가 있다.

  • Before : 핵심 기능 수행 전에 부가 기능을 수행한다.
  • After : 핵심 기능 수행 후에 부가 기능을 수행한다.
  • After-returning : 핵심 기능 수행 후에 부가 기능을 수행한다.
    • 핵심 기능이 정상적으로 수행되었을 때만 부가 기능을 수행한다.
  • After-throwing : 핵심 기능 수행 후에 부가 기능을 수행한다.
    • 핵심 기능이 예외를 발생시킬 때만 부가 기능을 수행한다.
  • Around : 핵심 기능 수행 전, 후에 부가 기능을 수행한다.
  • After-finally : 핵심 기능 수행 후에 부가 기능을 수행한다.
    • 핵심 기능이 정상적으로 수행되었든 예외가 발생하든 부가 기능을 수행한다.
profile
rocoli에요

0개의 댓글