본문 바로가기

Spring 3.0 - 4.3

[에러] MyBatis 이용 시, DTO 객체와 테이블의 컬럼명은 동일해야한다.

 

MyBatis는 resultType에 맞게 리턴타입을 반환합니다.

예를들어 SONG 테이블의 모든 컬럼은 SongVO의 'song_title, song_key ...' 속성값으로 처리됩니다.

좀 더 엄밀하게 말하면 MyBatis는 위의 쿼리 결과에서 song_title 이라는 컬럼이 존재하면 인스턴스의 setSong_title(); 를 호출하게 됩니다. MyBatis의 모든 파라미터와 리턴 타입의 처리는 get 파라미터명(), set 컬럼명()의 규칙으로 호출됩니다.

 

 

에러원인

해당 쿼리에 대한 데이터 값은 컬럼명을 참조하여 setSong_key(), setSong_title() .. 이런식으로 세팅이 됩니다.

<select id="getSongInfo" resultType="com.exe.domain.SongVO" parameterType="String">
		SELECT
				SONG_KEY, SONG_TITLE, REL_DATE, YOUTUBE_LINK, ALBUM_KEY
		  FROM
		  		SONG
		 WHERE
		 		SONG_KEY = #{song_key, jdbcType=VARCHAR}
	</select>

 

그런데 SongVO의 객체가 다음과 같이 정의돼있었습니다.

@Data
public class Song {
    private String songKey;
    private String songTitle;
    private String relDate;
    private String youtubeLink;
    private String albumKey;
}    

 

Lombok에 의해 setSongKey(), setSongTitle() 이렇게 생성됐겠죠? 그래서 쿼리결과값에 대한 데이터를 못받아온겁니다.

 

 

 

에러해결 

방법1) 컬럼명과 동일하게 변수선언을 해준다.

@Data
public class SongVO {
	
	private String song_key;
	private String song_title;
	private String rel_Date;
	private String youtube_link;
	private String album_key;
	
}

 

 

 

방법2) Mybatis 옵션을 통하여 CamelCase로 자동 변환 해준다.

mybatis-config.xml 에 이와같이 추가해주면 camelCase로 자동으로 변환이 될 수 있다.

<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE configuration  
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"  
 "[http://mybatis.org/dtd/mybatis-3-config.dtd](http://mybatis.org/dtd/mybatis-3-config.dtd)">  
<configuration>  
 <settings>  
  <!-- 자동으로 카멜케이스 규칙으로 변환 -->  
    <setting name="mapUnderscoreToCamelCase" value="true"/>  
 </settings>
</configuration>