Spring

[Spring] @RequestBody로 매핑하는 객체에 기본 생성자는 필수일까?

이덩우 2024. 5. 5. 23:37

의문

`@RequestBody`를 통해 DTO를 매핑시킬 때 큰 생각없이 `Setter` 및 `기본 생성자`를 사용했었다. 

기본 생성자를 통해 객체를 생성하고, Setter를 통해 필드 값을 주입하지 않을까? 라고 생각했기 때문이다.

 

다양한 블로그에서 잘 소개되어있지만, 위의 예상과는 조금 다르게 마치 JPA 처럼 `리플렉션`을 통해 매핑이 진행된다.

기본 생성자는 필요하다. 하지만 이후 필드값은 리플렉션을 통해 매핑된다. 그렇기에 Setter는 필요없다.

 

기본 생성자가 없어도 동작되던데..?

위의 결론에 따르면 기본 생성자는 필수이다. 하지만 프로젝트를 진행하던 중 기본 생성자 없이도 오류 없이 동작하는 모습을 확인할 수 있었다.

@Getter
public class LogInDto {
    private String email;
    private String password;
}

 

 

Jackson 라이브러리 의존성

build.gradle에 `jackson-module-parameter-names` 의존성을 추가하면 기본 생성자가 없어도 동작한다.

Spring Boot를 사용한다면, `spring-boot-starter-web`에서 위 의존성이 자동으로 추가된다.

 

* 주의할 점은 빌드 타입을 Gradle로 설정한 경우만 제대로 동작한다. IntelliJ IDEA로 빌드하면 실패한다.