회원과 게시글의 연동

Jong-uk·2023년 4월 13일
0

엘리스 온라인 학습

목록 보기
27/39
post-custom-banner

기능

  1. 게시글 작성 시 로그인 된 회원 정보를 작성자로 추가
  2. 게시글 - 작성자는 populate하여 사용하도록 구현
  3. 게시글 수정, 삭제 시 로그인 된 유저와 작성자가 일치하는지 확인
  4. 작성자의 게시글 모아보기 기능 구현

PostScema 수정

  • PostScema에 author추가
  • populate를 사용하기 위해 ObjectID 사용
  • ref를 유저 모델의 이름인 'User'로 선언
author: {
  type : Scema.Types.ObjectId,
  ref : 'User',
  required : true,
},

게시글 등록 요청 수정

const author = await User.find({
  shortId : req.user.shortId,
});
if(!author){
  throw new Error("No User");
}
await Post.create({
  title,
  content,
  author.
});

게시글 작성자 연동

  • 게시글 find시 populate를 추가하여 ObjectID로 저장된 author를 각 게시글에 주입

  • 사용시 post.author.{field}로 사용 가능

--- ./routes/posts.js ---
router.get('/', ... {
 ...
 const posts = await Post
   .find({})
   ...
   .populate('author');
res.render('posts/list', { posts });
--- ./views/posts/list.pug ---
...
 td post.author.name

게시글 수정, 삭제 시 유저 확인

  • 게시글 수정, 삭제 시 작성자를 populate하여 로그인된 사용자와 일치하는지 확인
const post = await Post.find({
 shortId,
}).populate('author');
if (post.author.shortId !== req.user.shortId) { throw new Error('Not Authorized');
}

작성자 게시글 모아 보기 기능

  • MongoDB는 document 검색 시, 전체 문서를 하나씩 확인함
  • 데이터가 크면 속도 저하의 가장 큰 원인이 됨
  • Index를 설정하면 주어진 쿼리를 효율적으로 수행하여 성능을 향상!

author에 index 설정

  • 몽구스가 자동으로 몽고디비에 인덱스 생성
  • 이미 데이터가 많은 상태에서 인덱스 추가할시 작업시간이 길어짐(몽고디비가 응답하지 않을 수 있음) -> 예상되는 인덱스를 미리 추가하는 것이 좋음
author: {
type: Schema.Types.ObjectId, ref: 'User',
required: true,
index: true,
},

회원 게시글 라우팅 추가하기

  • RESTful한 구성을 위해, 회원 -> 게시글의 경로를 '/user/{userId}/posts'로 구성
  • 게시글 목록 view는 기존에 작성한 posts/list.pug를 재활용
--- ./routes/users.js ---
...
router.get('/:shortId/posts', ... => {
...
const { shortId } = req.params;
const user = await User.find({ shortId }); const posts = await Post
    .find({ author: user })
    .populate('author');
   res.render('posts/list', { posts, user });
}); ...

게시글 목록 화면 수정

  • 게시글 목록 화면을 재활용 하기 위해 수정
  • 유저의 게시글인 경우 '###의 게시글'이라는 제목 사용
  • 게시글의 사용자가 이름에 유저 게시글 link 추가
h2= user ? `${user.name}의 게시글`: "전체 게시글" ...
td: a(href=`/users/${post.author.shortId}`)
  = post.author.nam
profile
안녕하세요! 만나서 반갑습니다.
post-custom-banner

0개의 댓글