[mybatis] Enum 에러: java.lang.ClassNotFoundException error using enum

yeahdy_:)·2022년 9월 4일

error

목록 보기
1/5
post-thumbnail

마이바티스 어노테이션 방식으로 진행 중 mapper에서 EnumOrdinalTypeHandler 를 사용해서 DB에 이눔의 순서를 넣으려고 했다.

Enum

public class OperatingTimeVO {

    public enum Day {
        MON, THE, WEN, THU, FRI, SAT, SUN;
    }
    
    ...
}

Mapper

    "#{info.days, " +
    "jdbcType=INTEGER," +
    "javaType=com.example.model.OperatingTimeVo.Days," +
    "typeHandler=org.apache.ibatis.type.EnumOrdinalTypeHandler}, "

...

javaType에 해당 이눔이 속해 있는 패키지명을 쭉 적고 enum이 클래스 안에 있으니까 당연히 . 를 찍고 Days를 했는데 오류가 발생했다!

java.lang.ClassNotFoundException error using enum

분명히 위치를 제대로 적었는데 오류가 나서 그래서 구글링을 열심히 하던 중 발견한 스택오버 플로우의 해결방안!
https://stackoverflow.com/questions/19601643/java-lang-classnotfoundexception-error-using-enum-as-a-key-in-map

✔️해결

. 이 아니라 $ 를 써야 한다는 것이다. 왜냐하면 enum class의 정규화된 이름은 ~class$Days 이기 때문이다.

javaType=com.example.model.OperatingTimeVo$Days

요약하자면 Spring은 자바 리플렉션을 사용하는데, Class.forName()을 사용하여 클래스의 객체를 가져오고 객체를 인스턴스화 한다. 그런데 forName()은 정규화된 풀네임을 요구 하기 때문이라고 한다.

  • 기초배경
    자바 리플렉션은 클래스의 구체적인 타입을 알 지 못해도 클래스에 있는 메소드, 변수에 접근 해 주는 API 라고 한다.
    자바 리플렉션 안에는 여러 메소드가 있는데 그 중에 하나가 forName()이다.
profile
기억하기 위해 기록하고 있습니다. 포스트 중 잘못된 정보가 있다면 코멘트 남겨주세요🐰

0개의 댓글