[내일배움캠프] 2월 17일 금요일 TIL 회고록
대댓글을 수정하려고 하면 400 BAD REQUEST 가 나오면서 수정이 안되는 오류가 발생했다.
인텔리제이에서도 IllegalArgumentException 익셉션이 출력되어서 굉장히 애를 먹었다.
하지만 대댓글의 id가 2번이고, 댓글의 id가 2번인 대댓글을 수정하려고 하면 404 Bad Request가 나오면서 수정이 안된다.
인텔리제이에선 IllegalArgumentException 익셉션이 출력되는데, 다른 오류 내용?이 없어서 어디가 잘못되었는지도 몰랐다.
혼자 끙끙 앓다가 팀원분들한테 여쭤봤는데 튜터님한테 가보는게 좋을 것 같다 해서 튜터님한테 가서 물어봤다.
대댓글 수정하는 컨트롤러 부분에서 디버깅 모드를 사용하여 디버깅 해보았다.
먼저 POSTMAN으로 대댓글의 id가 1이고, 댓글의 id가 1일떄 컨트롤러에서 서비스로 넘어갈때 값을 잘 준다. 여기서 스텝인투를 눌러서 서비스단으로 잘 들어가는지 확인을 해봤다.
서비스단으로 잘 넘어간다. 대댓글의 id가 1이고, 댓글의 id가 1인 상태에서 대댓글을 수정하면 오류가 나지 않는다.
이번에는 POSTMAN을 사용해서 대댓글의 id가 2번이고 댓글의 id가 2번일떄 컨트롤러에서 서비스로 넘어갈떄 값을 잘 주는지 확인해봤다. 값은 잘 들어가지만 여기서 스텝인투를 해보면
갑자기 익셉션으로 넘어가더니 그 후로 계속 스텝인투를 눌러도 익셉션 관련 코드로 넘어간다.
// 대댓글 수정
@PutMapping("/api/comments/{commentId}")
public ResponseEntity<String> updateReplyComment(@PathVariable Long commentId,
@RequestParam Long replyCommentId,
@RequestBody ReplyCommentRequest request,
@AuthenticationPrincipal UserDetailsImpl userDetails) {
replyCommentService.updateReplyComment(commentId, replyCommentId, request,
userDetails.getUser());
return new ResponseEntity<>("대댓글 수정 완료!", HttpStatus.OK);
}
대댓글을 수정하는 메소드인데 PathVariable을 사용해서 commentId를 받고, RequestParam을 사용해서 replyCommentId를 받는데 튜터님이 보시고는 @PutMapping에 RequestParam이 안된다고 하셨다. PutMapping에 RequestParam을 쓰고싶으면@RequestBody를 사용하라고 하셨다.
아래 블로그를 참고하면 더 좋을 것 같다.
https://override1592.tistory.com/21
[Spring] 스프링 RestApi의 put메소드에서 requestParam 문제
스프링 RestApi의 put메소드에서 requestParam 문제 문제 특정 테이블의 정보 수정을 위한 PUT메소드에서 title과 description 두 개의 값을 @RequestParam 을 통하여 받고자 하였으나, 값이 받아지지 않음. [위
override1592.tistory.com
// 대댓글 수정
@PutMapping("/api/comments/{commentId}/{replyCommentId}")
public ResponseEntity<String> updateReplyComment(@PathVariable Long commentId,
@PathVariable Long replyCommentId,
@RequestBody ReplyCommentRequest request,
@AuthenticationPrincipal UserDetailsImpl userDetails) {
replyCommentService.updateReplyComment(commentId, replyCommentId, request,
userDetails.getUser());
return new ResponseEntity<>("대댓글 수정 완료!", HttpStatus.OK);
}
RequestParam 어노테이션을 없애고 PathVariable 어노테이션으로 바꿨다.
실행해봤더니 오류가 그대로 출력되어 침착하게 대댓글 서비스 클래스를 봤다.
이 메서드는 userService.getProfile을 이용해서 닉네임을 가져오는 기능이다.
잘 보면 이상한 점이 있다.userService.getProfile에 replyComment(대댓글)에 userId를 넣어야하는데 대댓글의 Id를 넣고있다.
대댓글의 유저 id를 받아서 프로필을 조회한 후(getProfile) 닉네임을 뱉어주는 메서드인데 userId가 아닌 대댓글의 id를 넣어주니 에가 정신을 차리지 못하고 오류를 출력한 것 같다.
@Override
public String getNicknameByReplyComment(ReplyComment replyComment) {
return userService.getProfile(replyComment.getId()).getNickName();
}
@Override
public String getNicknameByReplyComment(ReplyComment replyComment) {
return userService.getProfile(replyComment.getUserId()).getNickName();
}
그래서 getId를 없애고 getUserId로 바꾼 뒤 테스트를 했더니 드디어 오류가 고쳐졌다.
정말 사소한 실수로 일어났던 실수였다.. 그래도 튜터님덕분에 오류를 고칠 수 있었다. @PUTMapping 일때도 ReqestParam을 쓰면 안된다는 것도 배웠다.
기술 멘토링시간에 튜터님한테 물어본 질문 :
답변: 기본적으로 만들기는 한다.
원페이지로 홈페이지를 만들어야 한다면 댓글 상세 조회 기능을 쓰고, 리스트로 뿌려주면서 원페이지를 안쓰면 상세 조회 기능을 쓸 필요가 없다. 백엔드 개발자는 기본적으로 만들어야한다.
시간 날때 상세조회 기능도 만들어봐야겠다. 만들기 전에 팀원들과 상의해서 상세 조회 기능이 필요할지 없을지 물어봐야겠다.