기본 생성자가 필요하다
결론부터 말하자면, ResultMap
에 사용되는 VO 및 DTO에는 기본 생성자 명시가 필요하다.
내가 만난 오류의 경우
상위 VO인 Villager
에서 하위 VO인 Personality
를 함께 받아오길 원했고, 다음과 같이 ResultMap
을 작성했다.
<resultMap id="VillagerResultMap" type="VillagerVo">
<id column="code" property="code" />
<result column="name" property="name" />
<result column="birth" property="birth" />
<result column="catchphrase" property="catchphrase" />
<association property="personality" javaType="PersonalityVo">
<id column="pid" property="id" />
<result column="pname" property="name" />
<result column="ptype" property="type" />
<result column="pgender" property="gender" />
<result column="pdesc" property="desc" />
</association>
</resultMap>
그러나, 각 Column 개수 및 이름이 맞는데도 불구하고 argument type mismatch 에러를 마주하였다.
오류 원인
MyBatis는 Reflection 기술을 사용해 클래스의 생성자를 찾고, 생성자를 호출하여 객체를 생성한다.
하지만 기본 생성자가 없는 경우, Reflection을 통해 적절한 생성자를 찾을 수 없어 객체 생성에 실패한다고 한다.
resultType
으로 반환 Type을 지정해준 경우라면
필요 Argument가 존재하는 생성자를 통해 객체를 생성할 수 있지만
resultMap
에서, 특히 association
등 SELECT한 값이 바로 주입되지 않는 경우
기본 생성자를 만들어 값을 매핑하는 것 같다.
@NoArgsConstructor
어노테이션을 통해 기본 생성자를 만들어주니
정상적으로 하위 VO를 포함한 튜플을 SELECT할 수 있었다!
'프레임워크 및 라이브러리 > Spring' 카테고리의 다른 글
RuntimeException : Cannot invoke "*" because "*" is null 해결 (0) | 2024.07.17 |
---|---|
[MyBatis] MyBatis 초기 설정하기 (2) | 2024.07.08 |
RestClient 자동 인코딩 (공공데이터 API Key Error) (0) | 2024.04.12 |
WebClient를 사용하지 않게 된 이유, 그리고 RestClient (1) | 2024.03.27 |
application.properties (0) | 2024.03.15 |