2025-02-05



# AOP(Aspect Oriented Programming)?
- 관점 지향 프로그래밍
- 코드 상에 핵심기능 + 공통 기능이 있는데 핵심 기능과
공통 기능을 분리해 놓는 것을 관점 지향 프로그래밍이라 함.
즉, 핵심 사항과 공통관심사항을 분리하여 구현하는 것을 말함.
- 문제를 바라보는 관점을 기준으로 프로그래밍을 하는 기법을 말함.
- AOP는 문제를 해결하기 위한 핵심 사항과 코드 전체에 적용되는
공통관심사항을 기준으로 프로그래밍 함으로써 공통 모듈을 여러
코드에 쉽게 적용할 수 있도록 도와줌.
- AOP는 핵심사항과 공통관심사항을 별도의 코드로 구현해서 최종적으로
이 둘을 조합하여 완성하는 것을 말함.
# AOP의 장점
- 전체 코드에 흩어져 있는 공통 관심 사항이 하나의 장소에
집중(응집)이 된다는 점.
- 서비스 모듈이 자신의 주요 관심 사항(핵심 사항)에 대한 코드만
집중하고, 그 외의 공통 관심 사항은 모두 빠지므로 코드가 깔끔해
진다는 장점.
# AOP 주요 용어 - 용어가 어려움(중요).
- target(핵심 관심 사항) : 비지니스 로직(주된 업무)
어떤 대상에 공통 관심 사항(부가 기능)을 적용할 것인가?
- advice(공통 관심 사항) - 횡단 관심 사항
: 부가적인 업무(보조 업무). 공통 관심 사항은 누군가에게 맡겨
버리는 것이 좋음.
공통 관심 사항 내용을 정의하고 언제 그 작업을 수행할지를 정의
하는 것을 말함. 즉, 언제 공통 관심 기능을 핵심 로직에 적용할
지를 정의하고 있어야 함.
언제 ==> Before, AfterReturning, AfterThrowing, After, Around
- aspect : 무엇을 언제 어디서 할지 즉, 필요한 정보가 정의되어
있음. 즉, 여러 객체에 공통으로 적용되고 있는 공통
관심 사항을 말함. 트랜잭션이나 보안, 로그 등이 좋은
예임. ==> aspect = advice + pointcut
- joinpoint : advice가 추가될 대상(메서드)
핵심 관심 사항과 공통 관심 사항을 연결해 주는
설정 정보를 말함.
어디에 적용할 것인가? 스프링에서는 메서드가 실행될 때만 적용이 됨.
- pointcut : join point 들을 정의한 패턴.
실제 공통 관심 사항(advice)이 적용되는 지점(join point)를
말함. 스프링에서는 정규 표현식이나 aspectj 문법을 이용하여 정의함.
- weaving : code, advice, pointcut 등을 조합해서
애플리케이션을 만들어 가는 과정을 말함.
# 스프링에서 AOP를 구현하는 방법
- 설정 파일을 이용하는 방법(XML 기반의 구현 방법)
- 애노테이션을 이용하는 방법(@AspectJ 애노테이션 기반의 AOP 구현)
- 스프링 AOP 사용 시 필요한 라이브러리 등록(pom.xml)
* artifactId가 aspectjweaver 인 라이브러리를 등록해야 함.
- 스프링 AOP 프록시 사용 시 필요한 라이브러리 등록(pom.xml)
* artifactId가 cglib 인 라이브러리를 등록해야 함.
- 공통 기능 클래스 제작 - Advice 역할을 하는 클래스.
# 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 클래스
안에 파라미터(인자)가 없는 모든 메서드.'Spring, Boot > 기초 내용 정리' 카테고리의 다른 글
| Spring Boot_00 (1) | 2025.02.06 |
|---|---|
| Spring(AOP)_01 (0) | 2025.02.06 |
| Spring(FileUpload)_01 (0) | 2025.02.06 |
| Spring(MyBatis)_04 (0) | 2025.02.05 |
| Spring(MyBatis)_03 (0) | 2025.02.05 |