- ๐ Axios
- ๐ Axios ์ค์นํ๊ธฐ
- ๐ Axios ์๋ต ์ ์ดํ๊ธฐ
- ๐ Axios HTTP ์์ฒญ ๋ฉ์๋ ์ข ๋ฅ
- ๐ Callback
- ๐ ๋น๋๊ธฐ์ Callback
- ๐ Promise
- ๐ async/await
- ๐ Axios๋ก GET ์์ฒญ ๋ณด๋ด๊ธฐ (๋๊ธฐ, ๋น๋๊ธฐ ๋ฐฉ์)
- ๐ SMS ์ ์ก
- ๐ ํ๊ฒฝ๋ณ์ ๋ถ๋ฆฌ
- ๐ EMAIL ์ ์ก
Axios
๋ ๋ธ๋ผ์ฐ์ ์ Node.js๋ฅผ ์ํ HTTP ๋น๋๊ธฐ ํต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.
ํน์ง์ผ๋ก๋ Promise api๋ฅผ ์ฌ์ฉํ๊ณ async/await api๋ฅผ ์ฌ์ฉํ๋ค.
๋ํ, HTTP ์์ฒญ๊ณผ ์๋ต์ JSON ํํ๋ก ์๋์ผ๋ก ๋ณ๊ฒฝ์์ผ์ค๋ค.
์ค๋์ axios๋ฅผ ํตํด ์๋ฒ์ request๋ฅผ ๋ณด๋ด๊ณ response๋ฅผ ๋ฐ์ ๊ฒฐ๊ณผ๊ฐ์ ์ฒ๋ฆฌํ๋ ๊ณผ์ ์ ๋ํด ํ์ตํ์๋ค.
axios๋ฅผ ์ค์นํ๋ ๋ฐฉ๋ฒ์ ์ฌ๋ฌ๊ฐ์ง๊ฐ ์์ง๋ง, yarn
์ ์ฌ์ฉํ์ฌ ์ค์น๋ฅผ ์งํํ๋ค.
yarn add axios
axios ํต์ ์์ ๋น๋๊ธฐ ํต์ ์ด ์ฑ๊ณตํ์ ๊ฒฝ์ฐ, .then()
์ ์ฝ๋ฐฑ์ ์ธ์๋ก ๋ฐ์ ๊ฒฐ๊ณผ๊ฐ์ ์ฒ๋ฆฌํ ์ ์๋ค.
.catch๋ฅผ ์ฌ์ฉํ์ฌ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๋ค. error
๊ฐ์ฒด์์ ์ค๋ฅ์ ๋ํ ์ ๋ณด๋ฅผ ํ์ธํ ์ ์๋ค. ์๋์ ๊ฐ์ด .catch์์ ๋ฐ์์ค๋ error ๊ฐ์ฒด๋ฅผ ํตํด ์๋ต์ํ์ฝ๋์ ์๋ตํค๋ ์ ๋ณด๋ฅผ ํ์ธํ ์ ์๋ค.
axios.get('/hello')
.catch(function (error) {
if (error.response) {
console.log(error.response.status);
console.log(error.response.headers);
}
}
axios์๋ ์ฌ๋ฌ ์์ฒญ ๋ฉ์๋๋ค์ด ์กด์ฌํ๋ค. ์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ๋๋ axios.get(),
์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ ๋๋ axios.post(), ๋ฐ์ดํฐ๋ฅผ ์์ ํ๋ ๊ฒฝ์ฐ์๋ axios.put ๊ทธ๋ฆฌ๊ณ ํน์ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ๋ axios.delete๊ฐ ์๋ค.
callback์ ํ๋ก๊ทธ๋๋ฐ์์ ๋งค์ฐ ์ค์ํ ๊ฐ๋
์ธ๋ฐ, ์๋ฏธ๋ก๋ ๋ ๊ฐ์ง๋ก ๋ํ๋ผ ์ ์๋ค.
๋จผ์ , ๋ค๋ฅธ ํจ์์ ์ธ์๋ก ์ด์ฉ๋๋ ํจ์, ๊ทธ๋ฆฌ๊ณ ์ด๋ฒคํธ์ ์ํด ํธ์ถ๋์ด์ง๋ ํจ์์ด๋ค.
ํจ์์๋ ๋จ์ํ ๊ฐ๋ง ์ธ์๋ก ๋ฃ์ ์ ์๋ ๊ฒ์ด ์๋๋ผ, ํจ์ ์์ฒด๋ฅผ ์ธ์๋ก ๋ฃ์ ์๋ ์๋ค. ์๋ฅผ ๋ค์ด ์๋์ ๊ฐ์ด func ํจ์์ ์ธ์๋ก callbackํจ์๊ฐ ๋ค์ด๊ฐ ํจ์ ์์์ ํจ์๊ฐ ์คํ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
function func (x, y, callback){
let result = x * y
callback(result)
}
>
function result (data) {
console.log(data, "์ฝ๋ฐฑํจ์ ์คํ")
}
>
add(5, 10, result)
์ง๊ธ๊น์ง ํ์ตํด์๋ ์ด๋ฒคํธ๋ onclick๊ณผ onchange๊ฐ ์๋ค.
์ด ๋ ์ด๋ฒคํธ๋ HTML์์ ๋ฏธ๋ฆฌ ๋ง๋ค์ด ๋์ ํจ์์ด๋ฉฐ, ์๋ฅผ๋ค์ด ๋ฒํผ์ ํด๋ฆญํ๊ฒ ๋๋ฉด, onclick์ ํจ์๊ฐ ์คํ๋๊ณ ๊ทธํ onclick์์ ํด๋นํ๋ ํจ์๊ฐ ํธ์ถ๋๋ค.
์ฆ, ํธ์ถํ๋ ํจ์๋ฅผ ์ฌ๊ธฐ์ callbackํจ์๋ก ๋ณผ ์ ์๋ค.
์ด๋ฌํ callback ํจ์๋ 2๊ฐ์ง๋ก ๋ค์ ๋๋ ์ ์๋๋ฐ, ๋๊ธฐ์ ํจ์์ ๋น๋๊ธฐ์ ํจ์์ด๋ค.
๋๊ธฐ์ ๋ฐฉ์์ด๋, ํ์ฌ ์คํํ๊ณ ์๋ ์์
์ด ๋๋ ๋ค์, ๋ค์ ์์
์ ์คํํ๋ ๊ฒ์ด๋ฉฐ, ๋น๋๊ธฐ์ ๋ฐฉ์์ด๋ ํ์ฌ ์คํ์ค์ธ ์์
์ ์๋ฃ ์ฌ๋ถ์ ๋ฌด๊ดํ๊ฒ ์ฆ์ ๋ค๋ฅธ ์ฝ๋๋ก ๋์ด๊ฐ๋ ๊ฒ์ด๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์์๋ single-thread / non-blocking ๋ฐฉ์์์ฝ๋๋ฅผ ์ฌ์ฉํ๋ค.
๊ฐ๋จํ๊ฒ ๋งํด์ js๋ ํ๋ฒ์ ํ๋์ ์ฝ๋๋ง ์คํํ ์ ์๋๋ฐ, ์คํ์ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ๋ค์ ์ฝ๋๋ฅผ ์คํํ๋ ๊ฒ์ด๋ค.
๋น๋๊ธฐ์ callbackํจ์๋ฅผ ์ค๋ช
ํ๊ธฐ ๊ฐ์ฅ ์ข์ ์์๋ setTimeout์ด๋ค.
setTimeout์ ์ผ์ ์๊ฐ์ ์ค์ ํ๊ณ , ๊ทธ ์๊ฐ ์ดํ์ ์์
์ด ์์ ๋๋ ๊ฒ์ธ๋ฐ, ์๋์ ๊ฐ์ด ๋์์ ์งํํ๋ฉด
"์ด๊ฑด ๋ฐ๋ก ์คํ"์ด ๋จผ์ ๋ํ๋๊ณ "3์ด ๊ธฐ๋ค๋ฆฌ๊ธฐ"๊ฐ ๋ํ๋๋ค.
"3์ด ๊ธฐ๋ค๋ฆฌ๊ธฐ"๋ฅผ ๋จผ์ ์คํํ๋๋ฐ ์ด์ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋ํ๋๋ ์ด์ ๋ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ๋น๋๊ธฐ์ ์ผ๋ก ์ฝ๋๋ฅผ ์คํํ๊ธฐ ๋๋ฌธ์ด๋ค.
function Test () {
console.log("3์ด ๊ธฐ๋ค๋ฆฌ๊ธฐ")
}
>
setTimeout(Test,3000);
console.log('์ด๊ฑด ๋ฐ๋ก ์คํ')
์์ ํ์ตํ ๋น๋๊ธฐ์ callback์ ์ฐ์ํ์ฌ ์ฌ์ฉํ๊ฒ ๋๋ฉด callback ์ง์ฅ์ ๋น ์ง๊ฒ ๋๋ค.
callback ์ง์ฅ์ด๋ ์ฝ๋ฐฑํจ์๋ฅผ ์ ๋ฌํ๋ ๊ณผ์ ์ด ๋ฐ๋ณต๋์ด ์ฝ๋์ ๊ฐ๋
์ฑ์ด ๋จ์ด์ ธ ์ฝ๋๋ฅผ ์ ์ง๋ณด์ํ๊ธฐ ์ด๋ ค์์ง๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
์ด์ ๊ฐ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์๋ฐ์คํฌ๋ฆฝํธ์๋ Promise
๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋ค.
์ด์ promise์ axios๋ฅผ ์ด์ฉํด GET ์์ฒญ์ ๋ณด๋ด๊ณ data๋ฅผ ๋ฐ์ ๋ณด๋ ์ค์ต์ ํด๋ณด๊ฒ ๋ค.
const url = 'https://koreanjson.com/posts/1';
>
function getData() {
return new Promise(function (resolve, reject) {
axios.get(url).then(function (response) {
if (response) {
resolve(response.data);
}
reject(new Error('Request is failed'));
});
});
}
>
let result = [];
getData()
.then(function (data) {
for (let v of Object.values(data)) {
result.push(v);
}
console.log(result);
})
.catch(function (err) {
console.error(err);
});
์ ์ฝ๋์์ resolve
๋๋ reject
ํจ์๋ฅผ ํธ์ถํ๋ ๊ตฌ๋ฌธ์ด ์๋ ๊ฒฝ์ฐ, ๋ ์ค ํ๋๊ฐ ์คํ๋๊ธฐ ์ ๊น์ง๋ then์ด๋ catch๋ก ๋์ด๊ฐ์ง ์๊ฒ ๋๋ค.
๋ฐ๋ผ์ ๋น๋๊ธฐ ์์
์ด ์๋ฃ๋ ๋, resolve ๋๋ reject๋ฅผ ํธ์ถํ๋ ๋ฐฉ๋ฒ์ผ๋ก ๋น๋๊ธฐ ์์
์ ๋๊ธฐ์ ํํ์ด ๊ฐ๋ฅํด์ง๋ค.
์ผ๋ฐ์ ์ผ๋ก, resolve๋ ์ฑ๊ณตํ์ ๋์ ๋ฐํ๊ฐ์ด๊ณ , reject๋ ์คํจํ์ ๋์ ๋ฐํ๊ฐ์ด๋ค.
axios๋ ๊ธฐ๋ณธ์ ์ผ๋ก async์ await๋ฅผ ์ง์ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.
async์ await๊ฐ ๋ฌด์์ธ์ง ์์๋ณด๊ธฐ์ ์์ axios๋ฅผ ์ด์ฉํด GET ์์ฒญ์ ๋ณด๋ด๊ณ data๋ฅผ ๋ฐ์์ค๋๋ก ํด๋ณด๊ฒ ๋ค.
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
๋ฅผ ํ๊ธฐํ๊ณ , ํจ์ ๋ด๋ถ์์ ์ค์ง์ ์ธ ๋น๋๊ธฐ ์์
์ด ํ์ํ ์์น๋ง๋ค await๋ฅผ ํ๊ธฐํ ๊ฒ์ ํ์ธํ ์ ์๋ค.
์ฆ, awat๋ฅผ ํ๊ธฐํ ๊ฒ๋ง์ผ๋ก ๋ท ๋ด์ฉ์ promise๋ก ์๋์ผ๋ก ์ ํํ๊ณ ํด๋น ๋ด์ฉ์ด resolve๋ ์ดํ์ ๋ค์์ผ๋ก ์งํ์ด ๋๋ ๊ฒ์ด๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก, await์ ์ ๋ฌด๋ก ๋๊ธฐ์ ํจ์์ ๋น๋๊ธฐ์ ํจ์๋ก ๊ตฌ๋ถ์ ํ ์ ์์ผ๋ฉฐ, ์์ ์ค๋ช ํ ์ฝ๋ฐฑ์ง์ฅ ๋ฌธ์ ๋ฅผ promise์ async/await๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐฉ์งํ ์ ์๋ค.
yarn add axios๋ฅผ ํตํด axios๋ฅผ ์ค์นํ ๋ค์, ์ด์ axios๋ฅผ importํ์ฌ ์ฌ์ฉํ ์ ์๊ฒ ๋์๋ค.
import axios from 'axios';
>
// 1. ๋น๋๊ธฐ๋ฐฉ์
function fetchAsync() {
>
}
>
fetchAsync();
>
// 2. ๋๊ธฐ๋ฐฉ์
async function fetchSync() {
>
}
>
fetchSync();
์์ ์ฝ๋๋ฅผ ๋ณด๊ฒ ๋๋ฉด ๋๊ธฐ์ ๋น๋๊ธฐ ๋ฐฉ์์ ์ ์ฒด์ ์ธ ๊ตฌ์กฐ๋ฅผ ํ์ธํ ์ ์๋ค.
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();
Coolsms ํํ์ด์ง ๋งํฌ
https://console.coolsms.co.kr/sdk
$ yarn add coolsms-node-sdk
coolsms-node-sdk
๋ฅผ import ํ๋ค.// phone.js
>
import coolsms from 'coolsms-node-sdk';
>
// ...์๋ต
.env
ํ์ผ ์์ฑํ๊ณ , ๊ทธ ์์ ์ค์ํ ํค๊ฐ๋ค์ ๋ณ์๋ก ๋ง๋ค๊ณ jsํ์ผ์ ๋ณ์๋ช
์ผ๋ก ๊ฐ์ ธ์ ์ฌ์ฉํ๋ค.
// ์์์
๋๋ค. ๋ณธ์ธ์ ํค๊ฐ์ ๋ฃ์ด ์์ฑํ์ธ์.
SMS_KEY = NCSIYWB4QAC1NTSP
SMS_SECRET = IECMDSCNKBKFX4MRQD22PRVITDY3ND7K
SMS_SENDER = 01012345678
.env ํ์ผ์ด ํจ์์์ ์ ์ฉ๋ ์ ์๋๋ก ์ฝ๋๋ฅผ ์์ ํ๋ค.
import coolsms from 'coolsms-node-sdk';
const mysms = coolsms.default;
>
export async function sendTokenToSMS(myphone, token) {
const SMS_KEY = process.env.SMS_KEY;
const SMS_SECRET = process.env.SMS_SECRET;
const SMS_SENDER = process.env.SMS_SENDER;
>
const messageService = new mysms(SMS_KEY, SMS_SECRET);
const result = await messageService.sendOne({
to: myphone,
from: SMS_SENDER,
text: `[์ฝ๋์บ ํ] ์๋
ํ์ธ์?! ์์ฒญํ์ ์ธ์ฆ๋ฒํธ๋ [${token}] ์
๋๋ค.`,
});
console.log(result);
>
// console.log(myphone + '๋ฒํธ๋ก ์ธ์ฆ๋ฒํธ' + token + '๋ฅผ ์ ์กํฉ๋๋ค!!!');
}
์ด์ .env ํ์ผ์ด ์ ์ฉ๋ ์ ์๋๋ก ์ถ๊ฐ์ ์ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ๋ ์ค์นํ๋ค.
$ yarn add dotenv
index.js ํ์ผ์์ detenv๋ฅผ importํด์จ๋ค.
import 'dotenv/config'
์ด๋ฒ์๋ ๋ฌธ์์ ์ด์ด์ ์ด๋ฉ์ผ์ ์ ์กํด๋ณด๋ api๋ฅผ ๋ง๋ค์ด ์ค์ต์ ์งํํ๋ค.
Nodemailer
https://nodemailer.com/about/
Nodemailer๋ฅผ ์ฌ์ฉํด ๋ฉ์ผ์ ๋ณด๋ด๋ ๋ฐ, ์ด๋ฅผ ์ํด ์๋ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํด Nodemailer๋ฅผ ์ค์นํ๋ค.
$ yarn add nodemailer
email api๊ฐ ๋ง๋ค์ด์ง email.js ํ์ผ์์ nodemailer๋ฅผ importํ๊ณ ๋ฉ์ผ์ ์ ์กํ๋ค.
// email.js
>
import nodemailer from 'nodemailer';
>
// ...๊ธฐ์กด ์ฝ๋
>
export async function sendTemplateToEmail(myemail, mytemplate){
const EMAIL_USER = "youremail@gmail.com";
const EMAIL_PASS = "abcdefghijklmnop";
const EMAIL_SENDER = "youremail@gmail.com";
>
const transporter = nodemailer.createTransport({
service: "gmail",
auth: {
user: EMAIL_USER,
pass: EMAIL_PASS,
}
})
>
const result = await transporter.sendMail({
from: EMAIL_SENDER,
to: myemail,
subject: "[์ฝ๋์บ ํ] ๊ฐ์
์ ์ถํํฉ๋๋ค!!!",
html: mytemplate
})
console.log(result)
>
// console.log(myemail + "์ด๋ฉ์ผ๋ก ๊ฐ์
ํ์ํ
ํ๋ฆฟ " + mytemplate + "๋ฅผ ์ ์กํฉ๋๋ค.")
}
๋ง์ง๋ง์ผ๋ก ๋ฌธ์์ ์ก๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ํ๊ฒฝ๋ณ์ ์ค์ ์ผ๋ก ํตํด ๋ณธ์ธ์ ๊ฐ์ธ์ ๋ณด๋ฅผ ์์ ํ๊ฒ ์ฒ๋ฆฌํ๋ฉด api ์์ฑ์ด ์๋ฃ๋๋ค.
๊ทธ๋์ api๋ฅผ ๋ง๋ค๊ณ ๋ฐ์ดํฐ๋ง ์ฃผ๊ณ ๋ฐ๋ ๊ณผ์ ๊น์ง๋ง ์ค์ต์ ํ์ง๋ง, ์ค๋๋ถํฐ ์ง์ ๋ฌธ์๋ ๋ฉ์ผ์ ์ ์กํ๋ ๊ธฐ๋ฅ์ ์ง์ ํด๋ณด๋ฉด์ ์ฆ๊ฒ๊ฒ ๊ณต๋ถ๋ฅผ ํ ๊ฒ ๊ฐ๋ค. ๋ด๊ฐ ๋ง๋ api๊ฐ ์ค์ ๋ก ๊ธฐ๋ฅ์ ํ๊ณ ๋์ผ๋ก ํ์ธํ๋ ๋ฒ์จ๋ถํฐ ์ฌ๋ฌ๊ฐ์ง ๋ค๋ฅธ api๋ฅผ ๋ง๋ค์ด ๋ณด๊ณ ์ถ๋ค๋ ์๊ฐ์ด ๋ค์๋ค. ํ๋ฃจํ๋ฃจ ์ค๋ ฅ์ ์์๊ฐ๋ฉฐ ์ธ์ ๊ฐ๋ ๋ด๊ฐ ๊ตฌํํ๊ณ ์ถ์ api๋ฅผ ๋ง๋๋ ๋ ์ด ์์ผ๋ฉด ์ข๊ฒ ๋ค.