mongodb findmongodb 검색mongodb searchmongodb cheat sheetbackend

Next.js에서 MongoDB find() 쿼리를 사용해 문서 검색하기

KUKJIN LEE
KUKJIN LEE
2024년 10월 15일
138

1. MongoDB에서 문서 검색하기

MongoDB의 find() 메서드를 사용하면 컬렉션에서 특정 조건에 맞는 문서를 검색할 수 있습니다.

 

find() 메서드 예시

db.collection('kakao').find({ title: '안녕' }).toArray();

kakao 컬렉션에서 title안녕인 문서를 검색하는 쿼리입니다. 검색 결과는 배열로 반환됩니다.

 

2. 사용자 입력을 받는 클라이언트 페이지 만들기

실제 예시를 위해서 사용자가 제목을 입력하면 그 제목에 맞는 문서를 검색해 결과를 화면에 표시하는 간단한 클라이언트 페이지를 만들어보겠습니다.

'use client';

import { useState } from 'react';

export default function Home() {
  const [title, setTitle] = useState('');
  const [documents, setDocuments] = useState([]);
  const [message, setMessage] = useState('');

  const handleSubmit = async (e: React.FormEvent) => {
    e.preventDefault();
    // 사용자 입력 데이터를 API로 전송
    const response = await fetch(`/api/search?title=${title}`, {
      method: 'GET',
    });

    const result = await response.json();

    if (result.success) {
      setDocuments(result.data); // 문서 결과 저장
      setMessage('');
    } else {
      setMessage(`오류 발생: ${result.error}`);
    }
  };

  return (
    <div className="p-8">
      <h1 className="text-2xl mb-4">문서 검색 예제</h1>
      <form onSubmit={handleSubmit} className="space-y-4">
        <div>
          <label className="block text-lg">검색할 제목:</label>
          <input
            type="text"
            value={title}
            onChange={(e) => setTitle(e.target.value)}
            className="border p-2 w-full"
            required
          />
        </div>
        <button type="submit" className="bg-blue-500 text-white py-2 px-4 rounded">
          검색하기
        </button>
      </form>

      {message && <p className="mt-4 text-red-500">{message}</p>}

      <div className="mt-8">
        {documents.length > 0 ? (
          <div>
            <h2 className="text-xl mb-2">검색 결과:</h2>
            <ul>
              {documents.map((doc, index) => (
                <li key={index} className="border p-2 mb-2">
                  <h3 className="font-bold">{doc.title}</h3>
                  <p>{doc.content}</p>
                  <p className="text-sm text-gray-500">작성일: {new Date(doc.createdAt).toLocaleDateString()}</p>
                </li>
              ))}
            </ul>
          </div>
        ) : (
          <p>검색 결과가 없습니다.</p>
        )}
      </div>
    </div>
  );
}
  • 사용자가 제목을 입력하면 handleSubmit 함수를 통해 입력된 제목을 기반으로 /api/search API에 GET 요청을 보냅니다. 검색 결과가 존재한다면 API에서 검색된 문서를 화면에 출력하게 됩니다.

  • input에서 value={title} 잊지 말아주세요~

 

3. API 엔드포인트 구축: route.ts

마지막으로 클라이언트 페이지에서 받은 제목을 이용해 MongoDB에서 문서를 검색하는 API를 만들면 됩니다. 클라이언트에서 요청을 /api/search로 보냈기 때문에 app/api/search/route.ts로 만들어주겠습니다.

import { NextResponse } from 'next/server';
import clientPromise from '@/lib/mongodb';

export async function GET(request: Request) {
  try {
    const { searchParams } = new URL(request.url);
    const title = searchParams.get('title'); // URL에서 title 파라미터 가져오기

    if (!title) {
      return NextResponse.json({ success: false, error: '제목을 입력해주세요.' });
    }

    const client = await clientPromise; // MongoDB 클라이언트 연결
    const db = client.db();
    const collection = db.collection('kakao'); // 'kakao' 컬렉션 사용

    // MongoDB에서 제목과 일치하는 문서 검색
    const documents = await collection.find({ title: title }).toArray();

    return NextResponse.json({ success: true, data: documents }); // 성공적으로 데이터를 반환
  } catch (error) {
    return NextResponse.json({ success: false, error: error.message }); // 에러 처리
  }
}

서버에서 중요한 건 param을 잘 받아와야 합니다. 따라서 title = searchParams.get('title') 잘 작성해주셔야 됩니다.

 

만약 검색 결과가 존재한다면 데이터를 클라이언트로 전달 할 것이고, 에러가 존재하면 별도의 에러 처리를 할 것입니다. (검색 결과가 없는 경우는 빈 배열을 반환합니다.)

 

find()를 사용하면 조건에 맞는 검색을 쉽게 할 수 있습니다.

관련 글

[SQL 입문] 필요한 데이터만 콕 집어 가져올 수 있는 WHERE 절

사용자는 테이블에 있는 모든 데이터를 다 보고 싶어 하지는 않습니다. 오히려 특정 항목에 대한 데이터만 가져오고 싶을 때가 훨씬 많습니다. 예를 들어, 어떤 사용자의 이메일이나 ID는 알고 있는데, 그 사람이 언제 우리 앱에 가입했는지 확인하고 싶다고 가정해 봅시다...

2026년 1월 27일10

SQL에서 SELECT란 무엇인가?

데이터베이스를 거대한 서류 보관함이라고 생각하면 됩니다. 보관함 안에는 수많은 데이터가 차곡차곡 쌓입니다. SELECT는 이 보관함에서 "내가 원하는 정보를 찾아줘!"라고 요청하는 명령어입니다. 이 과정을 전문 용어로 '쿼리(Query)'라고 부릅니다. &amp;nbs...

2026년 1월 26일10

[SQL 기초] "언제 하나씩 다 넣어?" 데이터 한 번에 넣기

개발을 하다 보면 데이터베이스(DB)에 샘플 데이터를 대량으로 넣어야 할 때가 있습니다. 메뉴 100개를 추가해야 하는데 INSERT 문을 100번 쓰고 있다면? 너무 비효율적이죠! 오늘은 SQL에서 여러 데이터를 한 번에 넣는 '다중 삽입(Multiple Inse...

2026년 1월 21일13

SQL 데이터 삽입하기

데이터가 없는 데이터베이스는 연료 없는 로켓과 같습니다. 이제 'Missions' 테이블에 새로운 행(row)을 추가하는 방법을 알아보겠습니다. "삽입(Inserting)"은 '데이터 추가'를 의미합니다. 기존 Missions 테이블 ...

2026년 1월 20일12