본문 바로가기
스프링 쇼핑몰 만들어보기

댓글 기능 만들기

by hoshi03 2024. 5. 6.
@GetMapping("/detail/{id}")

 

기존에 위의 api로 상세 페이지에 접속하게 했는데

상세페이지에서 댓글이 작성하게 만들어보자

 

댓글은 로그인한 회원만 달 수 있고, 작성자 id, 작성자 닉네임, 댓글 내용, 본문 글작성자 id 속성을 가지게 만들었다

 

@Entity
@Getter
@Setter
@ToString
public class Comment {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Column
    private String username;
    @Column
    private String content;
    @Column
    private Long parentId;
}

 

@GetMapping("/detail/{id}") 이 주소로 들어오면 상세페이지 아래에 

댓글 내용을 입력받는 폼이 생성되게 했고 댓글 작성자 id는 안보이게 해서 서버로 전달했다

<form action="/comment" method="post">
    <input name="content">
    <input name="parentId" th:value = "${item.id}" style="display : none">
    <button type="submit">전송</button>
</form>

 

댓글 엔티티, 리포지토리, 서비스, 컨틀롤러를 만들어주고 /comment로 postmapping이 들어오면 스프링 시큐리티로 한

로그인 인증을 이용해서 로그인 했는지 여부를 @PreAuthorize로 검사하고 폼에 작성한 content와 parentID, principal에서 

가져온 사용자 닉네임을 이용해서 db에 댓글을 추가했다

@Controller
@RequiredArgsConstructor
public class CommentController {
    private final CommentService commentService;
    //로그인 된 유저 정보는 Authentication에서 가져온다
    @PreAuthorize("isAuthenticated()") //로그인 여부 확인
    @PostMapping("/comment")
    String postComment(@RequestParam String content,
                       @RequestParam Long parentId,
                       Authentication auth){
        CustomUser user = (CustomUser) auth.getPrincipal(); //로그인 된 사용자 정보 가져오기!
        Comment data = new Comment();
        commentService.saveComments(user.getUsername(),content,parentId);
        return "redirect:detail/"+parentId;
    }
}

 

작성한 댓글은 상세페이지에서 해당 페이지 id로 검색해서 나오는 댓글들을 보여주는 방식으로 만들었다

댓글도 페이징을 적용해야 될 것 같으니 해보자 

//URL 파라미터로 상품번호로 상세페이지 조회하기
@GetMapping("/detail/{id}")
String detail(@PathVariable Long id, Model model) throws Exception{
    Optional<Item> result = itemService.findOne(id);
    List<Comment> comments = commentRepository.findAllByParentId(id);
    model.addAttribute("comments",comments);
    Item item;
    if (result.isPresent()){
        item = result.get();
        model.addAttribute("item", item);
        return "detail.html";
    }
    else return "redirect:/list";
}