NextJs13 와 MongoDB Atlas,Mongoose 사용한 간단한 crud 구현하기

작성자 : 조회수 :

NEXTJS를 통해서 이번에는 간단한 CRUD을 만들어보도록 하겠습니다

 

제가 사용한 버전은 NextJS 13.5.6 입니다

참고 주소 : https://github.com/ddpound/practice3

 

제가 아래 출처 레퍼런스 세 개만 보셔도 충분히 구현 가능한 난이도입니다.

 

MONGDB에 연동해 crud를 사용하려면 3가지가 필요합니다

1.     MONGODB와 연결할 URI

2.     MONGODB의 객체를 지정해줄 스키마 파일

3.     MONGODB와 커넥션 해줄 파일



프로젝트 구조입니다.

 

간단하게 연동법과 insert를 먼저 해보겠습니다


먼저 Atlas에 접속해 계정을 등록후 Database 메뉴에 접속합니다


중간에 Connect를 클릭해줍니다

MONGODB FOR VS CODE를 선택



3번에 있는 URI를 복사 후 NEXTJS 프로젝트에 잘 보관 해둡니다.


이제 2단계인 MONGODB의 스키마를 만들어보겠습니다

 

testBoard.js 코드

import mongoose, { Schema } from "mongoose";

 

const testBoardSchema = new Schema(

    {

        title : String,

        content : String,

    },

    {

        timestamps : true,

    }

)

 

const testBoard = mongoose.models.testBoard || mongoose.model('testBoard',testBoardSchema);

 

export default testBoard;



저는 간단하게 제목, 내용, 시간 까지만 구성 해두었습니다.

 

Mongoosemodel안에 testBoard는 아래와 같이 atlascollections가 됩니다.


모든 JS파일에 connection 코드를 둘 수 없으니 공통 모듈로 빼 두겠습니다

 

Database.js


import mongoose from "mongoose";

 

const connectMongoDB = ()=>{

    try{

        mongoose.connect('아까 받아둔 URI 여기에 넣어주세요);

        console.log('success connection mongodb');

    }catch(error){

        console.log(error);

    }

}

 

export default connectMongoDB;

 

이제 모든 준비는 끝났습니다 코드만 작성하면 됩니다.

 

NEXTJS의 라우팅 핸들러의 개념을 보겠습니다.

 

NextJS 기능을 사용하면 중간 route handlers를 간단하게 구현할 수 있습니다.

아래 route.js 파일 구조를 간단하게 확인해주시면




그럼 URI PATH는 이렇게 됩니다.

http://localhost:3000/test-board/

http://localhost:3000/test-board/{id}

이렇게 접근할 수 있습니다

 

그렇다면 GET, POST ,PUT, DELETE 는 어떻게 접근할까?

공식 문서를 확인해보면

아래와 같은 규칙을 지켜준 후 선언할 때 HTTP 메소드 타입만 지정해 주면 알맞게 사용할 수 있습니다.

 

아래 ROUTE HANDLER 를 확인해보면

 

Test-board/route.js

import testBoard from "@/models/testBoard";

import connectMongoDB from "@/util/database";

import { NextResponse } from "next/server";

 

export async function GET(){

    await connectMongoDB();

    const test_board = await testBoard.find();

    return NextResponse.json({test_board});

}

 

export async function POST(request){

    const {title, content} = await request.json();

    await connectMongoDB();

    await testBoard.create({title,content});

    return NextResponse.json({message: "success create board data"}, {status : 201});

}

 

export async function DELETE(request){

    const id = request.nextUrl.searchParams.get("id");

    await connectMongoDB();

    await testBoard.findByIdAndDelete(id);

    return NextResponse.json({message : "success delete id : " + id}, {status : 200})

}

 

이런 코드 구조를 가지고있는데 제가 테스트로 insert를 호출하는 코드를 추가해 보겠습니다.

 

 

 

 

Create/page.js 파일 코드입니다.

"use client"

export default function create(){

    return(

        <>

            <form onSubmit={(e)=>{

                e.preventDefault();

               

                const title = e.target.title.value;

                const content = e.target.content.value;

                const option = {

                    method: 'POST',

                    headers: {

                        'Content-Type' : 'application/json'

                    },

                    body: JSON.stringify({title, content})

                }

                fetch('http://localhost:3000/test-board', option)

                    .then(res=>res.json)

                    .then(result => {

                        alert('저장이 완료되었습니다.')

                    });

            }}>

                <h2>create 창입니다!</h2>

                <label>제목 : </label><input name="title" type="text"></input>

                <label>내용 : </label><input name="content" type="text"></input>

                <input type="submit" value="작성" />

            </form>

           

        </>

    )

}

 

OPTIONPOST 메소드를 지정해주면 NEXTJS는 알아서 POST메소드를 찾아갑니다.

 

 

 

 

 

Reference

NextJS Route에 관한 공식문서 : https://nextjs.org/docs/app/api-reference/file-conventions/route

생활코딩 : https://www.youtube.com/watch?v=9KOaR6QMb9A&t=3s

GT코딩 : https://www.youtube.com/watch?v=wNWyMsrpbz0&t=2605s