-
22-09-08_jsp(1)main 2022. 9. 8. 15:57
지금까지 serverside background 구성 위해 공부해옴.
50%는 요청 50%는 응답을 구성하는거
요청, 어떤 구조로 전달, 어떤 데이터 가지고있고
응답은 어떤 방식으로 포장되고 어떤 데이터 가지고 전달되는지
빈 종이를 펴시고 두개의 피어가 어떻게 소통하는지 ㄴ[?
요청이 몇개의 파트로 구성되고 각 파트 안에 들어가는 데이터 구조는 어떤게 있고 어떤 의미가 있는지 정리해보세요
(맞나?)
서로 다른 구조를 가진 두개의 피어가 소통...
Http라는 프로토콜에따라...
그리고필기를했는데 뭐지이게 .....ex)
1page는 UI까지 html소스 다 포함해서 가져옴
그 후에는 resource, 자원만 가져옴. 왜냐면 표현방식이 동일하니까. RESTful....
오늘할것
어제는 400번대 하나만 봤으니까 다른것도 보자
1) 200이라는 녀석을 만들어내고, 그 과ㅓㅇ에서 Http가 가진 단점을 찾아보자
2) 300번대 상태코드 보자
3) 500번대 상태코드보자. 그러면서 Exception에 대한걸... 500번은 서버에 문제가 생겼단 거고 거의 exception 문제니까 이걸 보자
--------------
415...server가 unmarshalling 할 능력이 없음
각 카테고리와 연관있는 헤더들도 같이 보자
---
200 : 요청에 대한 처리가 성공했다.
근데 이거 볼 떄 Response Header에 Refresh를 같이 보자
완전한 실시간 데이터가 아님 이걸 보완할 수 있는게 Refresh
HTTP 특성
1.- ConnectLess : request vs response(1:1) 현재 요청에 대한 응답이 전송된 후 연결 종료
이런 연결할때 통로가 생긴다고 하면, 서버는 불특정다수의 client와 연결을 계속함 그럼 통로가 계속생기고 부하가 많이 걸릴 것 그래서 통신끝나면 저거 닫아버림
2.- StateLess(비상태지향) :연결이 종료되면서 양 피어에 저장된 정보들이 삭제됨.
서버에 (1)통신 (2)통신 이렇게 발생한다 할때 서버는 통신하고 state를 저장을 안함.
같은 client에게서 온 통신인지 server는 구분할 수 없음
-> 이거 단점이라서 이걸 해결하기 위해, session, cookie 사용됨.
갱신되는 데이터를 클라이언트뭐라고요?ㅠ
refresh라는 헤더를 사용하는 이유인데..
이릏게 header 설정할때 ... <%@page import="java.util.Date"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <h4>현재 서버의 시간 : <%=new Date() %></h4> <pre> HTTP 특성 - ConnectLess : request vs response(1:1) 현재 요청에 대한 응답이 전송된 후 연결 종료 - StateLess(비상태지향) :연결이 종료되면서 양 피어에 저장된 정보들이 삭제됨. <% response.setIntHeader("Refresh", 1); %> </pre> </body> </html>
이렇게 하면
시간이 1초마다 갱신되서 시간이 자동으로 넘어가지만 페이지를 통째로 갱신시켜버리는거임.
그러면 이렇게 하면
<%@page import="java.util.Date"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta http-equiv="Refresh" content="1"> <title>05/autoRequest.jsp</title> </head> <body> <h4>현재 서버의 시간 : <%=new Date() %></h4> <pre> HTTP 특성 - ConnectLess : request vs response(1:1) 현재 요청에 대한 응답이 전송된 후 연결 종료 - StateLess(비상태지향) :연결이 종료되면서 양 피어에 저장된 정보들이 삭제됨. 주기적인 자동 요청 1. server side : Refresh 헤더 2. client side : 1) HTML meta 2) JavaScript <%-- response.setIntHeader("Refresh", 1); --%> </pre> </body> </html>
Refresh header는 안쓰는데 여전히 자동갱신이 잘됨.
이게 HTML meta 방식임
javascript 방식은 두가지인데...
일단 이렇게 하고 있음 <script type="text/javascript"> setInterval(function(){ }, milliseconds); </script>
아래 쟤는 람다방식이라 이렇게도 적을 수 있음
그래서
<%@page import="java.util.Date"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta http-equiv="Refresh" content="1"> <title>05/autoRequest.jsp</title> </head> <body> <h4>현재 서버의 시간 : <%=new Date() %></h4> <pre> HTTP 특성 - ConnectLess : request vs response(1:1) 현재 요청에 대한 응답이 전송된 후 연결 종료 - StateLess(비상태지향) :연결이 종료되면서 양 피어에 저장된 정보들이 삭제됨. 주기적인 자동 요청 1. server side : Refresh 헤더 2. client side : 1) HTML meta : http-equiv(Refresh) 2) JavaScript : Scheduling함수 timeout : 지연시간 설정하는 방식 interval(*) : 주기적 갱신 설정하는 방식 <%-- response.setIntHeader("Refresh", 1); --%> </pre> <script type="text/javascript"> setInterval(function(){ location.reload(); }, 1000); </script> </body> </html>
요렇게도 쓸 수 있음.
그런데 이렇게 하면 전체가 계속 갱신이라 그 페이지에서 동시에 다른 작업을 못함.
->비동기로 처리할 필요가 있음.
Lock...동기처리...
비동기....로..하려면...data오ㅓㅏ....ui가..분리가 되어야...
파란건 계속 변하는 동적 데이터고 빨간건 정적 데이터,. 그럼 일단 파란거 지우고 package kr.or.ddit.servlet05; import java.io.IOException; import java.util.Date; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class ServerTimeServlet */ @WebServlet("/getServerTimeServlet.html") public class ServerTimeServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); response.getWriter().append(new Date().toString()).close(); } }
이런걸 만들어줌
이렇게 동작함 --
어어ㅏㄱㅇㅁㄴㄹ...
--
<%@page import="java.util.Date"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <!-- <meta http-equiv="Refresh" content="1" > --> <title>Insert title here</title> <script type="text/javascript" src="<%=request.getContextPath() %>/resources/js/jquery-3.6.1.min.js"></script> </head> <body> <h4>현재 서버의 시간 : <span id="timeArea"></span></h4> <pre> HTTP 특성 - ConnectLess : request vs response(1:1) 현재 요청에 대한 응답이 전송된 후 연결 종료 - StateLess(비상태지향) :연결이 종료되면서 양 피어에 저장된 정보들이 삭제됨. 주기적인 자동 요청 1. server side : Refresh 헤더 2. client side : 1) HTML meta : http-equiv(Refresh) 2) JavaScript : Scheduling함수 timeout : 지연시간 설정하는 방식 interval(*) : 주기적 갱신 설정하는 방식 <%-- response.setIntHeader("Refresh", 1); --%> </pre> <script type="text/javascript"> let timeArea = $("#timeArea"); setInterval(function(){ // location.reload(); $.ajax({ url : "<%=request.getContextPath()%>/getServerTime.html", method : "get", dataType : "html", success : function(resp) { timeArea.html(resp); }, error : function(errorResp) { console.log(errorResp.status); } }); }, 1000); </script> </body> </html>
autoRequest.jsp
package kr.or.ddit.servlet05; import java.io.IOException; import java.util.Date; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class ServerTimeServlet */ @WebServlet("/getServerTime.html") public class ServerTimeServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // response.setIntHeader("Refresh", 1); response.setContentType("text/html;charset=UTF-8"); response.setHeader("Cache-Control", "no-store"); response.getWriter() .append(new Date().toString()) .close(); } }
ServerTimeServlet.java
no-store는 cache data 저장 안하겠다는것
C:\Users\PC-29\AppData\Local\Google\Chrome\User Data\Default\Cache\Cache_Data 여기에 캐시가 저장이안될것
cache 문제
1) ?
2) 보안
------------
???? 이젠 나도 모르겠다 후 이게 계속 캐시를 날리니까 글도 ㄴ날아가네 몇번을 날아가는거야
그러해ㅔㅆ다 뭔가 어디에 차이가있었다 그리고 또 글이 날아가서 못들었다
----------------
캐시제어
ㅎ
proxy???
프록시 서버라는 개념은 이렇게 가운데에 대리 서버가 있는거임 얘를 거쳐서 가야 함 이렇게 하면 진짜 서버가 프록시 서버라고 생각하고 이쪽에서 client가 request보냄
마찬가지로 server도 프록시가 client라고 생각함.
이녀석은 이 장점을 이용해서 넘어가는 데이터들을 다 까볼수도있고 위변조도 기록도 가능함
이게 프록시 서버라는개념임
-우리 수없이 많은 프록시 서버 사용함 예를들면 통신사..거쳐갈텐데 ....나한테는 기록 없어도 통신사한테는 다 남음...
---여러 지시자 등을 이용해서 캐시 정책 설정 가능
Cache-Control : HTTP 1.1, 캐시 정책 설정(캐시 데이터를 아주 디테일하진 않아도 어느정도 설정 가능...)
ex) max-age : 초단위 캐시 생존시간
public/private
no-store(아예저장X)/no-cache(일단저장,이후 서버에 물어봄. 이거 써도돼 안돼? 서버가 304넘기면 씀, 근데 200오면 캐시 가지고있어도 안씀)
Pragma : HTTP 1.0
Expires : HTTP 1.* ,캐시 데이터 만료 시간 설정.<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>05/cahceControl.jsp</title> </head> <body> <h4>캐시 제어</h4> <pre> Cache-Control : HTTP 1.1, 캐시 정책 설정(캐시 데이터를 아주 디테일하진 않아도 어느정도 설정 가능...) ex) max-age : 초단위 캐시 생존시간 public/private ==>304 상태코드로(response Body X) 서버의 데이터가 갱신되지 않았음을 알림 no-store(아예저장X)/no-cache(저장O) Pragma : HTTP 1.0 Expires : HTTP 1.* ,캐시 데이터 만료 시간 설정. <% response.setHeader("Cache-Control", "no-store"); response.setHeader("Pragma", "no-store"); response.setDateHeader("Expires", 0); // 0 -> 저장하지 마세요 %> </pre> </body> </html>
몰라 이런식으로 몰라 살려줘
'main' 카테고리의 다른 글
22-09-08_jsp(3) (0) 2022.09.08 22-09-08_jsp(2) (0) 2022.09.08 22-09-07_jsp(4) (0) 2022.09.07 22-09-07_jsp(3)_과제있음 (0) 2022.09.07 22-09-07_jsp(2) (0) 2022.09.07