Aspect Oriented Programming = AOP
AOP는 문제를 바라보는 관점을 기준으로 프로그래밍하는 기법이다. AOP는 문제를 해결하기 위한 핵심 관심 사항과 전체에 적용되는 공통 관심 사항을 기준으로 프로그래밍 함으로써 공통 모듈을 여러 코드에 쉽게 적용할 수 있게 도와준다
AOP를 구현하는 다양한 방법이 존재하지만, 기본적인 개념은 공통 관심 사항을 구현한 코드를 핵심 로직을 구현한 코드 안에 삽입하는것이다.
AOP란 쉽게 말해 핵심 로직을 구현할때 계속 반복적으로 쓰는 공통 코드를 조금더 쉽게 줄여서 가져다 쓰기위해 만들어 진 기능이다.

AOP 기법에서는 핵심 로직을 구현한 코드에서 공통 기능을 직접적으로 호출하지 않는다. 핵심 로직을 구현한 코드를 컴파일 하거나 , 컴파일 된 클래스를 로딩하거나, 로딩한 클래스의 객체를 생성할 때 AOP가 적용되어 핵심 로직 구현 코드안에 공통 기능이 삽입된다.
AOP프로그래밍에선 AOP라이브러리가 공통 기능을 알맞게 삽입해주기 때문에, 개발자는 게시글 쓰기나 목록 읽기와 같은 핵심 로직을 구현할 때 트랜잭션 적용이나 보안 검사와 같은 공통적으로 사용하는 기능을 처리하기 위한 코드를 핵심로직에 삽입할 필요가 없다, 핵심 로직을 구현한 코드에 공통 기능 관련 코드가 포함되어 있지 않으므로 적용해야할 공통 기능이 변경되더라도 핵심 로직 구현 코드를 변경할 필요가 없다. ( 공통 기능 코드만 변경한뒤 핵심 로직 구현 코드에 적용만 하면된다)
AOP는 다양한 용어를 소개하고 있다.
AOP의 주요 용어

Advice를 Weaving하는 방식에는 세 가지의 방식이 존재
- 컴파일 시에 Weaving
- 클래스 로딩 시에 Weaving
- 런타임 시 Weaving
컴파일 시에 코드를 삽입하는 방법은 AspectJ에서 사용하는 방식으로써 컴파일 방식에서는 핵심 로직을 구현한 자바 소스 코드를 컴파일 할 때 알맞은 위치에 공통 코드를 삽입하면, 컴파일 결과 AOP가 적용된 클래스 파일이 생성된다.
클래스를 로딩시에 AOP라이브러리는 JVM이 클래스를 로딩할 때 클래스 정보를 변경할 수 있는 에이전트를 제공
에이전트는 로딩한 클래스의 바이너리 정보를 변경하여 알맞은 위치에 공통 코드를 삽입한 새로운 클래스 바이너리 코드를 사용하도록 한다. ( 원본 클래스 파일은 변경하지 않고 클래스를 로딩할 때에 JVM이 변경된 바이트 코드를 사용하도록 함으로 AOP를 적용한다 AspectJ는 컴파일 방식과 더불어 클래스 로딩방식을 함께 지원한다.)
런타임 시에 AOP를 적용할 때 소스 코드나 클래스 정보 자체를 변경하지 않는다. 대신 프록시(PROXY)를 이용하여 AOP를 적용한다 프록시 기반의 AOP는 핵심 로직을 구현한 객체에 직접 접근하는 것이 아니고 중간에 프록시를 생성해서 프록시를 통해 핵심로직을 구현한 객체에 접근한다.

스프링은 세 가지 방식으로 AOP를 구현할 수 있도록 하고 있다.
- XML 스키마 기반의 POJO 클래스를 이용한 AOP
- AspectJ에서 정의한 @(어노텐션)@Aspect을 이용한 AOP
- 스프링 API를 이용한 AOP
XML 스키마 기반의 AOP

