const a = "name";
const b = "Elice";
const c = { a: b };
console.log(c); // { a: 'Elice' }
객체 외부에서 선언한 변수를 객체 안의 key 값으로 넣어주려고 할 때, 위와 같이 변수 이름을 입력하면 문자열로 인식해서 값이 제대로 들어가지 않습니다. 그럴 때는 대괄호([ ])를 이용해서 변수 이름을 넣어주면 됩니다.
const a = "name";
const b = "Elice";
const c = { [a]: b }; // a가 아니라 [a]를 넣어줌!
console.log(c); // { name: 'Elice' }
이렇게 대괄호 안에 변수 이름을 넣어주면 위와 같이 변수의 값이 제대로 key 값으로 들어간 것을 볼 수 있습니다.
const { option, keyword } = req.query;
// 닉네임으로 검색
if (option === "nickname") {
board = await Board.find({
nickname: new RegExp(keyword, "i"),
})
.lean()
.sort({ boardId: -1 });
}
// 제목으로 검색
if (option === "title") {
board = await Board.find({
title: new RegExp(keyword, "i"),
})
.lean()
.sort({ boardId: -1 });
}
// 내용으로 검색
if (option === "contents") {
board = await Board.find({
contents: new RegExp(keyword, "i"),
})
.lean()
.sort({ boardId: -1 });
}
프로젝트를 하면서 게시판 검색 기능을 구현한 코드입니다. 검색 옵션과 내용을 query에서 option과 keyword 값으로 받아왔습니다. 만약에 닉네임으로 "lapras"를 검색했다면 option 값은 nickname, keyword 값은 "lapras"가 될 것입니다. 위의 코드를 보면 중복되는 부분이 많은데, 객체 안에 받아온 option 값을 바로 key 값으로 넣어주면 중복 없이 코드를 한 번만 작성하면 되지만 프로젝트 기간에는 그 방법을 몰라서 option 값에 따라서 상황마다 코드를 작성했었습니다.
const { option, keyword } = req.query; // option 값은 nickname, title, contents
board = await Board.find({
[option]: new RegExp(keyword, "i"),
})
.lean()
.sort({ boardId: -1 });
이렇게 변수 값을 객체에 직접 넣어주면 불필요한 중복 없이 코드를 깔끔하게 작성할 수 있습니다. option 값으로 nickname, title, contents를 받아온 후에 key 값으로 넣어주면 if문을 작성할 필요 없이 바로 조건에 맞는 글을 찾아올 수 있습니다. 하지만 이런 방법을 쓰면 보안상 문제가 있을 수도 있으므로 option 값으로 원하는 값만 받을 수 있도록 화이트리스트를 작성하는 것이 좋습니다.
const option = 1;
const FIELD_WHITELIST = ["nickname", "title", "contents"];
if (!FIELD_WHITELIST.includes(option)) {
throw new Error("invalid option")
}
위와 같이 설정을 해주면 query에서 받아온 option 값이 화이트리스트에 없을 경우 에러가 발생합니다. 따라서, password와 같은 값들이 option으로 들어와도 검색이 되지 않습니다.
'코딩 공부 > JavaScript' 카테고리의 다른 글
[JavaScript] Number와 parseInt의 차이 (0) | 2024.05.28 |
---|---|
[JavaScript] JavaScript에서 물음표(?)를 쓰는 연산자 정리 - 삼항 연산자, 널 병합 연산자, 옵셔널 체이닝 (0) | 2024.05.24 |