동기식 처리 모델은
직렬적
으로 일(task)을 수행한다. 즉, 태스크는 순차적으로 실행되며 어떤 작업이 수행 중이면 다음 작업은 대기하게 된다.
만약 서버에서 데이터를 가져와서 화면에 표시하는 작업을 수행할 때, 서버에 데이터를 요청하고 데이터가 응답될 때까지 이후 태스크들은
블로킹(blocking, 작업중단)
이 된다.
아래는 동기식으로 동작하는 코드이다. 직렬적 = 순차적으로 진행되기 때문에 콘솔에
Hello1 → Hello2 → Hello3
순서로 출력된다.
function hello1() {
console.log('hello1');
func2();
}
function hello2() {
console.log('hello2');
func3();
}
function hello3() {
console.log('hello3');
}
hello1();
비동기식 처리 모델은 동기식과 반대로 병렬적으로 태스크를 수행한다. 즉, 태스크가 종료되지 않은 상태라 하더라도 대기하지 않고 다음 태스크를 실행한다.
만약 서버에서 데이터를 가져와서 화면에 표시하는 태스크를 수행할 때, 서버에 데이터를 요청한 이후 서버로부터 데이터가 응답될 때까지 대기하지 않고(Non-Blocking) 즉시 다음 태스크를 수행한다. 이후 서버로부터 데이터가 응답되면 이벤트가 발생하고, 이벤트 핸들러가 데이터를 가지고 수행할 태스크를 계속해 수행한다.
페이지 리로드의 경우 전체 리소스를 다시 불러와야하는데 이미지, 스크립트 , 기타 코드등을 모두 재요청할 경우 불필요한 리소스 낭비가 발생하게 되지만
비동기식 방식을 이용할 경우 필요한 부분만 불러와 사용할 수 있으므로 매우 큰 장점이 있다.
자바스크립트의
DOM 이벤트 핸들러
와Timer 함수(setTimeout, setInterval)
그리고Ajax
요청은 비동기식 처리 모델로 동작한다.
그리고 아래 코드는 비동기식으로 처리 되기 때문에 콘솔에Hello1 → Hello3 → Hello2
순서로 출력된다.
비동기적 코드가 다른 코드가 실행되는 동안 처리가 계속 진행되지만 그 결과는 동기적 코드가 전부 실행 되고나서 값을 반환하기 때문이다.
function hello1() {
console.log('hello1');
func2();
}
function hello2() {
setTimeout(function() {
console.log('hello2');
}, 0);
func3();
}
function hello3() {
console.log('hello3');
}
hello1();
👉 코드 해석
Ajax
,자바스크립트의 라이브러리
중 하나이며 Asynchronous Javascript And XML의 약자이다. 자바스크립트를 통해서 서버에 데이터를비동기 방식
으로 요청한다.
웹페이지 속도향상
JSON
,XML
,HTML
,텍스트 파일
등이 있다.$.ajax({
url: "",
type: "",
cache: ,
dataType: "",
data: "",
success: function(res){
},
error: function (request, status, error){
}
});
👉 url
: 요청이 전송될 URL주소를 작성한다.
👉 type
: 데이터 전송방식( GET 또는 POST )을 작성한다.
👉 cache
: 요청 페이지의 캐시 여부(false 또는 true)를 작성한다.
👉 datatype
: 서버에서 받아올 데이터를 어떤 형태(xml, json, html, script)로 해석할 것인지를 작성한다.
👉 data
: 서버에 전송하고 싶은 데이터를 작성한다.
👉 success
: Ajax 통신에 성공했을 때 실행되는 이벤트 (함수의 인자로 응답본문을 받는다.)
👉 error
: Ajax 통신에 실패했을 때 실행되는 이벤트 (request, status, error로 에러 정보를 확인할 수 있다.)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ajax</title>
<script src="../js/jquery-3.6.0.min.js"></script>
<script>
$().ready(function(){
$("#sendData").click(function(){
// json 형식으로 데이터를 전송할 형식 지정
var params = {
id : $("#id").val() ,
pwd : $("#pwd").val(),
account : $("#account").val()
}
// ajax 통신
$.ajax({
url : "ajaxEx02Pro.jsp",
type : "post",
data : params,
success: function(){
alert("성공하였습니다.");
$("#id , #pwd , #account").prop("disabled" , true);
},
error : function(){
alert("통신이 실패하였습니다.");
}
});
});
});
</script>
</head>
<body>
<form>
<fieldset>
<p><label for="id">id : </label><input type="text" id="id"></p>
<p><label for="pwd">pwd : </label><input type="password" id="pwd"></p>
<p><label for="account">account : </label><input type="text" id="account"></p>
<input type="button" id="sendData" value="데이터 전송">
</fieldset>
</form>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ajaxPro</title>
</head>
<body>
<%
request.setCharacterEncoding("utf-8");
System.out.println("--- 전송된 데이터 확인 ---");
System.out.println("id : " + request.getParameter("id"));
System.out.println("pwd : " + request.getParameter("pwd"));
System.out.println("account : " + request.getParameter("account"));
System.out.println();
%>
</body>
</html>
👉 콘솔에서 출력된 값=Ajax로 받은 값!
자바스크립트에서 객체를 만들 때 사용하는 표현식이다. JSON으로 가져올 수 있는 데이터는 해당 자바스크립트가 로드된 서버의 데이터에 한정되어 있다.
{ name1 : value2 , name2 : value2 , name3 : value3... }
타입 | 설명 |
---|---|
Number | JavaScript에서 배정되는 정밀한 부동 소수점 형식 |
String | 큰 따옴표를 사용한 유니코드 |
Boolean | true 또는 false |
Array | 연속된 값들의 정렬 |
Value | string, number, true 또는 false, null 등 |
Object | 정렬되지 않은 key:value 콜렉션 |
Whitespace | 토큰쌍 사이에서 사용 가능 |
null | 비었음 |
메소드 | 내용 |
---|---|
JSON.parse(SON 형식의 텍스트) | (파싱) 문자열을 자바스크립트의 데이터로 변환한다. |
JSON.stringify(JSON 형식(문자열)으로 변환할 값) | (문자열화) 자바스크립트의 데이터를 문자열로 변환한다. |
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSON 기초</title>
<script src="../js/jquery-3.6.0.min.js"></script>
<script>
$(document).ready(function(){
var product = {
productCode : "0000-1362",
productName : "samsung TV",
quantity : 777,
isSoldOut : false,
tvSize : [30,50,70]
};
console.log(product);
console.log(product["productCode"]);
console.log(product["productName"]);
console.log(product["quantity"]);
console.log(product["isSoldOut"]);
console.log(product["tvSize"]);
console.log(product["tvSize"][0]);
console.log(product["tvSize"][1]);
console.log(product["tvSize"][2]);
console.log("");
product["productCode"] = "0000-1363";
product["productName"] = "samsung smart TV";
product["quantity"] = 0;
product["isSoldOut"] = true;
console.log(product);
console.log(product["productCode"]);
console.log(product["productName"]);
console.log(product["quantity"]);
console.log(product["isSoldOut"]);
console.log(product["tvSize"]);
console.log(product["tvSize"][0]);
console.log(product["tvSize"][1]);
console.log(product["tvSize"][2]);
console.log("");
});
</script>
</head>
<body>
</body>
</html>