게시글에 소속된 댓글 추가하는 API
CommentController에서 계속 POSTMAN으로 blogId 파라미터를 못받아온다.
// 댓글 작성 by User API
@PostMapping("/comment")
public CommentResponseDto createComment(@RequestBody CommentRequestDto requestDto, HttpServletRequest req) {
User user = (User) req.getAttribute("user"); // 사용자 정보를 추출
String blogId = req.getParameter("blogId"); // 클라이언트에서 전달한 blogId 값을 가져옴
// 댓글 작성에 필요한 user와 blogId 정보를 commentService에 전달
return commentService.createComment(requestDto, user.getUsername(), blogId);
}
Java
복사
나타나는 오류는 두가지 유형이었다.
첫번째는 NullPointerException으로 blogId자체가 전달되지 않던 상황,
2023-09-14T22:00:08.588+09:00 ERROR 35675 --- [nio-8080-exec-6] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: java.lang.NullPointerException: Cannot invoke "java.lang.Long.toString()" because "blogId" is null] with root cause
java.lang.NullPointerException: Cannot invoke "java.lang.Long.toString()" because "blogId" is null
at com.yzpocket.blog.controller.CommentController.createComment(CommentController.java:33) ~[main/:na]
Java
복사
이건 너무 뻔했다. 위 코드에서 blogId를 req이란 변수, 이는 곧 HttpServletRequest에서 받고 있는데 여기 있을리가 없다. 원본 글의 id는 클라이언트에서 파라미터로 받아야 했다. 그래서 아래 코드와같이 변경했다.
// 댓글 작성 by User, blogID API
@PostMapping("/comment")
public CommentResponseDto createComment(@RequestBody CommentRequestDto requestDto, @RequestParam("blogId") Long blogId, HttpServletRequest req) {
log.info(blogId.toString());
User user = (User) req.getAttribute("user"); // 사용자 정보를 추출
String blogIdStr = (blogId != null) ? blogId.toString() : null;
// 댓글 작성에 필요한 user와 blogId 정보를 commentService에 전달
log.debug(blogIdStr); // 디버그 레벨의 로그로 스택 트레이스 및 디버그 정보를 출력
return commentService.createComment(requestDto, user.getUsername(), blogIdStr);
}
Java
복사
그런데 또 오류가 발생한다. blogId가 Long타입으로 들어오지 않는것 같다. 뭔가 요청문이 잘못되었을 수 있다.
[org.springframework.web.bind.MissingServletRequestParameterException: Required request parameter 'blogId' for method parameter type Long is not present]
Java
복사
POSTMAN에서 POST 방식의 url은 http://localhost:8080/api/comment 인 상태에서 로그인으로 쿠키에서 토큰을 받아서 헤더에 넣어주었다. Body에는 아래같이 JSON으로 넣었다. 아직도 이상한점이 있다.
{
"blogId": 2,
"contents": "댓글 내용입니다."
}
Java
복사
분명히 원본글을 파라미터로 id를 받아내야 하기 때문에 아래처럼 요청했는데 오류가발생한다. 계속 ChatGPT를 통해 문의하지만 전혀 틀린곳이 없다..
이상한 해결?
한두시간 헤매었는데 어이없게 해결되었다. 혹시몰라서 Params부분에 Key, Value를 다시 적어서 요청했다. 그런데 그냥 성공된다.. 아니 이게 무슨차이지?? 동적으로 위에 url에 파라미터가 붙게되는데, 두개의 모양이 전혀 다른게 없다. 난 아직도이해가 안된다. 무슨 안에 속성이라도 추가하는게 있는지 뒤적여보는데 전혀 그런부분이 없다. Auth나 Headers Body처럼 탭을 넘어가야 다른것들을 건들이게 되지만, 지금 그냥 저 체크박스만 위아래로 바꾸면 됫다가 안됫다가 한다. 공백이들어갔나? 체크해도 전혀 다른게 없다. 두 셀은 똑같이 생겼고 똑같은값이 입력되었는데 왜 이런문제가 발생하는거지? 그냥 POSTMAN 버그인건지 내가 모르는건지 시간만 또 엄청버리고있었다..
ChatGPT마저 이상한동작이라고한다..
A. 첫 번째 행과 두 번째 행의 파라미터가 동일하게 "blogId: 2"로 설정되어 있다면, 이는 동일한 요청을 보내는 것과 동일하게 작동해야 합니다. 만약 두 개의 파라미터가 서로 다르게 작동하거나 다른 결과를 생성한다면, 이는 POSTMAN 자체의 이상한 동작이나 설정에 문제가 있을 수 있으며, POSTMAN을 업데이트하거나 다시 설치하는 것을 고려할 수 있습니다.