[week_05] async/await๊ณผ API
elice/WIL

[week_05] async/await๊ณผ API

1. async/await

  • Promise๋ฅผ ํ™œ์šฉํ•œ ๋น„๋™๊ธฐ ์ฝ”๋“œ๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ž‘์„ฑํ•˜๋Š” ๋ฌธ๋ฒ•
  • async/await ๋ฌธ๋ฒ•์œผ๋กœ ๋น„๋™๊ธฐ ์ฝ”๋“œ๋ฅผ ๋™๊ธฐ ์ฝ”๋“œ์ฒ˜๋Ÿผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ž‘์„ฑ ๊ฐ€๋Šฅ
  • await ํ‚ค์›Œ๋“œ๋Š” ๋ฐ˜๋“œ์‹œ async ํ•จ์ˆ˜ ์•ˆ์—์„œ๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•จ
  • async๋กœ ์„ ์–ธ๋œ ํ•จ์ˆ˜๋Š” ๋ฐ˜๋“œ์‹œ Promise๋ฅผ ๋ฆฌํ„ด
  • async function asyncFunc() {
    	let data = await fetchData();
        let user = await;
        fetchUser(data);
        return user;
    }
  • async ํ•จ์ˆ˜๋Š” function ํ‚ค์›Œ๋“œ ์•ž์— async๋ฅผ ๋ถ™์—ฌ ๋งŒ๋“ ๋‹ค.
  • fetchData, fetchUser๋Š” Promise๋ฅผ ๋ฆฌํ„ด!
  • await ํ‚ค์›Œ๋“œ๋Š” then ๋ฉ”์„œ๋“œ ์ฒด์ธ์„ ์—ฐ๊ฒฐํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ์ˆœ์„œ๋Œ€๋กœ ๋™์ž‘
  • async function asyncFunc() {
    	let data1 = await fetchData1();
        let data2 = await fetchData2(data1);
        let data3 = await fetchData3(data2);
        return data3;
    }
    
    function promiseFunc() {
    	return fetchData1()
        	.then(fetchData2)
            .then(fetchData3);
    }
  • try-catch ๊ตฌ๋ฌธ์œผ๋กœ ์—๋Ÿฌ ์ฒ˜๋ฆฌ
  • async function asyncFunc() {
    	try {
        	let data1 = await fetchData1();
            return fetchData2(data1);
        } catch (e) {
        	console.log("์‹คํŒจ: ", e);
            // e = Promise์˜ catch ๋ฉ”์„œ๋“œ๊ฐ€ ๋ฐ›๋Š” ๋ฐ˜ํ™˜ ๊ฐ’๊ณผ ๋™์ผ
        }
    }

 

2. HTTP (Hypertext Transfer Protocol)

  • Web์—์„œ ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ๊ฐ„์˜ ํ†ต์‹ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •ํ•œ ๊ฒƒ
    • ํด๋ผ์ด์–ธํŠธ: ์›น ๋ธŒ๋ผ์šฐ์ € ๋“ฑ ์„œ๋ฒ„๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๋Œ€์ƒ
    • ์„œ๋ฒ„: ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญ์„ ๋ณด๋‚ด๊ธฐ ์ „๊นŒ์ง€ ๋Œ€์‘ X
  • ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด์—๋Š” ๋ฌด์ˆ˜ํžˆ ๋งŽ์€ ์š”์†Œ๊ฐ€ ์กด์žฌํ•˜๋ฉฐ, HTTP๋Š” ์ด๋Ÿฐ ์กด์žฌ๋“ค ์‚ฌ์ด์˜ ํ†ต์‹  ๋ฐฉ๋ฒ•์„ ๊ทœ์ •

2-1. HTTP Message

  • ์„œ๋ฒ„ ์ฃผ์†Œ, ์š”์ฒญ ๋ฉ”์„œ๋“œ, ์ƒํƒœ ์ฝ”๋“œ, target path, ํ—ค๋” ์ •๋ณด, ๋ฐ”๋”” ์ •๋ณด ๋“ฑ์ด ํฌํ•จ
  • ์š”์ฒญ ๋ฉ”์‹œ์ง€, ์‘๋‹ต ๋ฉ”์‹œ์ง€์˜ ๋ชจ์–‘์ด ๋‹ค๋ฆ„
  • HTTP/1.1 ๋ฉ”์‹œ์ง€๋Š” ์‚ฌ๋žŒ์ด ์ฝ์„ ์ˆ˜ ์žˆ์Œ

