Skip to content

MyBatis Enum Type Mapping 에러 해결 #4

@Tae4an

Description

@Tae4an

🚨 문제 상황

문제 은행에서 문제를 선택하여 모의고사를 생성하는 과정에서 다음과 같은 에러가 발생:

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 클래스를 참조하는 문제 발생

🛠 해결 과정

  1. 코드 검증

    • Question 엔티티, QuestionMapper, QuestionStatus enum 등 관련 코드 검토
    • DB 스키마와 실제 저장된 데이터 확인
    SELECT DISTINCT status FROM questions;
    -- 결과: 'ACTIVE'
  2. MyBatis 설정 점검

    • typeHandler 설정 확인
    • enum 매핑 방식 분석
  3. 해결 방법 적용

    • Custom TypeHandler 구현
    • MyBatis 설정에 type-handlers-package 추가

✅ 최종 해결

  1. QuestionStatusTypeHandler 구현:
@MappedTypes(QuestionStatus.class)
public class QuestionStatusTypeHandler extends BaseTypeHandler<QuestionStatus> {
    // TypeHandler 구현
}
  1. 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

💡 교훈

  1. Type Safety: Enum 매핑 시 명시적인 TypeHandler를 사용하면 더 안전한 타입 변환이 가능
  2. 설정 관리: MyBatis 설정에서 type-handlers-package를 명확히 지정하는 것이 중요
  3. 디버깅 접근: 문제 해결 시 로그, DB 데이터, 코드를 순차적으로 검증하는 체계적인 접근이 효과적

📚 참고 자료

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions