JJJAEOoni 2022. 6. 21. 13:37
반응형

X정리X

 

제어해주는거라서 핸들러에 만들어야 할 것 같지만 config에 만들자.

 

AOP는 관점지향 프로그래밍

 

내가 슈퍼에 갈 수도있고 회사에 갈 수도 있는데

옷을 입는 메서드를 만들 것이다.

 

항상 슈퍼, 회사에 가는 젤 첫 로직에 옷 입기가 필요하다.

메서드를 따로 분리해서 재사용하면 되겠네?

 

동일하게 동작(동일한 코드)하는 로직이라면 그냥 메서드에 추가하면 된다.

 

AOP를 사용하면

 

AController의 모든 메서드들은 ..

접근 지정자가 public인 메서드들은 ..

 

하면서 설정이 가능ㅎㅏ다.

 

이는 리플렉션 기능으로 가능한것.

 

반복로직을 들고있어서 번거롭게 적어주지 않아도 되지만 얘만 가지고 AOP라고 하지 않는다.

이는 핵심로직에 집중하게 해준다는 첫번째 AOP의 특징이다.

 

A컨트롤러의 모든 메서드가 실행될 때 옷입기를 한다.

그래서 슈퍼 메서드에서는 과자사기라는 핵심로직, 회사 메서드에서는 업무 핵심로직에 집중할 수 있다.

이 AOP 박스를 만드는 행위를 proxy라고 한다.

옷입기 행위 : 공통 로직

 

공통 로직을 프록시로 가져오는 행위 : weaving 적용시키다

슈퍼메서드의 제일 첫줄에 웨이빙시키는 것

 

내가 슈퍼의 첫줄에 들어갈거야 저 자리!! : PointCut

공통로직이 메서드의 앞뒤에 있다면 포인트컷어라운드

 

옷입기 메서드가 들어갈 포인트컷에 웨이빙 하는 것

 

공통로직을 갖고있는 메서드를 JoinPoint라고 한다.

공통로직을 적용시켜야 할 조인포인트!

 

A메서드() {
	공통로직1() - Advice (전) PointCut
    핵심로직() - JoinPoint
    공통로직2() - Advice (후) PointCut
}

프록시(대리인)박스 [
	처음(before)
    A메서드내부(JoinPoint) {
    	내부(around)
    }
	끝(after)
]

이 공통기능을 Advice라고 한다.

 

 

내부 필드에 접근하려면 조인포인트만 기억하면 된다.

 

advice 폴더에 공통로직을 작성해주자.

 

 

BindingAdvice 공통로직을 필요한 곳 마다 바인딩 해준다.

 

필요한 메서드에 @Before, @After, @Around를 걸어줄 수 있다.

 

괄호에는 리턴타입을 지정해준다. *을 적으면 모든  리턴타입을 받는다

클래스나 메서드를 찾는 기법으로 ..을 꼭 붙여줘야한다.

클래스 앞에는 ..붙이는게 문법이다.

 

execution(* site.metacoding.bolgv3.web.MainController.*(..))

 

 

메인컨트롤러의 모든 메서드의 매개변수 개수도 정해져있지 않은 모든 메서드에! 라는 의미이다.

 

package site.metacoding.blogv3.config.advice;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class BindingAdvice {

    @Before("execution(* site.metacoding.blogv3.web.MainController.*(..))")
    public void before() {
        System.out.println("하ㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏ");
    }
}

 

앞뒤로 실행해보자

@Before("execution(* site.metacoding.blogv3.web.MainController.*(..))")
public void before() {
    System.out.println("Beforeㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏ");
}

@After("execution(* site.metacoding.blogv3.web.MainController.*(..))")
public void after() {
    System.out.println("Afterㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏ");
}

after가 실행된 뒤에 파싱이나 이런게 실행된다.

 

 

 

 

 

// 앞에쓰고, 뒤에쓰는 개념이 아니라 JoinPoint에 접근이 가능하다 > 파라미터 분석 가능
@Around("execution(* site.metacoding.blogv3.web..*Controller.*(..))")
public Object bindingValidation(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
    System.out.println("JoinPoint ==============================================================");
    return proceedingJoinPoint.proceed();
}

 

 

@Around는 리턴을 해줘야한다.

조인포인트의 프로시드?

 

메서드에 접근할 때 메서드가 갖고있는 파라미터나 지역 변수에 접근을 Around로 가능한데

proceedginJoinPoint를 갖고 놀고

 

 

관점에 따라 공통로직이 미세하게 다르게 작동한다.

반응형