ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring Boot] DTO 관련 에러 해결 (Post 요청 시)
    JAVA/Spring Boot 2021. 4. 17. 20:18

    요즘은 PS보다는 개발하는 것이 더욱 재밌다. Spring boot 와 JPA에 대해서 하나씩 알아가면서 이것저것 알아가는데 할 수록 일이더 많아지는 느낌이 든다.

     

    처음 강의를 들을 때 그저 강사님의 내용을 따라치는 과정이라 '그렇구나' 하고 이해하는 정도였지만, 직접 ERD를 그려가며 내가 원하는 정보를 DB에서 JPA를 활용해 가져오면서 여러 에러들을 봤고, 처리 했던 에러를 포스팅 해보고자 한다.

     

    JPA로 간단한 ERD를 만들고 Controller ~ Service 과정을 이해하기 위해 연습하면서 나타났던 에러였다.

    포스팅하기 위해 메모로 남겨눴다가 직접 에러나는 상황을 만들어 보며 글을 작성 했다.

     

    이번 에러는 Controller에서 Post 했던 JSON을 DTO로 받아오는 과정에서 발생했던 에러 였다.

     

    즉, @RequestDto를 통해서 받아올 때 오류가 났다.

     

    Post 시 사용했던 DTO (문제를 해결해야 할 부분!!!)

    @Getter
    public class MemberRequestDto {
        private String name;
    
        public MemberRequestDto(String name){
            this.name = name;
        }
    }
    

    Post 요청 시 body에 넣은 데이터

    {
      "name": "kimjinoh"
    }

     

    해당 요청을 처리하는 Controller

     

    @RequiredArgsConstructor
    @RestController
    public class PostController {
        private final MemberService memberService;
    
        @PostMapping("/post/member")
        public Long save(@RequestBody MemberRequestDto requestDto){
            return memberService.save(requestDto);
        }
    }
    

     

     

    Error message

    {
      "timestamp": "2021-04-17T10:32:35.191+00:00",
      "status": 400,
      "error": "Bad Request",
      "message": "JSON parse error: Cannot construct instance of `com.blog.jino.demo.controller.dto.MemberRequestDto` (although at least one Creator exists): cannot deserialize from Object value (no delegate- or property-based Creator); nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `com.blog.jino.demo.controller.dto.MemberRequestDto` (although at least one Creator exists): cannot deserialize from Object value (no delegate- or property-based Creator)\n at [Source: (PushbackInputStream); line: 2, column: 3]",
      "path": "/post/member"
    }

    오류 메세지 중 [JSON parse error]<cannot deserialize from Object value> 가 보였다.

     

    • deserialize란 뭘까??

    - 간단하게 설명하자면 deserialize란 객체를 JSON 형태로 바꾸어주는 것을 의미한다. 

    Spring bootJSON 형식으로 데이터를 주고 받을 때 Jackson 이라는 라이브러리를 사용한다. 

    Jackson 라이브러리의 Object Mapper API를 통해 객체 -> JSON, JSON -> 객체로 자동으로 바꿔준다.

     

    구글링을 통해서 많은 블로그들을 뒤진 결과,, deserialize할 때 default생성자로 객체를 호출하는 부분이 나왔기 때문이다...

    @RequestBody로 전달받은 JSON이 객체로 바뀌는 과정에서 에러가 뜬 것이다.

     

    DTO의 default 생성자가 없으므로 에러가 뜬 것을 알 수 있었고, 기본 생성자를 생성 해준 뒤 에러를 해결 할 수 있었다.

    중요 !! < JAVA는 생성자가 하나 이상 만들어지면 기본 생성자를 자동으로 만들지 않기 때문 >

     

    에러나는 코드를 짜고, 알아보면서 Jackson 라이브러리가 있었기에 가능 했던 JSON <-> 객체 통신 방식을 이해할 수 있었다.

     

    참고자료

    댓글

Designed by Tistory.