Mongoose와 Next.js App Router의 데이터 저장 문제 해결 방법
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
웹 개발
대상자
Next.js App Router와 Mongoose를 사용하는 백엔드 개발자, 특히 MongoDB에 데이터가 제대로 저장되지 않는 문제를 겪는 중급 이상의 개발자
핵심 요약
- Mongoose 모델 캐싱 문제로 인해 Next.js App Router에서 데이터가
_id
만 저장되는 현상 발생 - 개발 서버 재시작 +
.next
캐시 삭제 및 방어적 모델 내보내기(mongoose.models.User || mongoose.model('User', UserSchema)
)로 해결 - 시간戳(
createdAt
,updatedAt
)가 자동으로 생성되도록timestamps: true
옵션 적용 필수
섹션별 세부 요약
1. 문제 현상
- Next.js App Router에서
/api/auth/signup
경로로POST
요청 시,name
,email
등 필드가 MongoDB에 저장되지 않음 - 콘솔 로그 및 MongoDB 연결 상태는 정상이지만, 저장된 문서에
name
,email
등이 누락됨 __v
필드 외에_id
만 존재하는 문서가 생성됨
2. 실질적인 원인
- Mongoose 모델 캐싱으로 인한 문제
- 개발 모드에서 Next.js 서버가 핫 리로드(Hot Reload) 시, 모델 재컴파일로 인해 Mongoose 내부 모델이 손상됨
name
,email
등 필드가 제대로 매핑되지 않아 저장되지 않음
3. 해결 방법
- 1단계: 서버 재시작 및 캐시 삭제
```bash
Ctrl + C
rm -rf .next
npm run dev
```
- 2단계: 방어적 모델 내보내기
```javascript
export default mongoose.models.User || mongoose.model('User', UserSchema);
```
- 모델이 중복 선언되지 않도록 방어적 코드 적용
4. 예제 코드
- 모델 파일(
/models/User.js
)
```javascript
import mongoose from 'mongoose';
const UserSchema = new mongoose.Schema({
name: { type: String, required: true },
email: { type: String, required: true }
}, { timestamps: true });
export default mongoose.models.User || mongoose.model('User', UserSchema);
```
- 라우트 파일(
/api/auth/signup/route.js
)
```javascript
import User from '@/models/User';
export async function POST(req) {
try {
const body = await req.json();
const user = new User({ name: body.name, email: body.email });
await user.save();
return new Response(JSON.stringify(user), { status: 201 });
} catch (err) {
return new Response(JSON.stringify({ error: 'Server error' }), { status: 500 });
}
}
```
결론
- Mongoose + Next.js App Router 사용 시, 모델 캐싱 문제로 인해 데이터 누락이 발생할 수 있음
- 방어적 모델 내보내기와
.next
캐시 삭제를 통해 문제 해결 가능 timestamps: true
옵션은 시간戳 자동 생성을 위해 반드시 포함해야 함