웹 어플리케이션에서 클래스의 메서드마다 사소한 작업들을 일일이 코딩을 한다면 시간이 많이 걸릴 뿐더러 소스 코드도 복잡해지는데, 이는 유지보수의 문제가 발생할 수 있습니다. 이를 해결해주는 것이 바로 관점 지향 프로그래밍입니다.
1. 관점 지향 프로그래밍이란?
관점 지향 프로그래밍은 Aspect Oriented Programming으로 말 그대로 관점 지향 프로그래밍입니다. 줄여서 AOP는 클래스에 해당하는 주기능과 보조기능을 분리한 후 선택적으로 메서드에 적용해서 사용한다는 개념입니다.
AOP를 사용하면 여러 클래스에 공통된 기능들은 한 곳에 모아 관리할 수 있습니다. 이는 선택적으로 기능을 적용 할 수 있어 코드가 단순해지고 가독성이 올라가며, 유지관리에 용이합니다.
2. AOP 용어
AOP에는 여러가지 용어가 있습니다.
용어 |
설명 |
aspect |
구현하고자 하는 보조 기능을 의미합니다. |
advice |
aspect의 실제 구현체(클래스)를 의미합니다. 메서드 호출을 기준으로 여러 지점에서 실행됩니다. |
joinpoint |
advice를 적용하는 지점을 의미합니다. 스프링은 method 결합점만 제공합니다. |
pointcut |
advice가 적용되는 대상을 지정합니다. 패키지이름/클래스이름/메서드이름을 정규식으로 지정하여 사용합니다. |
target |
advice가 적용되는 클래스를 의미합니다. |
weaving |
advice를 주기능에 적용하는 것을 의미합니다. |
3. AOP 기능 추가
메이븐 레포지토리에 접속합니다.
아래 링크 있습니다.
검색창에 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 |
최근댓글