Spring/Spring AOP

Spring AOP

레알윙 2020. 2. 9. 18:56
반응형

1. AOP(Aspect Oriented Programming)란? 

  • 관점지향 프로그래밍
  • AOP를 구현하는 다양한 방법이 존재하지만, 기본적인 개념은 아래 그림과 같이 공통 관심 사항 코드를 비즈니스 로직을 구현한 코드안에 삽입
  • 자체적인 언어라기보다는 기존의 OOP언어를 보완하는 확장
  • 흩어진 Aspect를 모듈화 할 수 있는 프로그래밍 기법
  • AOP의 구현체를 제공하며, 자바에 만들어 있는 AOP구현체(AspectJ)와 연동할 수 잇는 기능 제공
  • 위의 내용을 기반으로 트랜잭션, 캐쉬 등 여러가지 기능이 제공되고 있다.

 

2. 사용 목적

인터넷 및 책에서 찾아보니까 ‘관심의 분리(Separation Of concerns)‘라고 나오는데 말이 어렵다. 그렇기 때문에 내뜻대로 정의해 보았다

  • 핵심관점(업무로직 - 모듈) + (보안 기능, 로깅기능, 트랜잭션) 등
  • 아래의 그림을 보게 된다면 한마디로 공통기능들을 묶어 관리를 한다고 생각하면 된다.(트랜잭션, 보안, 로깅 등등 의 기능들)
  • 중복되는 코드제거, 효율적인 유지보수, 높은 생산성, 재활용성 극대화

 

3. AOP 구조

 

4. 용어

Advice는 끼워 넣을 로직 자체입니다. 해당 Advice를 "어디에" 넣을지가 '포인트컷'이고, 포인트컷은 프레임워크마다 지원하는게 다릅니다. 스프링의 경우 메소드 실행 전, 후, 주변, 에러 발생했을 때에 넣을 수 있는데 그런식으로 끼워 넣을 수 있는 지점 들이 곧 조인포인트이고 그 중에서 내가 추가하고 싶은 Advice를 넣을 곳이 포인트컷입니다.

 

백기선님 강의 설명 자료

Aspect

  • AOP에서 관점이라 부르며 여러 객체에 공통으로적용되는 기능을 담당
  • 보안기능, 로깅기능, 트랜잭선(DB기능)들이 해당
  • 백기선
    • 묶은것, 즉 모듈
    • advice와 Pointcut이 들어감

 

Advice

  • Aspect(이하 보안기능)이 적용할 조건을 담당
  • 보안기능이 어떤 메소드 전에 동작할지, 예외발생후 동작하건지 조건을 걸어주는것
  • 언제 공통 관심 기능을 핵심로직에 적용할 지를 정의
  • '메서드를 호출 하기전에 트랜잭션 시작' 기능을 적용한다는 것을 정의
  • 백기선
    • 해야할 일들

Pointcut

  • Joinpoint의 부분집합으로서 실제로 Advice가 적용되는 Joinpoint를 나타냅니다. 스프링에서는 정규 표현식이나 AspectJ의 문법을 이용하여 Poincut을 재정의 가능
  • 백기선
    • 어디에 적용해야되는지
    • 구체적으로 A Class에 B라는 호출 메소드할 때 Aspect X를 호출해라
    • Joinpoint 는 많은 지점을 말하는거고 Pointcut은 detail하게 설정할 때

Weaving

  • 어떤 Advice를 어떤 Pointcut에 사용할지 설정하는 역활
  • Advice를 핵심로직코드에 적용하는 것
  • 공통코드를 핵심로직코드에 삽입하는것을 weaving이라고 합니다.

Joinpoint

  • Advice를 적용 가능한 지점을 의미
  • 메소드호출, 필드값 변경, 생성자 호출지점, 생성자 호출할 때 등
  • 백기선
    • 메소드 실행 시점

Target

  • 여러개의 Joinpoint중 보안기능이 적용되는 포인트를 Target
  • 백기선
    • 적용이되는 대상

Proxy

  • 보안기능 절차가 다 적용이되면 Proxy라는 객체가 생성이되는데 Advice와 Target으로 구성되어 있다.
  • 클라이언트가 사용하려고 하는 실제 대상인 것처럼 위장하여 클라이언트 클라이언트의 요청을 받아주어 처리하는 대리자 역할.

5.AOP 구현체

6. AOP 구현 방법

컴파일시

  • AspectJ라이브러리를 추가해서 구현할 때 사용
  • 컴파일 A.java -----(AOP) ----> A.class(AspectJ)
  • 컴파일 시 해당 AOP기능을 하는 코드가 class파일에 존재해야 함
  • 문제점
    • 로딩할때랑 런타임 시 아무런 작업을 하지 않아도되지만 별도의 컴파일을 한번더 해야한다

클래스 로딩시

  • JVM이 변경된 바이트 코드를 사용(조작)하도록 함으로써 AOP를 적용
    • A.java -> A.class ---(AOP) ----> 메모리(AspectJ)
  • AspectJ라이브러리도 지원
  • 단점
    • 로딩할 때 클래스 부하 발생
    • 로드파임 위버(자바 에이전트)를 설정을 해야한다.

런타임 시(Spring AOP가 사용하는 방법)

  • 소스코드나 클래스정보 자체를 변경하지 않고, 프록시를 이용하여 핵심로직을 구현한 객체에 접근
  • 프록시 기반의 AOP는 핵심 로직을 구현할 객체에 직접 접근하는것이 아니라 아래 그림과 같이 중간에 프록시를 생성하여 프록시를 통해 핵심 로직의 객체에 접근하는 것
  • 프록시는 핵심 로직을 실행하기 전 또는 후에 공통 모듈 기능을 적용하는 방식으로 AOP를 구현
  • 단점
    • 최초의 Bean을 만들 때 비용이 발생

반응형