Springboot

AOP개념

25G 2021. 8. 13. 14:23

Validation체크

spring을 좀 하다 보면 유효성 검사를 하는 validation체크를 할 수밖에 없다. 사용자가 어떤 데이터를 던질지 모르고 혹시 모를 서버의 공격에 대비한 체크들을 해야 한다.

 

그럼 이때 예를 들어 request요청이 왔다고 했을 때 이데이 터가 쿼리 스트링이든 httpbody든 이 데이터를 filter에서 거르도록 해야 한다.

예를 들어서

post:/user에 username과 password요청이 왔다. 그럼 서버는 /user라는 http메서드와  uri를 디스페처가 감지를 하고 /user주소가 있는 함수를 찾는다. 그럼 자연스럽게 해당 함수의 매개변수를 확인한다.

이때 만약에 매개변수로

Strig username,

String password,

String Phone

이렇게 온 것이다.

그럼 요청은 username과 password가 왔는데 매개변수에 phone이 있으면 400번대 애러가 나면서 튕겨진다.

그럼 매개변수의 개수에 맞게 요청이 왔다면?

요청이 온 username에 있는 값이 null인지 empty인지 체크를 해야 한다. 

이때 무조건 해야 하는 값이 아니라 null이어도 괜찮은 값이라면 상관없지만 그렇지 않고 값이 정상적으로 잘 들어왔는지 체크를 해야 한다는 거다.

이걸 만약에 jsp에서 리플렉션을 하면 object 주입할 때 값들을 체크를 할 수 있다.

근데 여기서 스프링 서버라면 얘기가 달라진다 jsp는 직접 디스페처를 만들 수 있지만

스프링에서는 디스페처가 이미 다 만들어져 있다

왜 안 만들어 놨냐? 스프링 개발자들은 뭘 validation체크를 할지 수없기 때문이다.

 

그럼 프로그래머가 직접 디스페처를 건들여서 validation체크를 해야 한다.

1. 주소 매핑

2.ioc컨테이너 확인

3. 함수 매개변수 == request값

4. 주입

이 순서로 스프링 서버가 진행되는데 이 내부를 건드릴수 없다. validation체크를 못한다는 뜻

 

그래서 스프링에서 제공하는 기능이 AOP라고 한다.

 

 

AOP(Aspect Oriented Programing: 관점 지향 프로그래밍)

 

 

a라는 함수가 있다. 그럼 이 a함수에 접근할 때 발동하는 게 디스페처다. 그럼 이 함수를 쭉 실행하다가 끝날 때는 massage Converter나 view Resolver가 일을 한다. 그럼 이 유효성 검사를 하려면 이 a라는 함수에 디스페처가 접근하기 직전에 유효성검사를 하거나 아니면 함수의 마지막에 응답에 대한 검사를 할 수도 있는것이다.

 

aop와 필터의 차이점

필터는 어딘가에 진입하기 직전에 실행된다.

 

필터+리플렉션을 이용하면 a라는 함수에 필터를 타고 들어갔다가 빠져나올 때도 처리할 수 있다. 기술적인 것만 보면 이게 aop다

 

AOP란? 공통기능

ex) 회원가입

1. 핵심기능: 회원가입

2. 공통기능:

-값이 제대로 들어왔는지 유효성 검사

-세션 체크

-로그 값

-응답 시 처리해야 할 일들

위처럼 핵심기능을 수행하기 위해서 부가적인 기능을 더 많이 추가시켜야 한다.

근데 이 부가적인 기능들 중에 대부분의 컨트롤러에서 다 필요한 기능들이 대부분이다.

AOP를 사용하면 이 공통기능을 따로 빼서 pointCut(공통기능을 넣는 행위)할 수 있다. 이때 공통기능을 넣는 행위를 pointCut이라고 하고

이 공통기능을 넣는 위치가 joinpoint라고 한다.

이 공통기능을 넣을 때 따로 메모리 공간이 만들어진다 이 공간을 프록시(대리인) 공간이 하나 만들어진다.

이 임시공간(프록시 공간)이 하나 만들어지면 이 행위가 a함수를 들고 온다. 그럼 그 공간에서 공통기능을 넣어주는 것이다.

무슨 말이냐면 a라는 함수가 실행될 때 이 a라는 함수를 이 프록시 공간에 옮겨져서 공통기능들과 합쳐진 함수가 실행된다.

그 함수를 임시 프록시 공간에 들고 와서 그 함수의 앞뒤를 관리하는 것이다.

AOP는 관전 지향 프로그래밍, 프로그래머가 중요하게 생각하는 관점만 지향하고 어쩔 수 없이 해야 하는 로직은 aop를 해서 pointcut으로 다 빼버리는 것이다.

 

언제 AOP를 쓰고 언제 필터를 쓰냐 

함수의 앞쪽만 처리하고 싶을 때는 필터를 쓰고

함수의 앞뒤를 처리하고싶을때는 aop를 쓰면 된다.(스프링에선)