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를 쓰면 된다.(스프링에선)
'Springboot' 카테고리의 다른 글
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 |
지금 하는 프로젝트에서 상품평 기능 구현하기/이미지 업로드/상품평 수정/삭제 기능 구현 (0) | 2021.08.08 |