본문 바로가기
2024 웹/Spring & Spring Boot

Spring AOP(Aspect Oriented Programming)

by concho 2024. 4. 18.

 AOP(Aspect Oriented Programming)?
  - 관점 지향 프로그래밍
  
  - 코드 상에 핵심기능 + 공통 기능이 있는데 핵심 기능과 
        공통 기능을 분리해 놓는 것을 관점 지향 프로그래밍이라 함.
        즉, 핵심 사항과 공통관심사항을 분리하여 구현하는 것을 말함.
    
  - 문제를 바라보는 관점을 기준으로 프로그래밍을 하는 기법을 말함.
  
  - AOP는 문제를 해결하기 위한 핵심 사항과 코드 전체에 적용되는
        공통관심사항을 기준으로 프로그래밍 함으로써 공통 모듈을 여러 
        코드에 쉽게 적용할 수 있도록 도와줌.
    
  - AOP는 핵심사항과 공통관심사항을 별도의 코드로 구현해서 최종적으로
        이 둘을 조합하여 완성하는 것을 말함.

 

스프링이 제공하는 AOP는 프록시를 이용한 방식이다.

여기서 프록시(proxy)란 대리자란 뜻으로 여기서 사용하는 프록시 패턴은 객체(Controller등)를 직접적으로 참조하는게 아닌 해당 객체를 대변하는 객체(proxy객체)를 통해 대상 객체에 접근하는 방식이다.

 

AOP와 유사한 방식의 패턴이 존재한다.

데코레이터 패턴은 AOP와 유사하게 메서드에 기능을 추가하지만 중요한 차이점이 있다.

데코레이션 패턴은 실제 객체를 내부에 가지고 있고 호출된 메서드를 먼저 실제 객체에 전달한 다음 그결과를 반환하고 AOP는 실제 객체를 가지고 있지 않고 참조 변수만을 가지고 있다.

 

AOP 의 구조

 

 

 

# 스프링에서 AOP를 구현하는 방법
  - 설정 파일을 이용하는 방법(XML 기반의 구현 방법)
  - 애노테이션을 이용하는 방법(@AspectJ 애노테이션 기반의 AOP 구현)
  
  - 스프링 AOP 사용 시 필요한 라이브러리 등록(pom.xml)
    * artifactId가 aspectjweaver 인 라이브러리를 등록해야 함. 
     
  - 스프링 AOP 프록시 사용 시 필요한 라이브러리 등록(pom.xml)
    * artifactId가 cglib 인 라이브러리를 등록해야 함. 
  
  - 공통 기능 클래스 제작 - Advice 역할을 하는 클래스.  

 

- 리솔시스 패키지에 xml 파일 하나 만들고 하단에 NameSpace aop 설정 

<aop:config>
 
 
# xml(설정 파일을 이용하는 방법) 파일에서 advice 종류
  - <aop:before> : 핵심 기능이 실행되기 전에 advice(공통관심사항)를 실행.
  - <aop:after-returning> : 정상적으로 핵심 기능이 실행된 후에 
                            advice(공통관심사항)를 실행.
                                                        모든 실행이 정상적으로 이루어진 후에 
                                                        동작하는 코드임.
  - <aop:after-throwing> : 핵심 기능 실행 중에 Exception이 발생 
                                                      시 advice(공통관심사항)를 실행.
                                                      예외가 발생한 후에 동작하는 코드임.
  - <aop:after> : 핵심 기능 실행 후에 advice(공통관심사항)를 
                                    실행 ==> Exception이 발생하더라도
                                                   정상적으로 실행되거나 예외가 발생했을 
                                                   때 구분 없이 실행되는 코드임.
  - <aop:around> : 핵심 기능 실행 전 / 후 및 Exception 발생 
                                      시 advice(공통관심사항)를 실행
                   ==> 가장 많이 사용됨.
                   

# Aspect pointcut 표현식
  - pointcut 을 지정할 때 사용하는 표현식으로 AspectJ 문법을 
        사용함.
    pointcut으로 표현할 수 있는 명시자에는 여러 종류가 있지만 
       일반적으로 가장 많이 사용하는 명시자는 execution 명시자임. 
       그 외에도 within, bean 명시자가 있음.
    
    - execution 명시자 : advice를 적용할 메서드를 명시할 때 
                        사용함.
      
      - * : 모든
      - . : 현재
      - .. : 0개 이상
      
예시)


           * execution(public void get*(..))
             ==> public void 이고, 메서드 이름이 get으로 
                                  시작하는 메서드이고, 인자가 있는 경우.
             
           * execution(* com.test.aop.*.*())
             ==> com.test.aop 패키지의 모든 클래스에 
                                  파라미터(인자)가 없는 모든 메서드.
      
           * execution(* com.test.aop..*.*())
             ==> com.test.aop   패키지 및 com.test.aop
                                   패키지의 하위 패키지의 모든 클래스의 파라미터
                 (인자)가 없는 모든 메서드.
                               
           * execution(* com.test.aop.Staff.*() )
             ==> com.test.aop 패키지 안의 Staff 클래스 
                                  안에 파라미터(인자)가 없는 모든 메서드.

'2024 웹 > Spring & Spring Boot' 카테고리의 다른 글

spring security  (0) 2024.04.29
spring dependency  (0) 2024.04.29
JdbcTemplate and BeanPropertyRowMapper 사용  (0) 2024.04.16
spring and jdbc  (0) 2024.04.15
spring mvc  (0) 2024.04.15

댓글