스프링부트 27강 댓글 수정하기에서 제일 마지막 부분에 훈련하기에서 막혀서 질문 드립니다 다른거는 다 했는데 JpaRepositor y정렬하기에서 막혔네요 ㅜㅜ 최신댓글 상단에 나오게하기... 구글링도 해보고 다른책 참고하면서도 해봤는데 도저히 못하겠습니다 엉엉 도와주세요...
리파지토리는 db와 관계가 있습니다. jpa는 리파지토리가 db와 소통하는 것을 도와주는 역할을 합니다. 정렬은 db에서 order by를 의미합니다. 그러므로 JpaRepository를 상속받은 리파지토리에 정렬관련 메소드를 선언하고 컨트롤러에서 호출해줘야 db에서 정렬이 됩니다.
답변 감사합니다! 말씀하신 부분까지는 했는데 마지막에 컨트롤러에서 뿌려주는 부분에서 막혔네요 ㅠㅠ 모델객체에 담고 뿌릴려는데 어렵네요 ㅜㅜ 코드좀 한번 봐주실 수 있나요?? @GetMapping("/articles/{id}") public String show(@PathVariable Long id, // url의 {id}의 값을 변수화 Model model) { // id를 통해 article을 가져옴 Article article = articleRepository.findById(id) .orElseThrow( () -> new IllegalArgumentException("해당 Article이 없습니다.") ); model.addAttribute("article", article); model.addAttribute("comments", article.getComments()); model.addAttribute("commentList", commentService.findAllDesc()); return "articles/show"; } 마지막부분 보시면 service에서 정렬기능을 구현하고 모델객체에 commentList로 변수선언한 상태입니다 <ul class="list-unstyled"> {{#comments}} <li class="media mt-4" id="comments-{{id}}"> <img src="https://api.adorable.io/avatars/64/{{author}}.png" class="mr-3" alt="avata"> <div class="media-body"> <!-- 댓글 --> <h5 class="mt-0 mb-1">{{author}} <small> <!-- 부트스트랩 collapse 활용, https://getbootstrap.com/docs/4.5/components/collapse/ --> <a href="#" class="comment-edit-btn" data-toggle="collapse" data-target=".multi-collapse-{{id}}">수정</a> <!-- 삭제 버튼 추가 --> <a href="#comments" class="comment-destroy-btn" value="{{id}}">삭제</a> </small> </h5> <!-- 보기 모드 --> <p class="collapse multi-collapse-{{id}} show">{{content}}</p> <p>{{updatedTime}}</p> <!-- 수정 모드 --> <form class="collapse multi-collapse-{{id}}"> <div class="form-group"> <textarea class="form-control" id="comment-content" rows="3">{{content}}</textarea> </div> <input type="hidden" id="comment-id" value="{{id}}"> <input type="hidden" id="comment-author" value="{{author}}"> <button type="button" class="btn btn-info comment-update-btn">수정 완료</button> </form> </div> </li> {{/comments}} </ul> 그리고 여기 리스트 머스타치파일에서 commentList를 사용할려고 했습니다 정렬기능은 되는데 오류가 있더라구요 A게시글에 단 댓글이 B게시글에도 노출되고.. 등 뷰쪽에 어떤식으로 뿌려야할지 모르겠네요 ㅜㅜㅜ
저도 아직 댓글을 완벽하게 이해한 상태가 아니여서 보내주신 show()에 대해서만 말씀드리겠습니다. 서비스에 정렬하는 메서드를 호출할때 A게시글에 대한 댓글을 가져와서 그 댓글을 내림차순 정렬하는건 어떨가요? show 메서드에서 model객체에 담을때 A게시글에 대해서 내림차순으로 정렬된 댓글목록만 넘기고 list.mustache에서 commentList를 반복문을 돌려서 값을 하나씩 꺼내셔야 할거 같습니다. @GetMapping("/articles/{id}") public String show(@PathVariable Long id, Model model) { Article article = articleRepository.findById(id) .orElseThrow( () -> new IllegalArgumentException("해당 Article이 없습니다.") ); model.addAttribute("commentList", commentService.findAllDesc(article.getComments())); return "articles/show"; }
굿라이프님 답변 감사합니다 !! 말씀해주신거처럼 해봤는데 똑같은 상황이네요 A게시글에 단 댓글이 B게시글에도 나오는 상황입니다 ㅜㅜ 시간되신다면 마지막으로 한번만 봐주실 수 있을까요 ?? public interface CommentRepository extends CrudRepository<Comment, Long> { @Query("SELECT p FROM Comment p ORDER BY p.createdTime DESC") List<Comment> findAllDesc(); } CommentRepository에서 해당 쿼리문을 작성했습니다 책보고 참고하여 작성했습니다 @Transactional public List<Comment> findAllDesc(List<Comment> comments) { return commentRepository.findAllDesc(); } CommentService에서 내림차순메서드를 구현해봤습니다 @GetMapping("/articles/{id}") public String show(@PathVariable Long id, // url의 {id}의 값을 변수화 Model model) { // id를 통해 article을 가져옴 Article article = articleRepository.findById(id) .orElseThrow( () -> new IllegalArgumentException("해당 Article이 없습니다.") ); model.addAttribute("article", article); model.addAttribute("comments", commentService.findAllDesc(article.getComments())); return "articles/show"; } 그리고 컨트롤러 부분해서 굿라이프님이 말씀해주신대로 코드를 작성해보았습니다 그리고 마지막으로 _list.mustache파일입니다 <ul class="list-unstyled"> {{#comments}} <li class="media mt-4" id="comments-{{id}}"> <img src="https://api.adorable.io/avatars/64/{{author}}.png" class="mr-3" alt="avata"> <div class="media-body"> <!-- 댓글 --> <h5 class="mt-0 mb-1">{{author}} <small> <!-- 부트스트랩 collapse 활용, https://getbootstrap.com/docs/4.5/components/collapse/ --> <a href="#" class="comment-edit-btn" data-toggle="collapse" data-target=".multi-collapse-{{id}}">수정</a> <!-- 삭제 버튼 추가 --> <a href="#comments" class="comment-destroy-btn" value="{{id}}">삭제</a> </small> </h5> <!-- 보기 모드 --> <p class="collapse multi-collapse-{{id}} show">{{content}}</p> <p>{{updatedTime}}</p> <!-- 수정 모드 --> <form class="collapse multi-collapse-{{id}}"> <div class="form-group"> <textarea class="form-control" id="comment-content" rows="3">{{content}}</textarea> </div> <input type="hidden" id="comment-id" value="{{id}}"> <input type="hidden" id="comment-author" value="{{author}}"> <button type="button" class="btn btn-info comment-update-btn">수정 완료</button> </form> </div> </li> {{/comments}} </ul> 댓글이 내림차순으로 기능은 잘 작동은 하는데 위에서도 말씀드렸다시피 A게시글에 단 댓글이 B게시글에도 노출이 되는 오류가 나네요 ㅜㅜ 그래서 제가 해본 방법이 정렬메서드를 모델객체에 따로 담고 (commentList) {{#comment}}{{/comment}}감싸진 상태에서 안에 보기모드 주석으로 감싸진 부분을 {{#commentList}}{{/commentList}}로 감싸서 해봤는데 작동이 제대로 되지 않더라구요 ㅜㅜ 제가 생각하기에는 _list.mustache에서 뭔가 잘못한거 같아서 이런식으로 해봤습니다 몇일째 이거하나로 막히고있는건지.. 엉엉
CrudRepository 와 JpaRepository는 차이가 있습니다. CrudRepository는 말그대로 CRUD에 관련된 기능을 제공하는 인터페이스이고 JpaRepository는 정렬이나 페이징처리 관련 기능을 제공하는 인테페이스 입니다. 게시글 A에 대한 댓글을 내림차순으로 정렬하려면 CommentRepository가 JpaRepository를 상속 받아야 합니다. A게시글에 단 댓글이 A게시글과 관련되 있다는 것을 알려주기위해 Comment 클래스에 변수를 선언하셔야 할것같습니다. @Query에서 가겨오려는 댓글이 A게시글과 관련된 댓글이라는 것을 알려주기 위해 Commnet 테이블과 Article 테이블을 공통되는 값을 기준으로 join 시키는 sql문을 작성해야 할것같습니다. @GetMapping("/articles/{id}") public String show(@PathVariable Long id, Model model) { Article article = articleRepository.findById(id) .orElseThrow( () -> new IllegalArgumentException("해당 Article이 없습니다.") ); model.addAttribute("article", article); model.addAttribute("comments", commentService.findAllDesc(article.getComments())); return "articles/show"; } 만약 A게시글에 대한 댓글을 전부 가져온다고 하면 model객체에 담겨진 article은 A게시글이고 comments는 A게시글에 대한 댓글을 의미하는것이라면 list.mustache에서 A게시글 보여줄때는 {{#article}} {{/article}} 이렇게 하고 A게시글에 대한 댓글을 보여줄때는 {{#comments}} {{/comments}} 이렇게 하면 되지않을까요? 핵심은 @Query를 사용해서 가져오려는 댓글이 A게시글과 관련된 것이라면 A게시글과 관련된 댓글만 갖고올수 있도록 하려면 join을 사용해야 할거 같습니다. ㅎㅎ댓글 어려운데 같이 고민해볼수 있어서 좋네용 화이팅~!!
시간내주셔서 감사합니다 ㅎㅎ !! 말씀해주신 내용들은 이해를 했는데 끝내 마무리를 짓지 못했습니다 ㅜㅜㅜ 대신 댓글정렬 말고 게시글정렬하기로 마무리를 지었습니다 게시글정렬은 잘되더라구요... 이거에만 너무 시간을 뺏기니 공부 진도를 못나가고 있네요 친절히 설명해주셔서 감사했습니당 ^^