์๋ฒ์ ํด๋ผ์ด์ธํธ ๊ฐ์ ๋ฐ์ดํฐ ๊ตํ์ ๋น๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ๋ฐฉ์
๋๊ธฐ ๋ฐฉ์์์๋ ์์ฒญ์ ๋ณด๋ธ ํ ์๋ฒ์ ์๋ต์ ๊ธฐ๋ค๋ฆฌ๋ ๋์ ํด๋ผ์ด์ธํธ ์ธก ์ฝ๋๊ฐ ๊ณ์ ์คํ๋๋ฉฐ, ์๋ฒ์ ์๋ต์ด ๋์ฐฉํ๋ฉด ๊ทธ๋ ๋ณ๋๋ก ์๋ต์ ์ฒ๋ฆฌ
Non-blocking(๋น์ฐจ๋จ): ์์ฒญ์ ๋ณด๋ธ ํ ์๋ต์ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ๋ค๋ฅธ ์์
์ ๊ณ์ ์ํํ ์ ์์
์ฑ๋ฅ ํฅ์: UI๊ฐ ์๋ตํ์ง ์๋ ๋ฌธ์ (์๋ต ์ง์ฐ)๊ฐ ์ค์ด๋ค์ด ์ฌ์ฉ์ ๊ฒฝํ์ด ๊ฐ์ ๋จ
์๋ฒ์์ ํจ์จ์ ํต์ : ํ์ํ ๋ฐ์ดํฐ๋ง ๋น๋๊ธฐ์ ์ผ๋ก ๋ถ๋ฌ์ฌ ์ ์์ผ๋ฏ๋ก, ํ์ด์ง ์ ์ฒด๋ฅผ ๋ค์ ๋ก๋ํ ํ์๊ฐ ์์
Ajax (Asynchronous Javascript And XML)
Ajax๋ ์ธ์ด๋ ํ๋ ์์ํฌ๊ฐ ์๋ ๊ตฌํํ๋ ๋ฐฉ์์ ์๋ฏธ
Ajax๋ ์น์์ ํ๋ฉด์ ๊ฐฑ์ ํ์ง ์๊ณ ๋ฐ์ดํฐ๋ฅผ ์๋ฒ๋ก๋ถํฐ ๊ฐ์ ธ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์๋ฏธ
์๋ฒ๋ก๋ถํฐ ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ CSR ๋ฐฉ์์ ํตํด ํ์ด์ง์ ๋์ ์ผ๋ก ์ ์ฉ
JavaScript์ XMLHttpRequest ๊ฐ์ฒด๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๊ณ ๋น๋๊ธฐ ๋ฐฉ์์ผ๋ก ๊ฒฐ๊ณผ๋ฅผ ์กฐํ
ํ๋ฉด ๊ฐฑ์ ์ด ์์ผ๋ฏ๋ก ์ฌ์ฉ์ ์
์ฅ์์๋ ํธ๋ฆฌํ์ง๋ง, ๋์ ์ผ๋ก DOM์ ๊ตฌ์ฑํด์ผ ํ๋ฏ๋ก ๊ตฌํ์ด ๋ณต์ก
์ผ๋ฐ ์์ฒญ์ ๋ํ ์๋ต
data ์
๋ ฅ ํ event ๋ฐ์
Ajax๋ฅผ ์ ์ฉํ์ง ์์ ์์ฒญ์ ์๋ฒ์์ data๋ฅผ ์ด์ฉํ์ฌ logic ์ฒ๋ฆฌ
๋ก์ง ์ฒ๋ฆฌ์ ๋ํ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ ์๋ต page๋ฅผ ์์ฑํ๊ณ client์ ์ ์ก
Ajax ์์ฒญ์ ๋ํ ์๋ต
data ์
๋ ฅ ํ event ๋ฐ์
Ajax๋ฅผ ์ ์ฉํ๋ฉด event ๋ฐ์์ ์๋ฒ์์ ์์ฒญ์ ์ฒ๋ฆฌํ ํ Text, XML ๋๋ JSON์ผ๋ก ์๋ต
ํด๋ผ์ด์ธํธ์์๋ ์ด ์๋ต data๋ฅผ ์ด์ฉํ์ฌ ํ๋ฉด ์ ํ ์์ด ํ์ฌ ํ์ด์ง์์ ๋์ ์ผ๋ก ํ๋ฉด์ ์ฌ๊ตฌ์ฑ
์น ํ๋ฉด์ ๊ตฌ์ฑํ๋ ๋ฐฉ์์ ์๋ฒ ์ค์ฌ์ ์ํธ์์ฉ ๋ฐฉ์๊ณผ ํด๋ผ์ด์ธํธ ์ค์ฌ์ ์ํธ์์ฉ ๋ฐฉ์์ผ๋ก ๊ตฌ๋ถ
SSR (Server Side Rendering)
์๋ฒ ์ค์ฌ์ ๊ฐ๋ฐ ๋ฐฉ์์ ํ๋ฉด ๊ตฌ์ฑ์ด ์๋ฒ์์ ์ด๋ฃจ์ด์ง
ํ๋ ์ ํ
์ด์
์์ญ์ JSP๋ PHP, ASP ๋ฑ
CSR (Client Side Rendering)
ํด๋ผ์ด์ธํธ ์ค์ฌ์ ๊ฐ๋ฐ๋ฐฉ์์ ํด๋ผ์ด์ธํธ์์ ํ๋ฉด์ ๊ตฌ์ฑ
Ajax๋ ํด๋ผ์ด์ธํธ ์ค์ฌ์ ๊ฐ๋ฐ ๋ฐฉ์์ด๋ฉฐ ๋น๋๊ธฐ ์์ฒญ๋ณด๋ค๋ ๋์ ํ๋ฉด๊ตฌ์ฑ์ด ๊ด๊ฑด์
XMLHttpRequest ์ด์ฉ ๋ฐฉ์ (Browser)
fetch() ์ด์ฉ ๋ฐฉ์ (Browser)
์ธ๋ถ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ด์ฉ ๋ฐฉ์ - jQuery, axios
๋น๋๊ธฐ ํต์ ์ฌ์ฉ ๊ฐ์ฒด (XMLHttpReqeust)
๋น๋๊ธฐ ํต์ ์ ๊ตฌํํ ๋ ์ฌ์ฉ๋๋ ์ฃผ์ ๊ฐ์ฒด
์ด ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ฉด ์น ํ์ด์ง๊ฐ ๋ค์ ๋ก๋๋์ง ์๊ณ ๋ ์๋ฒ์ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ ์ ์์
XML๋ฟ๋ง ์๋๋ผ JSON, HTML, plain text ๋ฑ ๋ค์ํ ํ์์ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ ์ ์์
XMLHttpRequest๋ ๋น๊ต์ ๋ณต์กํ API๋ฅผ ์ ๊ณตํ๋ฉฐ, ๋ ๊ฐ๊ฒฐํ๊ณ ํ๋์ ์ธ ๋์ฒด API๋ก fetch๊ฐ ๋ง์ด ์ฌ์ฉ๋จ
// XMLHttpRequest ๊ฐ์ฒด ์์ฑ
var xhr = new XMLHttpRequest ( ) ;
// ์์ฒญ ์ด๊ธฐํ: 'POST' ์์ฒญ์ ๋ณด๋ผ URL ์ง์
xhr . open ( 'POST' , 'https://jsonplaceholder.typicode.com/posts' , true ) ;
// ์์ฒญ ํค๋ ์ค์ (๋ณด๋ด๋ ๋ฐ์ดํฐ๊ฐ JSON์์ ๋ช
์)
xhr . setRequestHeader ( 'Content-Type' , 'application/json; charset=UTF-8' ) ;
// ์์ฒญ์ด ์๋ฃ๋์์ ๋ ์คํ๋ ์ฝ๋ฐฑ ํจ์ ์ ์
xhr . onreadystatechange = function ( ) {
if ( xhr . readyState === XMLHttpRequest . DONE ) {
if ( xhr . status === 201 ) {
// ์์ฒญ์ด ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋ ๊ฒฝ์ฐ (201 Created)
console . log ( 'Response:' , xhr . responseText ) ;
// JSON ๋ฐ์ดํฐ๋ก ๋ณํํ์ฌ ์ฌ์ฉ
var data = JSON . parse ( xhr . responseText ) ;
console . log ( 'Created Post ID:' , data . id ) ;
} else {
// ์์ฒญ์ด ์คํจํ ๊ฒฝ์ฐ
console . error ( 'Request failed. Status:' , xhr . status ) ;
}
}
} ;
// ์ ์กํ ๋ฐ์ดํฐ ๊ฐ์ฒด ์์ฑ
var postData = {
title : 'foo' ,
body : 'bar' ,
userId : 1
} ;
// ์์ฒญ ์ ์ก (JSON ๋ฐ์ดํฐ๋ก ์ง๋ ฌํํ์ฌ ์ ์ก)
xhr . send ( JSON . stringify ( postData ) ) ;
JavaScript XMLHttpRequest AJAX
XMLHttpRequest ๋ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ Ajax ๋ฐฉ์์ผ๋ก ํต์ ํ ๋ ์ฌ์ฉํ๋ ๊ฐ์ฒด
XMLHttpRequest ๊ฐ์ฒด๋ Ajax ํต์ ์ ์ ์ก๋ฐฉ์, ๊ฒฝ๋ก, ์๋ฒ๋ก ์ ์กํ data ๋ฑ ์ ์ก ์ ๋ณด๋ฅผ ๋ด๋ ์ญํ
์ค์ ์๋ฒ์์ ํต์ ์ ๋ธ๋ผ์ฐ์ ์ Ajax ์์ง์์ ์ํ
์ง์ ์๋ฐ์คํฌ๋ฆฝํธ๋ก Ajax๋ฅผ ํ๋ก๊ทธ๋๋ฐํ ๊ฒฝ์ฐ ๋ธ๋ผ์ฐ์ ๋ณ๋ก ํต์ ๋ฐฉ์์ด ๋ฌ๋ผ ์ฝ๋๊ฐ ๋ณต์กํด์ง
Ajax httpRequest ์์ฑ๊ฐ
๊ฐ
์ํ
์ค๋ช
0
Uninitialized
๊ฐ์ฒด๋ง ์์ฑ (open ๋ฉ์๋ ํธ์ถ ์ )
1
Loading
open ๋ฉ์๋ ํธ์ถ
2
Loaded
send ๋ฉ์๋ ํธ์ถ, status์ ํค๋๊ฐ ์์ง ๋์ฐฉ๋์ง ์์
3
Interactive
๋ฐ์ดํฐ ์ผ๋ถ๋ฅผ ๋ฐ์ ์ํ
4
Completed
๋ฐ์ดํฐ ์ ๋ถ๋ฅผ ๋ฐ์ ์ํ
์ฝ๋
์ํ
์ค๋ช
200
OK
์์ฒญ ์ฑ๊ณต
403
Forbidden
์ ๊ทผ ๊ฑฐ๋ถ
404
Not Found
ํ์ด์ง ์์
500
Internal Server Error
์๋ฒ ์ค๋ฅ ๋ฐ์
๋ธ๋ผ์ฐ์ ์์ fetch() ํจ์๋ฅผ ์ง์ํ๊ธฐ ์ด์ ์๋ XMLHttpRequest๋ฅผ ์ด์ฉํ์ฌ ์ง์ HTTP ์์ฒญํ๊ณ ์๋ต์ ์ง์ ๊ตฌํ
๋ณต์กํ ๊ตฌํ๋๋ฌธ์ jQuery์ axios ๋ฑ๊ณผ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ
๋ธ๋ผ์ฐ์ ๊ฐ fetch() ํจ์๋ฅผ ์ง์ํ๋ฉด์ ์์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฐ์ง ์์๋ ๊ฐ๋จํ ๊ตฌํ ๊ฐ๋ฅ
fetch() ํจ์๋ ์ฒซ๋ฒ์งธ ์ธ์๋ก URL, ๋๋ฒ์งธ ์ธ์๋ก options ๊ฐ์ฒด๋ฅผ ๋ฐ์
options์ ์๋ฌด๊ฒ๋ ๋๊ธฐ์ง ์์ผ๋ฉด ์์ฒญ์ GET ๋ฐฉ์์ผ๋ก ์งํ๋๋ฉฐ url๋ก ๋ถํฐ content๊ฐ ๋ค์ด๋ก๋ ๋จ
์คํ ๊ฒฐ๊ณผ Promise ํ์
์ ๊ฐ์ฒด๋ฅผ ๋ฐํ
๋ฐํ๋ Promise ๊ฐ์ฒด๋ API ํธ์ถ์ด ์ฑ๊ณตํ์ ๊ฒฝ์ฐ ์๋ต ๊ฐ์ฒด๋ฅผ resolveํ๊ณ ์คํจํ์ ๊ฒฝ์ฐ ์์ธ ๊ฐ์ฒด๋ฅผ rejectํจ
ํด๋น ์ฒ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ํตํด ์ฝ๋ฐฑ ์ง์ฅ์ ํผํ๊ณ ๋น๋๊ธฐ ์์
์ ๋ณด๋ค ์ฝ๊ธฐ ์ฝ๊ฒ ์์ฑํ ์ ์๊ฒํจ
์๋ต ๋ณธ๋ฌธ(data) ๋ฐ๋ ๋ฐฉ๋ฒ
response.text() : ์๋ต์ ์ฝ๊ณ text๋ฅผ ๋ฐํ
response.json() : ์๋ต์ JSON ํ์์ผ๋ก ํ์ฑํจ
response.formData() : ์๋ต์ FormData ๊ฐ์ฒด ํํ๋ก ๋ฐํ
response.blob() : ์๋ต์ Blob ํํ๋ก ๋ฐํ
method option : POST ์ค์
headers option : Content-Type์ JSON ์ฌ๋ถ ์ค์
body option : ์์ฒญ data ๊ฐ์ JSON ํ์์ผ๋ก ์ง๋ ฌํ ํ์ฌ ์ค์
PUT ๋ฐฉ์์ ๊ฒฝ์ฐ method option ๋ง PUT์ผ๋ก ์์ ํ๊ณ ๋๋จธ์ง๋ ๊ฑฐ์ ๋น์ทํจ
PATCH ๋ฉ์๋๋ ๋ฆฌ์์ค์ ๋ถ๋ถ์ ์ธ ์
๋ฐ์ดํธ๋ฅผ ์ํ. ๋ณ๊ฒฝํ๊ณ ์ ํ๋ ๋ฐ์ดํฐ๋ง ์๋ฒ๋ก ๋ณด๋
PUT ๋ฉ์๋๋ ์ง์ ๋ ๋ฆฌ์์ค๋ฅผ ๋์ฒดํ๊ฑฐ๋, ๋ฆฌ์์ค๊ฐ ์กด์ฌํ์ง ์์ผ๋ฉด ์๋ก ๋ง๋ฌ
// POST ์์ฒญ ์์
fetch ('https://example.com/api/data' , {
method : 'POST' , // HTTP ๋ฉ์๋ (POST)
headers : {
'Content-Type' : 'application/json' // ์์ฒญ์ด JSON ๋ฐ์ดํฐ์์ ๋ช
์
},
body : JSON .stringify ({ name : 'John' , age : 30 }) // ์์ฒญ ๋ณธ๋ฌธ์ JSON ๋ฌธ์์ด๋ก ์ง๋ ฌํ
})
.then (response => {
if (!response .ok ) {
throw new Error ('Network response was not ok' );
}
return response .json (); // ์๋ต์ JSON ํ์์ผ๋ก ํ์ฑ
})
.then (data => {
console .log ('Success:' , data ); // ์ฑ๊ณต์ ์ผ๋ก ์ฒ๋ฆฌ๋ ์๋ต ๋ฐ์ดํฐ
})
.catch (error => {
console .error ('Error:' , error ); // ์์ฒญ ์คํจ ์ ์๋ฌ ์ฒ๋ฆฌ
});
Promise ๋ ๋น๋๊ธฐ ์์
์ ์๋ฃ ๋๋ ์คํจ๋ฅผ ๋ํ๋ด๋ ๊ฐ์ฒด
๋น๋๊ธฐ ์์
์ ๊ด๋ฆฌํ๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ฒ๋ฆฌํ๋๋ฐ ์ฌ์ฉ๋จ. ์ฃผ๋ก ๋น๋๊ธฐ ์ฝ๋๋ฅผ ์์ฑํ ๋ ์ฝ๋ฐฑ ํจ์ ๋์ ์ฌ์ฉ๋์ด ๊ฐ๋
์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ํฅ์์ํด
Promise๋ ์ด 3๊ฐ์ ์ํ๋ฅผ ๊ฐ์ง
Pending(๋๊ธฐ) : ์ค์ ์์
์ ์ํ ์ค๋น ๋จ๊ณ๋ก Promise ๊ฐ์ฒด ์์ฑ ๋ฐ fulfilled, rejected ์ํฉ์์ ํธ์ถํ handler ํจ์ ๋ฐ์ธ๋ฉํจ
Fulfilled(์ดํ) : ๋์์ด ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋ ์ํ๋ก 'resolve'๊ฐ ํธ์ถ๋ ์ํ
Rejected(๊ฑฐ๋ถ) : ๋์์ด ์คํจํ ์ํ๋ก 'reject'๊ฐ ํธ์ถ๋ ์ํ
Promise ๊ฐ์ฒด์ ์์ฑ๊ณผ ํธ์ถ
Promise ํจ์๋ ์์ฑ์์ executor๋ผ๋ ํจ์๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ๋๋ฐ executor๋ ์ฆ์ ์คํ๋๋ ํจ์
executor๋ resolver์ rejecter ๋ผ๋ 2๊ฐ์ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ธ์๋ก ๋ฐ๋๋ฐ Promise๋ executor ๋ด๋ถ์์ ์ํฉ์ ๋ฐ๋ผ ์์
์ฑ๊ณต ์ resolver๋ฅผ, ์คํจ ์ rejecter๋ฅผ ํธ์ถํ๋ ๊ฒ์ ์ฝ์ํจ (ํ์คํ ํธ์ถ)
Promise๊ฐ ์ ์๋์ํด์ ํธ์ถ๋๋ resolver๋ handler์์ ์ฌ์ฉํ ๊ฐ ํ๋๋ฅผ ์ธ์๋ก ๋ฐ์
Promise๊ฐ ์คํจํด์ ๋์ํ๋ rejecter๋ ์คํจ ์ด์ ํ๋๋ฅผ ์ธ์๋ก ๋ฐ์
resolve(value): ๋น๋๊ธฐ ์์
์ด ์ฑ๊ณตํ์ ๋ ํธ์ถํ์ฌ value๋ฅผ ์ ๋ฌ
reject(reason): ๋น๋๊ธฐ ์์
์ด ์คํจํ์ ๋ ํธ์ถํ์ฌ reason(์คํจ ์ด์ )์ ์ ๋ฌ
then(onFulfilled, onRejected): Promise๊ฐ ์ฑ๊ณตํ๋ฉด onFulfilled๋ฅผ, ์คํจํ๋ฉด onRejected๋ฅผ ํธ์ถ
catch(onRejected): Promise๊ฐ ์คํจํ์ ๋ onRejected๋ฅผ ํธ์ถ. then(null, onRejected)์ ๋์ผ
finally(onFinally): Promise๊ฐ ์ฑ๊ณตํ๊ฑฐ๋ ์คํจํ ํ ๋ฌด์กฐ๊ฑด ์คํ๋๋ ํจ์
๋ฌธ์ ๋ 1์ด ํ์ ๋ 1์ด ํ์.. ์ด๋ฐ์์ผ๋ก ๊ณ์ callback ๋ด์์ ๋ค๋ฅธ callback ๋ด์์ ๋ค๋ฅธ callback ์ด ๋ถ๋ฌ์ผ ํ๋ ๊ฒฝ์ฐ ๋ฐ์
๋์์ ์ ๋์ง๋ง ์ถ์ ์ด ๋งค์ฐ ํ๋ค์ด์ง๋ ์ํ๋ฅผ callback hell ์ด๋ผ๊ณ ํจ
ํด๋น Callback Hell์ ํด๊ฒฐํ๊ธฐ ์ํด Promise ๊ฐ์ฒด๊ฐ ๋ฑ์ฅ
Server์ Client๋ ์ฃผ๊ณ ๋ฐ์ data์ ํ์์ ๋ง์ถฐ์ผํจ
๋ํ์ ์ธ data์ ํ์์ CSV, XML, JSON ๋ฑ์ด ์์
๊ฐ ํญ๋ชฉ์ ์ผํ(,)๋ก ๊ตฌ๋ถํด ๋ฐ์ดํฐ๋ฅผ ํํํ๋ ๋ฐฉ๋ฒ
๋ค๋ฅธ ๋ ํ์์ ๋นํด ๊ต์ฅํ ์งง์. ๋ง์ ์์ ๋ฐ์ดํฐ ์ ์ก ์ ์ ๋ฆฌ
๋จ, ๊ฐ๊ฐ์ ๋ฐ์ดํฐ๊ฐ ์ด๋ค ๋ด์ฉ์ธ์ง ํ์
ํ๊ธฐ ์ด๋ ค์ (์๋ฒ์ ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒฝํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๊ณต์ ํ ๊ฒฝ์ฐ ๊ฐ๋ฅ)
20201111, ํ๊ธธ๋, A, 90,
20201111, ํ๊ธธ๋2, B, 85,
XML์ ํ๊ทธ๋ก data๋ฅผ ํํํจ
tag๋ฅผ ๋ณด๋ฉด ๊ฐ data๊ฐ ๋ฌด์์ ์๋ฏธํ๋์ง ํ์
๊ฐ๋ฅ
tag์ ์ฌ์ฉ์ ์ ์ ์์ฑ์ ๋ฃ์ ์ ์์ผ๋ฏ๋ก ๋ณต์กํ data ์ ๋ฌ ๊ฐ๋ฅ
<students >
<student >
<id >2022111</id >
<name >ํ๊ธธ๋</name >
<class >A</class >
<grade >90</grade >
</student >
<student >
<id >2022111</id >
<name >ํ๊ธธ๋2</name >
<class >B</class >
<grade >85</grade >
</student >
</students >
CSV์ XML์ ๋จ์ ์ ๊ทน๋ณตํ ํ์
JS ์์ ์ฌ์ฉํ๋ ๊ฐ์ฒด์ ํ์์ผ๋ก data๋ฅผ ํํ
Ajax ์ฌ์ฉ์ ๊ฑฐ์ ํ์ค์ผ๋ก ์ฌ์ฉ๋๋ data ํํ ๋ฐฉ์
JSON์ ํน์ง
๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ ๋ ์ธ ์ ์๋ ๊ฐ์ฅ ๊ฐ๋จํ ํ์ผ ํฌ๋งท
ํ
์คํธ ๊ธฐ๋ฐ์ผ๋ก ์๋นํ ๊ฐ๋ฒผ์
์ฝ๊ธฐ ํธํจ
Key์ Value์ ์์ผ๋ก ๋์ด ์์
์๋ฒ์ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ ๋ ์ง๋ ฌํ, ์ญ์ง๋ ฌํ๋ฅผ ์ฌ์ฉ
ํ๋ก๊ทธ๋จ ์ธ์ด๋ ํ๋ซํผ์ ์๊ด์์ด ์ฌ์ฉ ๊ฐ๋ฅ
๋๊ธฐ ์์
์ ์ฝ๋๋ฅผ ํ์ค ํ์ค ์คํํ๋ฉด์ ์ด์ ์ฝ๋์ ๋์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์ ํ ๋ค์ ์ฝ๋๊ฐ ์คํ๋๋ ๊ตฌ์กฐ
2. ๋น๋๊ธฐ(Asynchronous)
๋น๋๊ธฐ ์์
์ ์ฝ๋๋ฅผ ์คํํ๋ค๊ฐ ์ด์ ์ฝ๋์ ๋์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์ง ์๊ณ ๋ฐ๋ก ๋ค์ ์ฝ๋๋ฅผ ์คํํ๋ ๊ตฌ์กฐ
// ๊ฐ๋จํ setTimeout ๋น๋๊ธฐ ์์
let num = 0 ;
setTimeout ( ( ) => {
console . log ( `์์
์งํ: ${ num ++ } ๋ฒ์งธ ์์
์งํ ..` ) ;
} , 1000 ) ;
console . log ( `์์
๊ฒฐ๊ณผ num: ${ num } ` ) ;
// setTimeout์ 1์ด ํ์ ์ฒ๋ฆฌ๋ ์์
(callback)์ ๋น ๋๊ธฐ๋ก ๋ง๋ค์ด์ ๋์ ธ๋ฒ๋ฆฌ๊ณ ๋ฐ๋ก "์์
๊ฒฐ๊ณผ .."๊ฐ ์ฝ์์ ์ถ๋ ฅ
async/await๋ ๋น๋๊ธฐ ์ฝ๋๋ฅผ ๋๊ธฐ ์ฝ๋์ฒ๋ผ ์์ฑํ ์ ์๊ฒ ํด์ฃผ์ด, ๊ฐ๋
์ฑ์ ํฌ๊ฒ ํฅ์์ํด
async ํค์๋๋ฅผ ํจ์ ์์ ๋ถ์ด๋ฉด ํด๋น ํจ์๋ ํญ์ Promise๋ฅผ ๋ฐํํจ. ํจ์ ๋ด๋ถ์์ returnํ ๊ฐ์ ์๋์ผ๋ก Promise.resolve๋ก ๊ฐ์ธ์ ธ ๋ฐํ๋จ
await ํํ์์ await ํค์๋๋ Promise๊ฐ ํด๊ฒฐ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆผ. await์ async ํจ์ ๋ด๋ถ์์๋ง ์ฌ์ฉํ ์ ์์
// Promise๋ฅผ ๋ฐํํ๋ ํจ์
function fetchData () {
return new Promise ((resolve , reject ) => {
setTimeout (() => {
resolve ("Data fetched!" );
}, 1000 );
});
}
// async/await ์ฌ์ฉ ์์
async function fetchDataAsync () {
try {
const result = await fetchData (); // fetchData()๊ฐ ์๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆผ
console .log (result ); // "Data fetched!" ์ถ๋ ฅ
} catch (error ) {
console .error ("Error:" , error );
} finally {
console .log ("Fetch attempt completed." );
}
}
fetchDataAsync ();
ํน์ง
Promise
async/await
๊ตฌ๋ฌธ
then, catch, finally ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ฒด์ธ์ผ๋ก ์ฐ๊ฒฐ
async ํจ์์ await ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑ
๊ฐ๋
์ฑ
๋น๋๊ธฐ ์์
์ด ์ค์ฒฉ๋๋ฉด ์ฝ๋ฐฑ ์ง์ฅ์ด ๋ฐ์ํ ์ ์์
๋๊ธฐ ์ฝ๋์ฒ๋ผ ์์ฑํ ์ ์์ด ๊ฐ๋
์ฑ์ด ์ข์
์๋ฌ ์ฒ๋ฆฌ
catch ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ฒ๋ฆฌ
try/catch ๋ธ๋ก์ ์ฌ์ฉํ์ฌ ๋๊ธฐ ์ฝ๋์ฒ๋ผ ์๋ฌ ์ฒ๋ฆฌ
์ง์ ํ๊ฒฝ
๋ชจ๋ JavaScript ํ๊ฒฝ์์ ์ฌ์ฉ ๊ฐ๋ฅ
ES2017(ES8) ์ด์์์ ์ง์, ๊ตฌํ ํ๊ฒฝ์์๋ ํด๋ฆฌํ ํ์
์ฌ์ฉ ๋ฐฉ์
๋น๋๊ธฐ ์์
์๋ฃ ํ ๋ค์ ์์
์ then์ผ๋ก ์ฐ๊ฒฐ
await ํค์๋๋ฅผ ์ฌ์ฉํด ๋น๋๊ธฐ ์์
์ด ์๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆผ
์ฝ๋ ์์ฑ ๋ฐฉ์
๋น๋๊ธฐ ์์
์ ์ฒด์ธ ํํ๋ก ์ฐ๊ฒฐ
๋๊ธฐ ์ฝ๋์ฒ๋ผ ์์ฐจ์ ์ผ๋ก ์์ฑ ๊ฐ๋ฅ