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
'Web Application > Spring boot' 카테고리의 다른 글
| [Spring] spring boot에서 MySQL 연결 - 스프링부트에서 JPA를 사용하는 방법 및 간단한 기능 구현 (0) | 2023.04.14 |
|---|---|
| [spring] Spring Boot(스프링부트) - sftp를 사용하여 원격서버 파일 다운로드 받는 방법 (0) | 2023.04.07 |
| [spring] ERROR - MyBatis Invalid bound statement (not found) 오류 (0) | 2023.04.06 |
| [spring] 간편결제 - 카카오페이(kakao pay) 결제 api (1) - 결제취소 기능 구현 (0) | 2023.04.01 |
| [spring] Spring Security + JWT로 로그인 구현하기(2) - 구글 api로 로그인 기능 구현 (0) | 2023.03.31 |