Node.js

게시물마다 번호를 달아 저장하려면

MoZZANG 2022. 6. 10. 20:31

 

_id를 달아서 저장합시다. 

MongoDB에 데이터를 저장할 땐 _id라는 값을 꼭 넣으셔야합니다. 그래야 삭제도 쉽고 나중에 수정도 쉬우니까요.

아까 모르고 안넣으셨다고요? 괜찮습니다.

안넣으시면 MongoDB에서 알아서 ObjectId() 어쩌구 이런걸 만들어서 아이디를 강제로 부여해줍니다.  

무작위의 숫자와 문자로 이루어져있는데 

이게 싫으면 애초에 저장할 때 직접 _id를 강제로 달아주셔도 됩니다.

 

 

 

예전에 작성했던 post 요청 처리하는 서버코드를 다시 살펴봅시다. 

 

위의 코드에 주황색으로 표시된 부분을 새로 추가했습니다.

insertOne 함수 안에 _id : 1 이라는 항목을 요로케 써주시면... 번호달아서 저장하기 끝입니다.

 

 

그런데 1이라고 하드코딩을 해버렸네요. 글 쓸 때마다 항상 _id : 1일 수는 없죠?

2번째 글이면 _id: 2, 

3번째 글이면 _id : 3이 되어야 합니다. 

 

 

 

다른 DB에선 _id를 자동으로 1증가시켜서 추가해주세요~ 이런 기능이 있는데 (Auto Increment라고 합니다)

MongoDB는 그런거 없습니다. (실은 별로 필요없어서 그렇습니다)

그래서 여러분이 직접 지금까지 몇번 게시물을 발행했는지를 어딘가에 기록해두셔야합니다.

그리고 방금 코드를 이렇게 바꾸면 되겠죠? 

 

_id : 1 이라고 하드코딩 하지 말고 위 코드 처럼 바꾸면 글을 하나 발행할 때마다 유니크한 _id가 부여되겠군요.

 

 

 

 

 

 

지금까지 몇번 게시물을 발행했는지 기록합시다.

여러분 mongodb atlas 홈페이지 들어가셔서 대시보드에서 collection을 하나 더 만들도록 합시다. 

 

좌측에 여러분 todoapp이라는 데이터베이스에 + 버튼을 누르시면 collection(파일)을 하나 더 생성 가능합니다.

counter라는 이름을 가진 collection을 생성합시다. 

 

 

 

방금 새로만든 counter라는 콜렉션에 데이터를 하나 강제로 집어넣어봅시다. 

 

 

 

우측에 보면 Insert Document 흰버튼을 누르시면 강제로 항목을 하나 추가 가능합니다.

그리고 이렇게 그대로 작성한 후 Insert 버튼을 누르면 되겠습니다. 

(totalPost 라는 항목은 Int32로 셋팅하는거 잊지마세요)

 

 

이게 바로 여러분이 지금까지 몇번 게시물을 발행했는지를 기록할 공간입니다.

totalPost라는 곳에 저장할 것입니다. 

지금은 아무 게시물도 발행되지 않았다고 생각하고 초기값은 0이라고 합시다. 

 

 

 

 

 

그럼 아까 POST 요청 처리하는 코드를 수정해야겠군요

 

그리고 방금 코드를 이렇게 바꾸면 되겠죠? 

 

한글로 예쁘게 적은 부분을 자바스크립트 코드로 그대로 번역만 하시면 되겠습니다. 

 

 

 

1. findOne함수를 쓰시면 collection 내에서 내가 원하는 문서를 쉽게 찾을 수 있습니다.

    그럼 찾은 결과는 function내의 결과라는 이름의 변수에 담겨옵니다.

2. 그럼 아까 저장한 totalPost라는 자료도 출력가능합니다. 그걸 총게시물갯수 변수에 저장합니다. 

3. 그리고 그 다음에 post라는 콜렉션에 insertOne을 써서 제대로된 _id와 함께 자료를 저장합니다. 끝!

4. 그리고 응답.send 라는 코드를 이용해 응답해줍니다. (응답.어쩌구는 꼭 들어있어야합니다)

 

 

 

 

이런 긴 코드는 무슨 예술작품처럼 한눈에 보고 이해하려하시면 안됩니다.

위에서 부터 한줄한줄 읽어나가셔야합니다.

그럼 이해를 돕기 위해 위 코드를 차례로 다시 설명해드리자면

 

 

 

1번줄 : 누군가 /add 경로로 post 요청을 하면

2번줄 : counter라는 콜렉션에서 총게시물갯수 저장해놓은 문서를 찾습니다. 그 찾은 문서는 결과라는 변수에 담겨옵니다.

3번줄 : 결과.totalPost하면 총게시물 갯수가 뿅하고 출현합니다. 그걸 var 총게시물갯수 변수에 저장해서 사용합니다.

4번줄 : 이제 글저장 시간입니다. post라는 콜렉션에 insertOne을 이용해 게시물을 추가합니다. 추가할 때 _id를 var 총게시물갯수를 이용해 제대로 부여해줍니다. 

6번줄 : 성공했다고 응답.send로 브라우저에게 글자를 보냅니다. 응답.render, 응답.redirect 이런 것도 이용가능합니다. 

 

 

근데 뭔가 하나의 기능이 빠져있습니다. 4번줄에서 글을 잘 발행했다면...

counter라는 콜렉션 내의 'totalPost'라는 값도 1 증가시켜야하겠는데요?

 

 

 

 

 

 

DB 데이터를 수정하고 싶으면 updateOne을 쓰시면 됩니다. 

 

counter라는 콜렉션 내의 자료를 수정하고 싶으면 이렇게 하시면 됩니다. 

 

updateOne 함수엔 파라미터가 세개가 필요합니다.

왼쪽엔 { name : '게시물갯수' } 이렇게 자료를 찾을 수 있는 이름이라든지 쿼리문을 적어주면 됩니다. 

 

가운데는 여러분이 수정할 값을 입력해주시면 됩니다. 그런데 약간 특이합니다. 

{ $set : { totalPost : 100 } } 이렇게 넣어서 값을 아예 100으로 변경할 수도 있고

{ $inc : { totalPost : 5 } } 이렇게 넣어서 값을 5만큼 더해줄 수도 있습니다. (inc는 increase의 약자)

$ 표시 붙은게 바로 operator 라는 문법입니다. 여러 종류가 있으니 나머지는 필요할 때 찾아쓰도록 합시다. 

 

오른쪽은 그냥 콜백함수입니다. 수정이 실패나 성공시 실행할 코드를 안에 담으시면 됩니다. 

 

 

 

 

 

 

그럼 데이터를 1 증가시키려면 이렇게 하면 되겠군요.

▲ 위의 totalPost라는 데이터를 1 증가시켜봅시다. 

 

 

 

이 코드를 실행하면 totalPost라는 항목이 1 증가합니다. 끝!

 

 

 

 

 

 

이 코드를 언제 실행시켜야합니까

 

언제겠습니까. 글을 하나 발행할 때 아니겠습니까. 

 

이렇게 글 발행해주는 코드 안에 뿅하고 집어넣어주시면 되겠습니다.

 

 

 

 

 

 

 

 

 

 

<출처 : 코딩애플 : Node.js, MongoDB로 2시간 만에 빠르게 웹서비스 만들기>