CS

[Spring] AOP란 무엇일까?

뽀글보리 2021. 8. 21. 22:43
반응형

AOP란 무엇일까?

AOP란 Aspect-Oriented Programming의 약자이다.

즉, [Aspect] 를 중심으로 프로그래밍하는 것이다.

 

예를 들어, 여러 개의 클래스가 있을 때 비슷한 기능을 하는 부분이 있을 것이다.

글을 읽을 때 로그인이 되었는 지 확인하고, 글을 작성할 때 로그인이 되었는 지 확인하고, 관리자 페이지를 들어갈 때 로그인이 되었는 지 확인하고 등등...

 

이 때 [로그인이 되었는 지 확인] 부분을 하나의 Aspect로 모듈화를 할 수 있다.

다음과 같이 class에서 겹치는 부분들을 Aspect로 모듈화하여 재사용하는 것이 AOP이다.

 

주요 용어

Aspect : 겹치는 부분을 모듈화 한 것

Target : Aspect를 적용하는 클래스 혹은 메서드

Advice : 어떤 일을 해야하는 지에 대한 실질적 부가기능을 담은 구현체

JointPoint : Advice가 적용될 위치, 끼어들 수 있는 지점, 메서드 진입 지점, 생성자 호출 시점, 필드에서 값을 꺼내올 때 등 다양한 시점에 적용가능

PointCut : JointPoint의 상세한 스펙을 정의한 것

Weaving : Advice를 핵심 기능에 적용하는 행위

 

AspectJ에서의 AOP 구현되는 방식 & Weaving

=> @Before(이전), @After(이후), @AfterRunning(정상return이후), @Around(메소드 실행 전후)

AspectJ에서는 세 가지 방식의 Weaving을 사용할 수 있다.

[1] 컴파일 시점 Weaving : 컴파일 타임시 자바 파일을 클래스 파일을 만들게 된다. 이 때 미리 Weaving 된 class 파일을 생성한다.

[2] 컴파일 점 Weaving : 이미 존재하는 class 파일과 jar파일을 Weaving할 수 있다.

[3] 로드 시점 Weaving : class파일이 JVM에 로드 될 때 Weaving 된다. A.class로 컴파일 된 것을 로딩하는 시점 JointPoint에서 해당 Advice를 끼워넣는 방법이다. 즉, 바이트 코드는 변함이 없지만 로딩 시에 JVM 메모리 상에서 해당 Advice가 포함된 상태로 로딩이 되는 것이다.

 

스프링에서의 AOP 구현되는 방식

스프링에서는 Weaving이 런타임에 이루어진다.

스프링 AOP가 사용하는 방법은, A라는 Bean을 만들 때, A라는 타입의 프록시 Bean을 만든다.

이 프록시 Bean은 중간에서 대행 역할을 하게 되고,

client에서 프록시 빈에게 요청을 하게 된다.

그러면 프록시 빈에서 해당 공통 기능을 실행하고, target으로 가서 핵심 기능을 실행한다.

그리고 또 다시 프록시 빈으로 가서 나머지 공통 기능을 실행하게 되는 방식이다.

 

AspectJ와 스프링에서의 차이 비교

- Spring의 경우 Spring Container에서 관리되는 Bean에만 적용이 가능하다

- AspectJ는 컴파일 시점과 로드 시점에 Weaving을 사용하고, Spring AOP는 런타임에 Weaving을 사용한다.

- 따라서 성능적으로 AspectJ가 더 빠르다.

 

Spring AOP와 AspectJ 비교하기

0. 번역본에 대한 설명 오역/의역/직역 다수 존재합니다. 기술 용어 혹은 명칭, 주요 컨셉을 의미하는 용어는 번역하지 않고 영문 그대로 유지했고 파란색 글씨로 강조했습니다. 본문 내용 외 내

logical-code.tistory.com

해당 블로그 글에 너무 잘 정리가 되어있어서 참고하면 좋겠다.

 

Reference

- https://velog.io/@max9106/Spring-AOP%EB%9E%80-93k5zjsm95

- https://engkimbs.tistory.com/746

- https://logical-code.tistory.com/118

반응형

'CS' 카테고리의 다른 글

함수형 프로그래밍  (0) 2021.08.27
[Spring] ControllerAdvice가 어떻게 작동할까?  (0) 2021.08.22
[JAVA] 예외 처리 종류  (0) 2021.08.16
Devops와 CI/CD  (0) 2021.08.05
[기술면접] 데이터베이스 트랜잭션  (0) 2021.07.16