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으로 들어와도 검색이 되지 않습니다.

+ Recent posts