Response Body 객체 기본생성자

2024. 11. 25. 20:57Back-End/Spring-Boot

반응형

@RequestBody에 매핑되는 객체는 기본적으로 기본 생성자를 사용해서 생성됩니다.

이 과정은 Jackson 라이브러리가 JSON 데이터를 자바 객체로 변환할 때 자동으로 이루어집니다.

기본 생성자 사용

@RequestBody로 받은 데이터를 변환하려면 객체가 기본 생성자를 갖고 있어야 합니다. 즉, Jackson은 기본 생성자를 호출하여 객체를 생성한 뒤, 그 후 필드들을 setter 메서드나 필드 접근을 통해 값을 설정합니다.

예를 들어, 다음과 같은 DTO 클래스가 있을 때:

public class MyDto {
    private String userId;
    private String no;

    // 기본 생성자
    public MyDto() {
    }

    // Getter와 Setter
    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }

    public String getNo() {
        return no;
    }

    public void setNo(String no) {
        this.no = no;
    }
}

 

@RequestBody를 사용하여 해당 DTO를 요청 본문으로 받을 수 있습니다:

@PostMapping("/example")
public ResponseEntity<String> example(@RequestBody MyDto dto) {
    System.out.println(dto.getUserId());
    System.out.println(dto.getNo());
    return ResponseEntity.ok("success");
}

기본 생성자 없이 @RequestBody 사용 시

  • @RequestBody를 사용할 때, 기본 생성자가 없으면 Jackson이 객체를 생성할 수 없기 때문에 400 Bad Request 오류가 발생할 수 있습니다.
  • 생성자가 public이어야 하며, 필드에 값을 주입할 수 있는 접근자(setter나 @JsonProperty 등)가 필요합니다.

따라서 @RequestBody로 매핑될 객체는 기본 생성자, getter, setter가 필요합니다. 기본 생성자가 없는 경우, Jackson은 객체를 생성할 수 없기 때문에 요청 처리에 실패하게 됩니다.

 

 

@Data만 사용하면 안되는가?

@Data는 Lombok 라이브러리에서 제공하는 어노테이션으로, 여러 기능을 자동으로 생성해줍니다. @Data는 다음과 같은 기능들을 포함하고 있습니다:

  • @Getter, @Setter: 각 필드에 대한 getter와 setter 메서드를 자동으로 생성합니다.
  • @ToString: 클래스의 toString() 메서드를 자동으로 생성합니다.
  • @EqualsAndHashCode: equals()와 hashCode() 메서드를 자동으로 생성합니다.
  • @RequiredArgsConstructor: final 필드나 @NonNull이 지정된 필드를 매개변수로 받는 생성자를 자동으로 생성합니다.

하지만 @Data는 기본 생성자를 자동으로 생성하지 않습니다. 따라서 @Data만 사용하면 기본 생성자가 없는 상태가 되며, @RequestBody에서 객체를 제대로 매핑하려면 기본 생성자가 필요합니다.

해결 방법

  1. 기본 생성자 추가: @Data에 기본 생성자가 필요하다면, @NoArgsConstructor를 함께 사용하면 됩니다. @NoArgsConstructor는 매개변수가 없는 생성자를 생성해줍니다.
  2. @Data @NoArgsConstructor public class MyDto { private String userId; private String no; }
  3. @AllArgsConstructor: 이미 모든 필드를 받는 생성자가 필요하다면, @AllArgsConstructor와 함께 사용할 수도 있습니다. 이 경우 기본 생성자와 모든 인자를 받는 생성자가 동시에 생성됩니다.
  4. @Data @NoArgsConstructor @AllArgsConstructor public class MyDto { private String userId; private String no; }

이렇게 하면 @RequestBody로 해당 DTO를 받아오는 데 문제가 없을 것입니다. @NoArgsConstructor를 추가하면 기본 생성자가 생성되어 Jackson이 정상적으로 객체를 생성하고 JSON 데이터를 매핑할 수 있습니다.

반응형