댓글 등록 처리

강상은·2023년 12월 5일

ReplyService 인터페이스 구현

ReplyServiceImpl은 ReplyRepository와 ModelMapper를 주입받아서 구현

  • 댓글 등록 테스트

    결과

댓글 조회/수정/삭제/목록

  • 댓글을 수정하는 경우에는 Reply 객체에서 replyText만을 수정할 수 있으므로 Reply를 수정해 두도록 합니다.

  • Reply

  • ReplyServiceImpl

특정 게시물의 댓글 목록 처리

댓글 서비스의 가장 중요한 기능은 특정한 게시물의 댓글 목록을 페이징 처리하는 것입니다.

ReplyServic에 getListOfBoard()를 추가

ReplyServiceImpl

  • getListOfBoard 메서드 : 게시물 번호(bno)와 페이지 요청 정보(pageRequestDTO)를 받아 댓글 목록을 반환하는 메서드

  • 페이지 관련 정보를 설정하여 pageable(페이지 크기,번호,정렬 기준) 객체를 생성

  • replyRepository를 통해 게시글에 대한 댓글 목록을 가져옵니다.

  • 가져온 댓글 목록을 ReplyDTO로 변환합니다. modelMapper를 사용하여 각 Reply 엔터티를 ReplyDTO로 매핑하고, 그 결과를 리스트로 수집

  • 페이지 관련 정보와 댓글 목록, 전체 댓글 수 등을 설정합니다. pageRequestDTO, dtoList, 그리고 total 등의 정보를 설정한 후 build() 메서드로 최종적인 응답 객체를 생성하여 반환

컨트롤러 계층 구현

컨트롤러 영역에서는 Swagger UI를 이용해서 테스트와 함께 필요한 기능들을 개발합니다.

  • ReplyController는 ReplyService를 주입받도록 설계합니다.

등록 기능 확인

ReplyController의 등록 기능은 이미 개발된 코드에 JSON 처리를 위해서 추가 코드가 필요

Swagger UI를 통해 테스트 진행

*등록 작업에서 bno가 실제 존재하는 게시물 번호여야 함


잘못되는 상황에 대한 처리

@Valid는 이미 처리를 했지만 연관 관계를 가진 엔티티를 처리할 때마다 항상 문제가 되는 것은 연관된 객체의 안정성을 확보하는 것

  • 예를 들어, 앞선 테스트에서 bno 값을 사용할 수 없는 번호로 작성하면 문제가 발생합니다.
  • 존재하지 않는 게시글 번호를 이용해서 댓글 추가해보기

업로드중..

업로드중..

실행 결과는 예외 발생

서버에 기록된 로그를 보면 SQLException이지만
org.springframework.dao.DataIntegrityViolationException 예외가 발생하는 것을 볼 수 있다(SQL만으로보면 없는 PK값을 사용했으므로)

서버의 상태코드는 500으로 '서버 내부의 오류'로 처리된다
이것은 외부에서 Ajax로 댓글 등록 기능을 호출했을 때 500 에러가 발생한다면 호출한 측에서는 현재 서버의 문제라고 생각할 것이고 전송하는 데이터에 문제가 있다고 생각하지는 않을 것

오류의 논점을 정확하게 파악하기 위해서(클라이언트에 서버의 문제가 아니라 데이터의 문제) @RestControllerAdvice를 이용하는 CustomRestAdvice에 DataIntegrityViolationException을 만들어서 사용자에게 예외 메세지를 전송하도록 구성

업로드중..

추가한 handleFKException()는 DataIntegrityViolationException이 발생하면 constraint fails 메세지를 클라이언트로 전송

결과

업로드중..

특정 게시물의 댓글 목록

특정한 게시물의 댓글 목록 처리는 '/replies/list/{bno}' 경로를 이용하도록 구성
이때 bno는 게시물의 번호를 의미

스프링에서는 @PathVariable이라는 어노테이션으로 URL 경로의 일부를 추출하여 메서드의 파라미터로 전달할 때 사용됩니다. 주로 RESTful 웹 서비스에서 클라이언트가 전달한 경로 변수 값을 추출하는 데에 활용

ReplyController에 메서드 추가

업로드중..

getList()에서 bno 값은 경로에 있는 값을 취해서 사용할 것이므로 @PathVariable을 이용하고, 페이지와 관련된 정보는 일반 쿼리 스트링을 이용(결과가 달라질 수 있는 부분은 일반 쿼리 스트링을 쓰고 고정인 값은 URL로 고정하는 방식)

Swagger UI로 ReplyController를 호출해보면 PageResponseDTO가 JSON으로 처리된 결과를 확인할 수 있음
업로드중..

특정 댓글 조회

  • 특정한 댓글을 조회할 때는 Reply의 rno 경로를 이용해서 GET 방식으로 처리

ReplyController에는 getReplyDTO() 메소드를 다음과 같이 추가

업로드중..

업로드중..

데이터가 존재하지 않는 경우의 처리

getReplyDTO()와 같이 특정한 번호를 이용해서 조회할 때 문제가 되는 부분은 해당 데이터가 존재하지 않는 경우

  • 이 경우에는 500에러가 발생

서비스 계층에서 조회 시에 Optional<T>을 이용했고 orElseThrow()를 이용했기 때문에 컨트롤러에게 예외가 전달

  • 이를 해결하기 위해서 CustomRestAdvice를 이용해서 예외처리를 추가
    업로드중..

결과

업로드중..

특정 댓글 삭제

일반적으로 REST 방식에서 삭제 작업은 GET/POST가 아닌 DELETE방식을 이용해서 처리

ReplyController에 다음과 같이 remove()를 추가
업로드중..

업로드중..

존재하지 않는 번호의 삭제 예외

만일 존재하지 않는 번호의 댓글을 삭제하려고 하면 다음과 같은 에러 발생

업로드중..

업로드중..

업로드중..

특정 댓글 수정

댓글 수정은 PUT 방식을 처리하도록 합니다. ReplyController에는 modify()를 추가

조심해야하는 점은 수정할 때도 등록과 마찬가지로 JSON 문자열이 전송되므로 이를 처리하도록 @RequestBody를 적용한다는 점이다.

업로드중..

댓글 미리 확인

업로드중..

결과

업로드중..

업로드중..

0개의 댓글