본문 바로가기

공부 자료/Spring

[Spring Core] About AOP & AOP 용어

AOP 관련 정리글

https://kcode-recording.tistory.com/m/43

 

[Spring Core] AOP (Aspect Oriented Programming)

AOP(Aspect Oriented Programming)란? : OOP(Object Oriented Programming)은 객체지향 프로그래밍 즉, 객체 간의 관계를 지향하는 프로그래밍 방식 : Aspect(관심)을 지향하는 프로그래밍은 애플리케이션에 필요한 기

kcode-recording.tistory.com

 

Spring MVC 구조는 @Controller, @Service, @Repository와 같이 관심사 별 계층을 나눠 객체를 관리하게 되는데 관심사의 분리는 모듈화의 핵심임. 하지만 OOP에서 객체를 잘 활용하기 위해 관심사 분리 SoC의 디자인 원칙을 준수하지만 OOP에서 의 관심사 분리만 가지고는 아래와 같은 문제점이 존재하기 때문에 OOP 관심사 분리에 대한 한계적 부분을 해결하기 위해 AOP에 대해서 알아야 함.

 

[문제점]

  • 특정 관심사 업무 코드에 트랜잭션, 보안, 로깅 등의 코드가 존재하게 됩니다.
  • 트랜잭션, 보안, 로깅 코드는 업무와는 관련이 없지만 애플리케이션에 필수적인 부가 기능입니다.
  • 트랜잭션, 보안, 로깅 기능은 불특정 다수의 클래스에서 존재하게 됩니다.
  • 관심사 관점에서는 트랜잭션, 보안, 로깅 코드들을 횡단 관심사(Cross-cutting Concerns: 부가 기능)라고 합니다.
  • 업무 관련 코드는 핵심 관심사(Core Concerns: 핵심 기능)라고 합니다.
  • 비즈니스 클래스에 횡단 관심사와 핵심 관리사가 공존하게 됩니다.
    • 메소드 복잡도 증가 → 비즈니스 코드 파악이 어렵게 됩니다.
    • 부가 기능의 불특정 다수 메소드가 반복적으로 구현 → 횡단 관심사의 모듈화가 어렵습니다.

 

 

[AOP]

AOP(Aspect-Oriented Programming) : 기존과 다른 프로그램 구조 사고 방식을 제공함으로써 OPP의 부족한 부분을 보완함 >> OOP의 모듈화 핵심 단위는 클래스, AOP의 모듈화의 핵심 단위는 관점으로 Aspect는 여러 유형과 객체 간에 발생하는 문제의 모듈화를 가능하게 함

 

 

AOP 기능

1) 핵심 기능(Core Concerns)

 : 객체가 제공하는 고유의 기능(업무 로직 등을 포함)

 

2) 부가 기능(CROSS-CUTTING Concerns)

 : 핵심 기능을 보조하기 위해 제공되는 기능으로 단독으로 사용되지 않고 핵심 기능과 함께 사용

 : 로그 추적 로직, 보안, 트랜잭션 기능 등이 존재

 

Ex)

- 핵심 기능인 '주문로직'과 부가 기능인 '로그 추적 로직'이 하나의 객체로 들어감

- 부가 기능이 필요한 경우 위와 같이 합쳐져서 하나의 로직을 완성

- 서비스 실행 시 핵심 기능과 부가 기능이 함께 실행되게 됨

 

추가)

부가 기능의 경우 여러 클래스에 걸쳐 함께 사용되며 이러한 부가기능은 횡단 관심사가 됨

(문제점)

- 부가 기능을 여러곳에 적용하려면 번거롭고 중복 코드가 생기게 됨

- 부가 기능 수정이 필요할 경우 사용되는 클래스에 찾아가 수정해야 함

 

 

[AOP 용어]

1. 애스팩트(Aspect)

: 여러 객체에 공통으로 적용되는 기능(공통 기능)

: 어드바이스 + 포인트컷을 모듈화하여 애플리케이션에 포함되는 횡단 기능

: 여러 어드바이스와 포인트컷이 함께 존재

 

2. 조인포인트 (join point)

s는 메서드 실행 전 포인트 E는 메서드 실행 후 포인트 (포인트를 어드바이스가 적용될 조인 포인트라 칭함)

: 클래스 초기화, 객체 인스턴스화, 메서드 호출, 필드 접근, 예외 발생과 같은 애플리케이션 실행 흐름에서의 특정 포인트

: 애플리케이션에 새로운 동작을 추가하기 위해 조인 포인트에 관심코드 추가 가능

: 횡단 관심은 조인포인트 전/후에 AOP에 의해 자동 추가됨

