나의 개발 기록지

스키마와 MongoDB 그리고 몽구스 본문

NextJs

스키마와 MongoDB 그리고 몽구스

해기97 2025. 3. 14. 16:40

이번에 작업하면서 얻은 지식을 작성하며 한번 더 복기

 


일단 스키마는 데이터의 구조를 정의하는 것을 의미한다.

 

MongoDB는 기본적으로 스키마가 없는 NoSQL 데이터베이스이지만, 몽구스를 사용하면 스키마를 정의할 수 있다.

 

스키마를 사용하면 데이터의 일관성을 유지하고 유효성 검사를 적용할 수 있다.

 

- 약간 여기서 내가 느낀점은 자바와 자바스크립트의 차이같은 느낌이었다. NoSQL일 때는 데이터를 아무렇게나 때려넣어도 에러가 안나지만 몽구스를 사용하여 스키마를 사용할 땐 아무렇게나 때려넣을 수 없고 엄격하게 데이터를 확인하는 느낌이다.

- 자바에서 타입이나 코드들을 깐깐하게 보는것과 자바스크립트에서 너그럽게 봐주는 점의 차이라 생각들었다..

 

1. 스키마가 없는 MongoDB의 문제점

 

일단 MongoDB는 JSON형식으로 데이터를 저장하는 NoSQL 데이터베이스이다.

그래서 아래처럼 동일한 컬렉션(테이블)에 서로 다른 구조의 데이터를 저장할 수 있다.

 

// users 컬렉션의 데이터 1
{
  "name": "Alice",
  "age": 25,
  "email": "alice@example.com"
}

// users 컬렉션의 데이터 2 (다른 구조)
{
  "username": "bob123",
  "phone": "010-1234-5678"
}

 

👹 문제점

  • 보다시피 데이터가 일관성있지가 않다. -> users 컬렉션 내의 데이터들인데 키와 값이 제멋대로다.
  • 데이터가 일관성이 없기 때문에 이상한 데이터가 들어갈 수 있다.
  • 쿼리를 실행할 때 일관성이 없기 때문에 에러를 일으킬 수 있다.

2. 스키마가 있는 몽구스 예제

 

스키마가 있는 몽구스의 경우를 보면 (Models/User.js)

 

import mongoose from "mongoose";

const UserSchema = new mongoose.Schema({
  name: { type: String, required: true }, // 필수 값
  email: { type: String, required: true, unique: true }, // 중복 방지
  age: { type: Number, min: 0 }, // 최소값 제한
  createdAt: { type: Date, default: Date.now }, // 기본값 설정
});

export default mongoose.models.User || mongoose.model("User", UserSchema);

 

👍 다른점 

  • 보다시피 MySQL을 사용했을 때 처럼 타입도 키값을 정해둔다.
  • 그 외 세세한 옵션도 맞춰놓을 수 있다. 필수값인지, 중복 방지라던지, 글자 수라던지
  • 일관성 있는 데이터를 넣을 수 있게 데이터 구조를 만들어 둔다.

3. 몽구스 모델을 사용하여 데이터 저장

 

이제 위에 정의한 모델을 사용하여 데이터를 저장해보자 (app/api/users/route.js)

 

import "@/lib/mongoose"; // Mongoose 연결
import User from "@/models/User"; // User 모델 가져오기

export async function POST(request) {
  try {
    const { name, email, age } = await request.json();

    // 새로운 사용자 생성
    const newUser = new User({ name, email, age });
    const savedUser = await newUser.save(); // 저장

    return Response.json({ success: true, user: savedUser });
  } catch (error) {
    console.error("사용자 저장 오류:", error);
    return Response.json({ success: false, message: "서버 오류 발생" }, { status: 500 });
  }
}

 

👍 설명

  • new User({ name, eamil, age}) -> 스키마에 맞는 데이터 생성
  • 스키마에 맞는 데이터는 request로 프론트 단에서 넘겨받으면 될 듯?
  • .save() -> MongoDB에 저장
  • 필수 값 (required)이 빠지거나, 중복된 email이 있으면 자동으로 오류 발생.

 

MongoDB가 편하다곤 하지만 결국 에러를 줄이려면 스키마가 있어야 하는 것 같다.

그걸 도와주는게 몽구스이고 몽구스의 사용방법도 딱히 많이 어려운건 아닌 것 같다.

MySQL에 비하면 금방 익힐 수 있는 정도이지않을까..?

 

이제 이걸 토대로 CRUD 작업 시작해보면 될 것 같다.

'NextJs' 카테고리의 다른 글

mongoose 메모 - 스키마  (0) 2025.04.06
간만에 기록 - db 요청 그리고 node 와 mongoose  (0) 2025.03.25
Next.js의 use server란 무엇인가?  (0) 2025.01.28
Next의 지정된 파일 이름  (0) 2025.01.24
동적 라우팅  (0) 2025.01.11