์ถœ์ฒ˜: https://developer.mozilla.org/ko/docs/Web/HTTP/Messages

2-2. HTTP Header

  • ์ฝ˜ํ…์ธ  ๊ด€๋ จ ์ •๋ณด, ์ธ์ฆ ๊ด€๋ จ ์ •๋ณด, ์ฟ ํ‚ค ์ •๋ณด, ์บ์‹œ ๊ด€๋ จ ์ •๋ณด ๋“ฑ
  • ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ๊ฐ„ ํ†ต์‹  ์‹œ ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ๋‹ด๋Š”๋‹ค.
  • ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ ์‹œ, ์„œ๋ฒ„ ์‘๋‹ต ์‹œ ๋ชจ๋‘ ํ—ค๋”์— ์ •๋ณด๋ฅผ ๋‹ด์„ ์ˆ˜ ์žˆ๋‹ค.

2-3. HTTP Status

  • HTTP ์š”์ฒญ ์‹œ, ํด๋ผ์ด์–ธํŠธ๋Š” ์š”์ฒญ์˜ ๊ฒฐ๊ณผ์— ๋Œ€ํ•œ ์ƒํƒœ ์ •๋ณด๋ฅผ ์–ป๋Š”๋‹ค.
  • 200, 400, 500 ๋“ฑ ์ˆซ์ž ์ฝ”๋“œ์™€, OK, NOT FOUND ๋“ฑ์˜ ํ…์ŠคํŠธ๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค.
  • ์ฝ”๋“œ๋ฅผ ์ด์šฉํ•ด ๊ฐ ๊ฒฐ๊ณผ์— ํ•ด๋‹นํ•˜๋Š” ํ–‰์œ„๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

2-4. ์š”์ฒญ ๋ฉ”์„œ๋“œ

  • HTTP์—์„œ, ํด๋ผ์ด์–ธํŠธ๋Š” ์„œ๋ฒ„๋กœ ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค.
  • ์š”์ฒญ ์‹œ ์š”์ฒญ ๋ฉ”์„œ๋“œ๋กœ ํŠน์ • ์š”์ฒญ์— ๋Œ€ํ•œ ๋™์ž‘์„ ์ •์˜ํ•œ๋‹ค.
  • GET, POST, PUT, PATCH, DELETE, OPTIONS, CONNECT, TRACE ๋“ฑ์ด ๊ทœ์ •๋œ๋‹ค.

 

3. REST API(Representational State Transfer API)

  • REST๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋งŒ๋“ค์–ด์ง„ API
  • REST API๋Š” HTTP์˜ ์š”์ฒญ ๋ฉ”์„œ๋“œ์— ์‘ํ•˜๋Š” ์„œ๋ฒ„ API์™€ ํด๋ผ์ด์–ธํŠธ ๊ฐ„ ํ†ต์‹ ์˜ ๊ตฌ์กฐ๊ฐ€ ์ง€์ผœ์•ผ ํ•  ์ข‹์€ ๋ฐฉ๋ฒ•์„ ๋ช…์‹œํ•œ ๊ฒƒ์ด๋‹ค.
  • ๊ตฌ์ฒด์ ์ธ ๋‚ด์šฉ์œผ๋กœ๋Š” ์š”์ฒญ ๋ฉ”์„œ๋“œ์˜ ์˜๋ฏธ, URI ์„ค๊ณ„, ํด๋ผ์ด์–ธํŠธ์˜ ์ƒํƒœ์— ๋Œ€ํ•œ ๋™์ž‘ ๋“ฑ์„ ์ •์˜ํ•œ๋‹ค.

3-1. REST(Represetational State Transfer)

  • ์ž์›์„ ์ด๋ฆ„์œผ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ํ•ด๋‹น ์ž์›์˜ ์ƒํƒœ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ๋ชจ๋“  ๊ฒƒ
  • HTTP URI(Uniform Resource Identifier)๋ฅผ ํ†ตํ•ด ์ž์›์„ ๋ช…์‹œํ•˜๊ณ , HTTP Method(POST, GET, PUT, DELETE)๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ์ž์›(URI)์— ๋Œ€ํ•œ CRUD Operation์„ ์ ์šฉํ•˜๋Š” ๊ฒƒ
  • REST์˜ ๊ตฌ์„ฑ ์š”์†Œ
    • 1. ์ž์›(Resource): HTTP URI
    • 2. ์ž์›์— ๋Œ€ํ•œ ํ–‰์œ„(Verb): HTTP Method
    • 3. ์ž์›์— ๋Œ€ํ•œ ํ–‰์œ„์˜ ๋‚ด์šฉ(Representations): HTTP Message Pay Load

