Seongwon Lim

[MongoDB] Node.js mongoose를 이용한 CRUD 본문

MongoDB

[MongoDB] Node.js mongoose를 이용한 CRUD

limsw 2022. 5. 9. 20:50
반응형

해당 포스팅은 Node.js mongoose를 이용한 MongoDB 다루기 마지막 글이다. 이번 글에서는 MongoDB CRUD 예제를 다룰 예정이므로 스키마 및 모델 정의가 되지 않은 분들은 위 포스팅 글을 참고하면 좋을 것 같다.

서론

이전 글에서는 find() 메서드를 이용한 조회 기능과 save() 메서드를 이용하여 Document를 저장하는 예제를 살펴보았다.

이번 CRUD에서 다루고자 하는 내용은 다음과 같다.

  • find() 메서드에 조건을 추가하여 전처리 된 Document 조회
  • findOne() 메서드를 이용한 데이터 단일 조회
  • 스키마를 수정 후 Document 저장 시 이름 중복 확인하기
  • update() 메서드를 이용한 Document 수정
  • remove() 메서드를 이용한 Document 삭제

Read 기능 구현하기

Collection에 들어있는 데이터는 다음과 같은 상태에서 진행하였다.

find() 메서드에 조건 추가하기

먼저 find() 메서드에 조건을 추가하려면 다음과 같이 코드를 수정할 수 있다.

// 기존 코드 : 모든 Document 조회하기
router.get('', (req, res, next) => {
    
    User.find().then((result) => {
        res.json(result);
    }).catch((err) => {
        res.send(err);
    });
});

// 수정된 코드 : 성별이 male인 Document 조회하기
router.get('', (req, res, next) => {
    
    User.find({sex: "male"}).then((result) => {
        res.json(result);
    }).catch((err) => {
        res.send(err);
    });
});

find()메서드에 조건을 추가하기 위해서는 {}안에 조건을 추가하면 된다.

포스트맨을 통해서 본 결과이다. 위 사진과 같이 성별이 남성인 Document 2개가 반환된 것을 확인할 수 있다.

findOne() 메서드를 이용하여 데이터 단일 조회

findOne() 메서드는 전처리 된 데이터 중에서 가장 최상위에 있는 데이터 하나를 반환해주는 메서드이다.

router.get('', (req, res, next) => {
    
    User.findOne({sex: "male"}).then((result) => {
        res.json(result);
    }).catch((err) => {
        res.send(err);
    });
});

위처럼 기존의 find()함수를 findOne()함수로 변경한 뒤 GET 요청을 보내면?

상위 데이터 1개만 결과로 받아오는 것을 확인할 수 있다.

Create 기능 수정하기

현재 스키마는 어떠한 중복 처리도 되지 않았기 때문에 동일한 Document를 저장해도 문제 없이 저장된다. 그러나 실제 프로젝트를 구현할 때는 이메일 중복 체크와 같이 사용자의 유저 정보가 중복되는 일이 없도록 해야한다.

 

필자의 스키마는 현재 이메일 필드가 없으므로 name 필드가 중복되지 않도록 스키마를 수정하기로 했다.

 

따라서 현재 스키마의 name 필드가 중복되지 않도록 하기 위해서는 필드를 다음과 같이 수정할 수 있다.

// user.js
const userSchema = mongoose.Schema({
    name: {
        type: String,
        maxlength: 50,
        unique: true, // 해당 부분 추가
    },
    password: {
        type: String,
        minlength: 7,
    },
    sex: {
	    type: String,
    }
});

unique 옵션을 추가함으로써 해당 필드를 유니크하게 지정한 것이다. 이제 기존에 있던 name 값과 똑같이 값을 적은 후 POST 요청을 보내보면

400 Bad Request 에러를 반환한 것을 볼 수 있다. 에러를 살펴보면 name의 값으로 lim이 중복됐다는 것을 확인할 수 있다.

Document 수정하기

Document 수정할 때에는 update() 메서드를 이용한다.
코드는 다음과 같이 구성할 수 있다.

router.patch('', (req, res, next) => {
    User.update({name: "lim"}, {name: "limsw"})
    .then((result) => {res.json(result)})
    .catch((err) => {res.json(err)});
});

update() 메서드는 2개의 인자를 받는데 첫번째는 조건이고 두번째는 바꿀 데이터를 명시한다. 필자는 name의 값으로 lim을 가진 Document를 찾아서 해당 Document의 name을 limsw로 바꾼 것이다.

 

이제 localhost:3000/user에 PATCH 요청을 보내보면

요청이 잘 수행된 것을 확인할 수 있다. 결과는 다음과 같다.

데이터 또한 limsw로 사용자가 정의한 대로 잘 바뀐 것을 확인할 수 있다.

Document 삭제하기

Document를 제거할 때에는 remove() 메서드를 이용한다. 예시 코드는 다음과 같다.

router.delete('', (req, res, next) => {
    User.remove({name: "limsw"})
    .then((result) => res.json(result))
    .catch((err) => res.json(err));
});

remove()의 인자로 조건을 주면 그 조건에 맞는 데이터를 삭제하게 된다.


이제 localhost:3000/user에 DELETE 요청을 보내보면

요청이 잘 수행된 것을 확인할 수 있으며

Document또한 2개로 줄어든 것을 확인할 수 있다.

remove() 메서드 사용 시 주의할 점

조건을 명시할 때 조건에 부합되는 Document가 여러 개 있는 경우 해당 Document들을 전부 삭제하게 된다.

 

예를 들어 필자의 데이터에 성별이 male인 Document가 100명이라고 했을 때 User.remove({sex: "male"}) 이런 식으로 조건을 설정했다면 100개의 Document가 모두 삭제될 수 있으므로 주의해야 한다.

번외 - Mongoose CRUD functions

해당 주소의 Table of Contents탭에 mongoose에서 제공하는 CRUD 메서드와 예시들이 잘 정의되어 있으므로 다양한 로직을 작성해보고 싶은 분들은 위 사이트를 참고하면 좋을 것 같다.

Comments