spring 스프링 AOP

박예린·2023년 2월 23일

스프링 AOP(Aspect Oriented Programming)

관점 지향 프로그래밍

관점 지향은 쉽게 말해 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어 보고 그 관점을 기준으로 각각 모듈화(하나의 단위로 묶음)하겠다는 것

예를 들어 햑심적인 관점은 결국 우리가 적용하고자 하는 핵심 비즈니스 로직이 됨. 또한 부가적인 관점은 핵심 로직을 실행하기 위해서 행해지는 데이터베이스 연결, 로깅, 파일 입출력 등이 있음

Aspect로 모듈화하고 핵심적인 비즈니스 로직에서 분리하여 재사용하겠다는 것이 AOP의 목적

AOP 주요 개념

  • Aspect : 흩어진 관심사를 모듈화 한 것, 주로 부가기능을 모듈화 함
  • Target : Aspect를 적용하는 곳(클래스, 메소드...)
  • Advice : 실질적으로 어떤 일을 해야할 지에 대한 것, 실질적인 부가기능을 담은 구현체
  • JointPoint : Advice가 적용될 위치, 끼어들 수 있는 지점, 메소드 진입 지점, 생성자 호출 시점, 필드에서 값을 꺼내올 때 등 다양한 시점에 적용 가능
  • Pointcut : JointPoint의 상세한 스펙을 정의한 것

@AOP

스프링 @AOP를 사용하기 위해서는 다음과 같은 의존성 추가가 필요함

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

AOP 간단 예제

logger

앞에 올린 게시판 구현 프로젝트에 이어서 aop 추가함

package mul.cam.a.aop;

import java.util.Date;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;

/*
 * AOP(Aspect Oriented Programming) : 관점지향
 * 목적 : 감시자
 */

@Aspect
public class AopProc {
	
	//log,session검사
	//controller패키지 안에 있는 모든 프로젝트와 함께함
	@Around("within(mul.cam.a.controller.*) or within(mul.cam.a.dao.*.*)")
	public Object loggerAop(ProceedingJoinPoint joinpoint) throws Throwable{
		//logger - 신호를 받고
		String signatureStr = joinpoint.getSignature().toShortString();
		
		try {
			Object obj = joinpoint.proceed(); //실행시 controller진입
			System.out.println("AOP log:" + signatureStr + "메소드 실행" + new Date());
			
			return obj;
		}finally {
			//System.out.println("실행 후 : " + System.currentTimeMillis());
		}
	}
}
profile
개발자를 꿈꾸는 귀여운 나

0개의 댓글