스프링/Core

스프링 AOP-기본 개념

maeng0830 2023. 10. 18. 20:05

핵심 기능과 부가 기능

어플리이케이션의 기능은 크게 핵심 기능과 부가 기능으로 구분할 수 있다.

핵심 기능은 특정 객체가 제공하는 고유의 기능이라고 할 수 있다.

그리고 부가 기능은 핵심 기능을 보조하기 위해 제공되는 기능이다. 부가 기능은 단독으로 사용되지 않으며 핵심 기능과 함께 사용된다.

 

횡단 관심사(cross-cutting concerns)

일반적으로 부가 기능은 다양한 클래스에 대해 사용된다. 그리고 부가 기능은 황단 관심사(cross-cutting concerns)가 된다.

하나의 부가 기능이 여러 곳에 동일하게 사용된다는 것이다.

 

부가 기능 적용 문제

부가 기능을 여러 곳에 적용하는 것은 객체 지향 프로그래밍 방식으로는 번거로운 부분이 많다.

 

우선 부가 기능을 적용하고자 하는 클래스에 대해 모두 동일한 코드를 작성해줘야한다. 많은 반복 작업이 필요하고, 많은 중복 코드를 만들어 낸다.

 

이 처럼 부가 기능을 처음 적용할 때도 매우 번거롭지만, 수정 시에는 더 번거로울 수 있다.

부가 기능에 수정 사항이 있으면, 부가 기능이 작성된 부분을 하나씩 모두 수정해줘야한다. 부가 기능을 적용하고자 하는 대상이 변경될 때도 마찬가지이다. 

 

AOP(Aspect-Oriented Programming)

Aspect

이러한 부가 기능 적용의 문제를 해결하기 위한 노력이 이어졌다.

 

부가 기능을 핵심 기능에서 분리하여 한 곳에서 관리하도록 하였다.

그리고 부가 기능과 적용 위치 판단 기능을 통합하여 하나의 모듈로 만들었다. 이 모듈이 aspect이다.

 

즉 aspect는 부가 기능과, 해당 부가 기능이 적용될 위치를 정의한 것이라고 할 수 있다.

@AspectAdvisor가 바로 하나의  aspect들이다.

 

aspect는 우리말로 관점이라고 해석되며,

aspect를 사용한 프로그래밍 방식을 관점 지향 프로그래밍(AOP: Aspect-Oriented Programming)이라고 부른다.

 

AOP는 OOP를 대체하기 위한 것이 아니다.

횡단 관심사, 즉 부가 기능 적용의 문제를 깔끔하게 해결하기 어려운 OOP를 보조하기 위해 사용된다.

 

AOP 적용 시점

AOP가 적용되는 시점은 컴파일 시점, 클래스 로딩 시점, 런타임 시점(프록시)으로 구분할 수 있다.

 

컴파일 시점

AspectJ가 제공하는 특별한 컴파일러를 사용하는 적용 방법이다.

자바 소스 코드(.java)를 자바 바이트 코드(.class)로 컴파일하는 시점에 부가 기능 로직을 추가해버린다.

 

클래스 로딩 시점

클래스 로더 조작기를 통해 적용하는 방법이다.

컴파일 된 자바 바이트 코드(.class)가 JVM 내부 클래스 로더에 보관되기 전에 부가 기능 로직을 추가해버린다.

 

런타임 시점

프록시를 통해 적용하는 방법이다.

런타임 시점은 컴파일, 클래스 로더 작업이 완료되어 자바의 main()이 실행된 이 후를 의미한다.

 

스프링 어플리케이션은 컨테이너와 DI, 동적 프록시 기술, 빈 후처리기 등의 기능을 조합하여 빈으로 등록될 대상 객체의 프록시 객체를 생성해낸다. 그리고 대상 객체 대신 프록시 객체를 빈으로 등록해 AOP를 구현한다.

 

이것이 스프링 AOP 기술이다.