728x90
Mybatis로 select를 해서 그 결과 값을 dto 객체에 넣으려고 했는데 기본생성자가 없다고하면서 오류가 났었던 기억이 있다.
@Builder
@Getter
@NoArgsConstructor
public class HomeDisplayedBookVO {
private String id;
private String title;
private String about;
public HomeDisplayedBookVO(
String id, String title, String about, String price, List<String> images)
{
this.id = id;
this.title = title;
this.about = about;
...
분명 @Builder 패턴으로 객체를 생성하면 되는데 왜 굳이 기본생성자가 필요한지 궁금했다.
Mybatis에서 resultType, resultMapping은 ObjectFactory라는 것을 사용하고 있다고 한다. 이 과정에서 객체의 초기화가 필요한데, 이 때 기본생성자가 먼저 호출되어 사용되어진다. 기본 생성자를 이용하여 오브젝트를 생성 한 후에는, 리플렉션을 사용하여 객체에 데이터를 바인딩 한다고 한다.
그래서 리플랙션이랑 기본생성자랑 무슨 관계가 있는데?? 그리고 Mybatis랑 무슨 관계가 있는데?
리플랙션에서 객체를 만들 때 기본 생성자를 먼저 찾는다고한다. 왜냐하면 먼저 객체를 생성해야 필드값들을 가져와서 필드값에 값을 넣어줄 수 있지않는가?? 객체를 만들 때 필요한 것이 기본 생성자이기 때문이다. 그러므로 Mybatis 로 select 하고 select 된 값들로 객체를 생성해야 하는데, 생성하는 과정에서 리플랙션(reflection)이 기본 생성자를 가르켜 객체를 생성한 후, 객체의 필드에 접근하여 값을 저장합니다.
참조
https://da-nyee.github.io/posts/woowacourse-why-the-default-constructor-is-needed/
https://okky.kr/articles/725359
'난중(개발)일기 > 깨달음' 카테고리의 다른 글
Hexagonal architecture로 구조를 바꿔보며.. (0) | 2022.10.04 |
---|---|
Custom AOP로 바꿔보면서.. (0) | 2022.09.28 |
PK에 seq(sequence)와 id에 대한 고찰 (0) | 2022.09.25 |
[MyBatis] MySql JSON 타입 MyBatis select로 가져오기 (0) | 2022.09.17 |
[Java] Generic에 void 타입 받기 (1) | 2022.09.07 |