강의

멘토링

로드맵

Inflearn brand logo image

인프런 커뮤니티 질문&답변

eovnfjfpa님의 프로필 이미지
eovnfjfpa

작성한 질문수

자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]

30강. 책 생성 API 개발하기

DTO 관련

작성

·

16

0

안녕하세요 BookCreateRequest 객체에 name 을받는 생성자를 만들었더니 아무것도 안받는 생성자도 만들어야 정상 작동하더라구요 근데 아예 생성자를 안만드니까 바로 정상 작동하던데 무슨 차이가 있는건가요?

답변 2

0

최태현님의 프로필 이미지
최태현
지식공유자

안녕하세요! eovnfjfpa님~ 🙂 크~ 많이 물어보시는 질문인데요!

살짝 복잡한 내용일 수 있지만, 스프링은 들어오는 문자열 (HTTP Body에 들어 있는 json 이죠!) 을 객체로 변환하는 과정에서 객체의 생성자를 필요로 합니다!

그리고 어떤 생성자가 필요한지는 스프링 버전에 따라, 객체 필드 수에 따라 조금씩 다르더라고요... 😅

때문에 개인적으로는 기본 생성자 (= 아무것도 받지 않는 생성자) 를 항상 넣어주는 편입니다. lombok을 사용할 경우 @NoArgsConstructor 를 항상 붙이는 것이죠~

 

자바 17이 넘어가게 되면서는 record class가 등장해 record 클래스를 사용하면 조금 더 쉽게 대응이 되는 편입니다. 또 궁금한 점 생기시면 언제든 편하게 질문 주세요~ 감사합니다.

0

안녕하세요, 인프런 AI 인턴입니다. eovnfjfpa님.

DTO(Data Transfer Object) 클래스를 설계할 때 생성자를 사용하는 방법에 대해 질문 주셨군요. 이는 스프링과 같은 프레임워크에서 객체를 생성하고 관리하는 방식과 관련이 있습니다.

  1. 빈 생성자(no-args constructor):

    • 스프링은 JSON 데이터를 객체로 역직렬화(deserialization) 할 때, 리플렉션을 이용해 객체를 생성합니다. 이 과정에서 기본적으로 빈 생성자가 필요합니다. 빈 생성자가 있으면 스프링은 객체 생성 후 setter 메서드를 통해 각 필드를 초기화합니다.
  2. 매개변수 있는 생성자:

    • 특정 필드를 초기화할 때 사용하는 생성자입니다. 이를 사용하면 생성 시점에 값을 설정할 수 있어 편리하지만, 스프링이 자동으로 제공하는 기본 역직렬화 과정과 충돌할 수 있습니다.
  3. 리플렉션 사용:

    • 자바 리플렉션은 클래스의 런타임 시점에서 정보를 조회하고, 인스턴스를 생성할 수 있는 기능을 제공합니다. 스프링은 주로 리플렉션을 사용해 객체를 다루기 때문에 빈 생성자가 없더라도 동작할 수 있지만, 빈 생성자가 없는 경우 특정 조건에서 문제가 발생할 수 있습니다.

따라서, DTO 클래스 설계 시에는 빈 생성자를 명시적으로 제공해주면 예기치 않은 오류를 피할 수 있습니다. 관련해서 많은 개발자들이 기본 생성자를 추가하는 것을 권장하고 있습니다.

더 상세한 예시나 설명을 원하신다면, 아래와 같은 유사한 질문들을 참조하실 수 있습니다:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

eovnfjfpa님의 프로필 이미지
eovnfjfpa

작성한 질문수

질문하기