web.xml이 하는 일
- servletContext의 초기 파라미터 생성
- session의 유효시간 설정
- servlet/jsp에 대한 정의
- servlet/jsp 매핑
- Mime type 매핑
- welcome file list
- error pages 처리
- 리스너/필터 설정
- 보안
(1)servletContext의 초기 파라미터 생성
엄청나게 큰 성이 하나 있는데, 이 성에는 입구가 있고 입구에는 문지기가 한 명 있다.
문지기는 스스로 일을 할 수 없어 관리자는 문지기에게 문서를 던져 일을 시킨다. 그 문서대로 문지기를 일을 하게 되는데 이 문서가 web.xml 파일이다. 첫번째로 하는 일은 servletContext의 초기 파라미터를 생성하는 것이다.
외부에 사람이 들어올 때 문지기는 그 사람에게 암호는 ***라고 알려준다. 이것이 초기 파라미터이고 만약 잠입한 사람이 들어온 경우 그 사람은 암호를 모르게 된다. 이런 초기 파라미터는 한번 설정하면 어디서든 동작할 수 있다.
(2)session의 유효시간 설정
세션이란? 인증을 통해 들어오는 것이다.
집에 어떤 사람이 들어올 때 아무나 들어올 순 없고 인증이 되면 들여보내고 인증되지 않으면 들여보내지 않는 것처럼.
인증을 할 때는 중요한 어떤 특징을 통해서 하게 된다.
유효시간을 설정하여 문지기의 세션이 3일로 설정되면 성에 들어온 사람은 3일 동안만 지낼 수가 있다.
3일이 지나면 세션을 초기화해서 다시 3일을 더 있을 수 있게 된다. 몰래 잠입한 사람은 세션이 없어서 끌려나가게 된다.
세션 = 며칠동안 있을 수 있는가?
(3)servlet/jsp에 대한 정의, servlet/jsp 매핑
성 안에는 많은 건물들이 있고, 성 안에 들어오는 사람은 가고자 하는 목적지 건물이 있다.
문지기는 그 건물을 듣고 어디로 가라고 길을 알려준다. 이것을 서블릿 매핑이라고 한다.
내가 요청한 식별자, 자원이 어디인지 정확히 알고 도와주는 것이다.
(4)Mime type 매핑
성 안에 들어오는 사람은 들고 오는 물건이 있을수도 있는데, 이렇게 들고온 물건이 무엇인지 물어보는 것이 Mime type 매핑이다. (물건 = 데이터)
물건을 아무것도 들고오지 않은 사람은 뭔가를 주려고 온 사람이 아니라 가지러 온 사람이며, 이를 get방식의 요청이라고 한다. (데이터를 가져오지 않는다) select라고도 한다.
물건(데이터)를 들고 오는 사람은 먼저 해당 데이터의 창고로 이동해서 사용할 수 있는 데이터로 판단되면 가공을 한다.
예를 들어 쌀이라면 쌀 창고로 이동해서 먹을 수 있는지 확인하고 흙을 털어내는 등의 작업을 하는 것이다.
이렇게 가공하는 일을 하려면 mime type을 정확히 알아야 한다(어떤 물건인지)
(5)welcome file list
성에 들어오려는 사람이 가고자 하는 목적지를 모를 때,
이렇게 아무 이유 없이 들어온 사람은 문지기가 광장으로 보낸다. 이것을 welcome file list라고 한다.
-> 가려는 목적지가 없는 사람은 광장으로 던져진다.
(6)error pages 처리
이번에는 성에 들어오려는 사람이 가고자 하는 목적지가 문지기가 모르는 이상한 곳이다.
이런 경우는 error page로 던져지게 된다.
(7)리스너/필터 설정
필터라는건 성 안에 사람이 들어올 때 신분을 확인하는 것이다. 총을 소지하고 있다면 뺏고 들여보내거나
다른나라의 사람이라면 들여보내지 않는것 등.
리스너는 문지기의 대리인이다.
고급 관리자의 집에 높은 사람이 있는데 그 사람이 술을 잘 먹는 사람이 필요해졌다. 문지기는 바빠서
새로운 문지기를 만드는데 오직 술을 잘 먹는 사람만 확인하는 문지기 대리인이다. 이 대리인을 리스너라고 한다.
(8)보안
보안은 성을 보호하는 것이다. 이상한 사람이 들어오면 쫓아내고, 혹은 감옥으로 보내는 등의 일을 한다.
web.xml은 이렇게 8가지의 일을 하며, 웹 서버에 진입을 하면 최초에 도는 것이 web.xml이다.
FrontController 패턴
최초 앞단에서 request 요청을 받아서 필요한 클래스에 넘겨준다.
문지기가 web.xml에 너무 많은 서블릿과 jsp의 정의가 들어있으면 하는 일이 너무 많아 복잡해지기 때문에
요청을 받으면 FrontController로 넘긴다.
맨 처음 request 요청을 하고, 만약 특정 주소 ".do"라는 주소가 들어온다면 FrontController에 보내라는 약속을 web.xml에 코드로 적어놓는다.
최초의 요청이 들어왔을때 url이든 자바파일이든 자원으로 바로 접근을 못하고 톰켓으로 가고 request와 response 객체를 만든다. request는 요청한 사람의 정보를 들고 있고, 그 정보를 토대로 response 객체를 만든다. 이것을 톰켓이 자동으로 만들어준다. 원래는 버퍼로 통신을 하여 가변길이의 문자를 받는데, 이것을 받아 톰켓이 자동으로 객체로 만들어주는 것이다.
web.xml에 jsp/서블릿 매핑이 너무 많으면 복잡해지기 때문에 특정 주소가 들어오면 frontcontroller로 보내라고 셋팅을 하여 frontcontroller가 특정 주소를 받는다. 예를 들어 a.do, b.do 등등 .do로 끝나는 주소들... 그런 주소들이 들어오면 특정 자원을 찾아갈 수 있게 request한다.
새로운 request가 들어가면 기존의 request와 response객체는 바뀌게 된다. 그래서 필요한 클래스 요청이 도달했을 때 frontcontroller에 도착한 request와 response 객체를 그대로 유지시켜주는 RequestDispatcher가 필요해진다. RequestDispatcher를 이용해야 기존 데이터를 들고 페이지 이동이 가능하다.
FrontController 패턴을 직접 짜거나 RequestDispatcher를 직접 구현할 필요가 없다. 왜냐하면 스프링에는 DispatchServlet 이 있기 때문이다. DispatchServlet는 FrontController 패턴 + RequestDispatcher 이다.
해당 게시글은 '최주호' 님의 스프링부트 개념정리 강의를 참고하였습니다.
'JAVA > Spring' 카테고리의 다른 글
[스프링] 패키지 이름, UTF-8 (0) | 2022.02.17 |
---|---|
스프링 컨테이너 (0) | 2022.01.08 |
스프링부트 JPA 개념잡기 (0) | 2022.01.08 |
스프링부트의 동작 원리 (0) | 2022.01.06 |
스프링이란? 스프링의 기초 개념 (0) | 2022.01.06 |