[ 기타 ]/Trouble Shooting

[트러블슈팅/swagger] DTO에서 inner class 사용 시 swagger에서 인식하지 못하는 오류 해결

HSRyuuu 2023. 12. 12. 18:35

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
반응형