2020. 9. 24. 13:07ㆍ개발공부/Spring
Interface를 활용한 자동 메서드 실행 1편에서 Java 클래스와 Interface를 사용해 직접 구현해봤습니다. 이번 시간은 스프링에 있는 자동화 기능을 사용해 구현해보겠습니다. 우선 이런 기능은 AOP라고 통용됩니다.
AOP(Aspect-Oriented Programming) : 관점 지향 프로그래밍이란?
AOP는 스프링 기본 개념 DI, IoC과 더불어 중요합니다. 이름이 '관점 지향'이라 왠 관점이냐 라는 거부감이 듭니다. 하지만 전혀 어렵지 않습니다. 은행 웹사이트 기능을 예시로 들어보겠습니다. 방문자(Client)는 계좌이체나 예적금 상품가입 혹은 계좌개설 등 목적을 수행하기 위해 웹사이트를 방문했을 것입니다. 계좌이체, 예적금 상품가입, 계좌개설의 핵심 기능은 행위 목적 그대로 각기 다릅니다. 그러나 방문자 관점에서 공통 기능은 '로그인'을 해야하는 것입니다.
즉, 'transferAccount' , 'addAccount', 'openAccount' 메서드는 핵심 기능이며 'login' 메서드는 공통 기능입니다. 그리고 'login'은 핵심 메서드 사전에 실행돼야 하는 전제조건이 있습니다. 그럼 각각의 메서드 앞에 일일이 'login' 메서드를 코딩해줘야 할까요?
스프링은 이러한 일들을 자동으로 처리해주는 기능이 있습니다. 그것이 바로 AOP, 관점 지향 프로그래밍 입니다.
AOP 설정 방법(아노테이션@ vs XML.xml)
AOP 설정 방법은 2가지가 있습니다. @으로 선언하는 아노테이션과 JSTL로 선언하는 XML 파일 방식이죠. 이해를 돕기 위해 예제를 통해 알아보겠습니다. 예제는 lee 라는 남자아이와 park 라는 여자아이가 있습니다. 둘은 '집에서 라면을 끓이거나 김치찌개를 끓이는' 역할을 합니다.(lee - 라면, park - 김치찌개) 그리고 이런 역할의 메서드는 'runSomething'이란 이름을 붙이겠습니다. 이것이 바로 핵심 기능(메서드) 입니다. 사람의 개성이기 때문이죠. 하지만 둘의 공통점은 '존재한다'라는 사실입니다. 공통 기능은 핵심 메서드가 끝난 뒤 붙여주겠습니다. 이렇듯 스프링의 AOP 기능은 공통 메서드가 들어갈 위치도 정해줄 수 있습니다.
1) 예제 - 아노테이션 @ 설정 방식
클래스에 @Aspect, 공통 메서드 'after' 매개변수에 JoinPoint 객체를, 그리고 @After 아노테이션을 붙여주었습니다. 저에게 주어진 시간이 유한하며 저는 아주 부지런한 사람이 아니기 때문에 모든 케이스를 설명하진 않겠습니다. @Aspect는 공통 메서드가 있는 클래스가 여깄다! 라고 스프링에 외쳐주는 기능을 합니다. @After는 공통 메서드가 핵심 메서드가 '실행 전' 또는 '실행 후' 어떤 시점에 주입할 것인지 명시해줍니다. 마지막으로 Joinpoint는 핵심 메서드가 무엇인지 스프링에게 알려주는 역할을 합니다. 그리고 @After("execution...") 괄호 내 syntax가 바로 핵심 메서드 위치입니다. 약속된 형식으로 적어줘야 되는 것이 포인트 입니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
package aop002;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
@Aspect //이 클래스는 AOP에서 사용할 관점(횡단관심기능이 들어 있다.)
public class MyAspect {
// @After("execution(public void aop002.Boy.runSomething()) ||"
// + "execution(public void aop002.Girl.runSomething())")
@After("execution(public void aop002.*.runSomething())") //Pointcut
/*
* execution() 표현식
* public void aop002.Boy.runSomething() 해당 메서드 동작 시점을 기준으로 설정
*/
public void after(JoinPoint joinPoint) {
/*
* JoinPoint는 공통기능이 실행되는 시점(메서드)를 참조하는 변수
* @Before에서 execution으로 선언된 메서드(runSomething() 메서드)
*/
System.out.println("존재한다.");
}
}
|
cs |
2) 예제 - XML .xml 설정 방식
앞서 설명한 내용과 동일하지만 표기법만 다릅니다. 1번 예제를 잘 읽어보시면 코드만 봐도 저놈이 이놈이구나 하고 바로 알아챌 수 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd"> <aop:aspectj-autoproxy/> <bean id = "myAspect" class="aop003.MyAspect"/> <bean id = "boy" class="aop003.Boy"/> <aop:config> <aop:aspect ref="myAspect"> <!-- == @Aspect --> <aop:before method="before" pointcut="execution(* runSomething())"/> </aop:aspect> </aop:config> </beans> | cs |
'개발공부 > Spring' 카테고리의 다른 글
[Spring] AOP ④ - (예제) HashMap으로 Cache 기능구현 (0) | 2020.09.30 |
---|---|
[Spring] AOP ③ - @Pointcut, @Around... (0) | 2020.09.24 |
[Spring] Interface를 활용한 자동 메서드 실행 ① (0) | 2020.09.22 |
[Spring] bean 객체의 생애 (0) | 2020.09.22 |
[Spring 재수강] - Maven Project로 Member 관리 시스템 만들기 (1) (2) | 2020.09.15 |