GetMapping에서는 바디가 필요 없어서 유효성 검사가 없음!
[ MyValidationHandler 클래스생성 ]
[ 컨트롤러에서 복사 → org.springframework.web.bind.annotation ]
package shop.mtcoding.blog._core.errors; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.springframework.stereotype.Component; @Aspect // AOP 등록 @Component //IoC 등록 public class MyValidationHandler { // Advice (부가 로직 hello 메서드) //Advice - 포인트컷(Pointcut)에 의해 선택된 특정 지점에서 실제로 실행될 코드의 조각 // Advice가 수행될 위치 === PointCut @Before("@annotation(org.springframework.web.bind.annotation.GetMapping)") // <이걸 바로 PointCut 이라고 함 public void hello(JoinPoint joinPoint) { System.out.println("MyValidationHandler : hello_______________"); } }
@Before 어노테이션은 지정된 조인 포인트(JoinPoint) 바로 전에 실행되어야 할 코드를 정의한다 표현식 "@annotation(org.springframework.web.bind.annotation.GetMapping)"은 포인트컷(Pointcut)을 지정하는데, 이는 @GetMapping 어노테이션이 붙은 메서드가 실행되기 직전에 어드바이스인 hello 메서드가 실행되어야 함을 의미한다! @GetMapping 어노테이션이 붙은 어떤 컨트롤러 메서드가 호출될 때마다, 그 호출이 실제 메서드의 로직을 실행하기 전에 MyValidationHandler 클래스의 hello 메서드가 실행된다. hello 메서드는 이 시점에 특정 로직(예: 로깅, 유효성 검사 등)을 수행할 수 있다. (= hello 메서드가 @Before 어드바이스로 지정되었기 때문에, @GetMapping 어노테이션이 붙은 메서드가 실제로 실행되기 전에 hello 메서드가 호출되어 실행될 것)
[ 결과 ]
화면은 json으로 뜬다.
GetMapping 실행하자, hello 뜬 것 확인. GetMapping 일 때만 실행되도록 걸어놓음
[ 다시 때려보자 1 ]
package shop.mtcoding.blog._core.errors; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.springframework.stereotype.Component; @Aspect // AOP 등록 @Component //IoC 등록 public class MyValidationHandler { // Advice (부가 로직 hello 메서드) // Advice가 수행될 위치 === PointCut @Before("@annotation(org.springframework.web.bind.annotation.GetMapping)") // <이걸 바로 PointCut 이라고 함 public void hello(JoinPoint jp) { Object[] args = jp.getArgs(); //파라미터 (매개변수) System.out.println("크기 : " + args.length); System.out.println("MyValidationHandler : hello_______________"); } }
Object[] args = jp.getArgs(); 메소드가 실행될 때 메소드에 전달된 인자들을 가져오는 것. 즉, 메소드가 실행될 때 그 메소드에 어떤 인자들이 전달되었는지를 확인할 수 있게 해준다. 예를 들어, 어떤 메소드가 2개의 인자를 받는다면, args.length는 2가 된다. 이를 통해 메소드 실행 시 어떤 데이터가 사용되고 있는지를 파악할 수 있다.
[ 다시 때려보자 2 ]
package shop.mtcoding.blog._core.errors; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.springframework.stereotype.Component; @Aspect // AOP 등록 @Component //IoC 등록 public class MyValidationHandler { // Advice (부가 로직 hello 메서드) // Advice가 수행될 위치 === PointCut @Before("@annotation(org.springframework.web.bind.annotation.GetMapping)") // <이걸 바로 PointCut 이라고 함 public void hello(JoinPoint jp) { Object[] args = jp.getArgs(); //파라미터 (매개변수) System.out.println("크기 : " + args.length); for (Object arg : args) { System.out.println("매개변수 : " + arg); } System.out.println("MyValidationHandler : hello_______________"); } }
+)
AOP를 활용하여 특정 조건에 따라 다른 메시지를 출력하는 것이 가능하다 detail 메서드의 실행 결과가 1이면 good, 2면 bad... 이런 식으로 sout 출력 할 수 있음!
Share article