본문 바로가기

대덕공부/Spring

Refresh를 이용한 auto request

동기 (Synchronous)와 비동기(Asynchronous)

  • 동기 방식은 서버에서 요청을 보냈을 때 응답이 돌아와야 다음 동작을 수행할 수 있다. 즉 A작업이 모두 진행 될때까지 B작업은 대기해야한다.
  • 비동기 방식은 반대로 요청을 보냈을 때 응답 상태와 상관없이 다음 동작을 수행 할 수 있다. 즉 A작업이 시작하면 동시에 B작업이 실행된다. A작업은 결과값이 나오는대로 출력된다.(비동기에서는 인터벌구조사용)

비동기적 코드의 실행 결과는 동기적 코드가 전부 실행 되고나서 값을 반환한다.

동기는 디자인이 비동기보다 간단하고 직관적일수 있지만 결과가 주어질 때 까지 아무것도 못하고 대기해야하는 문제가 있다. 비동기는 동기보다 복잡하지만 결과가 주어지는데 시간이 걸려도 그 시간동안 다른 작업을 할 수 있어서 보다 효율적일 수 있다.  

 

auto request 

화면의 전체에 락을 거는 동기요청과 안거는 비동기요청이있는데 auto request는비동기요청이다. 

<%@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>
<script type="text/javascript" src="<%=request.getContextPath() %>/resources/js/jquery-3.6.0.min.js"></script>
</head>
<body>
<h4> Refresh를 이용한 auto request </h4>
<h4> 현재 서버의 시간 : <%=new Date() %></h4>
<h4> 비동기 요청으로 갱신되는 시간 : <span id="timeArea"></span></h4>
<input type="button" value="start" id="start" class="control">
<input type="button" value="stop" id="stop" class="control">

<pre>
   1. Refresh를 이용한 서버사이드 방식의 auto
   <%--
      response.setIntHeader("Refresh", 1);
   --%>
   2. 클라이언트 사이드 방식 auto
<!--       1) HTML meta tag <meta http-equiv="Refresh" content="3;url=https://www.naver.com" > -->
      2) JavaScript의 scheduling 함수 : 
</pre>
<script type="text/javascript">
//    setTimeout(() => {
//       location.reload();
//    }, 1000);
   let timeArea = $('#timeArea');
   let jobId = null;
   $(".control").on("click",function(event){
// 	   this.id
		let btnId = $(this).prop("id");
		if(btnId == "start"){
			jobId = setInterval(function(){
			      $.ajax({
			         url : "getServerTime.jsp",
			         // default 'get'
			         dataType : "json" // text, html, json, xml, script -> main type : text, 파일 업로드 처리를 비동기로? (FormData)
			         ,
			         success : function(resp, status, jqXHR) {
			            timeArea.html(resp.time);
			         },
			         error : function(jqXHR, status, error) {
			            console.log(jqXHR);
			            console.log(status);
			            console.log(error);
			         }
			      });
			   }, 1000);
		}else{
			clearInterval(jobId);
		}
   });
  
</script>
</body>
</html>

 

1. Refresh를 이용한 서버사이드 방식의 auto

response.setIntHeader("Refresh", 1);

1초마다 refresh되어서 1초단위로 요청이 들어오는것을 볼 수있다.

2. 클라이언트 사이드 방식 auto

1) HTML meta tag 

<meta http-equiv="Refresh" content="3;url=https://www.naver.com" >

3초뒤에 네이버로 이동

 

 2) JavaScript의 scheduling 함수 : 

</pre>
<script type="text/javascript">
//    setTimeout(() => {
//       location.reload();
//    }, 1000);
   let timeArea = $('#timeArea');
   let jobId = null;
   $(".control").on("click",function(event){
// 	   this.id
		let btnId = $(this).prop("id");
		if(btnId == "start"){
			jobId = setInterval(function(){
			      $.ajax({
			         url : "getServerTime.jsp",
			         // default 'get'
			         dataType : "json" // text, html, json, xml, script -> main type : text, 파일 업로드 처리를 비동기로? (FormData)
			         ,
			         success : function(resp, status, jqXHR) {
			            timeArea.html(resp.time);
			         },
			         error : function(jqXHR, status, error) {
			            console.log(jqXHR);
			            console.log(status);
			            console.log(error);
			         }
			      });
			   }, 1000);
		}else{
			clearInterval(jobId);
		}
   });
  
</script>

start버튼누르면 비동기요청으로 시간이가다가 stop을 누르면 요청이 멈춤