본문 바로가기

Web Application/Spring boot

[spring] Spring Boot - Aop개념 및 사용 방법

728x90
반응형
SMALL

AOP의 개념

AOP(Aspect-Oriented Programming)은 "관점 지향 프로그래밍"의 약자로,

객체지향프로그래밍에서 관심사의 분리를 통해 비즈니스 로직과 관련 없는 부가적인 기능들을 모듈화는 방식이다.

 

AOP는 프로그램의 모듈성, 유연성, 재사용성을 향상시킬 수 있으며, 비즈니스 로직과 부가 기능을 분리할 수 있어

코드의 가독성과 유지보수성을 향상시킬 수 있다.

 

대표적으로 Spring Framework에서 지원하며 로깅, 보안, 트랜잭션 처리 등에 활용할 수 있다.

 


AOP 사용하기

먼저, AOP를 사용하기 전에 관련 개념과 Annotation을 살펴보자.

JoinPoint Aspect가 적용될 수 있는 지점
Advice Aspect의 구현체로 JoinPoint에 적용되는 부가 기능을 구현
@Aspect 여러 객체에 공통적으로 적용되는 부가 기능을 구현한 모듈
@Pointcut Advice가 적용될 JoinPoint를 선택하는 패턴
@Before Joinpoint 앞에서 실행되며, 메소드 호출 전에 실행된다.
주로 메소드 호출 이전에 해야하는 작업이 있는 경우 사용한다.
@Around Joinpoint 전과 후에 실행되며, 메소드 호출 전/ 후에 실행된다.
메소드 호출 전과, 호출 후에 수행할 작업을 모두 포함하여 예외처리 기능등을 추가로 구현할 수 있다.
(메소드 호출전에 처리해야 할 작업이 없는 경우에는 @before를 사용하는 것보다 더 효율적이다.)
@After Joinpoint 후에 실행되며, 메소드 후에 실행된다.
주로 메소드 호출 이후에 해야하는 작업이 있는 경우 사용한다.
@AfterReturn 메소드 호출 이후 리턴값을 받은 후에 실행된다.
@AfterThrowing 메소드 호출 중 예외가 발생했을 때 실행된다.
@Order 실행 순서를 지정한다.

 

@Aspect
@Component
public class LoggingAspect {
    @Before("execution(* com.example.myapp.service.*.*(..))")
    public void logBefore(JoinPoint joinPoint) {
        //코드
    }
}

 

여기서 @Aspect는 LoggingAspect가 Aspect임을 나타낸다.

@Before는 logBefoe라는 Advice가 메소드 호출 전에 실행되도록 지정하는 어노테이션이다.

 

("execution(* com.example.myapp.service.*.*(..))") 는 Pointcut을 정의하는 것으로 logBefore가 실행되는 조건을 말하며,

여기서는 com.example.myapp.service에 속한 모든 메소드를 대상으로 한다는 것을 의미한다.

 

 

AOP 만들기

메소드를 호출할 때 공통 Map<String, Object>를 리턴할 수 있는 Aop를 만들어보자.

 

@Aspect
@Component
public class MapAspect {

    @Around("execution(* com.example.MyService.*(..))")
    public Object callMap(ProceedingJoinPoint joinPoint) throws Throwable {
    
    	Map<String, Object> params = new HashMap<String, Object>();
        params.put("idx", 1);
        params.put("data", "test");
        
        Object[] args = joinPoint.getArgs(); // 원래 메소드의 매개변수를 가져옴
        args[0] = params; // 첫 번째 매개변수를 변경
        Object returnValue = joinPoint.proceed(args); // 변경된 매개변수를 사용하여 원래 메소드 호출
        
        return returnValue;
    }
}

 

@Service
public class MyService {

    public Map<String,Object> getParmas(Map<String,Object> parmas) {
        return params;
    }
}

 

이렇게 하면 MyService에 있는 getParmas()의 return값은 aop에서 정의한 params 값이 된다.

 

 

728x90
반응형
LIST