3-2. API(Application Programming Interface)

  • ์‚ฌ์šฉ์ž๊ฐ€ ํŠน์ • ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œ๊ณตํ•˜๋Š” ํ•จ์ˆ˜
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ์šด์˜์ฒด์ œ, ๊ทธ๋ฆฌ๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ ์‚ฌ์ด์˜ ์ƒํ˜ธ ์ž‘์šฉ์„ ๋„์™€์ค€๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ ˆ์Šคํ† ๋ž‘์„ ๊ฐ„๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž. ์ ์›์ด ๊ฐ€์ ธ๋‹ค์ค€ ๋ฉ”๋‰ดํŒ์„ ๋ณด๋ฉด์„œ ์Šคํ…Œ์ดํฌ๋ฅผ ๊ณ ๋ฅด๋ฉด, ์ ์›์ด ์ฃผ๋ฌธ์„ ๋ฐ›์•„ ์š”๋ฆฌ์‚ฌ์—๊ฒŒ ์š”์ฒญํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์š”๋ฆฌ์‚ฌ๋Š” ์Šคํ…Œ์ดํฌ๋ฅผ ๋งŒ๋“ค์–ด ์ ์›์—๊ฒŒ ์ฃผ๊ณ , ์šฐ๋ฆฌ๋Š” ์ ์›์ด ๊ฐ€์ ธ๋‹ค์ค€ ๋ง›์žˆ๋Š” ์Šคํ…Œ์ดํฌ๋ฅผ ๋จน์„ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.
    • ์—ฌ๊ธฐ์„œ ์ ์›์˜ ์—ญํ• ์€? ์†๋‹˜์—๊ฒŒ ๋ฉ”๋‰ด๋ฅผ ์•Œ๋ ค์ฃผ๊ณ , ์ฃผ๋ฐฉ์— ์ฃผ๋ฌธ๋ฐ›์€ ์š”๋ฆฌ๋ฅผ ์š”์ฒญํ•œ๋‹ค. ๊ทธ ๋‹ค์Œ, ์ฃผ๋ฐฉ์—์„œ ์™„์„ฑ๋œ ์š”๋ฆฌ๋ฅผ ์†๋‹˜๊ป˜ ๋‹ค์‹œ ์ „๋‹ฌํ•œ๋‹ค.
    • API๋Š” ์—ฌ๊ธฐ์„œ์˜ ์ ์›๊ณผ ๊ฐ™์€ ์—ญํ• ์„ ํ•œ๋‹ค.
    • API๋Š” ์†๋‹˜(ํ”„๋กœ๊ทธ๋žจ)์ด ์ฃผ๋ฌธํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ”๋‰ด(๋ช…๋ น ๋ชฉ๋ก)๋ฅผ ์ •๋ฆฌํ•˜๊ณ , ์ฃผ๋ฌธ(๋ช…๋ น)์„ ๋ฐ›์œผ๋ฉด ์š”๋ฆฌ์‚ฌ(์‘์šฉ ํ”„๋กœ๊ทธ๋žจ)์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜์—ฌ ์š”์ฒญ๋œ ๋ฉ”๋‰ด(๋ช…๋ น์— ๋Œ€ํ•œ ๊ฐ’)๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.
    • ์ฆ‰, API๋Š” ํ”„๋กœ๊ทธ๋žจ๋“ค์ด ์„œ๋กœ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ๊ฒƒ์„ ๋„์™€์ฃผ๋Š” ๋งค๊ฐœ์ฒด์ด๋‹ค.

์ถœ์ฒ˜: https://blog.wishket.com/api%EB%9E%80-%EC%89%BD%EA%B2%8C-%EC%84%A4%EB%AA%85-%EA%B7%B8%EB%A6%B0%ED%81%B4%EB%9D%BC%EC%9D%B4%EC%96%B8%ED%8A%B8/

3-3. REST API ์š”์ฒญ ๋ฉ”์„œ๋“œ์˜ ์˜๋ฏธ

  • GET: ๋ฆฌ์†Œ์Šค ์ •๋ณด๋ฅผ ์–ป์Œ
  • POST: ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑ
  • PUT: ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธ
  • DELETE: ๋ฆฌ์†Œ์Šค๋ฅผ ์ œ๊ฑฐ

3-4. REST API์˜ ์„ค๊ณ„ ๊ฐ€์ด๋“œ

