728x90
반응형
SMALL
안녕하세요! 프뚜입니다.
Spring에서 AOP(Aspect Oriented Programming)을 사용하려고 합니다.
[개발 환경]
- OS: Windows 10 64bit
- JAVA: 1.8
# build.gradle 추가하기
// 2022.12.16[프뚜]: AOP
implementation 'org.springframework.boot:spring-boot-starter-aop'
# AOPConfig 설정하기
@Component
@Aspect
public class AOPConfig {
// 2022.12.15[프뚜]: @Before(이전) > 어드바이스 타겟 메소드가 호출되기 전에 어드바이스 기능을 수행
// 2022.12.15[프뚜]: @After(이후) > 타겟 메소드의 결과에 관계없이(즉 성공, 예외 관계없이) 타겟 메소드가 완료 되면 어드바이스 기능을 수행
// 2022.12.15[프뚜]: @AfterReturning(정상적 반환 이후) > 타겟 메소드가 성공적으로 결과값을 반환 후에 어드바이스 기능을 수행
// 2022.12.15[프뚜]: @AfterThrowing(예외 발생 이후) > 타겟 메소드가 수행 중 예외를 던지게 되면 어드바이스 기능을 수행
// 2022.12.15[프뚜]: @Around(메소드 실행 전후) > 어드바이스가 타겟 메소드를 감싸서 타겟 메소드 호출전과 후에 어드바이스 기능을 수행
@Around("@annotation(org.springframework.web.bind.annotation.GetMapping)")
public Object getAround(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("[LOG] > getAround method start");
// 2022.12.15[프뚜]: 메서드 실행
Object retVal = pjp.proceed();
System.out.println("[LOG] > getAround method end");
return retVal;
}
@Around("@annotation(org.springframework.web.bind.annotation.PostMapping)")
public Object postAround(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("[LOG] > postAround method start");
// 2022.12.15[프뚜]: 클라이언트에서 받아온 파라미터
Object[] objects = pjp.getArgs();
Map param = (Map) objects[0];
System.out.println("[LOG] > param check : " + param);
// 2022.12.15[프뚜]: 클라이언트에서 받아온 파라미터에 값 추가
param.put("birth", "0801");
// 2022.12.15[프뚜]: 메서드 실행
Object retVal = pjp.proceed();
// 2022.12.15[프뚜]: 메서드에서 받아온 파라미터에 값 추가
Map result = (Map) retVal;
result.put("hobby", "coding");
System.out.println("[LOG] > param add : " + param);
System.out.println("[LOG] > postAround method start");
return retVal;
}
}
# Test Controller 만들기
@RequiredArgsConstructor
@RestController
public class TestController {
@GetMapping("/")
public String main() throws Exception {
System.out.println("[LOG] > main method");
return "main";
}
@PostMapping("/check")
public Map check(@RequestBody Map param) throws Exception {
System.out.println("[LOG] > check method");
System.out.println("[LOG] > param check : " + param);
return param;
}
}
# 실행 결과 확인하기
/main (GET) URI에 요청을 보냅니다.
getAround 메서드에 정상적으로 끼어들기가 되었습니다.
/check (POST) URI에 body 값을 추가하고 요청을 보냅니다.
postAround 메서드에 정상적으로 끼어들기가 되었습니다.
자세한 내용은 소스코드를 통해 확인해보실 수 있습니다. (제목과 Git Comment는 같습니다.)
728x90
반응형
LIST
'프로그램 > JAVA' 카테고리의 다른 글
[Regex] JAVA replace 정규 문자 변경하기 (2) | 2023.01.05 |
---|---|
[Regex] JAVA 정규식표현 사용하기 (0) | 2023.01.04 |
[JWT] Spring Interceptor 세팅 및 사용하기 (2) | 2022.12.28 |
[JAVA] SpringBoot에서 JWT 설정 및 사용하기 (JJWT) (2) | 2022.12.27 |
[SpringBoot] Redis에서 keys VS scan 사용하기 (keys 대신 scan) (3) | 2022.12.05 |