2023.04.15 - [Web] - DB 스키마와 모델
임의의 스키마 생성
제목 - string
내용 - string
태그 - [string]
작성일 - date
mongoose의 Schema를 사용해서 스키마를 정의합니다.
각 필드의 이름 : 데이터 타입 <- 형태로 구성된 객체를 작성하고
객체를 default로 설정하면 됩니다.
▼ 표 22-2 Schema에서 지원하는 타입
타입 | 설명 |
String | 문자열 |
Number | 숫자 |
Date | 날짜 |
Buffer | 파일을 담을 수 있는 버퍼 |
Boolean | true 또는 false 값 |
Mixed(Schema.Types.Mixed) | 어떤 데이터도 넣을 수 있는 형식 |
ObjectId(Schema.Types.ObjectId) | 객체 아이디, 주로 다른 객체를 참조할 때 넣음 |
Array | 배열 형태의 값으로 [ ]로 감싸서 사용 |
스키마는 스키마 내부에 다른 스키마를 내장 시킬 수 있다.
const Schema1 = new Schema({
name: String,
email: String,
});
const Schema2 = new Schema({
title: String,
user: [Schema1],
extra: Schema.Types.Mixed,
});
현재 스키마 2에는 스키마 1이 들어가 있는데 이 user는 필드에는 스키마 1의 객체로 구성된 배열입니다.
import mongoose from 'mongoose';
const { Schema } = mongoose;
const PostSchema = new Schema({
title: String,
body: String,
tags: [String], // 문자열로 이루어진 배열
publishedDate: {
type: Date,
default: Date.now, // 현재 날짜를 기본값으로 지정
},
});
const Post = mongoose.model('Post', PostSchema);
export default Post;
스키마를 마탕으로 Post라는 인스턴스 모델을 만든 후 이걸 내보냈습니다.
mongoose의 model 함수(스키마 이름, 스키마 객체) <- DB에 스키마 이름을 정해 줄 경우
그 이름의 복수 개의 형태로 컬렉션 이름이 만들어 진다.
즉 Post 라는 이름의 스키마를 만들 시 컬랙션에는 posts가 생기게 됩니다.
이제 본격적으로 데이터를 MongoDB에 CRUD 할 것 입니다.
import Post from '../../models/post';
export const write = ctx => {};
export const list = ctx => {};
export const read = ctx => {};
export const remove = ctx => {};
export const update = ctx => {};
src/api/posts/posts.ctrl.js 파일 수정
/*
모델의 형태
{
title: '제목',
body: '내용',
tags: ['태그1', '태그2']
}
*/
c - 파일 생성
export const write = async (ctx) => {
const {title, body,tags} = ctx.request.body;
const post = new Post({
title,
body,
tags,
});
try{
await post.save();
ctx.body = post;
}catch (e){
ctx.throw(500,e);
}
};
new 생성자를 통해 Post 모델에 인스턴스를 만들고 그 인스턴스 객체의 파라미터에 실제 데이터를 넣습니다.
즉 스키마 라는 틀을 만들고 그 틀에 따라 모델을 만들면 모델의 인스턴스 객체에 데이터를 넣어서 DB에 넣는 것이
파일 생성의 원리 입니다.
이때 save()를 통해서 데이터에 저장 되고
이 함수의 반환 값은 Promise이므로 async/await 문법으로 데이터베이스 저장 요청을 완료할 때까지 await를 사용하여 대기할 수 있습니다
JSON 데이터 { "title": "제목", "body": "내용", "tags": ["태그1", "태그2"] }
이제 JSON 파일로 데이터를 넣어서 보내게 되면 아래와 같이 데이터가 id 등이 잘 붙어서 파일로 생성된 것을 볼 수 있습니다.
그 후 MongDB의 데이터 현황을 볼 수 있는 mongDB compass를 활용하면 DB에 내 데이터가 등록됐는지 볼 수 있다
경로는 blog -> posts
데이터 조회
API를 통한 데이터 조회 모델 인스턴스의 find() 함수를 사용하면 된다.
find() 함수의 리턴 값은 쿼리 입니다. 이를 Promise(비동기 처리 객체 )로 받고 싶다면 exec()를 붙여서 Promise 형식으로 받습니다.
export const list = async ctx => {
try {
const posts = await Post.find().exec();
ctx.body = posts;
} catch (e) {
ctx.throw(500, e);
}
};
https://mongoosejs.com/docs/promises.html
특정 포스트 조회
findByid() 함수를 통해 특정 id를 가진 사람을 찾을 수도 있다
export const read = async ctx => {
const { id } = ctx.params;
try {
const post = await Post.findById(id).exec();
if (!post) {
ctx.status = 404; // Not Found
return;
}
ctx.body = post;
} catch (e) {
ctx.throw(500, e);
}
};
'React' 카테고리의 다른 글
리액트를 왜 쓰는가? (0) | 2024.09.06 |
---|---|
[React] 페이지네이션 UI (0) | 2023.08.06 |
에러 'mongo'은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는배치 파일이 아닙니다. (0) | 2023.04.15 |
mongoose를 이용한 MongoDB 연동 실습 1 환경 설정 (0) | 2023.04.15 |
ESLint와 Prettier (0) | 2023.04.15 |