MongoDB를 사용할 때, 특정 속성을 제외하고 데이터를 가져와야 하는 경우가 있습니다. 예를 들어, 사용자의 비밀번호나 내부적으로 사용되는 민감한 데이터를 클라이언트에 노출하지 않도록 해야 합니다. 이를 위해 Mongoose에서 .select() 메서드를 활용할 수 있습니다.
기본적인 데이터 조회 코드
다음과 같이 Content 컬렉션에서 모든 데이터를 조회하는 API를 만들 수 있습니다.
app.get("/api/contents", async (req, res) => {
try {
const contents = await Content.find().lean();
res.status(200).json(contents);
} catch (error) {
console.error("콘텐츠 조회 오류:", error);
res.status(500).json({
success: false,
error: "서버 오류로 콘텐츠를 불러올 수 없습니다",
});
}
});
이 코드는 Content 컬렉션의 모든 문서를 가져와 JSON 형식으로 반환합니다. 하지만 특정 필드를 제외하지 않기 때문에 모든 필드가 포함되어 응답됩니다.
특정 필드를 제외하는 방법
Mongoose에서는 .select({ 필드명: 0 })을 사용하면 특정 필드를 제외할 수 있습니다. 예를 들어, quizzes라는 필드를 제외하고 데이터를 가져오려면 다음과 같이 작성합니다.
app.get("/api/contents", async (req, res) => {
try {
const contents = await Content.find().select({ quizzes: 0 }).lean();
res.status(200).json(contents);
} catch (error) {
console.error("콘텐츠 조회 오류:", error);
res.status(500).json({
success: false,
error: "서버 오류로 콘텐츠를 불러올 수 없습니다",
});
}
});
.select() 메서드 설명
- { quizzes: 0 } → quizzes 필드를 제외하고 나머지 필드만 가져옵니다.
- .lean() → Mongoose의 Document 객체 대신 일반 JavaScript 객체를 반환하여 성능을 향상시킵니다.
여러 필드를 제외하는 방법
여러 개의 필드를 제외하고 싶다면 다음과 같이 객체에 여러 필드를 명시하면 됩니다.
const contents = await Content.find().select({ quizzes: 0, createdAt: 0 }).lean();
이렇게 하면 quizzes와 createdAt 필드가 제외된 데이터를 가져올 수 있습니다.
특정 필드만 포함하는 방법
반대로 특정 필드만 선택해서 가져오고 싶다면 1을 사용하면 됩니다.
const contents = await Content.find().select({ title: 1, description: 1 }).lean();
위 코드는 title과 description 필드만 가져오고 나머지 필드는 제외합니다.
결론
Mongoose의 .select() 메서드를 사용하면 특정 필드를 제외하거나 포함하여 데이터를 조회할 수 있습니다. 특히 보안상 중요한 정보는 클라이언트에 노출되지 않도록 select({ 필드명: 0 })을 적극적으로 활용하는 것이 좋습니다.