백엔드 개발자(node.js)가 되는 과정

mongoDB의 find 사용 시 주의할 점

soopy 2023. 6. 14. 21:23
728x90

case 1

const user = await User.findOne({ _id });

위 코드는 User 컬렉션에서 _id의 값을 찾는 명령이다. 만약 _id 변수의 값이 컬렉션에 없는 id라면 null이 결과로 나온다.

const update = { '$set': {age: 40} }
await User.updateOne(user, update)

위 코드는 검색한 user에 대해서 나이를 40으로 변경하라는 명령이다. 그런데 만약 user가 null이라면 어떻게 될까? 일반적으로는 당연히 조건에 일치하는 유저가 없으니 아무런 변경이 없어야 한다.
하지만 User 컬렉션에서 가장 오래된 유저 데이터(다큐먼트)의 나이를 바꿔버린다.

updateOne 메서드가 원치 않는 명령을 수행하는 것이다. 이 부분은 의도한 바와 다르기 때문에 해결하기 위해서는 반드시 null값에 대응하기 위해서는 if (!user) return res.send( { 'msg': '데이터 없음'})과 같은 처리를 통해 방지해야 한다.

 

case  2

const user = await User.findById({ _id });

위 경우는 mongoDB에서 자동으로 생성해주는 ObjectId 조회를 통한 find 메소드에 해당한다. 사실 find와 큰 차이는 없지만 굳이 다른 예시를 가져왔다.
여기서도 만약 _id 변수의 값이 컬렉션에 없는 id라면 null이 나온다. 사실 null은 에러가 아니기 때문에 위와 같은 if문 처리를 해주지 않으면 뒤에 가서 큰일날 수가 있다.

const age = user.age;

위 코드처럼 _id를 기준으로 user를 찾은 후 해당 유저의 나이를 변수도 받고 있다. 그런데 user가 null이라면?? 위 코드에서는 에러가 발생한다. null에서 age 프로퍼티를 찾을 수 없다.라는 에러와 함께 서버가 정지한다. 그렇기 때문에 이를 방지하기 위해서는 반드시 try, catch문으로 대응을 해줘야 한다.

정리하자면 find의 결과가 null이길 바라지 않는 API 에서는 반드시 에러 비슷한 처리를 해줘야 하며, 이를 놓친다면 null값에 대한 프로퍼티를 요청하는 코드가 동작할 경우 에러가 발생할 것이므로 이를 위한 try, catch도 함께 이용하는 것이 좋다.

728x90
728x90