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의 등록 기능은 이미 개발된 코드에 JSON 처리를 위해서 추가 코드가 필요

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


@Valid는 이미 처리를 했지만 연관 관계를 가진 엔티티를 처리할 때마다 항상 문제가 되는 것은 연관된 객체의 안정성을 확보하는 것
실행 결과는 예외 발생
서버에 기록된 로그를 보면 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으로 처리된 결과를 확인할 수 있음
ReplyController에는 getReplyDTO() 메소드를 다음과 같이 추가
getReplyDTO()와 같이 특정한 번호를 이용해서 조회할 때 문제가 되는 부분은 해당 데이터가 존재하지 않는 경우
서비스 계층에서 조회 시에 Optional<T>을 이용했고 orElseThrow()를 이용했기 때문에 컨트롤러에게 예외가 전달
일반적으로 REST 방식에서 삭제 작업은 GET/POST가 아닌 DELETE방식을 이용해서 처리
ReplyController에 다음과 같이 remove()를 추가
만일 존재하지 않는 번호의 댓글을 삭제하려고 하면 다음과 같은 에러 발생
댓글 수정은 PUT 방식을 처리하도록 합니다. ReplyController에는 modify()를 추가
조심해야하는 점은 수정할 때도 등록과 마찬가지로 JSON 문자열이 전송되므로 이를 처리하도록 @RequestBody를 적용한다는 점이다.
댓글 미리 확인