🚨 문제 상황
문제 은행에서 문제를 선택하여 모의고사를 생성하는 과정에서 다음과 같은 에러가 발생:
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.executor.result.ResultMapException:
Error attempting to get column 'status' from result set.
Cause: java.lang.IllegalArgumentException: No enum constant com.qrystal.app.exam.domain.ExamStatus.ACTIVE
🔍 원인 분석
- Question 엔티티는
QuestionStatus enum을 사용하고 있지만, MyBatis가 ExamStatus enum으로 잘못된 매핑을 시도
- DB의 questions 테이블에는 'ACTIVE'라는 문자열이 저장되어 있음
- MyBatis의 기본 EnumTypeHandler가 잘못된 enum 클래스를 참조하는 문제 발생
🛠 해결 과정
-
코드 검증
- Question 엔티티, QuestionMapper, QuestionStatus enum 등 관련 코드 검토
- DB 스키마와 실제 저장된 데이터 확인
SELECT DISTINCT status FROM questions;
-- 결과: 'ACTIVE'
-
MyBatis 설정 점검
- typeHandler 설정 확인
- enum 매핑 방식 분석
-
해결 방법 적용
- Custom TypeHandler 구현
- MyBatis 설정에 type-handlers-package 추가
✅ 최종 해결
- QuestionStatusTypeHandler 구현:
@MappedTypes(QuestionStatus.class)
public class QuestionStatusTypeHandler extends BaseTypeHandler<QuestionStatus> {
// TypeHandler 구현
}
- MyBatis 설정 수정:
mybatis:
mapper-locations: classpath:mapper/**/*.xml
type-handlers-package: com.qrystal.app.question.handler
configuration:
map-underscore-to-camel-case: true
default-enum-type-handler: org.apache.ibatis.type.EnumTypeHandler
💡 교훈
- Type Safety: Enum 매핑 시 명시적인 TypeHandler를 사용하면 더 안전한 타입 변환이 가능
- 설정 관리: MyBatis 설정에서 type-handlers-package를 명확히 지정하는 것이 중요
- 디버깅 접근: 문제 해결 시 로그, DB 데이터, 코드를 순차적으로 검증하는 체계적인 접근이 효과적
📚 참고 자료
🚨 문제 상황
문제 은행에서 문제를 선택하여 모의고사를 생성하는 과정에서 다음과 같은 에러가 발생:
🔍 원인 분석
QuestionStatusenum을 사용하고 있지만, MyBatis가ExamStatusenum으로 잘못된 매핑을 시도🛠 해결 과정
코드 검증
MyBatis 설정 점검
해결 방법 적용
✅ 최종 해결
💡 교훈
📚 참고 자료