Spring AOP
모든 서비스마다 분리하여 작성하며 필요한 시점에 삽입하는 것이 관점지향 프로그램의 목적 AOP이다.

중복되는 공통 코드 부분(commit, rollback, log 처리)을 별도의 영역으로 분리해 내고,
코드가 실행 되기 전이나 이 후의 시점에 해당 코드를 붙여 넣음으로써 소스 코드의 중복을 줄이고,
필요할 때마다 가져다 쓸 수 있게 객체화하는 기술

기본적으로 Proxy server. Deric라고 부르며 클라이언트와 서버 사이에서 데이터를 전달해 주는 서버이며
요청을 가로채는 역할을 한다. 실제 호출되는 역할이 있으면 스터디라는 것을 호출한다.
-> 이전, 이후 정확하게 리턴, 또는 Throwing되는 시 혹은 위의 전체를 감싸서 Around라고 하는데 시작과 동작을 모두 감싸서 삽입되서 실행되는 것이다.

우리가 잡을 수 있는 조인 포인트는 메소드 호출 포인트이다.
AOP를 쓰기위해서는 해당 노테이션이 있어야만 활성화 된다.
포인트, 조인포인트를 작성해야 원하는 대로 동작한다.

단순하게 이렇게 생각하면 된다!

Spring AOP의 조인 포인트 : 메소드 호출
MemberController 가 MemberService에 호출이 되게 끔하고
Proxy라고 하는 건 감싸는 부가기능
Aspect 란?

 

아스펙트(Aspect)는 부가기능을 정의한 코드인 어드바이스(Advice)와
어드바이스를 어디에 적용하지를 결정하는 포인트컷(PointCut)을 합친 개념이다.

Advice + PointCut = Aspect

AOP 개념을 적용하면 핵심기능 코드 사이에 끼어있는 부가기능을 독 립적인 요소로 구분해 낼 수 있으며, 이렇게 구분된 부가기능 아스펙트 는 런타임 시에 필요한 위치에 동적으로 참여하게 할 수 있다.
Aspect 여러 객체에 공통으로 적용되는 기능을 분리하여 작성한 클래스
Joinpoint 클래스의 객체(인스턴스) 생성 지점, 메소드 호출 시점, 예외 발생 시점 등 특정 작업이 시작되는 시점
Advice Joinpoint에 삽입되어 동작될 코드, 메소드
Pointcut 조인 포인트의 부분 집합 / 실제 Advice가 적용되는 부분
Introduction 정적인 방식의 AOP 기술
Weaving 작성한 Advice (공통 코드)를 핵심 로직 코드에 삽입
Proxy 대상 객체에 Advice가 적용된 후 생성되는 객체
Target Object Advice를 삽입할 대상 객체
Spring은 프록시(Proxy) 기반 AOP를 지원

스프링은 대상 객체에 대한 프록시를 만들어 제공하며, 타겟을 감싸는 프록시는 서버 런타임 시에 생성된다.

이렇게 생성된 프록시는 대상 객체를 호출 할 때 먼저 호출되어 어드바이스 로직을 처리 후 대상 객체를 호출

Proxy : 대상 객체를 직접 접근하지 못하게 '대리인'으로써 요청을 대신 받는 기술

 

Proxy는 대상 객체의 호출을 가로챈다(Intercept)

Proxy는 그 역할에 따라 타겟 객체에 대한 호출을 가로챈 다음 어드바이스의 부가기능 로직을 수행하고 난 후에

타겟의 핵심기능 로직을 호출하거나 (전처리 어드바이스) 타겟의 핵심기능 로직 메서드를 호출한 후에 부가기능(어드바이스)을 수행한다.(후처리 어드바이스).

Spring AOP는 메소드 조인 포인트만 지원

 

Spring은 동적 프록시를 기반으로 AOP를 구현하기 때문에 메소드 조인 포인 트만 지원한다.

즉, 핵심기능(대상 객체)의 메소드가 호출되는 런타임 시점에만 부가기능(어드바이스)을 적용할 수 있다.

하지만, AspectJ 같은 고급 AOP 프레임워크를 사용하면 객체의 생성, 필드값 의 조회와 조작, static 메서드

호출 및 초기화 등의 다양한 작업에 부가기능을 적용할 수 있다.

 

XML 기반의 aop 네임스페이스를 통한 AOP 구현

부가기능을 제공하는 Advice 클래스를 작성.
XML 설정 파일에 를 이용해서 아스펙트를 설정한다. (즉, 어드바이스와 포인트컷을 설정함)

@Aspect 어노테이션을 이용한 AOP 구현

@Aspect 어노테이션을 이용해서 부가기능을 제공하는 Aspect 클래스 를 작성한다.
이때 Aspect 클래스는 어드바이스를 구현하는 메서드와 포인트컷을 포함한다. XML 설정 파일에 를 설정

 

JoinPoint Interface 메소드
getArgs() 메소드의 매개 변수를 반환
getThis() 현재 사용 중인 프록시 객체를 반환
getTarget()  대상 객체를 반환
getSignature() 대상 객체 메소드의 설명(메소드 명, 리턴 타입 등)을 반환
toString() 대상 객체 메소드의 정보를 출력

 

SMALL

'java > spring' 카테고리의 다른 글

REST API  (0) 2023.04.27
Spring Boot 🍃타임리프(Thymeleaf)  (0) 2023.03.06
Spring 계층형 개발 Architecture  (0) 2023.03.02
Spring Dependency Injection  (0) 2023.02.23
Spring bean  (1) 2023.02.22

+ Recent posts