1. URI๋Š” ๋™์‚ฌ๋ณด๋‹ค๋Š” ๋ช…์‚ฌ๋ฅผ, ๋Œ€๋ฌธ์ž๋ณด๋‹ค๋Š” ์†Œ๋ฌธ์ž๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

๐Ÿ‘Ž Bad http://www.example.com/Running/
๐Ÿ‘ Good http://www.example.com/run/

2. ๋งˆ์ง€๋ง‰์— ์Šฌ๋ž˜์‹œ(/)๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๋Š”๋‹ค.

๐Ÿ‘Ž Bad http://www.example.com/test/
๐Ÿ‘ Good http://www.example.com/test

3. ์–ธ๋”๋ฐ” ๋Œ€์‹  ํ•˜์ดํ”ˆ(-)์„ ์ด์šฉํ•œ๋‹ค.

๐Ÿ‘Ž Bad http://www.example.com/test_value
๐Ÿ‘ Good http://www.example.com/test-value

4. ํŒŒ์ผํ™•์žฅ์ž๋Š” URI์— ํฌํ•จํ•˜์ง€ ์•Š๋Š”๋‹ค.

๐Ÿ‘Ž Bad http://www.example.com/test.jpg
๐Ÿ‘ Good http://www.example.com/test

5. ํ–‰์œ„๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๋Š”๋‹ค.

๐Ÿ‘Ž Bad http://www.example.com/delete-something/1
๐Ÿ‘ Good http://www.example.com/something/1

 

4. Fetch API

  • ๊ธฐ์กด์˜ XMLHTTPRequest๋ฅผ ๋Œ€์ฒดํ•˜๋Š” HTTP ์š”์ฒญ API
  • ES6์— ์ถ”๊ฐ€๋œ Promise๋ฅผ ๋ฆฌํ„ด
  • ๋„คํŠธ์›Œํฌ ์š”์ฒญ ์„ฑ๊ณต์‹œ, Promise๋Š” Response ๊ฐ์ฒด๋ฅผ resolve
  • ๋„คํŠธ์›Œํฌ ์š”์ฒญ ์‹คํŒจ์‹œ, Promise๋Š” ์—๋Ÿฌ๋ฅผ reject

4-1. Response ๊ฐ์ฒด

  • ๊ฒฐ๊ณผ์— ๋Œ€ํ•œ ๋‹ค์–‘ํ•œ ์ •๋ณด๋ฅผ ๋‹ด๋Š”๋‹ค.
  • response.ok: HTTP Status code๊ฐ€ 200-299 ์‚ฌ์ด๋ฉด true, ๊ทธ ์™ธ false
  • response.status: HTTP status code
  • response.url: ์š”์ฒญํ•œ URL ์ •๋ณด
  • response.headers: Response ๊ฐ์ฒด์˜ ํ—ค๋” ์ •๋ณด
  • response.json(): ์–ป์–ด์˜จ body ์ •๋ณด๋ฅผ json์œผ๋กœ ๋งŒ๋“œ๋Š” Promise๋ฅผ ๋ฐ˜ํ™˜
  • Promise๊ฐ€ resolve ๋˜๋ฉด ์–ป์–ด์˜จ body ์ •๋ณด๋ฅผ ์ฝ์Œ
  • .text(), .blob(), .formData() ๋“ฑ์˜ ๋ฉ”์„œ๋“œ๋กœ ๋‹ค๋ฅธ ํ˜•ํƒœ์˜ ๋ฐ”๋”” ์ฝ์Œ
  • fetch(url, options)๋กœ fetch ๋ฉ”์„œ๋“œ ์˜ต์…˜์„ ๋„ฃ๋Š”๋‹ค.
  • method ํ•„๋“œ๋กœ ์—ฌ๋Ÿฌ ์š”์ฒญ ๋ฉ”์„œ๋“œ ํ™œ์šฉ
  • headers, body ํ•„๋“œ๋ฅผ ํ™œ์šฉ โžก ์„œ๋ฒ„์— ์ถ”๊ฐ€ ์ •๋ณด ์ „์†ก
fetch(serverURL, {
	method: 'post',
    headers: {
    	'Content-Type': 'application/json; charset=utf-8',
        Authentication: 'mysecret'
    },
    body: JSON.stringify(formData)
})
	.then(response => {
    	return response.json()	
    })
    .then(json => {
    	console.log('POST ์š”์ฒญ ๊ฒฐ๊ณผ:', json)
    })

 

 

 

์ฐธ๊ณ 

https://khj93.tistory.com/entry/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-REST-API%EB%9E%80-REST-RESTful%EC%9D%B4%EB%9E%80