: 추상적 개념이고 AOP를 적용할 수 있는 모든 지점

: 스프링 AOP는 프록시 방식을 사용하기에 조인 포인트는 항상 메서드 실행 지점으로 제한

: 어드바이스 적용이 필요한 곳은 애플리케이션 내에 메서드를 갖음

https://kcode-recording.tistory.com/m/62

 

[Spring Core] AOP - JoinPoint

[Join Point] : 추상적인 개념으로 AOP를 적용할 수 있는 지점을 의미 * AOP 적용 위치 - 지금까지 학습한 메서드 실행 위치 뿐 아니라 다양한 위치에 적용이 가능 : 적용 가능 지점(조인 포인트) : 생성

kcode-recording.tistory.com

 

3. 어드바이스(Advice)

: 조인 포인트에서 수행되는 코드

: Aspect를 언제 핵심 코드에 적용할지 정의

: 시스템 전체 Aspect에 API 호출을 제공

: 메소드 호출 이전 각 상세 정보와 모든 메서드를 로그로 남기기 위해 메서드 시작 전의 포인트인 조인 포인트 S를 선택

: 부가 기능에 해당

https://kcode-recording.tistory.com/m/60

 

[Spring Core] AOP - about Advice

[Advice 순서] : 어드바이스는 기본적으로 순서를 보장하지 않음 >> 순서 지정을 할 경우 @Aspect 적용 단위로 org.springfamework.core.annotation.@Order 애너테이션 적용이 필요함 (어드바이스 단위가 아닌 클

kcode-recording.tistory.com

 

4. 포인트컷(Pointcut)

: 조인 포인트 중에서 어드바이스가 적용될 위치를 선별하는 기능

: AspectJ 표현식을 사용해서 지정

: 프록시를 사용하는 스프링 AOP는 메서드 실행 지점만 포인트컷으로 선별 가능

https://kcode-recording.tistory.com/m/61

 

[Spring Core] AOP - Pointcut 표현식

[포인트컷 표현식] : 포인트컷은 관심 조인 포인트를 결정하므로 어드바이스가 실행되는 시기 제어가 가능하며 AspectJ는 포인트컷을 편리하게 표현하기 위한 특별한 표현식을 제공 : AspectJ pointcut

kcode-recording.tistory.com

 

5. 위빙(Weaving)

: 포인트컷으로 결정한 타겟의 조인 포인트에 어드바이스를 적용하는 것(어드바이스를 핵심 코드에 적용하는 것을 의미)

: 핵심 기능 코드에 영향을 주지 않고 부가 기능 추가 가능

: AOP 적용을 위해 애스팩트 객체에 연결한 상태 (컴파일 타임, 클래스 로드 타임, 런타임, 스프링 AOP는 런타임, 프록시 방식)

 - 컴파일 타임 : 컴파일 시점에 aspect가 삽입됨 (java >> .class로 변환될 때)

 - 클래스 로드 타임 : 컴파일 이후 메모리에 올라가는 시점에 AOP가 적용

* 위 두개는 aspectJ 를 활용할 때 사용 가능한 박식

 

 - 프록시 방식 = 런타임(실행중일때) : 스프링 컨테이너가 객체를 생성할 때 프록시 객체를 자동으로 생성하고 원본 객체 대신 프록시를 빈으로 등록 (스프링 컨테이너가 미리 생성)

 

6. AOP 프록시(proxy)

: AOP 기능 구현을 위해 만든 프록시 객체

: 스프링에서 AOP 프록시는 JDK 동적 프록시 또는 CGLIB 프록시

 

7. 타겟(Target)

: 핵심 기능을 담고 있는 모듈로 타겟은 부가 기능을 부여할 대상이 됨

: Advice를 받는 객체이고 포인트컷으로 결정됨

 

8. 어드바이저(Advisor)

: 하나의 어드바이스와 하나의 포인트컷으로 구성

: 스프링 AOP에서만 사용되는 특별한 용어

 

 

정리)

1. 조인 포인트는 클라이언트가 호출하는 모든 비즈니스 메서드

2. 포인트컷은 조인 포인트에서 특정 조건에 의해서 필터링 된 조인 포인트 (특정 메서드에서만 횡단 공통기능 수행을 위해서 사용함)

3. 어드바이스는 횡단 관심에 해당하는 공통 기능의 코드로 독립된 클래스의 메서드로 작성

4. 애스팩트는 어떤 포인트컷 메서드에서 어떤 어드바이스 메서드를 실행할지 (즉, 어디서 언제 실행할지)를 결정

5. 위빙은 포인트컷 지정 메서드 호출시 횡단 메서드가 삽입되는 과정을 말함