5. Spring은 무수히 많은 Filter를 가지고 있다.
Filter : 권한 체크, 인증을 하는 검문소.
내가 본 강의에서는 아래와 같이 표현하였다.
💡 A라고 불리는 나라와 그 나라의 성이 있다고 가정하자.
A 나라의 성에는 내부와 외부에 문지기가 각각 존재한다.
외부 검문에서는 그 나라의 백성인지 판별을 하고, 내부에는 왕의 집이 있기 때문에 지정된 소수의 사람만 출입할 수 있다.
이 때 A 나라의 성을 Tomcat이라 부르며, 왕의 집을 Spring Container, 문지기는 Filter를 의미한다.
그리고 외부의 filter은 그대로 filter라고 불리우며 web.xml이 관리하고 내부의 filter은 Interceptor(AOP?)라고 부른다.
대충 무슨 얘기인지 알겠죠?^^*
추가적으로 Filter, Interceptor 그리고 AOP에 대해 구글링해보았다.
- 사실 Filter는 Spring이 아닌 Java Servlet이 지원하는 것이라고 한다...?
- 요청 시 Filter→Interceptor→AOP→Interceptor→Filter으로 진행된다!
그리고 Interceptor와 AOP는 스프링 영역이다.
1) Filter(좁은 의미의 filter)
- 요청과 응답을 거르는 역할
- Dispatcher Servlet(앞단에서 HTTP 프로토콜로 들어오는 요청들을 먼저 받고 적절한 컨트롤러에 위임해주는 컨트롤러) 전후에 실행이 된다.
(그림 참고)
- 주로 web.xml에 등록되어 인코딩 변환, XSS 방어의 요청을 처리한다.
2) Interceptor
- Dispatcher Servlet에서 컨트롤러를 호출하기 전 그리고 컨트롤러가 호출되고 난 후, 요청/응답을 참조 및 가공하는 기능을 제공한다!
- 스프링에서 모든 빈 객체에 접근할 수 있다.
- 여러 개를 사용할 수 있다.
- 로그인, 권한체크, 로그확인 등을 처리한다.
3) AOP(Aspect Oriented Programming)
- OOP를 보완하기 위해 나온 개념.
- OOP : Object Oriented Programming, 즉 객체지향 프로그래밍.
- 객체지향은 각 객체(Class 만질 때 그 객체가 맞다.)를 형성하여
타 Class에서 상속, 위임을 통해 재사용하였다.
→ 코드 양 줄어듦
- 하지만 여전히 상속, 위임은 불편하고 번거롭다. 또한 각 객체들의 공통적인 속성들을 다루기 어렵다.
- 따라서 객체로 보는 것이 아닌 객체의 속성들로 보는 것!
- 사용자의 권한체크, 인증, 예외처리 등을 한 번에 관리할 수 있다.
OOP라면 객체의 설정을 각각 설정해야겠지...? 상상만 해도 극혐임.
6. Spring은 많은 Annotation을 가지고 있다.
Annotation?
- 주석 기능 + 컴파일러에게 주는 힌트!
- 기존의 주석 (ex. //, #, /* */ )은 컴파일러가 무시해서 아무 내용이나 기입해도 되었지만... Annotation은 컴파일러가 무시하지 않는다!
- Java, Kotlin의 대표적 Annotation : @Override, @Deprecated
- Spring에서의 Annotation : @[Annotation명]
- 객체 생성이 가능하다.
- Reflection을 이용하여 Annotation의 적용 여부 및 element 값을 읽고 처리할 수 있다.
- Reflection : 런타임 중 Class 내에서 함수, annotation 등을 분석
- @Component : Class를 Bean(메모리)에 등록하렴!
- @Autowired : 코딩된 객체를 해당 변수에 집어 넣으렴! (Singleton)
- 그 외에도 @Bean, @Controller, @Service, @Required 등이 존재!