
마이바티스 어노테이션 방식으로 진행 중 mapper에서 EnumOrdinalTypeHandler 를 사용해서 DB에 이눔의 순서를 넣으려고 했다.
public class OperatingTimeVO {
public enum Day {
MON, THE, WEN, THU, FRI, SAT, SUN;
}
...
}
"#{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()은 정규화된 풀네임을 요구 하기 때문이라고 한다.