쭈쌤
쭈쌤 Hello World

[Java,Spring] MyBatis 에러 케이스

크리에이티브 커먼즈 라이선스 ITPAPER(호쌤,쭈쌤)에 의해 작성된 ≪[Java,Spring] MyBatis 에러 케이스≫은(는) 크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 4.0 국제 라이선스에 따라 이용할 수 있습니다.
이 라이선스의 범위 이외의 이용허락을 얻기 위해서는 leekh4232@gmail.com으로 문의하십시오.

[Java,Spring] MyBatis 에러 케이스

MyBatis를 활용하여 데이터베이스 연동을 구현할 때 자주 겪게 되는 에러 메시지들을 상황별로 모아봤습니다.

#01. MyBatis 설정파일 오류

Spring의 경우 root-context.xml을 사용하지만 JSP나 일반 Java Console 프로그램의 경우 별도의 설정 파일을 가져가야 합니다. 다음의 에러는 설정파일상에 문제가 있는 경우입니다.

ex) mybatis_config.xml

1) 설정파일의 경로가 잘못된 경우

MyBatis의 설정파일을 읽어들여 SqlSession 객체를 생성후 리턴하는 과정에서 설정파일의 경로나 파일명을 잘못 기입하면 해당 파일을 찾을 수 없다는 에러 메시지가 표시됩니다.

Could not find resource mybatis_config_tmp.xml

01.png

2) 설정 파일상에 명시된 데이터베이스 접속 정보가 잘못된 경우

데이터베이스 호스트 주소 오류

데이터베이스의 주소를 잘못 명시할 경우 UnknownHostException이 발생합니다.

… nodename nor servname provied, or not known

02.png

데이터베이스 이름이 잘못된 경우

정확히는 지정된 데이터베이스를 찾을 수 없다는 내용의 에러 메시지가 표시됩니다.

Unkown database 데이터베이스이름

03.png

데이터베이스에 접근할 계정명이 잘못된 경우

사용자이름이나 비밀번호 설정이 잘못된 경우 접근이 거부되었다는 에러 메시지가 표시됩니다.

Access denied for user ‘아이디’@’호스트이름’ (using password: YES)

04.png

데이터베이스에 접근할 비밀번호가 잘못된 경우

사용자 이름이 잘못된 경우와 동일한 에러 메시지가 표시됩니다.

Access denied for user ‘아이디’@’호스트이름’ (using password: YES)

05.png

JDBC 설정 정보 중 Driver 클래스 이름이 잘못된 경우

Error setting driver on UnpooledDataSource …
드라이버이름을(를) 찾을 수 없습니다.

06.png

JDBC에 접속하기 위한 URL 문자열이 잘못된 경우

No suitable driver found for jdbc:…

07.png

3) SQL이 정의되어 있는 Mapper XML을 찾을 수 없는 경우

해당 경로에 대한 리소스를 찾을 수 없다는 에러 메시지가 표시됩니다.

Could not find resource Maapper파일 경로

08.png

#02. Mapper XML이나 Java 소스상의 문제

1) Mapper에 정의된 기능에 대한 id값을 찾지 못한 경우

Java소스에서 sqlSession 객체를 사용해 Mapper에 정의된 기능을 호출하는 과정에서 Mapper의 기능명을 잘못 지정했거나, Java에서 호출한 id값을 갖는 기능이 Mapper에 정의되어 있지 않은 경우 에러가 발생합니다.

예를 들어,

1
Department dept = sqlSession.selectOne("DepartmentMapper.select_one");

위와 같이 호출했을 때 Mapper XML에는 DepartmentMapper라는 namespace를 갖는 범위 안에서 select_one이라는 id를 갖는 <select>태그가 존재해야 합니다. 이러한 연결이 잘못된 경우 다음과 같은 에러가 발생합니다.

Mapped Statements collection does not contain value for 자바에서_명시한_기능명

09.png

2) Mapper에 명시되는 파라미터 타입이 잘못되는 경우

이 경우는 거의 Mapper쪽에 원인이 있는 경우가 많습니다.

Java 클래스에 대한 파라미터 타입을 <select>, <insert>, <update>, <delete> 태그에 명시해야 하는데 자바 소스상에서 잘못되었다면 컴파일 자체가 불가능하므로 이클립스에 빨간색으로 에러 표시가 보일 것 입니다.

MyBatis 상에서 런타임에러가 발생하는 경우는 컴파일 되지 않는 XML상의 문제인 경우가 대부분 입니다.

13.png

위와 같이 코딩되어 있으면서 정작 DepartmentHelloWorld 라는 클래스가 존재하지 않는다면 (혹은 패키지 경로 등이 잘못되었다면) MyBaits는 런타임시에 다음과 같은 에러를 표시합니다.

Can not find class: Mapper에서_명시한_클래스경로

12.png

3) Mapper로 전달된 파라미터 객체의 멤버변수 이름을 잘못 사용한 경우

<select>, <insert>, <update>, <delete> 태그로 전달된 parameter 객체는 parameterType 속성으로 정의한 객체가 전달되어 집니다.

그리고 SQL문에서는 ${멤버변수명} 형식으로 값을 사용하게 됩니다.

아래와 같이 구현하면 MyBatis는 Department 클래스의 객체로부터 deptnohelloworld 라는 멤버변수를 찾습니다.

15.png

하지만 실제로는 해당 멤버변수에 대한 getter, setter를 호출합니다.

그러므로 멤버변수 이름이 잘못되면 MyBatis에서는 getter, setter를 찾을 수 없다는 에러 메시지를 표시하게 됩니다.

There is no getter for property named ‘잘못명시한_멤버변수_이름’ in ‘class 파라미터로_전달된_클래스

14.png

#03. Mapper 자체의 에러

1) SELECT의 결과로 맵핑할 대상을 찾지 못하는 경우

<select> 태그에서 명시하는 resultMap 속성은 <resultMap> 태그에서 정의한 id값을 지정해야 합니다.

하지만 오타 등의 이유로 이 연결이 잘못되는 경우가 흔히 발생합니다.

11.png

이 경우 다음과 같은 에러메시지가 표시됩니다.

Result Maps collection does not contain value for 잘못명시된 resultmap 이름

위의 소스코드에서는 <select>태그에서 resultMapdepartment라고 정의하고 정작 <resultMap> 태그에서는 id값departmentMap이라고 지정했습니다.

그러므로 MyBatis는 런타임시에 DepartmentMapper라고 정의된 Mapper XML안에서 <select> 태그에서 정의한 대로 department라는 id를 갖는 <resultMap> 태그를 찾으려고 합니다. 하지만 해당 id값을 갖는 요소를 찾을 수 없기 때문에 아래와 같이 에러가 발생합니다.

10.png

Rating:

크리에이티브 커먼즈 라이선스 ITPAPER(호쌤,쭈쌤)에 의해 작성된 ≪[Java,Spring] MyBatis 에러 케이스≫은(는) 크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 4.0 국제 라이선스에 따라 이용할 수 있습니다.
이 라이선스의 범위 이외의 이용허락을 얻기 위해서는 leekh4232@gmail.com으로 문의하십시오.

comments powered by Disqus