JoinPoint에서 실행될 공통 기능인 trace()메서드를 구현 trace()메서드는 ProceedingJoinPoint 타입의 joinPoint 파라미터를 전달 받는데 해당 파라미터를 이용해 Around Advice에 맞는 공통 기능을 구현할 수있게 된다.(XML에 Aspect설정)
우선 공통 기능을 제공할 클래스를 빈으로 등록 해주어야 한다.
<bean id="profiler" class="aop.Profiler"/>
Aspect설정 : Advice를 어떤 Pointcut에 적용할지
<aop:config>
<aop:aspect id="traceAspect" ref="profiler">
<aop:pointcut id="publicMethod" expression="execution(public * chap..*(..))"/> <!-- chap에 있는 모든 하위폴더 -->
<aop:around pointcut-ref="publicMethod" method="trace"/>
</aop:aspect>
</aop:config>
----------
공통 기능을 적용하기 위해 profiler이란 이름으로 클래스를 빈으로 등록해주고
또한 XML 스키마를 이용해서 AOP를 구현하기 위해 aop 네임스페이스를 추가해주어야한다.
추가가된 이후 aop:config aop:aspect aop:pointcut aop:around 태그를 이용해 AOP설정을 할수 있다.
그렇게되면 공통로직을 사용할수 있는 상태가되며 public 메서드가 호출이 되면 profiler클래스의 trace()메서드가 Around Advice로 적용된다.

XML 스키마로 설정한 정보를 받아서 getBean으로 WriteArticleService 에 리턴한다.
WriteArticleService빈의 write()메서드를 호출한다 MemberService도 동일.

<aop:cofig> : AOP 설정 정보임을나타낸다.
<aop:aspect> Aspect를 설정한다.
<aop:pointcout> : pointcut를 설정한다.
<aop:around> : around Advice를 설정한다 이외에도 다양한 Advice를 설정할 수있다.
@Aspect 어노텐션 기반 AOP 퀵 스타트
aop 스키마가 XML 설정을 이용해서 Advice, Pointcut 등을 설정하는 방식이라면, @Aspect어노텐션 자바 코드에서 AOP를 설정하는 방식이다. @Aspect 어노텐션을 이용해서 AOP를 구현하는 과정은 XML 스키마 기반의 AOP를 구현하는 방식과 거의 유사하다 차이점은
- @Aspect 어노텐션을 이용해 Aspcet 클래스를 구현한다 Aspect 클래스는 Advice를 구현한 메서드와 Pointcut를 포함한다.
- XML 설정에 <aop:aspectj-autoproxy />를 설정한다 @Configuration 기반 자바 설정을 이용한다면 @EnableAspectJAutoProxy를 설정한다
@Aspect 어노텐션을 이용할 경우 XML 설정 파일에서 Pointcut을 설정하는 것이아닌 import 를통해 사용한다.

XML에서 <aop:config> 태그를통해 AOP가 사용되었다면, 어노텐션을 사용하면.

이 클래스는 @Aspect를 나타내고
@Pointcut를통해 폴더 대상지점을 잡아주고
@Around를 통해 잡힌 지접에서 사용하기 위한 공통로직을 만들어준다.
출력결과는 위 이미지 파일과 동일
execution 명시자

'Java > SPRING' 카테고리의 다른 글
스프링 [Spirng] ViewResolver 인터페이스란 (0) | 2022.01.15 |
---|---|
스프링 [Spirng] MVC패턴에 대한 개념 및 용어 설정에 대한 정리. (0) | 2022.01.12 |
스프링 [Spirng] Environment를 이용한 프로퍼티 란 (0) | 2022.01.11 |
스프링 [Spirng] 빈 생명주기 (빈 라이프사이클, 빈 범위)란 (0) | 2022.01.10 |
스프링 [Spirng] DI(Dependency Injection) 의존성 주입이란 (0) | 2022.01.05 |