Static Web
: Program 없이 Web Server가 Client에서 요청한 resource를 제공
서버가 가지고 있는 데이터를 일방적으로 제공하기보다는 서버에게 프로그램 실행 후 결과를 요청하는 방식으로 변화함
Dynamic Web
: Server side에 Program이 존재 (Servlet)
- Servlet : 동적으로 HTML Page 생성
▶ Servlet(Java)와 웹 페이지(HTML, CSS, JS)의 사용 언어가 다르기 때문에 생산성, 유지보수성 🔽
Servlet의 단점을 보완하는 프로그램 개발
JSP
: 생산성을 높이기 위해 사용
▶ 구현은 쉽지만 유지보수성 🔽
JSP의 단점으로 인해 Servlet으로 다시 돌아오되 다른 방식으로 구현
MVC Pattern
: Layered Architecture 방식의 Servlet
▶ 사용 기법들의 통일성 부족
Pattern들간 규칙을 만들어 통일성을 얻기 위한 프레임워크 개발
Framework
: Spring
1) Web Client 측면
Request URL : http://localhost:8080/path/file?_______
프로토콜 IP 포트번호
?___ : Query String (?key1=value1&key2=value2&key3=value3)
2) Web Server 측면
HTTP Request Message
- Request Line: <HTTP Method> <URL> HTTP/1.1
- Request Header
- Client의 IP
- 사용언어 : ko(Acomp-language)
- content-type
- Request Body: Query String의 정보
HTTP Response Message
- Response Line(status) : HTTP/1.1(Protocol 버전) 200(status code) OK(status 설명)
- Response Header: Message size, 데이터 타입 등 Response body에 관한 정보
- Encoding
- Content-type : MIME(HTTP, image, video 등..)
- body size
- Server description
- Response Body
- Request한 파일을 문자열로 변환하여 브라우저에게 전달 ▶ 브라우저가 Response Body를 parsing하여 rendering
http://localhost:8080/html/index.html
context root 요청 resource(없으면 자동으로 index.html)
사용자 데이터를 포함
: Query String 이용
: Query String을 사용하지 않고 request header에 데이터 포함
1) Web Client(Browser)가 Web Server(HTTP Server)에게 Request(Servlet 호출)
2) Web Server는 Web Container(Servlet Container[Servlet Engine])에게 Servlet 요청
3) Web Container 내에 요청된 Servlet 객체가 있는지 확인 (Container 내에 객체로 저장됨)
4) 해당 Servlet이 없으면 Servlet 객체를 만들 수 있는 Class가 있는지 확인
5) Thread가 생성됨
6) Thread는 Request, Response 생성해 service()에 전달하여 호출
Servlet은 Thread의 공용객체임
1) GET 방식 : Tomcat의 InputStream Encoding 변경
2) POST 방식 :
request.setCharacterEncoding("EUC-KR");
모든 Servlet들이 공유하는 Map List 형태의 객체
Context Root 안에 Servlet Context 객체는 하나!
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1. 입력
// 2. 로직
// Servlet Context 사용
// ServletContext 객체를 얻어온다. (공유객체에 대한 Reference를 획득)
ServletContext context = getServletContext();
// ServletContext에 특정 정보를 저장
context.setAttribute("product", "냉장고");
// 3. 출력
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1. 입력
// 2. 로직
ServletContext context = getServletContext();
String product = (String)context.getAttribute("product"); // getAttribute(key)의 결과 Object로 반환되기 때문에 downcasting 필요
// 3. 출력
response.setContentType("text/html; charset=UTF-8");
PrintWriter out = new PrintWriter(response.getOutputStream());
out.println("얻어온 결과는 : " + product);
out.close();
}
"Session 처리"를 통해 해결
1) Web Client가 Web Server에게 Request
2) Web Server가 Servlet Container에게 Request
3) Client가 원하는 Servlet이 가지고 있는 메소드(doGet, doPost)를 Thread가 실행
4) 해당 메소드에서 session 처리
5) Servlet Container 내에 Session 객체가 생성됨 (map 형태의 저장 공간, Session id가 할당됨)
6) 처리된 결과와 Session id가 함께 Web Client에게 Response로 전달됨
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1. 입력
String id = request.getParameter("myID");
// 2. Logic
// 해당 Client에게 session을 할당하거나 할당된 session을 찾는다.
HttpSession session = request.getSession(); // container로부터 session을 할당받음
session.setAttribute("id", id); // session에 id 저장
// 3. 출력
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1. 입력
// 2. Logic
HttpSession session = request.getSession();
String result = (String)session.getAttribute("id"); // session으로부터 client id를 가져온다.
// 3. 출력
response.setContentType("text/html; charset=UTF-8");
PrintWriter out = new PrintWriter(response.getOutputStream());
out.println("얻어온 결과는 : " + result);
out.close();
}