오늘은 댓글 기능을 구현해 보았다.
가장 먼저 댓글이 보여지는 화면은 게시글 상세페이지에 들어가면 보이기 때문에 postController에 replyService 메서드를 기입했다.
PostController
// 게시글 상세보기
@GetMapping("/post/{postId}")
public ResponseEntity<Integer> read(HttpSession session, @PathVariable(name = "postId") Long postId, Model model) {
Long userIndex = (Long) session.getAttribute("userIndex");
// 게시글 model
Optional<PostEntity> post = postService.read(postId);
model.addAttribute("post", post);
// 댓글 model
List<ReplyEntity> replyList = replyService.read(postId);
model.addAttribute("reply", replyList);
// 세션을 가져와서 만약 게시글, 댓글 userIndex와 같다면, 1을 출력해 수정 및 삭제 버튼 활성화 / 다르면 0 or 2 출력
// 수정 필요
Integer checkedUserIndex = 0;
if(userIndex != null){
if(userIndex == post.get().getUserIndex()){
// 게시글, 댓글, 세션이 같으면
checkedUserIndex = 1;
model.addAttribute("checkIndex", checkedUserIndex);
} else if(userIndex != post.get().getUserIndex()){
checkedUserIndex = 2;
model.addAttribute("checkIndex", checkedUserIndex);
} else {
model.addAttribute("checkIndex", checkedUserIndex);
}
}
return new ResponseEntity<>(checkedUserIndex, HttpStatus.OK);
// return "post_detail";
}
해당 게시글의 index를 가져와서 댓글들을 가져오게 만들었다.
여기서 댓글도 만약 로그인한 유저가 단 댓글일 때, 수정 및 삭제 버튼이 생성되어야 한다.
만약 게시글 userIndex가 같다면, 게시글이 자신의 것이기 때문에 댓글도 자신의 것일 것이다.
그래서 댓글에 대한 수정 및 삭제 버튼도 게시글 수정 및 삭제 버튼과 같이 조건문으로 값을 가져와 버튼 display를 활성화/비활성화 시키면 된다.
ReplyService
@Service
public class ReplyService {
@Autowired
private ReplyRepository replyRepository;
// 댓글 저장
@Transactional
public ReplyEntity save(ReplyDto replyDto, Long userIndex, Long postIndex) {
ReplyEntity replyEntity = replyDto.toEntity(userIndex, postIndex);
replyRepository.save(replyEntity);
return replyEntity;
}
// 게시글 읽어올 때 해당 게시글 댓글 불러오기
public List<ReplyEntity> read(Long postIndex) {
List<ReplyEntity> replyList = replyRepository.findByReplyPostIndex(postIndex);
return replyList;
}
// 댓글 수정
@Transactional
public Optional<ReplyEntity> edit(Long replyIndex, ReplyDto replyDto) {
Optional<ReplyEntity> reply = replyRepository.findById(replyIndex);
return reply.map(r -> {
reply.get().setReplyDescription(replyDto.getReplyDescription());
return r;
})
.map(r -> replyRepository.save(r));
}
// 댓글 삭제
public void delete(Long replyIndex) {
replyRepository.deleteById(replyIndex);
}
}
해당 메서드들은 게시글 메서드와 거의 비슷한 형태를 띄고있다.
이제 백엔드는 거의 마무리 단계에 돌입했다.
이제 내가 짠 코드를 검토해보고, 메모리 최적화, return 값 변경, thymeleaf 설정등이 남았다.
아직 성능 최적화, 메모리 최적화를 해본적이 없어서 좀 더 구글링 해보고 찾아봐야한다.
아직 프로젝트가 완성된 것은 아니지만, 무언가 내가 생각해낸 것을 만들어 냈다는 생각에 기분이 좋아진다.
아직 부족한 부분이 많지만, 좀 더 성능 개선에 힘쓰고, 공부를 더 해야겠다.
얼른 프론트 부분이 마무리 지어져 내가 만든 것들을 postman이 아닌 화면으로 테스트 해보고 싶다.
얼마 안남은 프로젝트 확실하게 마무리 하고 싶은 마음이 더 커지는 것 같다.