MyBatis를 사용하며
DTO 를 한 대 모아 요청 형태와 반환 형태를 정의해주고 싶었다.
public class testDTO {
@Getter
@Setter
public class testReqDTO{
private Integer id;
private String title;
private String content;
private Time time;
}
@Getter
@Setter
public class testRespDTO{
private String title;
private String content = null;
}
}
[ERROR] 2023-11-05 14:27:48.574 : o.a.c.c.C.[.[.[.[dispatcherServlet] - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.ReflectionException: Error instantiating class testDTO$testRespDTO with invalid types (testDTO) or values (1). Cause: java.lang.IllegalArgumentException: argument type mismatch] with root cause
java.lang.IllegalArgumentException: argument type mismatch
이런 형태를 중첩클래스라고 한다.
중첩 클래스는 static 으로 선언되어야 한다.
중첩된 클래스가 non-static으로 선언되면 해당 클래스의 인스턴스에는 외부 클래스의 참조가 포함되므로, 직렬화에서 문제가 발생할 수 있다.
특히나 batis를 사용한다면 batis 가 매핑하는 과정에서 문제가 발생할 수 있습니다.
public class testDTO {
@Getter
@Setter
❌ public class testReqDTO{
✅ public static class testReqDTO{
...
}
@Getter
@Setter
❌ public class testRespDTO{
✅ public static class testRespDTO{
...
}
}