기존의 만들어 둔 Todo 리스트에서 각 게시물을 작성한 작성자를 프론트단에 표시하고 싶어짐
이 경우 현재 프론트에서는 Task 관련 API 요청의 응답을 화면에 뿌려서 보여주고 있지만 각 글의 작성자, 쉽게 말해 현재 로그인 한 상태로 글을 쓰는 사용자의 이름값은 User 관련 API 요청으로 받을 수 있음
즉 요청관련 백엔드 model 객체가 다르고, 서로 연관성이 없음!
우선 taskSchema 에 위와 같이 writer 라는 필드를 추가하고, ref 에 User 모델 이름을 추가해서 해당 컬렉션을 참조하도록 설정
결과적으로 이는 type을 Schema.Types.ObjectId
로 지정하여 이 writer 필드에 담기는 값이 User 모델객체의 id값이 되도록 함 (참조)
중요한 것은 이렇게 Schema 내린 후, 실제로 해당 Task 모델 객체의 writer 필드에 값을 넣어준 후 사용해야 한다는 것임
여기서는 writer 필드에 User 모델 객체의 id값, 정확히는 현재 로그인 한 유저의 id값이 담겨야 함
프론트에서 createTask API 호출 시 요청에 따로 userId 값을 포함해서 보내는 방식도 가능하나 여기서는 미들웨어 방식으로 req에 담아서 가져옴
authenticate 로직 함수를 미들웨어로 활용해서 UserId값 받아오기
authenticate
로직 함수를 createTask
함수 보다 먼저 실행하도록 하여 미들웨어로 활용 해당 로직을 살펴보면 요청으로 받아오는 토큰 값을 디코딩하여 User의 id값을 반환하고 이를 requset 객체에 담아서 보내는 것 확인 가능
이 로직을 우선 실행하여 request에 담고 나서 next 호출로 뒤의 authenticate
를 실행하게 되면 request 객체에 id값이 존재하게 되고, 이 id 값을 wrtier 필드의 값에 할당해주면 됨
Populate
메서드를 활용해서 위의 문제점을 해결 가능
Populate
는 DB 에서 데이터 객체를 받아올 때, 지정한 필드의 id값 (여기서는 writer 필드)을 이용해 필드가 참조하는 모델 객체 내에서 해당 id값을 지닌 Document 자체를 필드 값으로 반환
앞서 Schema 에서 type은 ObjectId 로, ref 는 User로 지정하였기에 populate 를 사용하면 현재 Task 모델객체의 writer 필드에 있는 id값과 일치하는 User 모델객체 내 Document가 writer 필드의 값으로 다시 할당되는 것
이제 Task 컬렉션의 각 할 일 목록 데이터 + User 컬렉션의 사용자 이름 데이터를 받아서 사용 가능
결과적으로 한 번의 요청을 통해 두 개의 컬렉션에서 데이터를 가져와서 프론트에서 각 데이터를 알맞게 사용할 수 있게 됨
관련 정리 블로그