~16.3 댓글 목록 가져오기(종이책 p.475~487)
보통 게시판의 특정 글을 클릭하면 상세 페이지(show)가 뜨면서 그 아래에 댓글(_comments)이 보인다. 댓글 영역은 크게 두 가지로 나뉘는데, 기존 댓글을 보여 주는 영역(_list)과 새 댓글을 입력하는 영역(_new)이다. 두 영역은 별도의 뷰 페이지를 만들어 상세 페이지 아래에 삽입하는 형태로 구현한다.
controller 패키지의 ArticleController를 보면 show() 메서드가 /articles/{id}로 접속했을 때 보여 주는 페이지를 반환하고 있다. return문을 보면 반환하는 뷰 페이지는 articles 디렉터리의 show.mustache 파일이다.
댓글은 페이지 맨 밑에 넣기로 했으니 show.mustache 파일을 열고 푸터(footer) 바로 위에 댓글 뷰 파일을 삽입한다.({{>comments/_comments}}). 이렇게 하면 comments 디렉터리의 _comments.mustache 파일을 연결해 상세 페이지에서 댓글이 보이게 된다.
_comments.mustache 파일이 아직 만들어지지 않았으므로, templates 디렉터리에 comments 디렉터리를 생성하고 그 안에 _comments.mustache 파일을 만든다.
댓글을 볼 수 있도록 다음과 같이 _comments.mustache 파일에 코드를 작성한다.
<div>
{{>comments/_list}}
{{>comments/_new}}
</div>
<div></div> 태그로 레이아웃을 잡고 그 안쪽을 2개 영역으로 나누어 뷰 파일을 삽입한다. _list.mustache 파일은 댓글 목록을 보여주고, _new.mustache 파일은 새 댓글을 작성한다.
comments 디렉터리 안에 _list.mustache 파일과 _new.mustache 파일을 만든다.
_list.mustache 파일로 가서 다음과 같은 코드로 댓글 목록 뷰 페이지를 만든다.
<div id=”comments-list”>
{{#commentDtos}}
<div class=”card m” id=”comments-{{id}}”>
<div class=”card-header”>
{{nickname}}
</div>
<div class=”card-body”>
{{body}}
</div>
</div>
{{/commentDtos}}
</div>
<div></div> 태그로 댓글 목록 전체를 보여 주는 영역을 만들고 id=”comments-list”로 설정한다.<div></div> 태그로 댓글 하나를 보여주는 영역을 만든다. 이때 class=”card” 속성은 이 영역을 카드 구조로 만들라는 뜻이고, id=”comments-{{id}}” 속성은 반복되는 commentDtos에 있는 id값을 삽입해 이 영역의 id를 comments-1, comments-2, comments-3 등으로 설정하라는 뜻이다.<div></div> 태그로 댓글 내에서 헤더 영역(class=”card-header”)을 만들고, commentDtos에 담겨있는 {{nickname}}을 보여준다.<div></div> 태그로 댓글 내에서 본문 영역(class=”card-body”)을 만들고, commentDtos에 담겨 있는 {{body}}를 보여준다.※ 이렇게 작성하면 댓글이 너무 붙어 있기 때문에 보기 좋게 여백을 주기 위해서 “card m-2”로 설정해준다.
서버를 실행하고 5번 게시글의 상세 페이지를 봐도 댓글이 보이지 않는다. 왜냐하면 뷰 페이지에서 사용하는 commentDtos를 모델에 등록하지 않았기 때문이다.
뷰 페이지에서 사용할 변수는 반드시 모델에 등록해야 사용할 수 있기 때문에 댓글 목록을 모델에 등록해야 한다.
ArticleController로 가서 show()메서드에서 댓글 목록을 가져와 반환하도록 한다.
먼저 CommentService의 comments(id) 메서드를 호출해 조회한 댓글 목록을 List<CommentsDto> 타입의 commentDtos 변수에 저장한다.
List<CommentDto> commentsDtos = commentService.comments(id);
CommentService 객체를 주입한다.
@Autowired
private CommentService commentService;
받아 온 댓글 목록(commentDtos)을 모델에 등록한다.
model.addAtrribute(”commentDtos”, commentsDtos);
이제 서버를 재시작하고 5번 게시글의 상세 페이지(http://localhost:8080/articles/5)로 가면 댓글이 나오는 것을 확인할 수 있다.
