express ๊ธฐ์ด(2): URL ๋งค๊ฐ๋ณ์
์๋ฐ์คํฌ๋ฆฝํธ ํ ๋ณํ (type conversion)
์๋ฐ์คํฌ๋ฆฝํธ์์, ํจ์์ ์ฐ์ฐ์์ ์ ๋ฌ๋๋ ๊ฐ๋ค์ ๋๋ถ๋ถ ์ ์ ํ ์๋ฃํ์ผ๋ก ์๋ ๋ณํ๋๋ค.
let a = "5";
let b = "10";
// ์๋ฐ์คํฌ๋ฆฝํธ๋ ๋ฌธ์์ด์ ์ซ์๋ก ๋ณํํ ํ ๋น๊ตํจ
console.log(a > b); // false ("5"์ "10"์ ์ซ์๋ก ๋ณํํ์ฌ 5 > 10์ ๋น๊ต)
alert( "6" / "2" ); // 3, ๋ฌธ์์ด์ด ์ซ์ํ์ผ๋ก ์๋๋ณํ๋ ํ ์ฐ์ฐ์ด ์ํ
let result = 5 + "10"; // "510"์ด ๋จ
https://ko.javascript.info/type-conversions
ํ ๋ณํ
ko.javascript.info
parseInt
์๋์ผ๋ก ํ ๋ณํ์ ํด์ค ๋๊ฐ ๋ง์ง๋ง, ์ฝ๋์ ๋ช ํ์ฑ๊ณผ ์์ธก ๊ฐ๋ฅํ ๋์์ ์ํด ์ ์๋ฅผ ํํํ๊ธฐ ์ํด์๋ parseInt๋ฅผ ํตํด ๋ช ์์ ์ผ๋ก ๋ค๋ฃจ๋ ๊ฒ์ด ์ข๋ค.
let num = parseInt("10"); // 10
let num2 = parseInt("10px"); // 10
let num3 = parseInt("abc10"); // NaN
let binary = parseInt("1010", 2); // 2์ง์ "1010"์ 10์ง์๋ก ๋ณํ -> ๊ฒฐ๊ณผ๋ 10
let hexadecimal = parseInt("1F", 16); // 16์ง์ "1F"๋ฅผ 10์ง์๋ก ๋ณํ -> ๊ฒฐ๊ณผ๋ 31
์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด, ๋ฐฐ์ด ๋น๊ตฌ์กฐํ(Destructuring)
// ์๋ฐ์คํฌ๋ฆฝํธ ๋ฐฐ์ด ๋น๊ตฌ์กฐํ
const array = [1, 2, 3, 4, 5];
const [, a, , b] = array;
console.log(a, b); // 2 4
๋ฐฐ์ด ๋น๊ตฌ์กฐํ๋ ์์์ ๋ฐ๋ผ ๊ฐ์ ํ ๋นํ๋ค.
const keyboard = {
brand: "Happy Hacking",
model: "Professional 2",
layout: "60%",
switchType: "Topre",
};
// ๊ฐ์ฒด ๋น๊ตฌ์กฐํ
const { brand, model, layout, switchType } = keyboard;
๊ฐ์ฒด ๋น๊ตฌ์กฐํ์์ ์ฌ์ฉ๋๋ ๋ณ์ ์ด๋ฆ์ ๊ฐ์ฒด์ ์์ฑ ์ด๋ฆ(ํค)์ ์ ํํ ์ผ์นํด์ผ ํ๋ค.
URL ๊ฒฝ๋ก ๋งค๊ฐ๋ณ์ (req.params)
app.get('/keyboard/:brand', function (req, res) {
const queryBrand = req.params.brand; // URL ๊ฒฝ๋ก ๋งค๊ฐ๋ณ์๋ก ๋ธ๋๋๋ฅผ ๋ฐ์
// ...
});
๊ฒฝ๋ก ๋งค๊ฐ๋ณ์(req.params): ๋ฐ์ดํฐ๊ฐ URL์ ์ผ๋ถ๋ก ๋ค์ด๊ฐ๋ค.
๊ฒฝ๋ก ์์ฒด๊ฐ ๋ฐ์ดํฐ๋ฅผ ํฌํจํ๊ธฐ ๋๋ฌธ์ ๊ตฌ์กฐ์ ์ผ๋ก ๋ ๋ช ํํ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
URL ์ฟผ๋ฆฌ ๋งค๊ฐ๋ณ์ (req.query)
app.get('/keyboard', function (req, res) {
const queryBrand = req.query.brand; // URL ์ฟผ๋ฆฌ๋ก ๋ธ๋๋๋ฅผ ๋ฐ์
...
});
/keyboard/brand=HappyHacking
app.get('/search', function (req, res) {
const query = req.query.q;
const page = req.query.page || 1; // ๊ธฐ๋ณธ๊ฐ 1
const limit = req.query.limit || 10; // ๊ธฐ๋ณธ๊ฐ 10
res.json({
searchQuery: query,
page: page,
limit: limit
});
});
๋ฐ์ดํฐ๊ฐ URL ๊ฒฝ๋ก ๋ค์ ?๋ก ์์ํ๋ ์ฟผ๋ฆฌ ์คํธ๋ง์ ํํ๋ก ์ ๋ฌ๋๋ค.
๋ณต์์ ํํฐ๋ ๊ฒ์ ์กฐ๊ฑด ๋ฑ์ ์ ๋ฌํ ๋ ์ ์ฉํ๊ณ , ๊ฒฝ๋ก๊ฐ ์ ์ ์ด๋ฉด์๋ ์ถ๊ฐ์ ์ธ ์ ๋ณด๋ฅผ ๋ง๋ถ์ผ ์ ์๋ค.
req.query๋ Expree.js์์ URL์ ์ฟผ๋ฆฌ ์คํธ๋ง ํ๋ผ๋ฏธํฐ๋ฅผ ํ์ฑํ์ฌ ๊ฐ์ฒด ํํ๋ก ์ ๊ณตํ๋ค.
http://localhost:3000/search?q=keyboard&page=2
์ด ๊ฒฝ์ฐ ์๋์ ๊ฐ์ ๊ฐ์ฒด๋ก ํํ๋๋ค. (์ฟผ๋ฆฌ ์คํธ๋ง์ ํ์ฑํ ๊ฒฐ๊ณผ์ธ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด)
{
q: "keyboard",
page: "2"
}
์๋ฐ์คํฌ๋ฆฝํธ ๋ค์ด๋ฐ ์ผ์ด์ค
- [kebab-case] cf. snake_case // ๋์ค ํ๋๋ก. ํต์ผ
- ํด๋, ํ์ผ
- [camelCase]
- ๋ณ์, ํจ์
- [PascalCase]
- ํด๋์ค
์๋ฐ์คํฌ๋ฆฝํธ Map
์๋ฐ์คํฌ๋ฆฝํธ Map ๊ฐ์ฒด๋ ๋ฐ์ดํฐ๋ฅผ ํค-๊ฐ ์์ผ๋ก ์ ์ฅํ ์ ์๋ ๋๊ตฌ์ด๋ค.
ํน์ง
- ๋ชจ๋ ์๋ฃํ(์ซ์, ๋ฌธ์์ด, ๊ฐ์ฒด ๋ฑ)์ ํค๋ก ์ฌ์ฉ ๊ฐ๋ฅ (์ผ๋ฐ์ ์ธ ๊ฐ์ฒด {}๋
- ์ฝ์ ๋ ์์ ์ ์ง: ๋ฐ๋ณต๋ฌธ (for...of ๋๋ forEach)๋ฅผ ํตํด ์ํ ์ ์ฝ์ ๋ ์์๋๋ก ๋ฐํ
- ํค ๋น๊ต์ ์๊ฒฉํจ : ์ซ์ 1๊ณผ ๋ฌธ์์ด 1์ ์๋ก ๋ค๋ฅธ ํค๋ก ๊ตฌ๋ถํจ.
const myMap = new Map();
// ํค-๊ฐ ์ ์ถ๊ฐ
myMap.set(1, "Number One"); // ์ซ์ ํค
myMap.set("1", "String One"); // ๋ฌธ์์ด ํค
myMap.set(true, "Boolean True"); // ๋ถ๋ฆฌ์ธ ํค
myMap.set({ name: "Alice" }, "Object Value"); // ๊ฐ์ฒด ํค
// ํค-๊ฐ ์ ์กฐํ
console.log(myMap.get(1)); // "Number One"
console.log(myMap.get("1")); // "String One"
console.log(myMap.get(true)); // "Boolean True"
// Map ํฌ๊ธฐ ํ์ธ
console.log(myMap.size); // 4
// Map ์ํ
myMap.forEach((value, key) => {
console.log(`Key: ${key}, Value: ${value}`);
});