웹 어플리케이션에서 클래스의 메서드마다 사소한 작업들을 일일이 코딩을 한다면 시간이 많이 걸릴 뿐더러 소스 코드도 복잡해지는데, 이는 유지보수의 문제가 발생할 수 있습니다. 이를 해결해주는 것이 바로 관점 지향 프로그래밍입니다.

 

1. 관점 지향 프로그래밍이란?

 

관점 지향 프로그래밍은 Aspect Oriented Programming으로 말 그대로 관점 지향 프로그래밍입니다. 줄여서 AOP는 클래스에 해당하는 주기능과 보조기능을 분리한 후 선택적으로 메서드에 적용해서 사용한다는 개념입니다.

AOP를 사용하면 여러 클래스에 공통된 기능들은 한 곳에 모아 관리할 수 있습니다. 이는 선택적으로 기능을 적용 할 수 있어 코드가 단순해지고 가독성이 올라가며, 유지관리에 용이합니다.

 

2. AOP 용어

 

AOP에는 여러가지 용어가 있습니다.

용어

설명

aspect

구현하고자 하는 보조 기능을 의미합니다.

advice

aspect의 실제 구현체(클래스)를 의미합니다. 메서드 호출을 기준으로 여러 지점에서 실행됩니다.

joinpoint

advice를 적용하는 지점을 의미합니다. 스프링은 method 결합점만 제공합니다.

pointcut

advice가 적용되는 대상을 지정합니다. 패키지이름/클래스이름/메서드이름을 정규식으로 지정하여 사용합니다.

target

advice가 적용되는 클래스를 의미합니다.

weaving

advice를 주기능에 적용하는 것을 의미합니다.

 

3. AOP 기능  추가

 

 

메이븐 레포지토리에 접속합니다.

 

아래 링크 있습니다.

 

https://mvnrepository.com/

 

Maven Repository: Search/Browse/Explore

org.wso2.carbon.identity.notification.mgt provides the management functionality for notifications Last Release on Aug 12, 2020

mvnrepository.com

 

 

검색창에 aspectj weaver를 검색한 후 빨간 박스를 클릭합니다.

 

 

빨간 박스 부분을 복사해서 pom.xml에 붙여넣기 해줍니다.

 

 

pom.xml의 dependencies태그 안에 붙여넣기 해주어야 업데이트가 되면서 maven dependencies에 추가가 됩니다.

 

4. AOP JointPoint 동작, Advice 객체 설정

 

 1) Before

 

 - before

   before는 비즈니스 메소드를 수행하기 전에 수행하는 어드바이스입니다.

<context:component-scan base-package="com.spring.biz"></context:component-scan>

<!-- AOP 설정(xmlns:aop 추가) -->
<!-- Before : 어드바이스 동작시점 before에 적용할 어드바이스 객체 생성 -->
<bean id="before" class="com.spring.biz.common.BeforeAdvice" />
<aop:config>
	<!-- 대상 설정(포인트컷) -->
    <aop:pointcut id="allPointcut" expression="execution(* com.spring.biz..*Impl.*(..))" />
    <aop:pointcut id="getPointcut" expression="execution(* com.spring.biz..*Impl.get*(..))" />

    <!-- 작업설정(연결) -->
    <aop:aspect ref="before">
    	<aop:before pointcut-ref="getPointcut" method="beforeLog"/>
    </aop:aspect>
</aop:config>

처음 빈(bean)으로 before라는 id에 적용 할 어드바이스 객체를 생성하고 포인트컷으로 대상을 설정합니다. 뒤에 expression은 실행 할 패키지, 클래스, 메소드, 파라미터를 설정 할 수 있습니다.

aop:aspect를 통해 연결할 id를 설정하고 aop:before를 통해 설정 할 포인트 컷 id와 설정된 클래스의 메소드를 설정합니다.

 

 2) After

 

 - after

 after는 정상 수행이든, 예외가 발생하든 상관없이 메소드 실행 후 수행하는 어드바이스입니다.

<!-- 작업설정(연결) -->
<aop:aspect ref="afterReturn">
    <!-- 핵심관심 메소드 정상실행 후 afterReturnLog 메소드 실행 -->
    <aop:after-returning pointcut-ref="allPointcut" method="afterReturnLog"/>
</aop:aspect>

aop:after태그에 참조할 포인트컷 id, 포인트컷id에 해당하는 클래스의 메소드를 지정합니다.

 

 - returning

 returning은 정상 실행 후에만 수행하는 어드바이스입니다.

<!-- 작업설정(연결) -->
<aop:aspect ref="afterReturn">
    <!-- 핵심관심 메소드 정상실행 후 afterReturnLog 메소드 실행 -->
    <aop:after-returning pointcut-ref="allPointcut" method="afterReturnLog"/>
</aop:aspect>

aop:after-returning태그에 참조할 포인트컷 id, 포인트컷id에 해당하는 클래스의 메소드를 지정합니다.

 

 - throwing

 throwing는 예외발생시 수행하는 어드바이스입니다.

<aop:aspect ref="afterThrowing">
    <!-- 핵심관심 메소드 예외발생시 exceptionLog 메소드 실행 -->
    <aop:after-throwing pointcut-ref="allPointcut" method="exceptionLog"/>
</aop:aspect>

aop:after-throwing태그에 참조할 포인트컷 id, 포인트컷id에 해당하는 클래스의 메소드를 지정합니다.

 

 

출처 : 자바 웹을 다루는 기술

'코딩 > Spring' 카테고리의 다른 글

Spring 스프링을 사용하는 이유  (0) 2020.08.20
Spring Lombok  (0) 2020.08.18
Spring AOP 관점 지향 프로그래밍 Annotation  (0) 2020.08.14
Spring 의존성 주입(Dependency Injection)  (0) 2020.08.12
Spring context:component-scan  (0) 2020.08.11
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기