AOP (Aspect-Orientes Programming)란?
관점 지향 프로그래밍
AOP는 OOP(객체지향프로그래밍)와 다른 게 아니라 OOP를 보완해주는 것
OOP에서 핵심 비즈니스 로직과 독립적으로 분리하기 힘든 부가 기능들을 AOP의 Aspect을 활용해 모듈화해준다.
핵심 비즈니스 로직을 담고 있지는 않지만 어플리케이션에 부가됨으로써 의미를 갖는 특별한 모듈!
OOP: 비지니스 로직의 모듈화
AOP: 인프라 혹은 부가 기능의 모듈화
ex) 트랜잭션, 로깅, 등
Aspect을 이용해 모듈화 왜 필요? 그냥 쓰면 안되나?
흩어진 관심사를 횡단 기능에 관심을 두어 하나로 합칠 수 있다.
이 과정에서 중복을 줄여 코드의 효율성도 증가하고 유지보수도 더 쉬움
ex)
매 클래스마다 이용자가 사용하는 부가 기능(ex, 실행시간 측정 등)이 있다고 생각해보자.
관련된 코드들을 매 클래스마다 다 넣으면 핵심 로직과 관련된 코드도 아닌데 작성도 힘들고 수정이 필요할 시 유지보수도 힘들다.
그렇다고 없앨 수는 없다.
AOP 용어
Aspect
부가 기능 모듈
advice와 point cut을 내재
Target
aspect에 적용되는 대상
Advice
어떤 기능을 부가적으로 넣을지
Join Point
advice 적용될 위치, 끼어들 수 있는 지점, 메서드 진입 지점, 생성자 호출 지점 등 다양한 시점에 적용 가능
Point Cut
어디에 적용해야 하는지에 대한 정보 ex 메서드 정보 등
Proxy
타겟을 감싸서 타겟의 요청을 대신 받아주는 랩핑 오브젝트
Weaving
지정된 객체에 aspect를 적용해서 새로운 proxy 객체를 생성하는 과정
AOP 구현체 종류
1. AspectJ
2. Spring AOP
AOP 적용 방법
1. 컴파일시 -> AspectJ
자바 파일을 클래스 파일로 만들 때 바이트 코드를 조작하여 AOP 적용
2. 클래스 로드시 -> AspectJ
컴파일은 원래 클래스 그대로, 클래스를 로딩하는 시점에 AOP 적용
3. 런타임시(프록시 패턴 사용) -> Spring AOP
Spring AOP 대상인 클래스의 빈이 만들어질 때 Spring AOP가 프록시 기능이 추가된 클래스를 자동으로 만든다.
이후 원본이 아닌 프록시 기능이 추가된 클래스를 빈으로 등록
Spring AOP란?
스프링은 프록시 패턴을 이용해 AOP를 구현
스프링 빈에만 AOP 적용 가능
모든 AOP 기능을 지원하진 않고 스프링 IoC와 연동하여 중복코드, 프록시 클래스 작성 번거로움과 같은 흔한 문제들에 대한 해결책을 지원하는 게 목적
Spring AOP 의존성 추가
maven
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
gradle
implementation 'org.springframework.boot:spring-boot-starter-aop'
참고 사이트
https://www.youtube.com/watch?v=Hm0w_9ngDpM
https://jojoldu.tistory.com/71
https://devlog-wjdrbs96.tistory.com/398
https://engkimbs.tistory.com/746
https://tecoble.techcourse.co.kr/post/2021-06-25-aop-transaction/
'Spring > 개인 공부' 카테고리의 다른 글
[스프링 부트] 스프링 부트 data jpa 프로젝트에 Querydsl 적용하기 (0) | 2022.02.04 |
---|---|
[mySQL 8.0.27] 비밀번호 정책 변경하기 최신 버전, Unknown system variable 'validate_password_policy' 오류 해결 (0) | 2022.02.03 |
[스프링 부트] 로그(Log), 로깅( Logging)이란? (0) | 2022.02.03 |
[JUnit4] 최신 스프링 부트 프로젝트(2.2x~)에서 Junit4 사용 설정하기 (0) | 2022.02.03 |
[JUnit5] 유저 Junit4 테스트 코드를 Junit5 테스크 코드로 변경해보기 (0) | 2022.02.03 |