20/09/04 웹 프로그래밍 기초 (model2, request dispatch , redirect)
서버사이드 웹어플리케이션 하는 일: 요청 분석, 응답 생성
Request
line url: 누가 받을 것인가
line에 method: CRUD에서 C-post / R - get
line은 누구나 열어볼수잇는 데이터 . 실제 필드에선 get 안씀
주소로 허용될수있는 문자 대부분 500kb (25000문자)
만약 get으로 파일 업로드 시 제약있음. 조그만 파일만 올릴수이씀 post는 크기 제약 없음
Response line: status code,
Response header: r body에들어갈 데이터의 부가정보. 얘가 어떠냐ㅑ에따라 브라우저가 그 다음 할일을 조정한다.
나 엑셀보낸다 `~ -> 엑셀실행,,
대표적으로 content type, content length
*수정중*
브라우저정보 - 클라이언트가 직접 입력하는 것이 아님 (=요청 파라미터 아님) = > metadata임
metadata: 진짜 데이터 아니고 데이터를 식별하기 위한 ... ( 부가 정보 표현)
Request Body = Content body (Post일때만 생성된다)
Response가 HTTP 에서 어떻게 포장되는가?
응답데이터
Response Line: Status code. (100~5//)
100번대:
200번대: OK
esponse Line
- Protocol, version, status code 응답 상태 코드
- status code: 요청이 정상 처리되었는지 여부를 클라이언트에게 전송
100 : Ing... (Websocket / HTTP 1.1부터 ) 좀만 기다려 금방 보내준다
200 : OK , 정상 처리
300 : 클라이언트의 추가 액션이 필요함
300번대: 성공도/실패도 아님. 요청을 한번더 보내줘야 함 ( 사이트에 있는 정적자원가져와서 캐싱 미리 해둠. 니가 가져간 캐시 데이터 뒤져봐라 ( 304) - 클라이언트한테 뭔가 한번 더 하라고 요구하는 듕,,, ( 페이지 이동할 떄 사용)
.SC_NOT_MODIFIED %> : 정적 자원이 변경된 적 없으니 캐시 데이터를 사용하도록 유도 304
.SC_MOVED_TEMPORARILY %> : 자원 위치 임시 변경됨. 변경된 위치 알려줌 (header에 'location'으로)
302, 307: resource 위치가 옮겨졌다고 알려준다. 새로운 위치 다른데로 요청 올려라~
400: Bad_request / parameter 안 넣었다 (data validation 시에 사용)
401: UNATHORIZEd
SC_NOT_FOUND %> : not Found 404
SC_BAD_REQUEST %> : bad requ
SC_FORBIDDEN %> : 금지 자원에 접근했
SC_UNAUTHORIZED %> : 권한 없는 요
SC_UNSUPPORTED_MEDIA_TYPE %>
SC_METHOD_NOT_ALLOWED %> : r
%> : not Found
T %> : bad request
%> : 금지 자원에 접근했을 떄
ED %> : 권한 없는 요청 (관리자 자원에 일반인이 접근 )
D_MEDIA_TYPE %> : 요구 자원의 MIME을 처리할 수 없을 때
_ALLOWED %> : request method 지원하지 않음 (doGet으로 해놨는데 요청을 post로) (서블릿 do000잘못 친 경우_
400번대: 클라이언트 (주로 404/ 주소 잘못 입력했을 때= 니가 찾는 자원은 서버상에 존재하지 않는다 )
500번대: 서버 문제 (주로 개발자가 코드 잘못 짬)
HTTP에서 중요한 특성
stateless: 상태를 저장하지 않는다. 서버는 하난데 클라이언트가 개많음 근데 a가 요청한 거의 응답은 무조건 걔한테로 가야하구 다른애한테 가면 안됨 a가 이 요청 날렸다는 정보가 서버에 저장되어야함. but 이 정보가 계속 남아잇으면 네이버 서버 너무 힘들다 그 사람한테 응답 주고 나면 그 사람정보,요청 정보가 지워져야함. 요청이 들어오는 순간 정보 형성, 1대1 응답, 응답 나가면 나머지 정보 다 사라짐. = 상태를 유지하지 않는다. => 대화 안됨 / 저장 안되니까 장바구니에서 장바구니 담아도 이게 한 사람거인지??? 모름 그래서 이거 해결하려고 쓰는게 100번대!
최프때 많이 쓰이는애: 웹 소켓 ( 100번대 )
응답보내고 끊지않고 상시통로 개방해두고 데이터 거기서 여러번 주고 받는다. 그게 계속 유지되고있다 = 100 (ing)
웹소켓있으면 웹에서 채팅 가능 (클라이언트-다른 클라이언트끼리... 서버 안 끼고 실시간 양방향 통신 가능)
Response Header: 얘도 metadata (body의 Content-type, ... 데이터 받아올떄 지금 몇퍼 받았는가 현재 응답 데이터 크기가 얼마고 내가 받은게 얼마만큼이다 / 엑셀파일 다운받았는데 바로 엑셀 프로그램 켜지는거 ( 여기서 이거 엑셀이다 하고 알려줫기 때문) )
- metadata
e.g.) Content-length
1. 응답 MIME 결정 : Content-type
- response.setContentType, page 지시자의 contentType="", response.setHeader
2. 캐시 제어 : Cache-control(HTTP/1.1), Pragma(HTTP/1.0) -> 혹시 모르니까 두개 다 써야댐, Expires(모든 버전 공통 )
- 브라우저가 정적 자원을 캐시하는 구조를 제어할 수 있음.
- Expires:
3. 자동 요청 Refresh
- 단점: 동기요청
4. page 이동 Location
!!* Accept안에 있는건 클라이언트가 이거 볼 수 있다~ 는 거고 Response Header안에 있는게 그 응답의 타입
<%
response.setHeader("Cache-control", "no-cache"); //firefox용 "no-store"
response.addHeader("Cache-control", "no-store"); //이렇게 하면 두개 쓸 수 있당
response.setHeader("Pragma", "no-cache");
response.addHeader("Pragma", "no-store");
response.setHeader("Expires", "0"); // 0ms 모든 언어에서 날짜는 ms로 환산
Date date = new Date(2020, 8, 4, 2, 20); //자바에서 월은 0부터 시작
response.setDateHeader("Expires", date.getTime());
Response Body
attr() 속성값 무조건 문자열
prop() 원래 데이터가 가지고있는 값 타입 그대로 true값 가지고있으면 prop 써야겠져
<책임 분리를 위한 구조들>SRP!
1. model2: 책임 분리돼서 req, resp에 대한 책임이 따로
view응답내보냄: JSP
요청받음 (servlet)
2. MVC:
모델: service+dao+vo
뷰: view
컨트롤러:
3. layered architecture
웨이터:controller, 뷰: 보여주기, service: 로직을 가지고있다 / db 가져오는 새끼주방장dao / db:ㅈ재료 저장
<h4>페이지 이동 방식 (흐름 제어)</h4>
<pre>
코드 상에서 a------>b 자연스럽게 이동. 클라이언트의 터치 필요없이
분류 기준: HTTP Protocol: stateless(무상태, 비상태 유지 )
1. Request Dispatch (상태를 유지하면서 이동.= 중간에 응답데이터가 나가면 안됨 )
<forward>
클라이언트 -> a에 요청 -> a가 b로 날림 -> b가 답 줌. 클라이언트는 b의 존재 모르고 a가 보내준 줄앎 (책임 위임 방식) /응답이 b에서 나왓더라도 a에서 나왔다고 생각함
*최초의 요청을 그대로 유지 (상태 유지)하면서 도착지로 이동하는 방식
RequestDispatcher rd = request.getRequestDispatcher("
//rd.forward(request, response);
rd.include(request, response); //a+b . b에서 a로 다시 올라가서 합함
2. Redirect (상태 유지 안 하고 다시 처음부터 들어온당 / 중간에 응답데이터가 나가야함 (끊겨야함))
클라이언트 -> 1에 요청-> 1이 클라이언트에게 응답 -> 다시 클라에서 2에 요청0> ...
Request에서 1ㅇ 클라에게 잠깐 줄댸 body가 있을 필요 없음. 그떄 302코드가 나옴 (MOVED)
302 나오면 location 찾고 2(b)에 다시 요청 발생 시킨다
req A / req B 완전히 다른 녀석임
* 최초의 요청에 대한 응답이 이동 전에 클라이언트로 전송 /
body는 없고, line(302,307)/header(location)로 구성된 응답이 전송
새로운 요청(B)가 클라이언트로부터 발생 : stateless
req A, req B 관련 전혀 없음. 왜냐 stateless한 http기때문
1. 내가 이동해야하는 도착지가 어디느냐 (web inf는 클라이언트가 direct로 들어갈수 없음. 무조건 404뜸)} 이 영역 아래에 jsp있으면 그거 404니까 다른 방식 생각해야함
2. 현재 정보를 유지할거냐 (다른 이유 외에도 현재 요청 정보를 유지해야한다면 request dispatch를 써야함)
에 따라 이동방식이 달라진다
BtsServlet에서 맵 가지고 btsList 로
client side에서는 WEB-INF로 다이렉트로 접근할 수 없다.
하나의 jsp에서 다른 jsp로 이동할때
dispatch forward,
dispatch include
redirect
이해하고 model2 이해해야