프로그램/JAVA

[AOP] SpringBoot AOP 사용하기

프뚜 2022. 12. 30. 10:00
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는 같습니다.)

https://github.com/JeongSeongSoo/spring-tistory

 

GitHub - JeongSeongSoo/spring-tistory

Contribute to JeongSeongSoo/spring-tistory development by creating an account on GitHub.

github.com

728x90
반응형
LIST