
MyBatis를 사용해 Department 정보를 조회하는 Departments() 메소드를 구현했지만, 조회된 데이터가 모두 null로 반환되는 문제가 발생했습니다.

타입 확인: 먼저 타입이 올바른지 확인했습니다. 데이터베이스에서 가져온 값들이 자바 객체에 잘 매핑될 수 있도록 필드와 타입을 점검했습니다.
@Autowired 시도: @Autowired를 사용하여 매퍼 인터페이스를 자동 주입해봤으나, 문제는 여전히 해결되지 않았습니다.
다른 DB로 테스트: 이후, 동일한 방식으로 다른 student 테이블을 조회해봤는데, 이상 없이 데이터가 정상적으로 반환되었습니다. 이를 통해 MyBatis 설정 자체에는 문제가 없음을 알게 되었습니다.
디버깅 과정: 디버깅을 통해 11개의 데이터가 조회된다는 사실을 확인하면서, 데이터베이스와의 연결은 정상적임을 알게 되었습니다. 그 이후 문제는 매핑에 있다는 것을 깨달았습니다.
디버깅 과정에서 데이터베이스와 자바 객체 간 매핑이 실패한 원인을 파악할 수 있었습니다. 자바는 기본적으로 카멜 케이스(camelCase) 방식으로 변수명을 사용하고, 데이터베이스에서는 스네이크 케이스(snake_case) 방식으로 컬럼명이 정의됩니다. 예를 들어, 데이터베이스에서는 dept_code, dept_name과 같은 컬럼명이 사용되지만, 자바 클래스에서는 deptCode, deptName과 같은 필드명을 사용합니다.
이처럼 자바 객체의 필드명과 데이터베이스 컬럼명이 일치하지 않으면, MyBatis는 이를 자동으로 매핑할 수 없습니다. 그래서 데이터베이스에서 가져온 값들이 모두 null로 반환되는 문제가 발생한 것입니다.
처음에는 자바의 필드명을 데이터베이스 컬럼명에 맞게 수정하면 정상적으로 동작할 것이라는 의문이 들었습니다. 그래서 자바 변수명을 DB 컬럼명과 일치시켰더니, 예상대로 데이터가 정상적으로 반환되었습니다. 이를 통해 자바 변수명과 데이터베이스 컬럼명이 일치하지 않으면 매핑 오류가 발생한다는 점을 확인할 수 있었습니다.
하지만 이는 바람직한 방식은 아닙니다. 자바에서는 카멜 케이스를 사용하는 것이 표준이므로, 보다 유연하고 올바른 해결 방법이 필요했습니다.


resultMap을 사용하여 매핑을 명시적으로 설정했습니다.
resultMap을 통해 데이터베이스 컬럼과 자바 클래스 필드를 정확히 매핑할 수 있었습니다.
<mapper namespace="wisoft.entertainment.EntertainmentService">
<resultMap id="departmentResultMap" type="wisoft.entertainment.Department">
<result property="deptCode" column="dept_code"/>
<result property="deptName" column="dept_name"/>
</resultMap>
<select id="getDepartments" resultMap="departmentResultMap">
SELECT * FROM department
</select>
</mapper>
SQL문에서 컬럼의 별칭(Alias)을 설정하여 매핑을 명시적으로 지정했습니다.
SQL문에서 AS 키워드를 사용하여 데이터베이스 컬럼 이름과 자바 클래스 필드를 일치시킬 수 있었습니다.
<select id="getDepartments" resultType="wisoft.entertainment.Department">
SELECT dept_code AS deptCode, dept_name AS deptName, dept_loc AS deptLoc
FROM department
</select>
MyBatis 설정 파일에서 mapUnderscoreToCamelCase 옵션을 활성화했습니다. 이 설정을 적용하면 자동으로 데이터베이스의 언더스코어(_) 표기법을 자바의 카멜케이스 표기법으로 변환할 수 있습니다.
<configuration>
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
</configuration>
이번 문제를 해결하면서 MyBatis에서 매핑 문제를 처리하는 방법에 대해 더 깊이 이해하게 되었습니다.