인프런 커뮤니티 질문&답변
몽구스 시퀀스 관련 질문
작성
·
538
1
안녕하세요.
게시글에 1부터 시작하는 넘버를 부여하고 싶어서 몽구스의 시퀀스 기능을 찾아봤는데, 자체적인 auto increment 기능은 없고 몽구스 시퀀스 라이브러리를 이용해야 하더라고요.
잘 이해가 안 가서 그냥 _id로 게시글 번호를 줘버렸더니, 해당 게시글의 _id를 못 찾았을 경우 (예를 들어 _id를 엔드포인트로 하는 경로가 틀렸을 경우) throw new UnauthorizedException 에러가 아니라 500 에러를 띄워서.. 왜 500 에러가 뜨는지도 모르겠고 예상과는 다른 에러에 다시 시퀀스 방법을 찾아보는 중입니다.
관련해서 상석 님이 답변해주신 게시물도 읽어 봤는데, 이 몽구스 시퀀스를 어떻게 활용하는 건지 감이 전혀 잡히지 않아 질문하게 되었습니다. 혹시 몽구스 시퀀스 코드를 어디서 (서비스라든지 스키마라든지) 작성해야 하는지 간단한 예제를 보여 주실 수 있으실까요? ㅠ 아직 초보라서 활용 방법이 너무 어렵네요 ㅠㅠ...
https://github.com/ramiel/mongoose-sequence
답변 1
1
안녕하세요!
플러그인을 사용할 경우 예시는 아래 링크를 참조해주세요!
https://stackoverflow.com/questions/62824276/auto-increment-sequence-in-nestjs-mongoose
외부 플러그인을 사용하는 방법도 있지만 공식문서에서 제시하는 방식은 아래와 같습니다.
https://docs.mongodb.com/v3.0/tutorial/create-an-auto-incrementing-field/
해당 문서에서 설명하는 과정을 큰 그림으로 그리면 아래와 같습니다.
1. db에 counters라는 collection을 만들고 "userid" 값을 가지는 _id를 지정해주고 증가시킬 seq 값을 default 값을 0으로 둡니다.
2. 공식문서에서 설명하는 getNextSequence 라는 함수를 만들고 임의의 collection이 저장되기 전에 hook을 걸어줍니다.. (mongoose에서 제공하는 pre 함수를 사용하면 됩니다.)
몽고디비 특성상 _id는 ObjectID 타입으로 그대로 두는 것을 권장드립니다.
그냥 object _id 값 그대로 사용하는 방법으로 해결했습니다! 그런데 주신 링크에 대해 궁금한 점이 있습니다.
해당 문서의 코드를 mongosh에 복사 붙여넣기 하면 _id값이 수정되고 디비에 저장도 되는데, 결국 이걸 nest에서 어떻게 사용하는지를 모르겠습니다. 지금까지 nest의 서비스단에서 this.~~Model.create() 같은 방식으로 db에 값을 넣어줬었는데, getNextSequence 함수를 보면 db.counters.findAndModify라고 되어 있어서 counters라는 스키마를 새로 만들어야 하는 건지, this.counters 이렇게 접근해야 하는 건지, getNextSequence 함수는 서비스단에서 사용하면 되는 건지 이런 게 잘 잡히지 않네요.. ㅠㅠ
제가 만일 해당 방식을 프로젝트에 적용한다면, counters라는 스키마를 따로 만들어 정의하고 getNextSequence 함수를 따로 만들어서 create할때 DI가 아닌 직접 호출해서 사용할 것 같습니다. 혹은 해당 메서드를 모듈화해서 개발자 친화적으로 커스텀 모듈을 만들어서 DI가능하도록 만드셔도 좋습니다.





.png?w=112)
시도해보시고 어려운 부분 추가적으로 질문하셔도 좋습니다~!