TIL 2023-11-06 @RequestBody String 타입 에러

장규빈·2023년 11월 6일

TIL

목록 보기
18/59
post-thumbnail

오늘은 개인과제를 하면서 생긴 문제를 해결하는 과정을 설명해 보려고 한다.

문제 발생

  @DeleteMapping("/delete/{id}")
   public Long deleteBoard(@PathVariable Long id,@RequestBody String password){
       return commentService.deleteComment(id,password);
   }

다음과 같이 게시판의 내용을 삭제하기 위해서 @PathVariabl로 게시판의 아이디 값을 받고 @RequestBody에 password 값을 받아와 패스워드가 일치하면 삭제할수 있게 코드를 만들었다.

    private Board findBoardAndCheckedPasswordByPassword(Long id,String password) {
       return boardRepository.findById(id).filter(board -> board.getPassword().equals(password)).orElseThrow(
               () -> new IllegalArgumentException("선택한 게시물이 존재하지 않거나, 비밀번호가 일치하지 않습니다.")
       );
   }

하지만 비밀번호를 맞게 입력해도 에러가 발생하였다.

그래서 디버깅을 진행해보았다.

그런데 password값이 1234가 아닌 json형식의 원본 값이 들어가 있는것이다....

문제 해결

@RequestBody 어노테이션을 사용하면 request body를 도메인 객체가 아닌 자바 Map 으로도 역직렬화할 수 있다.

    @DeleteMapping("/delete/{id}")
    public Long deleteBoard(@PathVariable Long id,@RequestBody Map<String, String> passwordMap){
        return boardService.deleteBoard(id,passwordMap.get("password"));
    }

RequestBody의 값을 Map에 담아서 get을 사용해서 패스워드를 꺼내오니 에러가 해결이 되었다.

느낀점

사실 처음에 에러가 났을땐 너무 당황했다. 데이터를 받아오는거 부터가 문제가 될줄은 상상도 못했으니..
이때까지 php를 사용하면서 데이터를 못받아와서 생긴 문제가 한번도 없었기에 어떻게 해야할지 방법을 찾아보다가 튜터님께 여쭈어 보았다.
스프링은 데이터를 전달 받는 데이터들을 DTO를 사용하여서 받아오지만 지금처럼 1개만 받아도 되는데 객체를 굳이 만들어야하는게 맞는지 의문도 조금 들었다. 그러다 객체를 만들지 않고 MAP을 사용해서도 데이터를 받을수 있는 방법이 있다고 튜터님께서 말씀해 주셔서 참고 자료를 통해 문제를 해결했다.
아직 스프링을 배우는 초기라 @RequestBody 와 같은 어노테이션들의 처리 방식을 이해하지 못해서 발생한 이슈였다. 조금더 스프링을 공부한뒤 어노테이션들도 공부해보아야겠다.

profile
나다운사람

0개의 댓글