Springboot

AOP실습해보기

25G 2021. 8. 13. 16:13

aop 들어가기 전에 validation체크부터 먼저 해보겠다.

jsp에서 만든 필터는 프로그래머 본인이 만든 필터라서 수정할 수 있는데

스프링에 필터는 이미 .class로 만들어진 jar파일이라 코드에 손을 될 수 없다.

그럼 스프링개발자들이 프로그래머들이 코드에 손댈 수 있게 필터를 수정하고 싶으면 해당 함수나 인터페이스를 찾아야한다.

@Vaild

BindingResult

위 코드를 보면 유효성 검사를 어노테이션으로 하고 있는 것을 볼 수 있다. 이게 무슨 뜻이냐면 스프링에서 리플렉션 해서 확인한다는 뜻.

그리고 공백(empty)과 null은 엄연히 다른 유효성 검사이다.

꼭 두 개를 다 구분해서 처리를 해  줘야 한다.

 

위 유효성 검사에 관한 어노테이션은 상황에 맞게 찾아서 보면 된다.

 

@Valid bindingResult가 뭐냐면  request에서 스프링의 필터를 타면 필터에서 request값을 분석하는데 이 어노테이션 값을 보고 분석을 한다. 이때 스프링이 어노테이션을 봤는데 실제 들어온 어노테이션의 값이 위 유효성 체크한 값에 오버되거나 혹은 그 외의 결과를 이 함수에 담아준다.

그럼이 bindinfgResult를 쓰면 된다.

 

위와 같이 bindinfgResult를 쓰면 되는데 애러가 난다. 왜냐하면 리턴 타입이 맞지 않기 때문 String을 리턴하기로 했는데 map타입을 리턴하는 꼴이 됐기 때문이다.

하지만 위 함수에서는 경우에 따라서 여러 가지 타입을 리턴을 해야 하는 함수다 

이럴 땐 어떻게 해야 할까? 

그럴 때는 "?"를 쓰면 된다. 그럼 응답할 때 정하겠다고 설정하는 것이다.

그러면 요청이 잘못된 것은 밑에 핵심 로직을 신경 쓰지 않아도 되고. db에서 오류 난 것은 글로벌 익셉션 처리하면 된다.

 

응답할 따 hashmap을 응답하는데 응답할 때의 데이터를 보면 json으로 바뀌어서 응답됐다.

스프링에선 요청과 응답을 json으로 맞춰서 처리를 한다는 것을 알 수 있다.

 

그럼 이제 validation체크를 해봤는데 위 체크는 해당 컨트롤러에서만 적용되기 때문에 다른 컨트롤러에서도 유효성 처리를 해야 한다면 똑같은 코드를 다시 적어줘야 한다.

그렇다면 필터에 넣는다면?

필터는 전처리만 되지 후처리가 되지 않는다. 아니면 리플렉션을 써야 한다는 것이다.

그럼 이제 여기서부터 알면 좋은 것이 바로 AOP이다

공통기능을 빼서 핵심기능만 적도록. 그럼 프로그램을 엄청나게 심플하게 만들어준다.

 

 

그럼 이제부터 AOP를 사용해 볼 것이다.

AOP를 사용하기 위해서는 먼저 라이브러리를 받아와야 한다.

https://mvnrepository.com/search?q=aop 

위 spring Aop는 레거쉬 꺼고

bootStater를 사용할 것임 버전은 2.37  사용한다.

넣을 때 중요한 것은 버전을 안 넣어도 된다. 알아서 맞춰준다

그럼 aop처리를 할 클래스를 하나 만들어보자

이름을 BindingAdvice를 하는 이유

공통기능을 가지고 있는 그 자체를 advice라고 부른다.

그럼 이 advice를 어디에 넣어야 하나? 내가 실행하고 싶은 함수의 pointCut으로 넣어야 한다. 함수에 joinpoint에 pointCut 한다고 한다.

그리고 이 advice를 적용하는 행위 자체를 Waeving이라고 한다.

 

Aspect:공통기능

Advice: Aspect의 기능 자체

JointPoint:Adviec를 적용해야 되는 부분(ex:필드, 메서드/스프링에서는 메서드만 해당)

PointCut: Joinpoint의 부분으로 실제로 Advice가 적용된 부분

Weaving: Advice를 핵심기능에 적용하는 행위

 

사실 용어보다 중요한 것은 앞뒤로 공통기능을 집어넣는다 이것이 핵심이다.

 

자 이제 aop클래스 설정에 들어가 보자

주석을 잘 이해하면 왜 configuration을 사용하지 않고 Component를 사용했는지 알 수 있다.

@Configuration은 어떤 것을 설정할 때 사용하면 된다.(진입하기 전에)

그게 아닌 모든 것들은 @Component를 사용하면 된다.

 

ProceedingJoinPoint를 사용하면 밑에 AOP를 적용할 함수의 매개변수 값들에 접근할 수 있게 된다.

메모리에 프락시 구역을 만들어서 위 함수를 끌고 온 다음에 aop 처리된 코드들의 조건에 맞으면 위 함수의 핵심 로직을 실행하고 유효성 검사에 맞지 않은 정보가 들어오면 위에 vaildCheck가 return을 할 것이다.(앞뒤로)

근데 만약에 함수의 앞쪽만 제어하고 싶은 거나 뒤만(응답만) 제어하고 싶을 수가 있다. 위 세가 지경우를 AOP에서 다 제공을 해준다 

@Before

@After

@Around

위 새게 중 around가 우선순위가 가장 높다

그럼 위와 같이 설정해놓고 아무 함수나 때려보겠다.

그럼 함수가 타지는 것이 아닌 제어가 이 함수로 오는 것을 알 수 있다.

위 정규표현식 말고도 많은 정규표현식이 있다 겨우 에 따라서 다양하게 사용하기 위해서는 상황에 맞는 정규표현식 문법을 구글링을 하면 잘 나온다.

그럼 위 코드를 응용해서

이렇게 되면 위 정규표현식에 조건에 맞는 함수들이 실행되기 전에 aop처리를 하는데 어떤 오류가 났는지 체크를 한 뒤 오류를 리턴하던지 정상적으로 실행됐다면 함수를 실행하도록 설계가 된 것이다.

 

앞뒤를 제어할 수 있을 때만(Around) ProceedingJoinPoint를 사용할 수 있다.

before는 전처리이기 때문에 ProceedingJoinPoint를 사용하면 오류가 난다.

after도 마찬가지다

그럼 이제 필드마다 유효성 체크를 해놓으면 되는 것이다.

유효성 체크를 할 때는 오브젝트에 하면 좀 위험하다 (분기를 할 수 없기 때문)

그래서 DTO를 쓰면 상황에 따라서 분기를 할 수 있기 때문에 통신을 할 때 웬만하면 DTO를 사용하는 것이 좋다.

 

 

 

'Springboot' 카테고리의 다른 글

톰켓이란?  (0) 2021.08.20
AOP 사용해서 sentry및 Log적용  (0) 2021.08.13
AOP개념  (0) 2021.08.13
체크박스를 통해서 자바스크립트로 fetch요청하기  (0) 2021.08.11
Spring boot/JPA (enum타입 사용법)  (0) 2021.08.10