MyBatisSystemException : namespace 불일치 오류

신수정·2024년 3월 28일

구현과 첫 번째 장애

상품 문의하기 기능에 대한 Restful API를 구현하는 과정에서, JUnit과 MockMVC를 활용하여 기능의 성공적인 작성을 테스트하던 중, 예상치 못한 MyBatisSystemException 오류가 발생했습니다. 특히, MockMVC를 통해 ProductInquiryAPIController에게 POST 방식으로 요청을 보내 create 메서드를 호출하려 할 때, insert(unknown Source)라는 에러 메시지가 발생했습니다.

MyBatisSystemException : MyBatis에서 데이터베이스 액세스 중 발생하는 예외를 Spring 프레임워크가 처리할 때 사용되는 예외 클래스입니다. MyBatis는 Java 기반의 데이터베이스 매핑 툴로, SQL 쿼리 실행 과정에서 발생하는 예외를 MyBatis 자체의 예외로 처리하고, 이를 Spring과 같은 다른 프레임워크에서 쉽게 관리할 수 있도록 MyBatisSystemException으로 변환하여 던집니다.
이 예외는 주로 SQL 쿼리 실행 중에 발생하는 오류, 데이터베이스 연결 문제, 매핑된 SQL 문과 매개변수 사이의 불일치 등으로 발생할 수 있습니다.

  1. SQL 문법 오류: SQL 쿼리 자체에 문제가 있어서 실행할 수 없는 경우.
  2. 데이터베이스 연결 실패: 데이터베이스 서버에 연결할 수 없거나, 연결 정보가 잘못된 경우.
  3. 매핑 오류: MyBatis 매핑 파일에서 지정한 SQL ID를 찾을 수 없거나, 매개변수와 결과 매핑에 문제가 있는 경우.
  4. 설정 문제: MyBatis 또는 연관된 Spring 설정에 오류가 있는 경우.

문제의 원인 파악

에러 메시지와 DAO에서 지정한 ProductInquiryMapper.create 스테이트먼트를 확인하는 과정에서, Unknown Source라는 메시지가 나타났습니다. 이는 namespace와 statement 간의 불일치 문제로 추측했습니다.


찾아보니 namespace가 실제로 ProductInquiryAPIController로 설정되어 있었으며, 이는 DAO와 일치하지 않는 문제였습니다. ProductInquiryMapper로 정정하고 재테스트한 결과, 기능이 정상적으로 작동하는 것을 확인할 수 있었습니다.

MyBatis 사용과 TDD의 중요성

이번 오류를 통해, MyBatis를 사용할 때 namespace를 명확하고 일관된 규칙으로 설정하는 것의 중요성을 깊게 이해하게 되었습니다. 또한, 문제 상황을 신속하게 해결하고 기능 구현을 검증하는 과정에서 TDD(Test-Driven Development)의 가치를 직접 경험하며, 개발 과정에서의 체계적인 테스트의 중요성을 깨달았습니다.
profile
안녕하세요:)

0개의 댓글