Spring - AOP(1) (Aspect Oriented Programming) 관점 지향 프로그래밍 개념

kimseyoung·2022년 12월 23일
0

Spring

목록 보기
1/4

AOP 기본

AOP(Aspect Oriented Programming, 관점 지향 프로그래밍)는 Spring에서 제공하는 핵심기능 DI(Dependency Injection, 의존성 주입) 과 IoC(Inversion of Control, 제어 역전) 과 함께 핵심 중 하나이다.

AOP는 기존의 OOP(Object Oriented Programming, 객체 지향 프로그래밍) 가 객체를 쪼갤수 있는 모듈을 기준으로 프로그램을 설계했다면, AOP는 관점을 기준으로 프로그램을 설계한다.

AOP는 OOP와 경쟁하는 것이 아닌, OOP를 보완하는 개념이라는 것이 중요한 핵심이다.

OOP는 중요한 비즈니스 로직을 모듈화 하는데에 초점이 맞춰져 있고, AOP는 중요한 비즈니스 로직이 아닌, 어플리케이션 전체에 중복된 코드 또는 부가기능들을 모듈화 하기위한 수단이 될 수 있다.
( ex> 트랜잭션, 로깅 등 애플리케이션 전체에 공통으로 쓰이는 부가기능 모듈들)

AOP는 애플리케이션에서 코드가 중복되고 강력하게 결합되어 다른 로직과 분리할 수 없는 애플리케이션 로직을 가르키는 '횡단 관심사' 를 모듈화 하는것이 목적이다. ( ex> 위 예제에서 얘기한 트랜잭션, 로깅은 강력하게 결합되어있다. (거의 모든 소스코드에 로깅은 존재하며, DB와 통신할때는 트랜잭션을 반드시 사용하게 된다.)

횡단 관심사를 추출하는 AOP의 방법


다음 그림은 핵심 비즈니스 로직을 분리하는 OOP의 관점에서 설계된 애플리케이션 예제이다. 이 때, 관점을 바꿔보자는 것이 AOP의 중점이다. 다음 그림을 통해 이해가 더욱 잘 될것이다.


다음과 같이 모든 서비스 로직에 공통적으로 들어간, 즉 애플리케이션을 가로지르는, 횡단하는 공통 로직을 횡단 관심이라고 부르면 된다. 예를 들어 로깅은 모든 소스코드에 들어가야할 공통 로직이지 않은가? 모든 서비스에 로그를 기록하는 코딩을 일일히 하지 않도록 하는것, 그것이 AOP 이다.

AOP 기초 용어

다음은 AOP의 기초 용어 및 설명을 나열 하였다.

용어설명
타겟(Target)부가기능을 또는 관점을 삽입할 대상을 얘기한다. 위의 그림을 예로 들면, Function1을 삽입하는 Service A,B,C를 타겟이라고 얘기한다.
애스펙트(Aspect)OOP에서 모듈을 오브젝트라고 부르는 것과 유사하게 Function1 같은 부가기능 모듈을 애스펙트라고 부르며, 핵심기능에 부가되어 의미를 갖는 특별한 모듈 이라고 생각하면 된다. Aspect에는 아래에서 설명할 부가될 기능을 정의하는 어드바이스와 어드바이스를 어디에 적용할지 결정하는 포인트컷을 함께 가지고 있는 개념이다.
어드바이스(Advice)실질적으로 부가기능을 담은 구현체를 의미한다. 어드바이스의 경우 타겟 오브젝트에 종속되지 않기 때문에 순수하게 부가기능에만 집중 할 수 있다. 어드바이스는 Aspect가 '무엇'을 '언제' 할지를 정의한다.
포인트컷(PointCut)부가기능이 적용될 대상(메소드)를 선정하는 방법을 의미한다. 즉, 어드바이스를 적용할 조인포인트(하단 참조)를 선별하는 기능을 정의하는 모듈을 의미한다.
조인포인트(Joinpoint)어드바이스가 적용될 수 있는 위치를 의미한다. 다른 AOP 프레임워크와 달리 Spring은 후에 설명하겠지만, 동적 AOP를 지향하고 있으므로, 메소드 조인포인트만 제공하고 있다. 따라서 Spring 내에서는 조인포인트라 하면 메소드를 가리킨다고 생각해도 된다.
프록시(Proxy)타겟을 감싸서 타겟의 요청을 대신 받아주는 래핑(Wrapping)오브젝트 이다. 동적 AOP의 특징이며, 호출자 에서 타겟을 호출하게 되면, 타겟이 아닌 타겟을 감싸고 있는 프록시가 호출되어, 타겟 메소드 실행전에 선철, 타겟 메소드 실행 후, 후처리를 실행시키도록 되어있다.
위빙(Weaving)위빙은 애플리케이션 코드의 적절한 위치에 Aspect를 삽입하는 과정을 의미한다. 동적 AOP와 반대되는 정적 AOP의 경우 컴파일 시점 AOP 솔루션에서는 일반적으로 위빙이 빌드 시점에 수행되고, 동적 AOP 런타임 AOP 솔루션에서는 위빙 과정이 런타임에 동적으로 실행된다.
인트로덕션(Introduction)인트로덕션은 타겟 클래스에 코드 변경없이 신규 메소드나 멤버 변수를 추가하는 기능을 의미한다. 인트로덕션을 이용하면, 명시적으로 특정 인터페이스를 구현하지 않아도 모든 객체가 해당 인터페이스를 구현할 수 있게 된다.

동적? 정적? AOP

동적 AOP와 정적 AOP를 쉽게 설명하자면, C++와 Python의 차이와 같다. C++는 컴파일 언어로서 정적 언어라 할 수 있고, Python은 인터프리터 언어로서 동적 언어의 특성을 가진다. 마찬가지로 정적 AOP는 위빙(Weaving)을 빌드 또는 컴파일 프로세스에서 적용하고, 동적 AOP는 런타임에 동적으로 위빙 프로세스가 수행된다.

Spring은 기본적으로 동적 AOP만을 지원한다. 그래서 정적 AOP보다 느릴 수가 있다. (C++보다 파이썬이 느리듯이) 기능적 문제로 정적 AOP를 사용하고자 한다면, AspectJ를 사용하면 된다. (추후 설명)

profile
Back-end Developer, DevOps Engineer

0개의 댓글

관련 채용 정보