MyBatis 프로젝트를 진행하고 있는데 Dto를 만들면서 기본 생성자 외에 매개변수가 있는 생성자도 같이 적으면 어떤 생성자가 호출되는지 궁금했다. 콘트롤러에서 필요한 필드들을 하나의 객체(dto)로 묶으면서 매개변수가 있는 생성자도 자연스럽게 함께 작성해 줬는데 디버그 문으로 확인해 본 결과 정작 호출되는 것은 기본 생성자였다. 이러한 내용들을 문서에서 확인해 보니 다음과 같았다.
아래는 mapper.xml에서 resultType이 map일 때 반환 객체를 어떻게 생성하는지에 대한 이야기이다.
여기서 'your application will use JavaBeans or POJOs for the domain model...'에서 관련 내용을 확인할 수 있었다. 참고로 MyBatis는 둘 다 지원한다고 하지만, 기본적으로는 JavaBeans Naming Conventions를 채택하고 있는 듯 했다.(실제로 그렇게 동작했으니까)
JavaBeans는 위 mybatis 문서 예제 나온 것처럼 기본 생성자에 getter, setter 메서드들만 둔 것이다. 바로 위 문서의 'that has a no-argument constructor and conforms to the JavaBeans naming conventions. The bean properties are accessed through getter and setter methods...' 부분을 통해서도 같은 내용을 확인해 볼 수 있다. 결과적으로 Dto 객체를 기본 생성자를 호출해 만들고 이후 setter 메서드들을 통해 값을 채운다는 것을 알게 되었다.
사실 chatGPT에도 먼저 물어봤었는데 MyBatis, JPA, QueryDsl 등 시스템마다 어떤 생성자를 호출하는지는 다르다고 답변이 왔다. 일단 이 정도로만 알고 나중에 헷갈리면 바로 생성자에 디버그 문 넣어서 확인해 본다음 관련 문서를 빨리 찾아봐야겠다.
참고로 매개변수 있는 생성자로 객체가 만들어지기를 원한다면 mapper에서 생성자를 이렇게 지정하면 된다. 나는 기본 생성자의 편리함을 따르기로 했지만, 이렇게 매개변수 있는 생성자로 만든다면 불변 객체를 만들 수 있다는 장점이 있다. 빌더 패턴과도 상응하는데 명확하게 어떤 필드에 값이 들어가는지를 알 수 있고, 필드를 final로 지정한다면 나중에 setter를 통한 값의 변경을 막을 수 있다. 생성자 주입과 setter 주입의 모습 같기도 하다.
<resultMap id="categoryDtoMap" type="CategoryDto">
<constructor>
<arg column="category_large_id" javaType="string"/>
<arg column="category_large_name" javaType="string"/>
<arg column="category_medium_id" javaType="string"/>
<arg column="category_medium_name" javaType="string"/>
<arg column="category_small_id" javaType="string"/>
<arg column="category_small_name" javaType="string"/>
</constructor>
</resultMap>
<select id="selectByCategory" parameterType="MainSearchCondition" resultMap="categoryDtoMap">
cf. POJO(Plain Old Java Objects)는 특정 기술과 환경에 의존하는 자바코드가 아닌, 객체지향 원리에 충실하면서 환경과 기술에 의존하지 않는 오래된 방식의 순수한 자바 객체를 의미한다. (https://siyoon210.tistory.com/120)
'Spring' 카테고리의 다른 글
[Spring] URL에서 정적 파일, 동적 파일 접근하기 (0) | 2025.02.20 |
---|---|
[Spring] STS 오류 해결 모음 (0) | 2025.02.10 |
[Spring] 프로그램 서버 구동 오류 해결 (0) | 2024.11.21 |
[Spring] OAuth 2.0 원리 이해 (2) | 2024.10.06 |
[Spring] 컴파일 과정, 의존성 추가와 플러그인 설치 차이 (0) | 2024.09.30 |