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