• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

안녕하세요! 질문있습니다.

21.03.30 11:36 작성 조회수 71

1

안녕하세요! 좋은강의 감사드립니다.

이번 수업시간에 궁금한점이 생겨 질문드립니다.

회원수정 API에서 findByIdAndUpdate 하는 부분이 있는데요.

해당 method의 세번째 인자값으로 { new: true }를 추가하면 해당 API의 결과값으로 업데이트된 user의 data를 가져오게 되는데요.

이때의 세부 과정이 궁금합니다.

먼저, client로부터 입력받은 userId에 해당되는 user data를 mongodb로 부터 가져와서 그 가져온 user data 값을 애플리케이션단에서 변경하는 것인지, (select -> update query 수행)

아니면 update query이후 한번의 조회 query를 또 수행시키는 방식으로 업데이트된 user data를 조회하는 것인지 궁금합니다. (select -> update -> select query 수행)

답변 1

답변을 작성해보세요.

1

ygh님 안녕하세요 :)

좋은 질문입니다! findByIdAndUpdate를 하면 모든 작업은 데이터베이스에서 하나의 operation으로 이루어집니다. 데이터베이스에서 해당 문서를 탐색하고 수정을 한 후 결과값을 돌려주는데요. new를 설정하지 않으면(기본값이 false에요) 수정되기 전 문서를 메모리에 가지고 있다가 수정이 완료 된 후 기존 문서를 돌려줘요. new를 true로 하면 수정된 문서를 보내주구요. 그래서 성능차이도 사실상 없거나 미비하다고 보면 되요. 그래서 성능을 조금이라도 올리고 싶다면 다음 방법보다는 findByIdAndUpdate가 더 효율적이죠:

findOne() -> 노드에서 문서 수정 -> document.save()

이 방법으로 하면 디비를 2번 거치는거라 "대략적으로" 2배로 더 느려질 수 있어요.

아 그리고 참고로 findById 이 부분은 mongoose가 findOne({ _id: id }) 이런식으로 중간에 변환해줍니다. 성능상으로나 몽고에 들어가는 명령으로나 동일하다가 보면 되요. 그냥 조금이라도 코드를 더 간결하게 해주는 용도에요 :)

ygh님의 프로필

ygh

질문자

2021.03.30

좋은 답변 감사드립니다:) 도움이 됐습니다!