작업 노트
게시판 시작해봅시다 -6 본문
게시글에 유저를 연결해서, 게시물에 글쓴이를 표시하고, 로그인한 계정과 글쓴이가 일치하는 경우 글을 수정, 삭제할 수 있게 해봅시다.
첫째로 게시글에 유저 정보를 담아야 합니다. 두개의 data에 relationship을 만드는 것이죠.
지난번 포스팅에서 말했던 것 처럼, _id는 단순한 문자열이 아닙니다. _id를 담기 위해서는 mongoose.Schema.Tyopes.ObjectId로 표시해야 합니다. 그리고 ref:'user'를 통해서 이 항목이 user collection을 가리키고 있다는 것을 나타내어 줍니다.
본격적으로 코드를 수정하기 전에, 기존의 게시글들을 다 지워줍니다. 새로운 항목을 사용해야 하는데, 그 항목이 없는 이전의 게시글들은 에러를 발생합니다. 물론 null체크를 하여 기존의 데이터와 호환성을 유지할 수도 있는데, 이 포스팅에서는 하지 않겠습니다.
게시글 생성하는 route를 수정합니다. new에서는 게시글 작성시에 로그인 되어 있는 유저를 form에서 보여주기 위해 로그인되어 있는 유저를 전달하겠습니다.
req.user를 사용하기 전에 login체크를 합니다. 만약 로그인이 안되어 있는 상태라면 req.user가 null이기 때문에 에러가 발생합니다.
(물론 비로그인자의 글 작성을 위해 req.user를 null체크해서 따로 기능을 추가할 수도 있습니다.)
글 작성시에는 post.author에 req.user._id를 대입하여 data를 생성합니다.
view파일입니다.
user의 nickname을 아래와 같이 표시하게 됩니다.
이제 게시글 리스트에 작성자를 표시하겠습니다.
오늘 새로 익히는 함수는 모델.populate()입니다. 게시글 data는 user의 _id를 가지고 있을 뿐, user의 nickname을 가지고 있지 않습니다. populate("author")를 사용해서 reference인 user object를 찾아서 author를 치환합니다. reference가 반드시 있어야 하는 이유입니다.
view 입니다.
아래는 실행결과입니다.
다음으로 show를 수정하겠습니다.
각각의 게시글도 nickname을 표시해 줘야 하니까 populate를 해줍니다. 또한 로그인된 user가 일치하는 경우에만 수정, 삭제 버튼을 보여주기 위해 user도 넘겨줍니다.
아래는 실행결과 입니다.
만약 로그인한 계정이 글쓴이와 일치하지 않으면 edit, delete버튼이 안보이겠죠.
다음으로, 수정과 삭제인데요..
127번째 줄 : _id는 문자열이 아니라 object이므로 ==로 비교하면 같은 문자열이라도 결과적으로 다르다고 나옵니다. 그렇기 때문에 Schema.ObjectId에는 equals함수가 있는데, _id 문자열 값이 같으면 true, 다르면 false를 return합니다.
223~230번째 줄, 233~239번째 줄 : 게시글을 수정, 삭제 하기 전에 작성자와 로그인한 계정을 확인해주는 부분인데요.. 바로 findByIdAndUpdate, findByIdAndRemove하는 것이 아니라, findById만해서 계정을 확인하고 계정이 일치하는 경우에 다시 각각의 함수를 호출해서 처리하고 있습니다.
(포스팅 이후 추가 : 이 부분의 코드는 다음번 포스팅에 개선된 버전이 있습니다.)
view입니다.
edit은 항상 별로 특별한게 없네요..
많이 부족하지만 로그인도 있고 최소한의 기능은 작동하는 게시판이 되었습니다!
이제 여기까지 배운 것을 응용하면 기능을 더 추가할 수 있습니다. 예를 들어,
- 게시글에 댓글을 다는 기능(hint를 드리자면, comment 모델을 추가해야합니다. reference로 post와 user를 가져야 하구요.)
- 아무글이나 다 수정, 삭제가 가능한 관리자 계정(hint: user모델에 admin항목을 두고 true면 관리자, 아니면 일반 사용자)
- Profile에 작성 글 수 표시
- 게시글에 조회 수 표시, 추천기능
등등은 지금까지 익힌 것들로만으로도 충분히 가능합니다. 위 기능들을 다 연습하시고 좀 더 복잡한 기능을 추가하고 싶으시면,
- 게시글에 답글을 다는 기능(self reference를 줘야 하고 view도 많이 신경써야 해서 comment보다 귀찮은 기능이죠)
- 친구추가(역시 self reference.. self는 자기 자신을 가리키는 것이 아니라 User 모델이 다른 data인 User 모델을 가리킨다는 겁니다.)
- 검색기능 및 페이지 표시 기능(이정도까지 하시면 DB를 꽤 다룰 수 있는거죠..)
까지 도전해 보시기 바랍니다. 아마 이 강좌가 끝나면 하나씩 해볼 날이.. 있을지도.......
일단 엉성하지만 게시판이 완성되었으니! 제 강의는 다음으로 진행하도록 하겠습니다.
다음 강의로 refactor를 한번 하겠습니다. app.js 한 파일에 모든 기능을 쑤셔 넣어놨는데.. 사실 이렇게 코딩하면 큰 프로젝트에서는 하루종일 스크롤만 하게 되는 경우가 있습니다. 기능별로 파일을 쪼개 보겠습니다.
github.com/imtaekh/my_app/tree/be31544796a3ad04f933de22cc86f7d846bf7e72에서 코드를 보실 수 있습니다. git clone한 다음 git reset --hard be31544하시면 컴퓨터에서 코드를 보실 수 있습니다. |
'javascript > w3schools nodejs' 카테고리의 다른 글
게시판 시작해봅시다 -8 (0) | 2017.02.23 |
---|---|
게시판 시작해봅시다 -7 (0) | 2017.02.23 |
게시판 시작해봅시다 -5 (0) | 2017.02.23 |
게시판 시작해봅시다 -4 (0) | 2017.02.23 |
게시판 시작해봅시다 -3 (0) | 2017.02.23 |