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/

 

[우아한테크코스] 기본 생성자가 필요한 이유 (Why the default constructor is needed) (feat. Jackson ObjectMapper

개요

da-nyee.github.io

https://okky.kr/articles/725359

 

OKKY - Spring MyBatis & DTO 기본생성자 관련 질문 드립니다.

안녕하세요.SQL Mapper인 MyBatis를 사용하다가 궁금한점이 생겨 질문 드립니다.MyBatis에서 Select를 통해 데이터를 조회 후 객체에 데이터 삽입할 경우 기본 생성자가 없을 경우 데이터값 삽입 불가 [@N

okky.kr

https://stir.tistory.com/52

 

기본 생성자(Default Constructor)가 필요한 이유

서론 어느날 갑자기 이런 생각이 떠올랐다. 클래스에 매개변수가 존재하는 생성자가 있으면 기본 생성자가 굳이 필요한가? 왜 매개변수가 존재하는 생성자를 만들어주면 항상 기본 생성자를 만

stir.tistory.com

 

+ Recent posts