NodeJS ๋ ๊ตฌ๊ธ ํฌ๋กฌ์ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ๊ธฐ๋ฐํด ๋ง๋ค์ด์ง ์๋ฒ ์ฌ์ด๋ ํ๋ซํผ์ด๋ค.
๋ ธ๋๋ ์น์๋ฒ๊ฐ ์๋๋ค.
๋น๋๊ธฐ์ ์์ฃผ
: ๋
ธ๋์ ๋ชจ๋ API๋ ๋น๋๊ธฐ์์ด๋ค. Node.js์๋ฒ๋ API๊ฐ ์คํ๋์์๋,๋น ๋ฅธ์๋
๋จ์ผ ์ฐ๋ ๋/ ๋ฐ์ด๋ ํ์ฅ์ฑ
๋
ธ ๋ฒํผ๋ง
function getToken() {
const result = String(Math.floor(Math.random() * 1000000)).padStart(6, "0");
console.log(result);
}
getToken();
function createTokenOfPhone(qqq) {
// 1. ํด๋ํฐ ๋ฒํธ ๋ง๋์ง ํ์ธ
if (qqq.length !== 11) {
console.log("์๋ฌ๋ฐ์ !! ํธ๋ํฐ ๋ฒํธ๋ฅผ ์ ๋๋ก ์
๋ ฅํด์ฃผ์ธ์!");
return;
}
// 2. ์ธ์ฆ๋ฒํธ ์์ฑ
const result = String(Math.floor(Math.random() * 1000000)).padStart(6, "0");
console.log(result);
// 3. ์ธ์ฆ๋ฒํธ ์ ์ก
console.log(qqq + "๋ฒํธ๋ก ์ธ์ฆ๋ฒํธ " + result + "๋ฅผ ์ ์กํฉ๋๋ค.");
}
createTokenOfPhone("01012345678"); // 0101234567: ์ธ์(argument)
facade๋ ๊ฑด๋ฌผ์ ์ ๋ฉด์ ์๋ฏธํ๋ค.
ํผ์ฌ๋ ํจํด์ ์ฌ๋ฌ ์๋ธ ์์คํ ์ ์์ ๋ค์ ํ๋์ ์ธํฐํ์ด์ค๋ก ํตํฉํ์ฌ ์ ๊ณตํ๋ ๊ฒ.
function createTokenOfPhone(qqq) {
// 1. ํด๋ํฐ ๋ฒํธ ๋ง๋์ง ํ์ธ
if (qqq.length !== 11) {
console.log("์๋ฌ๋ฐ์ !! ํธ๋ํฐ ๋ฒํธ๋ฅผ ์ ๋๋ก ์
๋ ฅํด์ฃผ์ธ์!");
return false
} else {
return true
}
// 2. ์ธ์ฆ๋ฒํธ ์์ฑ
const result = String(Math.floor(Math.random() * 1000000)).padStart(6, "0");
console.log(result);
// 3. ์ธ์ฆ๋ฒํธ ์ ์ก
console.log(qqq + "๋ฒํธ๋ก ์ธ์ฆ๋ฒํธ " + result + "๋ฅผ ์ ์กํฉ๋๋ค.");
}
createTokenOfPhone("01012345678"); // 0101234567: ์ธ์(argument)
์ด๊ฒ์ ํผ์ฌ๋ ํจํด์ผ๋ก ์ ์ฉํด๋ณด์.
function createTokenOfPhone(myphone) {
// 1. ํด๋ํฐ ๋ฒํธ ๋ง๋์ง ํ์ธ
const isValid = checkPhone(myphone);
if (isValid === false) {
return;
}
// 2. ์ธ์ฆ๋ฒํธ ์์ฑ
const myToken = getToken();
// 3. ์ธ์ฆ๋ฒํธ ์ ์ก
sendTokenToSMS(myphone, myToken);
}
function checkPhone(myphone) {
if (myphone.length !== 11) {
console.log("์๋ฌ๋ฐ์ !! ํธ๋ํฐ ๋ฒํธ๋ฅผ ์ ๋๋ก ์
๋ ฅํด์ฃผ์ธ์!");
return false;
} else {
return true;
}
}
function getToken() {
const result = String(Math.floor(Math.random() * 1000000)).padStart(6, "0");
console.log(result);
}
function sendTokenToSMS(myphone, result) {
console.log(qqq + "๋ฒํธ๋ก ์ธ์ฆ๋ฒํธ " + result + "๋ฅผ ์ ์กํฉ๋๋ค.");
}
Template Literal
: ๋ด์ฅ๋ ํํ์์ ํ์ฉํ๋ ๋ฌธ์์ด ๋ฆฌํฐ๋ด์ด๋ค.
ํ ํ๋ฆฟ ๋ฆฌํฐ๋ด์ ํํ์/๋ฌธ์์ด ์ฝ์ , ์ฌ๋ฌ์ค ๋ฌธ์์ด, ๋ฌธ์์ด ํ์ํ, ๋ฌธ์์ด ํ๊น ๋ฑ ๋ค์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
const apple = 3;
const banana = 2;
console.log("์ฒ ์๋ ์ฌ๊ณผ๋ฅผ " + apple + "๊ฐ, " + "๋ฐ๋๋๋ฅผ " + banana + "๊ฐ ๊ฐ์ง๊ณ ์์ต๋๋ค.");
console.log(`์ฒ ์๋ ์ฌ๊ณผ๋ฅผ ${apple}๊ฐ, ๋ฐ๋๋๋ฅผ ${banana}๊ฐ ๊ฐ์ง๊ณ ์์ต๋๋ค.`); // ํ
ํ๋ฆฟ ๋ฆฌํฐ๋ด
์ด์ฒ๋ผ ํ ํ๋ฆฟ ๋ฆฌํฐํธ์ ์ฌ์ฉํ๋ฉด ํ๋ํ๋ ๊ฐ์ธ์ฃผ์ง ์์๋ ๋ฌธ์์ด ์ฝ์ ๊ฐ๋ฅํ๋ค.
ํํ์์ ์ฝ์ ํ๊ธฐ ์ํด์๋ `` ์์ ${}์ ๊ฐ์ธ์ค์ผํ๋ค.
์์ฃผ ์ฌ์ฉํ๋ key-value๋ฅผ ๊ฐ์ ์ด๋ฆ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ฌ์ฉ.๊ฐ์ ๋จ์ด๋ฅผ ๋๋ฒ ์ฌ์ฉํ๋๋ฐ ๋ฒ๊ฑฐ๋กญ๋ค.
๊ฐ์ฒด์์ ํค ๋ฐธ๋ฅ๋ช ์ด ๊ฐ์ ๊ฒฝ์ฐ ์ถ์ฝํด์ ์ฌ์ฉํ ์ ์๋ค.
shorthand property names์ ๊ฐ์ฒด์์ key์ value๋ช ์ด ๊ฐ์ ๊ฒฝ์ฐ ์ถ์ฝํด์ ์ฌ์ฉํ ์ ์๊ฒ ๋ง๋ค์ด์ฃผ๋ ๋ฌธ๋ฒ์ ๋๋ค.
*//๊ธฐ์กด ๊ฐ์ฒด ์ฝ๋*
const obj = {
name: name,
color: color,
x: x,
y: ,
};
*//shorthand property names๋ฅผ ์ด์ฉํ ์ฝ๋*
const obj = {
name,
color,
x,
y,
};
๊ตฌ์กฐ ๋ถํด ํ ๋น
: ๋ฐฐ์ด์ด๋ ๊ฐ์ฒด์ ์์ฑ์ ํด์ฒดํ์ฌ ๊ทธ ๊ฐ์ ๊ฐ๋ณ ๋ณ์์ ๋ด์ ์ ์๊ฒ ํ๋ ์๋ฐ์คํฌ๋ฆฝํธ ํํ์์ด๋ค.
๊ฐ๋ฐ์ ํ๋ค ๋ณด๋ฉด ํจ์์ ๊ฐ์ฒด๋ ๋ฐฐ์ด์ ์ ๋ฌํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์๊ธฐ๊ณค ํ๋. ๊ฐ๋์ ๊ฐ์ฒด๋ ๋ฐฐ์ด์ ์ ์ฅ๋ ๋ฐ์ดํฐ ์ ์ฒด๊ฐ ์๋ ์ผ๋ถ๋ง ํ์ํ ๊ฒฝ์ฐ๊ฐ ์๊ธฐ๊ธฐ๋ ํ๋ค. ์ด๋ด๋ ๊ตฌ์กฐ๋ถํดํ ๋น์ ์ฌ์ฉํ ์ ์๋ค.
function zzz(aaa){ // const aaa = basket
console.log(aaa) // ๊ฐ์ฒด
console.log(aaa.apple) // 3
console.log(aaa.banana) // 10
}
const basket = {
apple: 3,
banana: 10
}
zzz(basket)
์ฝ์์ ํ์ธํด๋ณด๋ฉด ,aaa ๋์ ์ { apple: 3, banana: 10 } ์ธ basket ๊ฐ์ฒด๊ฐ ๋ค์ด๊ฐ ์ ์๋ ๊ฒ์ด๋ค.
์ด๊ฒ์ ๊ตฌ์กฐ๋ถํดํ ๋น์ ํ๋ฉด
// ๊ตฌ์กฐ๋ถํดํ ๋น ๋ฐฉ์์ผ๋ก ์ ๋ฌ
function zzz({ apple, banana }){ // const { apple, banana } = basket
console.log(apple) // 3
console.log(banana) // 10
}
const basket = {
apple: 3,
banana: 10
}
zzz(basket)
๊ตฌ์กฐ๋ถํดํ ๋น์ ํตํด ๊ฐ์ฒด์ key๋ฅผ ๋งค๊ฐ๋ณ์๋ก ๋ณด๋ด์ฃผ๊ฒ ๋๋ฉด,
ํจ์ ์คํ์ ์ธ์์ ์์์ ๊ด๊ณ์์ด ๋์ผํ ์ด๋ฆ์ผ๋ก ์ฐพ์์ฃผ๊ธฐ ๋๋ฌธ์ ์์ ํ ํจ์ ์คํ์ด ๊ฐ๋ฅํ๋ค.
๊ฐ์ฒด ๊ตฌ์กฐ ๋ถํด ํ ๋น
const user = {
name: '์ฒ ์',
age: 13,
school: '๋ค๋์ฅ์ด๋ฑํ๊ต',
createdAt: '2010-09-07',
}
const name = user.name
const age = user.age
const school = user.school
const createdAt = user.createdAt
// ๊ตฌ์กฐ๋ถํดํ ๋น
const {name, age, school, createdAt} = user
user ๊ฐ์ฒด์ ์ผ์ผ์ด ํ๋ํ๋ ๋ณ์ ๋ช
์ ์ฌํ ๋นํ๊ฒ๋ณด๋ค ๊ตฌ์กฐ๋ถํดํ ๋น์ผ๋ก ๋ณ์๋ฅผ ์ฌํ ๋นํ๊ฒ
๊ตฌ์กฐ๋ถํด๋ก ์ฌํ ๋นํ ๋ถ๋ถ์ด ๋ณ์ ์ ์ธ์ ์ค์ฌ์ค ์ข๋ ๊ฐ๊ฒฐํ ์ฝ๋๋ฅผ ๋ณผ ์ ์๊ฒ ํด์ค๋ค.
๋ฐฐ์ด ๊ตฌ์กฐ ๋ถํด ํ ๋น
const classmates = ['์ฒ ์', '์ํฌ', 'ํ์ด'];
const child1 = classmates[0];
const child2 = classmates[1];
const child3 = classmates[2];
// ๊ตฌ์กฐ๋ถํดํ ๋น์ ์ด์ฉํด
// child1์ arr[0]
// child2์ arr[1]
// child3์ arr[2]์ ํ ๋นํ์์ต๋๋ค.
const [child1, , child2, child3] = classmates;
๊ตฌ์กฐ๋ถํด ํ ๋น์ ์ใ
ํ์ฌ ๋ณ์ ์ ์ธ ๋ถ๋ถ์ ํ์ค๋ก ์ ๋ฆฌํ์๋ค.
๊ฐ์ฒด๋ ๊ตฌ์กฐ๋ถํด ํ ๋น์ ๊ฐ์ฒด ์์ Key๊ฐ์ ๊ฐ์ ธ์ ํ ๋น!
๋ฐฐ์ด์ ๊ตฌ์กฐ๋ถํด ํ ๋น์ ๋ฐฐ์ด์ ์์๊ฐ ์ค์!
HTTP
: Hyper Text Transfer Protocol ์ ๋๋ฌธ์์ด๋ก, ์ธํฐ๋ท์์ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ ์ ์๋ ํ๋กํ ์ฝ
ํ๋กํ ์ฝ
: ์ปดํจํฐ ๋ด๋ถ์์, ๋๋ ์ปดํจํฐ ์ฌ์ด์์ ๋ฐ์ดํฐ์ ๊ตํ ๋ฐฉ์์ ์ ์ํ๋ ๊ท์น ์ธ๊ณ
โ ์ ํธ ์ฒ๋ฆฌ๋ฒ, ์ค๋ฅ์ฒ๋ฆฌ, ์ํธ, ์ธ์ฆ , ์ฃผ์ ๋ฑ์ ์ ์ํ๋ค.
์ฌ๊ธฐ์ ์์ฒญ์ ๋ณด๋ผ ๋๋ ๋ฐฑ์๋์๊ฒ ์์ฒญ์ ํ๋๋ฐ API๋ผ๋ ๊ธฐ๋ฅ์ผ๋ก ์์ฒญ์ ๋ณด๋ธ๋ค.
API
: HTTP ์์ฒญ์ ๋ฐฑ์๋ ์ปดํจํฐ์ ๋ณด๋์ ๋ ์คํ๋๋ ๋ฐฑ์๋ ๊ธฐ๋ฅ์ด๋ค.
์๋ฒ๋ฅผ ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด๊ธฐ ์ํด์ ๊ฐ๊ฐ์ HTTP๋ผ๋ ๊ธธ์ด ์กด์ฌํ๊ณ ๊ฐ๊ฐ์ ์์ฒญ๋ง๋ค ๋ด๋ด์๊ฐ ํ์ํ๋ค
๊ทธ ๋ด๋น์๋ฅผ API ๋ผ๊ณ ํ๋ค.
Rest-API
๋ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ผ ํ๋ค. ๋ฐ๋ฉด์ GraphQL-API
๋ ํ์ํ ๋ฐ์ดํฐ๋ง ๊ณจ๋ผ ๋ฐ์ ์ ์๋ค.
Rest ์์ฒญ๋ด๋น์๋ axios
, Graphql ์์ฒญ ๋ด๋น์๋ apollo-client
์ด๋ค.
API ์๋ต ์ฃผ๋ ๋ฒ CRUD
swagger
๋ Rest-API
๋ฅผ ์ํ ์ค๋ช
์ (์ ์ฒด ์กฐํ)
playground
๋ GraphQL-API
๋ฅผ ์ํ ์ค๋ช
์ (์ฟผ๋ฆฌ ์ธ์ด๋ก ๊ฐ๋ณ ์กฐํ ๋ฐ ์์ ๊ฐ๋ฅ)
Error: listen EADDRINUSE: address already in use :::3000
ํน์ ์ด๋ฐ ์๋ฌ ๋ฌธ๊ตฌ๊ฐ ๋์ค์ง ์๋์?
์์์ ์ดํด๋ณด์๋ฏ์ด ํ๋์ ํฌํธ ๋ฒํธ์๋ ํ๋์ ํ๋ก๊ทธ๋จ๋ง ์คํํ ์ ์์ต๋๋ค.
์๋ ์ค๋ช
์ ์ฝ๊ณ , ํฐ๋ฏธ๋์ ํตํด์ ํ๋ก๊ทธ๋จ์ ์ข
๋ฃํด์ฃผ์ธ์!
๋ง์ฝ์ ์๋ฒ๊ฐ ์ผ์ง ํฐ๋ฏธ๋์ ์ฐพ์ ์๊ฐ ์๋ค๋ฉด,
ํฐ๋ฏธ๋์ netstat -anv | grep LISTEN
๋ช
๋ น์ด๋ฅผ ์
๋ ฅํด๋ณด์ธ์.
3000๋ฒ ํฌํธ๋ก ์๋ฒ๋ฅผ ์ผฐ๊ธฐ ๋๋ฌธ์ ๊ทธ ๋ถ๋ถ์ ์ฐพ์, process id
๋ฅผ ๊ธฐ์ตํฉ๋๋ค.
์ด์ ์ด ์์ด๋๋ฅผ ์ด์ฉํด์ ํ๋ก๊ทธ๋จ์ ์ข ๋ฃํด ์ฃผ๊ฒ ์ต๋๋ค.
kill -9 ํ๋ก์ธ์ค_์์ด๋
๋ฅผ ์
๋ ฅํด์ฃผ๋ฉด ๋ฉ๋๋ค. ์์ ์์์์๋ kill -9 7381
๊ฐ ๋๊ฒ ๋ค์.
๋ค์ netstat -anv | grep LISTEN
๋ช
๋ น์ด๋ฅผ ์
๋ ฅํด์ ํ์ธํด๋ณด๋ฉด, 3000๋ฒ ํฌํธ์์ ๋์์ค์ธ ํ๋ก๊ทธ๋จ์ ์๋ค๋๊ฒ์ ํ์ธ ํ ์ ์์ต๋๋ค.