(2022-12-28) @RequestBody에 왜 기본생성자가 필요한가?

C one·2022년 12월 29일

/ postman status 500 ( Internal Server Error )

* 시도해본 것 : API POST 작성중 status 500 에러가 자꾸 발생하였다. 컨트롤러의 문제일거라 생각해서
오타가 있는지 확인했고, Course(requestDto) 생성자가 올바르게 만들어 졌는지 확인했다.
* 해결방법 : 그래도 해결하지 못해서 status 500 에러를 구글링했더니 내부 서버 오류로 인해 발생하고, 에러 로그를 
확인 하면 오류가 발생한 코드를 알 수 있을 것이라는 것을 알게 되어 에러 로그를 확인해본 결과 DTO코드의 문제임을 
알게 되었다

** 기존의 CourseRequestDto 코드 **

@Getter
@RequiredArgsConstructor
public class CourseRequestDto {
    private final String title;
    private final String tutor;
}

=> 강의에서 기존코드를 알려줬지만, 수업자료에는 수정한 코드로 바뀌어있엇다

* 기존코드 설명*
=> Dto클래스를 생성하고 필드에 final을 붙여 (필드 선언시, 객체생성시) 를 제외하고 값을 변경할 수 없도록 하였다
=> @RequiredArgsConstructor 을 사용해 final이 붙은 필드에 대한 생성자를 만들어 주었다

    @RequiredArgsConstructor로 만들어진 생성자
    public CourseRequestDto(String title, String tutor) {
        this.title = title;
        this.tutor = tutor;
    }
    
----------------------------------------------------------------------------

**수정한 CourseRequestDto 코드**

@Getter
@NoArgsConstructor
public class CourseRequestDto {
    private String title;
    private String tutor;

    public CourseRequestDto(String title, String tutor) {
        this.title = title;
        this.tutor = tutor;
    }
}

=> 왜 수정한 코드로 작성해야 할까??
=> 차이점 : @NoArgsConstructor가 존재
//  @NoArgsConstructor -> 기본생성자 생성 해주는 어노테이션 : 
	public CourseRequestDto(){}
* 알게 된 것 :

=> DTO 이후의 강의에서 기본생성자를 사용해서 기존코드에서 오류가 발생했을거라 생각햇다
=> ?? 사용한적이 없다
=> 구글링을 통해 DTO에 기본생성자가 필요하다는 것을 알게 되었다
=> 이유를 알기 위해서 스프링이 어떻게 DTO를 JSON으로 매핑하는지 알아야 한다
=> 컨버터(MappingJackson2HttpMessageConverter)Jackson 라이브러리의 ObjectMapper를 사용해 body를 읽음
=> ObjectMapper는 직렬화(serialize) / 역직렬화(deserialize)를 수행,
// 직렬화 : java object -> JSON 으로 파싱 / 역직렬화 : JSON -> java object 으로 파싱
=> 컨트롤러에서 @RequestBody통해 DTO를 가져올 때 , ObjectMapper@RequestBody를 바인딩한다
=> ObjectMapper request의 body가 null인지 확인하고, deserialize 역직렬화 하는 메소드를 호출
=> deserialize 의 메서드에서 기본생성자로 java object(DTO)를 생성하기 때문에 기본생성자가 필요하다는 것이다

profile
🌽

0개의 댓글