-
[Spring Boot] AOP JoinPoint & 바인드 변수SpringBoot Meteor 2021. 12. 29. 16:32
프로젝트를 진행하다가 보면 *관점 지향 프로그래밍을 구현해야할 때가 발생할 수 있다.
*AOP - Aspect Oriented Program (관점 지향 프로그래밍)
관점지향프로그래밍이란 , 핵심 기능과 공통 기능을 분리하는 것이다.
예를 들어 회원가입을 진행하고 로그인을 진행할 때
- 파라미터 값들의 유효성 검증
- 해당 비지니스 로직
이렇게 나누어 볼 수 있다. 회원가입 , 로그인에서는 파라미터 값들의 유효성 검증은 공통 기능에 해당할 것이다.
실질적으로 회원가입의 데이터를 DB에 저장시키고, 로그인 되어질 정보를 DB에서 가져와 검증하는것이 핵심 기능이라고 볼 수 있다.
관점지향적 프로그래밍을 함으로써 핵싱 기능과 공통 기능을 분리한다.
ex ) 회원 가입
- 유효성 검사
- 세션 체크
- 로그 남기기 등등...
포인트 컷 - 공통기능을 넣는 것
조인 포인트 - 공통기능 위치
코드를 구현하면서 @Before 어드바이스 메소드를 구혀하려고 할 때 , 예외 발생 메소드가 무엇인지, 해당 메소드가 속한 클래스, 패키지 정보, 어노테이션 정보등을 알아야
정확한 포인트에서 어드바이스를 적용할 수 있다. (로직 구현 또한 마찬가지일 것이다.)
이렇게 다양한 정보들을 이용할 수 있도록 스프링에서 제공해주는 JoinPoint 인터페이스에 대해 정리를 해보자.
스프링 JoinPoint 에서 제공하는 메소드들. Signature getSignature() - 클라이언트가 호출한 메소드의 시그니처 (리턴타입, 이름, 매개변수..) 정보가 있는 Signature 객체 리턴 Object getTarget() - 클라이언트가 호출한 비즈니스 메소드를 포함하는 비즈니스 객체를 리턴 ( 해당 클래스 객체를 리턴) Object[] getArgs() // Object타입의 배열임에 주의하자 - 클라이언트가 메소드를 호출할 때 넘겨준 인자 목록을 Object 배열로 리턴 즉 public void aopPractice(Member member) { System.out.println("...." + member.toString()); } Member라는 인자 정보를 Object 배열로 리턴
@Around 어드바이스 메소드를 구현할 때에는 ProceedingJoinPint를 사용한다.
ProceedingJoinPint 코드를 타고 들어가보면
JoinPoint를 상속받고있는 인터페이스이다.
즉, JoinPoint가 가지고있는 모든 메소드를 지원하며 거기에 추가적으로 proceed()메소드가 추가되어있다.
proceed()메소드는 어드바이스의 로직이 끝나고 다음 함수의 스택을 실행하게끔 해주는 역할을 해준다.
JoinPoint 객체를 사용하기 위해서는 메소드 매개변수로 JoinPoint를 선언해주면 된다.
그러면 클라이언트가 비즈니스 메소드를 호출할 때,
스프링 컨테이너가 JoinPoint 객체를 생성하고,
메소드 호출과 관련된 모든 정보를 이 객체에 저장해서,
어드바이스 메소드를 호출할 때 인자로 넘겨준다. (프록시 방식으로 돌아감)
'SpringBoot Meteor' 카테고리의 다른 글
[Spring Boot] AOP JoinPoint & 바인드 변수 (0) 2021.12.29 [Spring Boot] AOP pointcut post, put 어노테이션에 적용하기 (pointcut 여러개) (0) 2021.12.29 [Spring Boot] Objects.requireNonNull 메서드 (0) 2021.12.29 [Spring Boot] @RestControllerAdvice를 이용해서 예외 처리 핸들링하기 (0) 2021.12.29 [Spring Boot] JWT (JSON WEB TOKEN) 간단 정리 (0) 2021.12.23