각진 세상에 둥근 춤을 추자

[Spring] AOP 본문

Spring

[Spring] AOP

circle.j 2023. 1. 3. 17:00

1. 핵심기능과 부가기능

 

업무(Biz) 로직 = 핵심 기능(Core Concerns) + 부가 기능(Cross-cuttion Concerns)

 

  • 핵심 기능 = 사용자가 적용하고자 하는 핵심 비즈니스 로직
  • 부가 기능 = 핵심 로직을 실행하기 위해 행해지는 부가적인 로직 (데이터베이스 연결, 로깅, 파일 입출력 등)

 


2. AOP

 

AOP(Aspect Oriented Programming)는 여러 객체에서 공통으로 사용하는 기능(로직)을 분리해서 재사용성을 높이는 프로그래밍 기법

 

AOP의 주요 용어는 다음과 같다.

 


3. AOP 실습하기

 

(1) pom.xml

https://mvnrepository.com/artifact/org.aspectj/aspectjweaver/1.9.19

<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.9.19</version>
</dependency>

 

(2) 해당 프로젝트 - src/main/resources - application.xml 생성하기

<?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
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop
        https://www.springframework.org/schema/aop/spring-aop.xsd">
        

	<!-- 컴포넌트를 스프링 컨테이로 등록하기 위한 태그 선언 -->
    <context:component-scan base-package="kr.co.ch03"/>
	
	<!-- AOP 처리를 위한 태그선언 -->
	<aop:aspectj-autoproxy>
	</aop:aspectj-autoproxy>
    
	
</beans>

 

(3) Maven Project 생성하기

0123

 

(4) Service.java (핵심 기능)

package kr.co.ch03;
// 핵심기능 

import org.springframework.stereotype.Component;

// component 등록
@Component
public class Service {
	
	public void insert() {
		System.out.println("핵심관심 - insert...");
	}
	public void select() {
		System.out.println("핵심관심 - select...");
	}
	public void update() {
		System.out.println("핵심관심 - update...");
	}
	public void delete() {
		System.out.println("핵심관심 - delete...");
	}
	
}

 

(5) Advice.java (부가 기능)

package kr.co.ch03.sub1;
// 부가기능

import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class Advice {

	// pointcut 선언 (내용이 없는 메소드 선언)
	@Pointcut("execution(* kr.co.ch03..Service.*(..))")
	public void beforePointcut() {}
	
	@Pointcut("execution(* kr.co.ch03..Service.*(..))")
	public void afterPointcut() {}
	
	
	
	// before가 언제 weaving 되는지 정해주는 어노테이션
	@Before("beforePointcut()")
	public void before() {
		System.out.println("횡단관심 - before...");
	}
	
	// after가 언제 weaving 되는지 정해주는 어노테이션
	@After("afterPointcut()")
	public void after() {
		System.out.println("횡단관심 - after...");
	}
	
	
}

 

(6) AOPMain.java

package kr.co.ch03.sub1;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

/*
 * 
 * 스프링 AOP(Aspect Oriented Programming)
 * - AOP는 관점지향 프로그래밍으로 OOP(객체지향프로그래밍)로 독립적으로 분리하기 어려운 부가 로직을 모듈화하는 기법
 * - 핵심 관심과 전체에 적용되는 공통(횡단, 부가) 관심을 분리해 프로그래밍하는 방식
 * 
 * 주요 용어
 * 1) 조인포인트(JoinPoint)
 * 	- 실행하는 모든 핵심관심 메소드
 * 2) 포인트컷(PointCut)
 * 	- 조인포인트 가운데 실행(AOP가 설정)되는 핵심관심 메소드
 * 3) 어드바이스(Advice)
 * 	- 횡단관심에 해당하는 공통의 부가기능 메소드
 * 4) 애스펙트(Aspect)
 * 	- 포인트컷과 어드바이스의 결합된 모듈형태
 * 4) 위빙(Weaving)
 * 	- 포인트컷(핵심관심)이 실행될 때 어드바이스가 포인트컷에 결합되는 과정
 */
public class AOPMain {
	public static void main(String[] args) {
		
		ApplicationContext ctx = new GenericXmlApplicationContext("application.xml");
		
		Service service =  (Service) ctx.getBean("service");
		
		// joinpoint
		System.out.println("------------------------");
		service.insert();
		
		// joinpoint
		System.out.println("------------------------");
		service.select();
		
		// joinpoint
		System.out.println("------------------------");
		service.update();
		
		// joinpoint
		System.out.println("------------------------");
		service.delete();
				
		
		
	}
}