SpringBoot AOP 활용 / 모든 응답 데이터에 접근
SpringBoot AOP 활용 / 모든 응답 데이터에 접근
이번 포스팅에서는 서버의 응답 데이터 접근하는 방법을 알아보겠습니다.
AOP 기능을 활용할건데요, AOP에 대한 설명은 아래의 링크를 확인하세요.
Link : https://aljjabaegi.tistory.com/278
간단하게 AOP는 Aspect-Oriented Programming (관점지향 프로그래밍)의 약자로 모든 프로세스의 공통적인 전처리, 후처리 등에 활용합니다.
AOP는 Controller를 감싼 Proxy Pattern으로 동작하며 dispatcher-servlet 이후에 동작하기 때문에 Controller의 Request, Response, 파라메터, Spring bean에 접근 할 수 있습니다. ( dispatcher-serlvet 전에 동작하는 Filter와는 다름)
/*2022-05-02 추가*/
AOP 관련 용어 정리
Joinpoint : Advice를 적용 가능한 지점을 의미
Pointcut : Joinpoint의 부분 집합으로서 실제로 Advice가 적용되는 Joinpoint를 나타냄
Advice : 언제 공통 관심 기능을 핵심 로직에 적용할 지를 정의
Weaving : Advice를 핵심 로직 코드에 적용하는 것
Aspect : 여러 객체에 공통으로 적용되는 기능
Springboot에서 AOP를 활용하기 위해서는 spring-boot-starter-aop 를 의존성 주입해주어야 합니다.
implementation group: 'org.springframework.boot', name: 'spring-boot-starter-aop', version: '2.6.0'
최신버전 연결 링크 : https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-aop
이제 AOP 기능을 위한 클래스를 생성합니다.
의존성 주입에 제대로 되었다면, @Aspect 어노테이션을 활용할 수 있습니다.
그리고 @Component 를 사용하여 Spring bean에 등록해줍니다.
@Aspect
@Component
public class TestAOP {
}
이제 이 Aspect가 실행될 시점을 @Pointcut 어노테이션을 사용하여 설정해줍니다.
@Aspect
@Component
public class TestAOP {
@Pointcut("@annotation(org.springframework.web.bind.annotation.GetMapping)")
public void getMapping(){ }
}
위의 예시 코드의 경우 모든 GetMapping에 대해서 시점을 설정해 준 것 입니다.
@annotaion을 사용하지 않고 패키지명으로 설정할 수 도 있습니다.
이제 모든 GetMapping 에 대해서 AOP가 설정되었습니다. 이제 상세 설정입니다.
GetMapping된 메소드가 실행되기 전, 후, Exception 없이 실행된 후, Exception이 발생한 후,
그리고 앞에 말한 모든 시점을 관리할 수 있는 어노테이션이 있습니다.
@Before : 메소드 실행 전
@After : 메소드 실행 후
@AfterReturning : Exception 없이 메소드 실행 후
@AfterThrowing : Exception 이 발생 한 후
@Around : 모든 시점 관리
이번 예제에서는 Exception 이 없이 메소드가 실행되었을 때 전달되는 데이터에 접근해보겠습니다.
@AfterReturning 어노테이션을 사용합니다.
@Aspect
@Component
public class TestAOP {
@Pointcut("@annotation(org.springframework.web.bind.annotation.GetMapping)")
public void getMapping(){ }
@AfterReturning(pointcut = "GetMapping()", returning = "result")
public void afterReturning(JoinPoint joinPoint, Object result) {
Map<String, Object> returnMap = CmmnVar.GSON.fromJson(result.toString(), HashMap.class);
System.out.println(returnMap.toString());
}
}
모든 GetMapping된 메소드는 JSON 데이터를 리턴하게 되어있습니다.
GSON 라이브러리를 활용해 Object 객체를 맵으로 현변환 하였습니다.
콘솔을 확인해보면 전달되는 데이터가 출력되는 것을 확인할 수 있습니다.
이를 활용하여 리턴이 성공하였는지, 어떤 데이터를 리턴하였는지 체크를 할수 있고,
로그로 저장하거나 DB에 저장 할 수 도 있습니다.
용도에 따라 비지니스 로직을 구현하시면 됩니다.