강의

멘토링

로드맵

인프런 커뮤니티 질문&답변

dawon.hyun님의 프로필 이미지
dawon.hyun

작성한 질문수

swagger api 리스트 갱신 방법 궁금합니다.

작성

·

609

0

gateway에 swagger 설치해서 api 리스트를 체크하고 있습니다.

라우트 정보를 config 서버에서 관리하도록 변경해서 gateway 재시작 없이 /actuator/refresh로 라우트 정보가 갱신되는 것은 성공했습니다.

그런데 gateway에 있는 swagger에 definition 목록에서는 추가된 라우트 정보가 반영되지는 않더군요.

apidoc 라우트 빈 등록하는 부분에 @RefreshScope를 적용해봐도 그대로라서 gateway 재시작 없이 반영할 수 있는 방법이 있을까요?

@Configuration
public class OpenApiDocConfig {

	@RefreshScope
	@Bean
	@Lazy(false)
	public List<GroupedOpenApi> apis(SwaggerUiConfigParameters swaggerUiConfigParameters, RouteDefinitionLocator locator) {

		List<GroupedOpenApi> groups = new ArrayList<>();
		List<RouteDefinition> definitions = locator.getRouteDefinitions().log("OpenApiDocConfig").collectList().block();

		Optional.ofNullable(definitions)
			.map(Collection::stream)
			.orElseGet(Stream::empty)
			.filter(routeDefinition -> routeDefinition.getId().matches(".*-service"))
			.forEach(routeDefinition -> {
				String name = routeDefinition.getId();
				swaggerUiConfigParameters.addGroup(name);
				GroupedOpenApi.builder().pathsToMatch("/" + name + "/**").group(name).build();
			});

		return groups;

	}

}

 

답변 1

0

안녕하세요, 인프런 AI 인턴이에요.

Gateway에 있는 Swagger에 Definition 목록이 갱신되지 않는 문제에 대해 여쭤봐주셨는데요. Gateway를 재시작하지 않고 추가된 라우트 정보를 반영하는 방법이 궁금하신 거죠?

현재 코드를 보면, OpenApiDocConfig 클래스에서 @RefreshScope 어노테이션이 적용되어 있는데요, 이로 인해 스프링 클라우드 컨피그 서버로부터 변동 사항을 가져옵니다. 그런데, 현재 코드에서는 갱신된 라우트 정보를 리스트에 추가하는 부분이 빠져있어서 반영되지 않는 것 같아요.

아래 코드 부분을 수정하면 갱신된 라우트 정보를 반영할 수 있을 겁니다.

...
.forEach(routeDefinition -> {
    String name = routeDefinition.getId();
    swaggerUiConfigParameters.addGroup(name);
    GroupedOpenApi group = GroupedOpenApi.builder().pathsToMatch("/" + name + "/**").group(name).build();
    groups.add(group); // 빠진 코드 추가
});
...

위와 같이 수정한 후에 다시 실행해보시고 Swagger에 Definition 목록이 잘 갱신되는지 확인해보세요.

추가적인 도움이 필요하시면 언제든지 물어보세요. 좋은 결과 있길 바래요!

dawon.hyun님의 프로필 이미지
dawon.hyun

작성한 질문수

질문하기