inner class 사용 시 문제 발생
하나의 DTO 클래스 내에 Request와 Response를 나눠서 static inner class로 생성하여 사용하는 경우 swagger에서 inner 클래스를 인식하지 못하는 문제가 발생한다.
아래와 같이 MemberLogin DTO를 사용 시에 Swagger에서 인식하지 못하여 이 요청과 관련 없는 다른 DTO가 보이게 된다.
public class MemberLogin {
public static class Request {
private String email;
private String password;
}
public static class Response {
private TokenDto tokenDto;
}
}
Swagger 내부 동작 원리
Swagger는 각 DTO의 property를 파악하고 DTO이름(식별자)를 부여하는 과정이 필요하다.
따라서 Springfox는 각 DTO 클래스에 식별자를 부여하기 위해 TypeNameProviderPlugin 인터페이스의 nameFor()이라는 메서드를 이용하게 된다.
그러나 이 인터페이스의 기본 구현체에서는 단순히 Class<?>.getSimpleName() 값을 반환하도록 작성되어 있어, inner class 이름과 property를 가져오지 못하게 된다.
해결 방법
TypeNameExtractor의 종속성을 사용하는 Bean을 변경하여, 주입되는 종속성을 변경하는 방법으로 해결할 수 있다.
아래와 같은 Config 파일 하나를 추가하면 된다.
@Configuration
public class SwaggerCustomTypeResolveConfig {
@Bean
public PluginRegistry<TypeNameProviderPlugin, DocumentationType> customTypeNameResolvers(){
return PluginRegistry.of(new DefaultTypeNameProvider(){
@Override
public String nameFor(Class<?> type) {
return type.getName();
}
});
}
@Bean
@Primary
public TypeNameExtractor customTypeNameExtractor(TypeResolver typeResolver,
@Qualifier("customTypeNameResolvers") PluginRegistry<TypeNameProviderPlugin, DocumentationType> customTypeNameResolvers,
EnumTypeDeterminer determiner){
return new TypeNameExtractor(typeResolver, customTypeNameResolvers, determiner);
}
}
아래 글에서 해결 방법을 얻었다.
https://velog.io/@vinto1819/Spring%EC%97%90%EC%84%9C%EB%8A%94-DTO%EA%B0%80-%EA%B7%B8%EB%A6%BC%EC%9E%90-%EB%B6%84%EC%8B%A0%EC%88%A0%EC%9D%84-%EC%94%81%EB%8B%88%EB%8B%A4
반응형