Spring Boot Json화 관련 issue 정리(무한 수정중)

박철현·2023년 10월 12일
0

문제해결

목록 보기
10/17

Spring Boot Json화 관련 겪은 이슈를 정리하고자 합니다.
비슷한 이슈(문제)를 겪으시는 분들 도움 되시길 바랍니다!

이슈 1

  • 문제점 : DTO 객체 생성이 안되는 문제점 발생
  • 발생 메세지

    Cannot construct instance of 'com.cheor.wanted_10.recruitment.dto.RecruitmentDTO' (no Creators, like default constructor, exist)

  • 원인 : 잭슨 라이브러리에서 필요한 기본 생성자를 선언해주지 않음
  • 해결 : @NoArgsConstructor 선언
    • GPT 답변 : Jackson 라이브러리 (Spring Boot에서 기본적으로 사용되는 JSON 직렬화 및 역직렬화 라이브러리)는 클래스를 역직렬화할 때 기본 생성자를 필요
    • 해결 코드
@Data
@AllArgsConstructor
@NoArgsConstructor
public class RecruitmentDTO {
	@NotBlank(message = "서비스에 등록된 회사명을 입력해주세요.")
	private String companyName;
	@NotBlank(message = "채용포지션을 입력해주세요")
	private String position;

	@NotNull(message = "채용보상금을 입력해주세요. 없으면 0")
	private Integer reward;

	@NotBlank(message = "채용내용을 입력헤주세요.")
	private String content;

	@NotBlank(message = "사용기술을 입력해주세요")
	private String skill;

}

이슈 2

  • 문제점 : 잭슨에 의한 Json화 자동으로 처리 되지 않음
  • 원인 : HTTP 요청 본문의 JSON 데이터를 해당 타입의 새로운 객체로 변환한 후 메서드 인자로 전달하기 위해 @RequestBody 어노테이션이 필요한데 사용하지 않음.
  • 해결 :@RequestBody 어노테이션을 사용
    • GPT 답변 : Spring에서 HTTP 요청 본문을 Java 객체로 변환하려면 @RequestBody 어노테이션 필요

Spring에서 HTTP 요청 본문을 Java 객체로 변환하려면 @RequestBody 어노테이션이 필요합니다.

클라이언트가 보낸 JSON 형식의 HTTP 요청 본문을 Java 객체로 변환해주는 역할을 합니다. 이를 위해 내부적으로 HttpMessageConverter를 사용하는데, JSON 데이터의 경우 MappingJackson2HttpMessageConverter (혹은 GsonHttpMessageConverter)가 사용됩니다.

따라서, 클라이언트로부터 받은 JSON 데이터를 Java 객체에 바인딩하기 위해서는 @RequestBody 어노테이션을 메서드 매개변수 앞에 붙여야 합니다. 이렇게 하면 Spring은 HTTP 요청 본문의 JSON 데이터를 해당 타입의 새로운 객체로 변환한 후 메서드 인자로 전달합니다.

  • 해결 코드
    @PostMapping("/register")
    public RsData<Recruitment> register(@Valid @RequestBody RecruitmentDTO recruitmentDTO) {
      RsData<Recruitment> rsData = recruitmentService.create(recruitmentDTO);
      return rsData;
    }

이슈 3

  • 문제점 : @RequestBody 어노테이션을 통한 HTTP 요청 객체 추출 시 DTO객체 사용하지 않아 테스트케이스 실패
  • 원인 : @RequestBody는 기본적으로 JSON 본문을 Java 객체로 변환하는 역할을 하는데, 매개변수에서 객체로 받지 않았음
	@PostMapping("/recommend")
	public RsData<PlanDTO> recommend(@RequestBody Integer totalPrice) {
	}
  • 해결 : DTO 객체를 정의함
    • 어찌보면 당연한것 아래와 같이 요청이 가면 서버에서는 객체로 인식
    • 자바스크립트 {} : Object형태기도 하고.. 인자가 하나여도 DTO객체가 필요하다..!
    • 꼭 기억하길!!
{
   "totalPrice" : "1000000"
}
@Data
public static class TotalPriceDTO {
	private Integer totalPrice;
}
    
@PostMapping("/recommend")
public RsData<PlanDTO> recommend(@RequestBody Integer totalPrice) {
	}
  • 출처 : GPT
profile
비슷한 어려움을 겪는 누군가에게 도움이 되길

0개의 댓글