작성
·
2.9K
4
안녕하세요 영한님.
항상 좋은강의 보면서 이미 완강을 하였지만 궁금한점이 이 강의내용에 해당되는것 같아 질문을 남깁니다.
컨트롤러에서 (API) 개발을 할때 Entity를 바로 접근하지 말고 DTO를 권장하셔서
DTO를 사용하던 찰나에 문제가 생겼습니다.
Entity에 Setter를 사용하는건 지양한다고 하셔서 생성자로 값을 넣어주고 있는데
DTO에서도 값을 생성자로 넣어줘야 하나요?
백을 먼저 개발하고 프론트를 개발하기위해 타임리프로 하고 있는데
DTO 를 생성자로 만들어 놓으니 값을 계속 못받아와서요.
한참 헤매다가 설마 하고 LOMBOK @Setter 로 하니 값이 넘어오더라고요.
DTO는 Setter로 하여도 문제가 없을까요? 제 생각에도 DTO는 단순 값을 전달 받는 Form(?)이라고 생각되어
Entity에서의 Setter를 지양해야하는 문제에 와는 달리 큰 영향은 없을 것 같아서요.
감사합니다.!
답변 2
15
안녕하세요. KwangMin Lee님
Entity는 비즈니스 로직이 있고, 실제 데이터도 변경되기 때문에, Setter를 최대한 사용하지 않는 편이 좋습니다.
반면에 DTO는 목적 자체가 어떤 로직이 있다기 보다는, 단순히 데이터를 전달하는 것이기 때문에 Getter, Setter를 자유롭게 사용하셔도 됩니다^^
감사합니다.
2
늦었지만 혹시 구글 검색을 통해 들어오신 분들을 위해 추가적으로 답변드립니다.
DTO와 같은 모델에 setter가 없는 경우 다음과 같이 데이터 바인딩을 합니다. 결론부터 말씀드리면, 기본 생성자를 제거해야 합니다.
아래 글은 제가 작성한 블로그의 내용을 좀 발췌했습니다.
... 다음과 같은 방법 중 하나로 인스턴스화됩니다.
- @ModelAttribute 메소드에 의해 추가되었을 수 있는 모델을 탐색한다.
- 만약 model attribute가 클레스 레벨에 @SessionAttribute 어노테이션이 붙었는지 Http Session을 통해 탐색한다
- model의 속성 이름과 path variable, request parameter와 같은 request 값이 매치되는 경우 컨버터를 얻는다.
- 기본 생성자를 통해 인스턴스화한다.
- 서블릿 request 파라미터들의 이름과 가장 일치하는 인자가 있는, 적절한 생성자를 통해(primary constructor) 인스턴스화된다. 인자의 이름은 JavaBeans의 @ConstructorProperties 또는 바이트코드의 런타임 시 존재하는(runtime-retained) 파라미터의 이름을 통해 결정된다.
만약 컨트롤러에서 DTO가 데이터바인딩이 되지 않을 경우, DTO에 기본 생성자 및 관련 어노테이션이 있는지 확인하셔야 합니다. 만약 있다면 제거해주세요.