Controller에서 View를 통해 데이터를 전달 받을 때, DTO(Data Transfer Object) 클래스를 생성해 DTO 객체를 통해 데이터를 전달 받곤 한다. (반대로 Controller에서 View로 데이터를 전달할 때도 사용한다.)
그런데 DTO 클래스를 설계할 때, 필드의 모든 멤버 변수들을 private 선언하였는데, 컨트롤러에서 어떻게 객체에 접근하여 데이터를 저장하는지 궁금해졌다.
ChatGPT에게 질문해본 결과. view에서 사용자 입력 데이터가 포함된 요청(request)을 controller로 보내고, 이 때 spring에서는 요청에 포함된 데이터 중 필요한 데이터를 추출하여 DTO 객체와 매핑을 진행한다. 이 과정에서 spring은 우선 생성자(constructor)가 객체에 존재하는지 찾는다. 생성자가 존재하지 않으면 setter 메소드를 찾는데, 이 마저도 없으면, org.springframework.beans.NotWritablePropertyException 예외가 발생한다고 한다.
내가 놓치고 있던 건, DTO 클래스를 정의할 때, 따로 생성자를 생성한 것이 아니라, @AllArgsConstructor 어노테이션을 사용하여 생성자가 생성되도록 작성 해놓은 부분인 것 같다. 생성자가 보이지 않으니 어떻게 데이터를 저장 하는지 생각해보게 됐던 것 같다.
어떻게 생각해보면 당연하다고 느낄 수도 있는 내용이지만, 문득 의문이 생겨 찾아보게 되었고, 좀 더 깊게 스프링에 대해서 이해할 수 있었던 시간이었다.