❗️내장 톰켓을 알기전 socket과 http통신에 대해서 집고 넘어가기
운영체제에 내장되어 있는 것이다.
❗️톰켓을 따로 설치할 필요 없이 바로 실행가능하다.
소켓 통신이란)
B가 A랑 통신하고 싶다면 IP주소와 5000번 포트번호를 넣어서 연결을 한다. 하지만, 5000번 포트는 연결의 용도이고 다른 포트번호(5001번)가 만들어져서 연결된다. 하지만 또 5001번과 B가 연결(통신)되어 있기 때문에 모든 자원을 5001번이 사용한다. 때문에 5000번이 연결을 받을 수 없다. 그렇기 때문에 5001번에 스레드를 만들어 주고 5000번에는 main 스레드를 만들어준다. 그러면
C가 A랑 통신하고 싶다면 또 5002번 포트번호에 스레드2를 만들어주어 통신하면 된다.
이게 소켓 통신이다. 소켓통신을 제대로 알려면 스레드 개념을 알아야된다.
장점)
Socket 통신의 장점은 연결이 계속되어있다.
단점)
지속연결 이기 때문에 부화가 커서 느려질 수 있다.
해결방법)
http 통신을 사용하면 된다.
- http 통신은 연결을 지속하지 않고 Stateless 방식을 사용한다.
- http 통신은 단순하게 문서를 전달하는 통신이다.
- http는 운영체제가 들고 있는 소켓이라는 얘를 이용해서 만들어졌다.
- http기반은 소켓이다.
요청시마다 변하는 자원(동적)이 아니라 정적이다. 이게 웹서버이다.
자바 코드를 컴파일 하고 html 파일로 만들어주고 아파치한테 돌려 주는 것이다.
웹서버 = 아파치
웹서버는 흔히 사용하고 있는게 아파치라는 웹서버이다.
아파치는 자바코드를 이해하지 못한다. 그래서 자바코드 요청시에 응답하지 못한다. 그래서 요기에 아파치에 톰켓이라는 얘를 달아준다. 톰켓이라는 애를 달면 아파치가 자기가 이해하지 못하는 어떤 파일에 대한 요청이 오면 제어권을 톰켓에 넘겨버린다. 그래서 톰켓은 .JSP파일 안에 있는 자바코드를 컴파일하고 컴파일이 끝나면 컴파일이 끝난 데이터를 .html 파일에다가 덮어 쓴다.
즉, 아파치는 해당 .html파일을 응답해주는 것이다.
웹 브라우저는 html, js, css 파일을 읽어주는 프로그램이다. 자기가 이해할 수 없는 확장자가 들어오면 재기능을 할 수 없는 것이다.
Service(HttpServletRequest, HttpServletResponse)는 탐켓이 만들어주는 객체이다.
서블릿(Servlet)이란 동적 웹 페이지를 만들 때 사용되는 자바 기반의 웹 애플리케이션 프로그래밍 기술이다. 서블릿은 웹 요청과 응답의 흐름을 간단한 메서드 호출만으로 체계적으로 다룰 수 있게 해준다.
서블릿 컨테이너는 서블릿을 담고 관리해주는 컨테이너이다. 서블릿 컨테이너는 구현되어 있는 서블릿 클래스의 규칙에 맞게 서블릿을 관리하며 클라이언트 요청을 받으면 HttpServletRequest와 HttpServletResponse 객체를 생성하여 post, get 여부에 따라 동적인 페이지를 생성하여 응답한다.
웹 페이지는 크게 정적(Static)과 동적(Dyanamic)으로 나뉜다. 정적과 동적의 가장 큰 차이는 이미 만들어져 있는 문서만을 서비스할 것이냐 아니냐의 차이이다. 정적은 이미 만들어진 것만을 사용하는 것이고 동적은 클라이언트에게 실시간으로 정보를 가공 처리하여 서비스하는 것이다.
동적인 웹 페이지는 주로 데이터베이스 서버와 연동하여 웹 서버에서 처리한다.
URL
Spring은 직접적인 자원에 요청을 할 수 없다.
Spring은 식별자를 통해서 요청을 해야된다.
URL : 자원 접근 X
URI : 식별자 접근
URL접근방식은 Spring에서는 다 막았다.
즉, 식별자를 통해서 요청을 해야된다. 특정한 파일 요청을 할 수 없기 때문에
요청 시에는 무조건 자바를 거쳐야된다.
URL 주소 형태
http://naver.com/a.png
URI 주소 형태
http://naver.com/picture/a
20개의 스레드가 있고 21번째 요청을 했을 때 빈 스레드가 없다면 대기한다. 1번 스레드가 응답을 하고 작업이 끝나면 사라지는게 아니라 21번째 요청에 재사용된다. 그렇기 때문에 속도가 빨라진다.
여기에서 Servlet/JSP 매핑시(web.xml에 직접 매핑 or @WebServlet 어노테이션 사용)에 모든 클래스에 매핑을 적용시키기에는 코드가 너무 복잡해지기 때문에 FrontController 패턴을 이용함.
web.xml 을 뭐로 보면 되냐면?
문지기가 web.xml이다.
초기파라미터는 한번 설정하면 어디서든 작동할 수 있다.
a가 '다'를 들고오면 문지기(web.xml)는 서울 용산구로 가면된다고 해주는 것이다.
'다'는 서울 용산구로 정의되어 있기 때문에 그쪽에 매핑해주는 것이다.
b는 아무것도 안가져올 수 있다. 이게 get방식(select)이다.
a가 쌀이라는 데이터를 가져온다. 그러면 문지기가 Mime Type이 뭐야? 하면 쌀이에요 하면 쌀창고로 보낸다. 쌀창고에 데이터를 보내서 우리나라에서 있을지 없을지 판단하고 먹을 수 있으면 가공한다.
get방식은 데이터를 가져오지 않는다.
Mime Type을 알아야한다. 왜? 어떤 물건을 들고오는지 알아야지 쌀을 어디로 보내야 할지 안다.
결론) Mime Type은 내가 들고올 데이터를 뭔지를 알려주는거 것이다.
아무 이유없이 들어온 애들은 광장으로 보내라는게 Welcom File list이다.
최초 앞단에서 request 요청을 받아서 필요한 클래스에 넘겨준다. 왜? web.xml에 다 정의하기가 너무 힘듬.
이때 새로운 요청이 생기기 때문에 request와 response가 새롭게 new될 수 있다. 그래서 아래의 RequestDispatch가 필요하다.
.do(특정 주소) 들어오면 FrontController로 보내라는 약속의 코드를 짠다 어디에? web.xml에 써놓는다.
요청한 사람들의 정보들의 따라서 response객체를 만들어준다. 탐켓이 만들어준다.
web.xml에 JSP/servlet 매핑이 너무 많으면 이런 특정 주소를 FrontController가 처리한다.
필요한 클래스 요청이 도달했을 때 FrontController에 도착한 request와 response를 그대로 유지시켜준다.
이거를 이용해야지 페이지간 데이터 이동이 가능하다.
FrontController 패턴을 직접짜거나 RequestDispatcher를 직접구현할 필요가 없다. 왜냐하면 스프링에는 DispatchServlet이 있기 때문이다. DispatchServlet은 FrontController 패턴 + RequestDispatcher이다.
DispatchServlet이 자동생성되어 질 때 수 많은 객체가 생성(IoC)된다. 보통 필터들이다. 해당 필터들은 내가 직접 등록할 수도 있고 기본적으로 필요한 필터들은 자동 등록 되어진다.