Programing/Springboot

SpringBoot AOP 활용 / 모든 응답 데이터에 접근

리커니 2021. 12. 15. 14:07
반응형

SpringBoot AOP 활용 / 모든 응답 데이터에 접근

 

이번 포스팅에서는 서버의 응답 데이터 접근하는 방법을 알아보겠습니다.

AOP 기능을 활용할건데요, AOP에 대한 설명은 아래의 링크를 확인하세요.

 

Link : https://aljjabaegi.tistory.com/278

 

AOP 설정을 활용한 세션체크 AOP Session Check

AOP 설정을 활용한 세션체크 AOP Session Check /****20170331 update ********/ 세션체크는 AOP를 활용한 방식보다는 Interceptor를 활용하는 방식을 추천합니다. Link : Spring Interceptor 활용 세션 설정 ajax..

aljjabaegi.tistory.com

 

간단하게 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에 저장 할 수 도 있습니다.

 

용도에 따라 비지니스 로직을 구현하시면 됩니다.

 

 

반응형