๋ง๋ค๊ธฐ ์ ๋ผ์ฐํ ๊ฐ๋ ์ ์ตํ๋ณด์
๋ผ์ฐํ
: URL ๋ฐ ํน์ ํ HTTP ์์ฒญ ๋ฉ์๋(GET,POST ๋ฑ)์ธ ํน์ ์๋ํฌ์ธํธ์ ๋ํ ํด๋ผ์ด์ธํธ ์์ฒญ์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์๋ตํ๋ ๋ฐฉ๋ฒ์ ๊ฒฐ์ ํ๋ ๊ฒ
Rest-API์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ์์ฒญ์ GET ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค.
์๋ํฌ์ธํธ๋ก get ์์ฒญ์ด ๋ค์ด์์๋, ๋ฐ์ดํฐ๊ฐ ์กฐํ ๋ ์ ์๋๋ก ์ฐ๋ฆฌ๋ ๋ก์ง์ ์ถ๊ฐํด ์ค์ผํ๋ค.
๋ณดํต ๋ฐ์ดํฐ๋ ํ๋์ ๊ฐ์ด ์๋ , ์ฌ๋ฌ ๊ฐ์ผ๋ก ๊ตฌ์ฑ๋์ด ์์ผ๋ฏ๋ก ๋ฐฐ์ด ์์ ๊ฐ์ฒด๊ฐ ๋ค์ด์๋ ํํ๊ฐ ๋๋ถ๋ถ์ด๋ค.
// get๋ฐฉ์์ API๋ฅผ ๋ง๋ค๊ฒ ๋ค
app.get('/boards', function (req, res) {
// 1.DB์ ์ ์ํ, ๋ฐ์ดํฐ๋ฅผ ์กฐํ => ๋ฐ์ดํฐ๋ฒ ์ด์ค ์กฐํํ๋ค๊ณ ๊ฐ์ .
const result = [
{ number: 1, writer: "cho", title: "์ ๋ชฉ์
๋๋ค", contents: "๋ด์ฉ์ด์์!" },
{ number: 2, writer: "jo", title: "๋ฐ๋ณด์
๋๋ค", contents: "๋ฐ๋ณด์์!" },
{ number: 3, writer: "hyun", title: "์ฃผํ์
๋๋ค", contents: "์ฃผํ์ด์์!" }
]
// 2.DB์์ ๊บผ๋ด์จ ๊ฒฐ๊ณผ๋ฅผ ๋ธ๋ผ์ฐ์ ์ ์๋ต(response) ์ฃผ๊ธฐ
res.send(result)
})
app.listen(3000, () => {
console.log("๋ฐฑ์๋ API ์๋ฒ๊ฐ ์ผ์ก์ด์!!!")
})
get
ํจ์์ ๋๋ฒ์งธ ๋งค๊ฐ๋ณ์ ํ์ดํ ํจ์๋ฅผ ๋ฐ๊ณ ์๋๋ฐ req, res ๋ผ๋ ๋ ๋ณ์๋ฅผ ๋ฐ๊ณ ์๋ค.
req๋ ์์ฒญ ์ด๊ณ res๋ ์๋ต์ด๋ค.
์ด๋ฒ์๋ POST ๋ฉ์๋๋ฅผ ์ด์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๋ก์ง์ ์ง๋ณด๊ฒ ๋ฐ.
// index.js
// ... ๊ธฐ์กด ์ฝ๋
app.post('/boards', (req, res) => {
// 1. ๋ธ๋ผ์ฐ์ ์์ ๋ณด๋ด์ค ๋ฐ์ดํฐ ํ์ธํ๊ธฐ
===>req.body๋ก ๋ฐ์ดํฐ ์ ์ฅํ๋๊ฒ ํ์ธํด์ฃผ๊ธฐ
console.log(req)
console.log("=========================")
console.log(req.body) // ์ถ๊ฐ
// 2. DB์ ์ ์ ํ, ๋ฐ์ดํฐ๋ฅผ ์ ์ฅ => ๋ฐ์ดํฐ ์ ์ฅํ๋ค๊ณ ๊ฐ์
// 3. DB์ ์ ์ฅ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ธ๋ผ์ฐ์ ์ ์๋ต(response) ์ฃผ๊ธฐ
res.send("๊ฒ์๋ฌผ ๋ฑ๋ก์ ์ฑ๊ณตํ์์ต๋๋ค.")
});
app.listen(3000, () => {
console.log("๋ฐฑ์๋ API ์๋ฒ๊ฐ ์ผ์ก์ด์!!!")
})
์ฌ๊ธฐ์ ์ฐ๋ฆฌ๊ฐ ํด๋ผ์ด์ธํธ ์์ ๋ณด๋ธ HTTP ์์ฒญ ์ ๋ณด๊ฐ req์ ์์ฑ๋์ด์๋ค๊ณ ๋ฐฐ์ ๋ค.
๊ทธ๋ฌ๋ฉด post์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋๊ฒ์ ํ์ธํ๋ ค๋ฉด req.body ๋ฅผ ์ด์ฉํด์ ๋ณผ ์ ์๋ค.
๋ฐ๋ผ์ req ์ req.body๋ฅผ ํ์ธ ํ ์ ์๋ ์ฝ๋๋ฅผ ์ถ๊ฐํด์ฃผ์.
ํ์ง๋ง postmen์ผ๋ก ์์ฒญ์ผ๋ก ๋ณด๋ด์ฃผ๊ฒ ๋๋ฉด ์ฑ๊ณต์ ์ผ๋ก ์๋ตํ์ง๋ง
req.body์๋ undefined
๊ฐ ์ถ๋ ฅ๋์๋ค. ๊ทธ ์ด์ ๋??
express
ํ๋ ์์ํฌ๋ ๊ธฐ๋ณธ์ ์ผ๋ก๋ jsonํํ๋ฅผ ์ง์ํ๊ณ ์์ง ์์ต๋๋ค.
๋ฐ๋ผ์ ์๋ฒ์์ json์ ์ฝ์ด์ค๊ธฐ ์ํด app.use(express.json())
์ฝ๋๋ฅผ ์ถ๊ฐํด ์ฃผ์ด์ผ ํฉ๋๋ค.
// index.js
// const express = require('express')
import express from 'express';
const app = express();
app.use(express.json()); // ์ถ๊ฐ๋ ์ฝ๋
app.get('/boards', (req, res) => {
// ... ์๋ต
app.post("/tokens/phone", function(req, res){
// post body ๋ง๋ค๊ธฐ (๋ด๊ฐํ๊ฑฐ)
// req.body.qqq
// console.log(req.body);
//1.๊ตฌ์กฐ๋ถํด ํ ๋น
// const {myphone} = req.body;
//2.๋ค๋ฅธ ๋ฐฉ๋ฒ
// const myphone = req.body[myphone];
// post body ๋ง๋ค๊ธฐ
const myphone = req.body.qqq
// 1. ํด๋ํฐ ๋ฒํธ ์๋ฆฟ์ ๋ง๋์ง ํ์ธํ๊ธฐ (10~11์๋ฆฌ)
const isValid = checkPhone(myphone)
if(isValid === false){
return
}
// 2. ํด๋ํฐ ์ธ์ฆ๋ฒํธ 6์๋ฆฌ ์์ฑ
const mytoken = getToken()
// 3. ๋ฒํธ์ ์ธ์ฆ๋ฒํธ(ํ ํฐ) ์ ์กํ๊ธฐ
sendTokenToSMS(myphone, mytoken)
res.send("์ธ์ฆ์๋ฃ")
})
ํน์ง
Axios ์ค์น
yarn install axios
================
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
// HTML ์ถ๊ฐ
Axios ๋ฌธ๋ฒ
.then
: ๋น๋๊ธฐ ํต์ ์ด ์ฑ๊ณตํ์ ๊ฒฝ์ฐ, ์ฝ๋ฐฑ์ ์ธ์๋ก ๋ฐ์ ๊ฒฐ๊ณผ๊ฐ์ ์ฒ๋ฆฌ
.catch
: ์ค๋ฅ ์ด๋ฆฌ
<head>
<title>ํ์๊ฐ์
์ฐ์ตํ๊ธฐ</title>
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
<script>
function check() {
// 1. ์
๋ ฅํ ํด๋ํฐ๋ฒํธ ๊ฐ์ ธ์ค๊ธฐ
const myphone = document.getElementById('qqq').value;
console.log('๋์ ํธ๋ํฐ๋ฒํธ: ', myphone);
// 2. ํด๋น ํด๋ํฐ๋ฒํธ๋ก ์ธ์ฆ๋ฒํธAPI ์์ฒญํ๊ธฐ
axios
.post('http://localhost:3000/tokens/phone', {
qqq: myphone,
})
.then((res) => {
console.log(res);
document.getElementById("zzz").innerText = res.data
});
}
</script>
</head>
[axios.post](http://axios.post)
๋ฅผ ์ฌ์ฉํ์ฌ API์์ฒญ์ ๋ณด๋ธ๋ค.
axios.then
์ ์ฌ์ฉํ์ฌ ์์ฒญ์ ๋ณด๋ธ ํ, ์คํ๋๋ ์ฝ๋๋ฅผ ์์ฑํด ์ฃผ๋ฉด ๋๋๋ฐ ์์ฒญ์ ๋ํ ์๋ต์ ๋ฐ์์ค๋ค.
ํ์ง๋ง ์์ฒญ์ ๋ณด๋ด๋ฉด ์๋ต์ด ์จ๊ฒ์ธ์ง ํ์ธํ ์๊ฐ ์๋ค.
์์ธํ ๋ณด๋ฉด cors๋ผ๋ ๋จ์ด๊ฐ ๋์ ๋๋๋ฐ cors๋ ๋ญ๊น?
CORS๋, Cross-Origin-Resource-Sharing
์ ์ฝ์์ด๋ค.
์ฆ, ์๋ก ๋ค๋ฅธ ์ถ์ฒ(origin)๋ฅผ ๊ฐ์ง ์ฃผ์๋ก ์์ฒญ์ด ๋ค์ด์์๋ ๋ฐ์ํ ์ ์๋ ์๋ฌ๋ค.
์ถ์ฒ๋ port๋ฒํธ๊น์ง ํฌํจํ url์ด๋ค.
์ง๊ธ ์์ ์ ์ ์ด๋ฌํ url(http://localhost:3000/tokens/phone
)์์ http://localhost:3000
์ origin์ด๋ผ ๋ถ๋ฆ
๋๋ค.
cors ๋ฌธ์ ํด๊ฒฐํ๊ธฐ
์ง์ ์๋ตํค๋์ ์ถ์ฒ๋ฅผ ์ ์ด์ฃผ๋ ๋ฐฉ์๋ ๊ฐ๋ฅํ์ง๋ง ์กฐ๊ธ ๋ ํธํ cors๋ฏธ๋ค์จ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํด์ฃผ์.
cors ์ค์นํ๊ธฐ
yarn add cors
=============
import cors from 'cors'
app.use(cors())
app.use(express.json())
app.use(cors())
์ ์
๋ ฅํ๋ฉด ๋ชจ๋ ์ถ์ฒ์์ ๋ค์ด์ค๋ ์์ฒญ์ ํ์ฉํ๊ฒ ๋๋ค.app.use(cors({origin:})
๊ณผ ๊ฐ์ด ์์ฑํ์ฌ ํน์ origin๋ง์ ํ์ฉํ๋๋ก ์ค์ ํ ์ ์๋ค.
์ฐ๋ฆฐ ์ง๊ธ๊น์ง Rest-API์ ๋ํด ์ฌ์ฉํ๊ธฐ ์ํด express
๋ฅผ ์ฌ์ฉํด ์๋ฒ๋ฅผ ๋์์๋ค. express์ ๋น์ทํ apollo-server๋ฅผ ์ฌ์ฉํ๊ณ ์ ํ๋ค.
apollo-server ์ค์นํ๊ธฐ
yarn add apollo-server graphql
apollo-server ๋ฌธ๋ฒ ๊ตฌ์ฑ๊ณผ express์ฐจ์ด
// index.js
// const { ApolloServer, gql } = require('apollo-server');
import { ApolloServer, gql } from "apollo-server";
const typeDefs = gql` // TypeDefs => swagger๋ฅผ ํตํด ์ง์ ์์ฑํ์์ง๋ง Graphqldms typeDefs๋ฅผ ํตํด ์๋์์ฑํด์ค๋ค..
type Query {
qqq: String
}
`;
const resolvers = {
Query: {
qqq: () => {
return "Hello World!";
},
},
};
====> resolver ๋ express ์ get API ์ ๋น์ทํ๋ค.
// express
app.get('/', function (req, res) {
res.send('Hello Wordld')
})
const app = new ApolloServer({
typeDefs: typeDefs,
resolvers: resolvers,
cors: true, // ๋ชจ๋ ์ฌ์ดํธ ํ์ฉํ๊ณ ์ถ์ ๋
// cors: { origin: ["https://naver.com", "https://daum.net"] } // ํน์ ์ฌ์ดํธ๋ง ์ง์ ํ๊ณ ์ถ์ ๋
});
app.listen(3000).then(() => {
console.log("๋ฐฑ์๋ API ์๋ฒ๊ฐ ์ผ์ก์ด์!!!");
});
================================================
// express
app.listen(3000)
// apollo-server
app.listen(port).then(({ url }) => {
console.log(`๐ Server ready at ${url}`);
});
callback ์ด๋?
function add (x, y, callback){
let result = x * y
callback(result)
}
function result (data) {
console.log(data, "์ฝ๋ฐฑํจ์ ์คํ")
}
add(5, 10, result)
add
ํจ์์๋ ์ธ์๋ก x,y,callback์ด ๋ค์ด๊ฐ๊ณ callback
์๋ ํจ์ ๊ฐ ๋ค์ด๊ฐ๋ค.
add
ํจ์๋ฅผ ์คํ์ํค๋ฉด add
์์ ์ธ์๋ก ๋ค์ด๊ฐ result
๊ฐ ์คํ๋๋ค.
์ฆ, add
ํจ์ ์ธ์๋ก ์ฌ์ฉ๋ result
ํจ์๋ฅผ callback
ํจ์๋ผ๊ณ ๋ถ๋ฅธ๋ค.
<button onClick={handleClickFunction}></button>
button
์์ onClick
ํจ์๊ฐ ์คํ๋๊ณ onClick
์์ handleClickFunction
์ ์คํํ๋ค.
์ฆ, onClick
์ด๋ผ๋ ์ด๋ฒคํธ ํจ์ ์์ handleClickFunction
๊ฐ ๋ค์ด๊ฐ ์คํํ๊ธฐ ๋๋ฌธ์
handleClickFunction
๊ฐ callback
ํจ์๋ผ๊ณ ๋ถ๋ฅผ ์ ์๋ค.
callback ๋ฐฉ์!!
callback ์ง์ฅ๊ณผ promise ๋ ๋
ธ์
๋ณด์ถฉ ์๋ฃ ์ฐธ๊ณ !!!
async/await
axios๋ ๊ธฐ๋ณธ์ ์ผ๋ก async/await ๋ฅผ ์ง์ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.
async function getData(url){
let data = (await axios.get(url)).data;
return data;
}
let url = 'https://koreanjson.com/posts/1';
async function dataArr(){
let data = await getData(url);
let result = [];
for(let v of Object.values(data)){
result.push(v);
}
console.log(result);
}
dataArr();
async
: async ํค์๋๋ function ์์ ์ฌ์ฉํ๊ณ async๊ฐ ๋ถ์ ํจ์๋ ๋ฐ๋์ Promise๋ฅผ ๋ฐํํ๊ณ ,
ํ๋ผ๋ฏธ์ค๊ฐ ์๋ ๊ฒ์ ํ๋ผ๋ฏธ์ค๋ก ๊ฐ์ธ ๋ฐํํ๋ค.
await
: async ํจ์ ์์์๋ง ๋์ํ๋ค. Promise๊ฐ ์ฒ๋ฆฌ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ์ญํ ์ ํ๋ค.
๋๊ธฐ ๋น๋์ ๋ฐฉ์์ผ๋ก ํจ์ ์คํ
import axios from 'axios';
// 1. ๋น๋๊ธฐ๋ฐฉ์
function fetchAsync() {
const result = axios.get("https://koreanjson.com/posts/1");
console.log("๋น๋๊ธฐ๋ฐฉ์: ", result); // Promise { <pending> }
}
fetchAsync();
// 2. ๋๊ธฐ๋ฐฉ์
// async function fetchSync() {
// // => ํจ์ ์ค๋ณต ์ ์ธ ๋ฌธ์ ๋ฅผ ํผํ์!!! (ํ์ดํ ํจ์๋ก ๋ณ๊ฒฝ)
// const result = await axios.get("https://koreanjson.com/posts/1");
// console.log("๋๊ธฐ๋ฐฉ์: ", result.data); // ์ ๋๋ก๋ ๊ฒฐ๊ณผ => { title: "....." }
// }
const fetchSync = async () => {
const result = await axios.get("https://koreanjson.com/posts/1");
console.log("๋๊ธฐ๋ฐฉ์: ", result); // ์ ๋๋ก๋ ๊ฒฐ๊ณผ => { title: "....." }
console.log("๋๊ธฐ๋ฐฉ์: ", result.data.title);
};
fetchSync();