본문 바로가기

노력을 이기는 재능은 없고
노력을 외면하는 결과도 없다.
- 이창호 9단

E R R O R/Spring Error

[Spring Error] 심각: Servlet.service() for servlet [appServlet] in context with path [] threw exception [Request processing failed; nested exception is org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.Reflect..

  Junesker   2024. 4. 11.
반응형

 

1:N 의 관계성을 가지고 있는 테이블 구조에서 Mapper를 통해 데이터 바인딩한 결과를 가져오려고 하는데, 이때, N의 관계성을 가지고 있는 VO에서 Type Mismatch 에러가 발생하고 있다. Mapper까지 넘기고 있는 파라미터도 정상적으로 들어오고 있고 파라미터를 통해 결과도 잘 나타내고 있는데, N관계성을 가지고 있는 데이터만 [nuread]로 나타나고 있는거 말고는 오타라던지 resultMap을 잘못 구성했다던지 등등의 이슈는 없었다. 

 

 

 

 

 

java.lang.IllegalArgumentException: argument type mismatch

 

 

 

 

 

SpringFramework를 활용한 CRUD를 진행하다보면 굉장히 많은 에러들이 발생할 수 있다. 대부분 시스템이 잘못되서가 아니라 우리가 작성한 소스에 문제가 있다! 우리의 손가락을 탓하고 우리가 놓친 센스를 탓하자...

argument type mismatch 에러는 확인해야할 부분이 두가지 정도로 좁혀질 수 있다. 물론 더 많은 검증 체크 포인트가 존재할 수 있지만, 대부분 이런 두가지 정도를 확인해보면 에러를 수정할 수 있다. 

 

 

 

 

 

첫번재, 자바빈즈 클래스 객체(VO)와 테이블 컬럼 타입을 확인!


 

 

Mapper에서 조회한 쿼리 결과의 데이터를 바인딩할 자바빈즈 클래스 객체(VO객체)의 필드와 타입, 그리고 조회할 테이블의 컬럼 타입도 같이 대조해보면서 타입을 확인한다. 가끔 보면 테이블을 작성하고 컬럼을 등록한 후에 데이터를 바인딩하기 위해 만든 VO클래스의 타입이 잘 못되어 있는 경우가 있다. 서로 타입이 달라지는 순간부터는 얻어온 결과 데이터를 자바빈즈 클래스 객체인 VO에 넣어야하는데 타입이 맞지 않아서 들어가지 않는 에러가 발생하게 된다.

 

 

 

 

 

두번재, 자바빈즈 클래스 객체(VO)의 기본 생성자 확인!


 

 

Mapper에서 조회한 쿼리 결과의 데이터를 type에 설정되어 있는 객체정보에 데이터를 담는다. 이때, type에 설정되어 있는 객체의 기본 생성자 정보를 이용해서 담는다. 그런데 기본 생성자가 없고 커스텀 생성자만 있다면 커스텀 생성자를 이용해서 객체를 만들고 커스텀 생성자 내에서 명시하고 있는 설정에 맞춰서 데이터를 바인딩하는데 이때에 필드에 존재하지 않고 여타 다른 타입의 필드들이 구성되어 있는 경우라면 type missmatch가 나타날 여지를 남겨두는것과 마찬가지다. 그렇기 때문에 VO에서 커스텀 생성자를 만들었다면 필히 기본 생성자를 함께 만들어 커스텀 생성자로만 객체를 만들 수 있도록 열어두는게 아니라 기본 생성자를 통해서도 객체 정보를 만들어 줄 수 있도록 제공해야한다.

 

정리하지면,

1. 자바빈즈 클래스 객체와 테이블의 명시된 컬럼 타입을 비교하여 일치하는지 확인
2. 데이터를 바인딩할 VO객체의 기본 생성자가 만들어져 있는지 확인

 

 

 

 

 

 

@Junesker


 

반응형

댓글