반응형
dto는 컨트롤러의 매개변수로 들어오는 값들이 착착 매핑된다,
이건 메세지 컨버터가 setter를 때려서 값을 채워줄까?
생성자에 값을 채워주는걸까?
테스트 해보기 위해 dto와 컨트롤러를 만들어 테스트해보자.
package site.metacoding.blogv4junit.web.dto;
public class BookSaveReqDto {
private String title;
private String author;
public BookSaveReqDto() {
System.out.println("=================================");
System.out.println("BookSaveReqDto() 호출됨");
System.out.println("=================================");
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
System.out.println("=================================");
System.out.println("setTitle() 호출됨");
System.out.println("=================================");
this.title = title;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
System.out.println("=================================");
System.out.println("setAuthor() 호출됨");
System.out.println("=================================");
this.author = author;
}
}
@PostMapping("/api/book")
public ResponseEntity<?> test(@RequestBody BookSaveReqDto bookSaveReqDto) {
return new ResponseEntity<>(bookSaveReqDto, HttpStatus.OK);
}
메세지 컨버터가 빈생성자를 호출하고 setter를 때린다.
그렇다면 풀생성자를 만들면 어떻게될까?
setter를 호출 할 필요없이 풀생성자를 호출하면 한방에 끝나지 않을까?
만들어보자.
package site.metacoding.blogv4junit.web.dto;
public class BookSaveReqDto {
private String title;
private String author;
public BookSaveReqDto(String title, String author) {
this.title = title;
this.author = author;
System.out.println("=================================");
System.out.println("BookSaveReqDto(String title, String author) 호출됨");
System.out.println("=================================");
}
public BookSaveReqDto() {
System.out.println("=================================");
System.out.println("BookSaveReqDto() 호출됨");
System.out.println("=================================");
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
System.out.println("=================================");
System.out.println("setTitle() 호출됨");
System.out.println("=================================");
this.title = title;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
System.out.println("=================================");
System.out.println("setAuthor() 호출됨");
System.out.println("=================================");
this.author = author;
}
}
똑같이 빈생성자와 setter를 호출한다.
그럼 빈생성자가 없으면 어떻게될까?
오류가 난다.
풀생성자를 만들면 디폴트 생성자는 사라진다.
메세지 컨버터는 빈생성자와 세터를 필수로 호출한다!!
만약 final을 붙여서 생성자로 주입하게 만들면 빈생성자가 사라지기때문에 오류난다!
package site.metacoding.blogv4junit.web.dto;
import lombok.RequiredArgsConstructor;
import lombok.Setter;
// ReqDto의 경우는 무조건 빈생성자 + 세터가 필요함
@Setter
@RequiredArgsConstructor
public class BookSaveReqDto {
private final String title;
private final String author;
}
[출처]
https://cafe.naver.com/metacoding
메타 코딩 유튜브
https://www.youtube.com/c/%EB%A9%94%ED%83%80%EC%BD%94%EB%94%A9
반응형