2-21 비동기 프로그래밍 입문
1. 동기 방식과 비동기 방식
동기적(synchronous) 방식
- 현재 실행중인 코드가 끝나야 다음 코드를 실행하는 방식
- 일반적 프로그래밍 세계에서 코드는 모두 동기적으로 실행됨
비동기적(not synchronous) 방식
- 실행 중인 코드의 완료 여부와 무관하게 즉시 다음 코드로 넘어가는 방식
- setTimemout, addEventListner 등
- 별도의 요청, 실행 대기, 보류 등과 관련된 코드는 모두 비동기적 코드
- 대표적으로 서버 통신과 관련된 로직들을 포함함
ex) 중식집에서 배달 후 배달원이 다먹을때까지 기다렸다가 그릇을 회수하지 않고, 다른 집도 갔다가 다시 찾으러 오는 것과 비슷함
2. 콜백지옥
- 콜백함수를 익명함수로 전달하는 과정이 반복되어 코드의 들여쓰기 수준이 너무 높아지는 경우
- 주로 이벤트 처리 및 서버 통신과 같은 비동기적 작업을 수행할 때 발생
- 가독성, 수정이 어려움
=> 즉 이를 해결하기 위해 ES6 에서 Promise 객체가 나옴
=> 비동기 프로그래밍 = Promise 다룬다
2. Promise 객체
1. 개념
- 비동기 작업이 맞이할 미래의 완료 또는 실패와 그 결과값을 나타냄
왜 이름이 약속일까?
- 비동기 작업은 수행의 제어권을 제 3자에게 넘겨준 후 작업이 완료되면 안내를 받아 제어권을 이양받는 식의 일처리 방법
- 즉 약속에 따라 제어권을 넘겨주고 넘겨받는 것
- 그 약속에 관련된 사항들이 모두 Promise 객체에 담기게 됨
2. Promise 객체에 담기는 주요한 상태 정보
- 대기(pending) : 요청 직후. 아직 성공 또는 실패되지 않은 상태
- 이행(fulfilled) : 데이터 전달을 성공적으로 해 준 상태
- 거부(rejected) : 데이터 전달을 못해준 경우
3. Promise 객체 핸들링 방법
- 주요한 상태정보 3가지에 따라 적절한 처리를 해주어야 함
# then ~ catch
// http://api.naver.com/weather/today 로 요청을 한다고 가정합시다.
axios.get('http://api.naver.com/weather/today')
.then(response => {
console.log('정상처리 되었습니다 : ' + response);
})
.catch(error => {
console.log('오류가 발생하였습니다 : ' + error);
})
.finally(()=>{
console.log('항상 실행되는 부분입니다!');
});
axios.get 으로 요청을 보낸 후, 받아온 값이 promise 객체
성공하면 then으로 응답 값 출력
에러가 나오면 catch로 에러 출력
성공 여부와 상관없이 finally로 항상 실행
# acync ~ await
const getWeather = async () => {
try {
const response = await axios.get('http://api.naver.com/weather/today');
console.log('정상처리 되었습니다 : ' + response);
} catch (error) {
console.log('오류가 발생하였습니다 : ' + error);
}
}
함수 소괄호 앞에 async 붙여줌 -> 비동기함수구나!
중괄호 안에서 await를 만나면 그 구문이 끝날때까지 기다림
왜 써야 하는가?
- 코드에서는 일의 순서가 중요, 비동기프로그래밍을 동기적으로 작동해야 하는 경우 있음
2-22 REST (Path Variable, Query Parameter)
1. REST API란?
- REpresentational State Transfer의 약자
- 어떤 자원에 대해 CURD를 진행할 수 있게 HTTP Method(GET, POST, PUT, DELETE)를 사용하여 요청을 보내는 것
- 요청을 위한 자원은 특정한 형태로 표현된다.
- URI를 통해 자원을 표현하고, 자원의 행위를 HTTP Method로 명시한다.
자원(Resource) : URI
행위(Verb) : HTTP Method
표현(Representations)
2. 예시 - 좋은 예시 나쁜 예시
// bad
GET /members/delete/1
// good
DELETE /members/1
// bad
GET /members/show/1
// good
GET /members/1
// bad
GET /members/insert/2
// good
POST /members/2
3. 규칙
http://example.com/posts (O)
http://example.com/posts/ (X)
http://example.com/post (X)
http://example.com/get-posts (X)
--> URI는 명사를 사용하고 소문자로 작성되어야 한다.
--> 명사는 복수형을 사용한다.
--> URI의 마지막에는 /를 포함하지 않는다.
http://example.com/post-list (O)
http://example.com/post_list (X)
--> URI에는 언더바가 아닌 하이픈을 사용한다.
http://example.com/post/assets/example (O)
http://example.com/post/assets/example.png (X)
--> URI에는 파일의 확장자를 표시하지 않는다.
4. RestFul 하다는 것?
- REST API의 조건을 만족시킨 통신 설계 상태를 말함
- 그 누가 보더라도 이해하기 쉽고, 사용하기 쉬운 REST API일 때
5. RestFul 하지 못하다는 것?
- CRUD의 기능을 모두 POST 로만 이용하는 경우
- URI에 행위에 대한 부분이 들어가는 경우 (/classes/createPeople)
6. Path Variable vs Query Parameter
Path Variable
/user/10
- 경로 자체에 변수를 사용한 방법
- 전체 데이터 또는 특정 하나의 데이터를 다룰 때 처럼, 리소스를 식별하기 위해 사용
Query Parameter
/users?user_id=10
- 데이터를 정렬하거나 필터링하는 경우 적합
2-23 JSON과 비동기통신 실습 (NoSQL 설계 기초)
1. JSON이란?
- Javascript Object Notation
- 자바스크립트 객체 문법에 토대를 둔 문자 기반의 데이터 교환 형식
- 자바스크립트 객체 리터럴 작성법을 따르는 구조
{
"squadName": "Super hero squad",
"homeTown": "Metro City",
"formed": 2016,
"secretBase": "Super tower",
"active": true,
"members": [
{
"name": "Molecule Man",
"age": 29,
"secretIdentity": "Dan Jukes",
"powers": [
"Radiation resistance",
"Turning tiny",
"Radiation blast"
]
},
{
"name": "Madame Uppercut",
"age": 39,
"secretIdentity": "Jane Wilson",
"powers": [
"Million tonne punch",
"Damage resistance",
"Superhuman reflexes"
]
},
{
"name": "Eternal Flame",
"age": 1000000,
"secretIdentity": "Unknown",
"powers": [
"Immortality",
"Heat Immunity",
"Inferno",
"Teleportation",
"Interdimensional travel"
]
}
]
}
2. 메서드
- 자바스크립트 객체 -> JSON / JSON -> 자바스크립트 객체로 파싱하는 과정
JSON.stringify()
자바스크립트 객체 -> JSON 문자열 변환
console.log(JSON.stringify({ x: 5, y: 6 }));
// Expected output: "{"x":5,"y":6}"
console.log(JSON.stringify([new Number(3), new String('false'), new Boolean(false)]));
// Expected output: "[3,"false",false]"
console.log(JSON.stringify({ x: [10, undefined, function(){}, Symbol('')] }));
// Expected output: "{"x":[10,null,null,null]}"
console.log(JSON.stringify(new Date(2006, 0, 2, 15, 4, 5)));
// Expected output: ""2006-01-02T15:04:05.000Z""
JSON.parse()
JSON 문자열 -> 자바스크립트 객체
const json = '{"result":true, "count":42}';
const obj = JSON.parse(json);
console.log(obj.count);
// Expected output: 42
console.log(obj.result);
// Expected output: true
- 네트워크 통신의 결과로 받아온 JSON문자열을 프로그램 내부에서 사용하기 위해 JS 객체로 변환할 때 사용
3. JSON.placeholder
- 가짜 서버 (= fake, mock)로 JSON 기반 DB통신
import "./App.css";
import { useEffect, useState } from "react";
function App() {
const [data, setData] = useState([]);
useEffect(() => {
fetch("https://jsonplaceholder.typicode.com/posts")
.then((response) => {
console.log();
console.log("response.json()", response);
return response.json();
})
.then((json) => {
console.log("json", json);
setData([...json]);
});
}, []);
return (
<div>
{data.map((item) => {
return (
<div
style={{
border: "1px solid black",
margin: "3px",
}}
key={item.id}
>
<ul>
<li>userId : {item.userId}</li>
<li>id : {item.id}</li>
<li>title : {item.title}</li>
<li>body : {item.body}</li>
</ul>
</div>
);
})}
</div>
);
}
export default App;
'강의 > 스파르타코딩클럽' 카테고리의 다른 글
[리액트 숙련주차] 2-19~20 React Router Dom (1), (2) (6) | 2023.07.01 |
---|---|
[리액트 숙련주차] 2-12~18 Redux (1) | 2023.06.30 |
[리액트 숙련주차] 2-11 DOM과 Virtual DOM (0) | 2023.06.30 |
[리액트 숙련주차] 2-10 Lifecycle (1) | 2023.06.29 |
[리액트 숙련주차] 2-3~9 React Hooks (0) | 2023.06.29 |