diff --git a/backend/apigateway/build.gradle b/backend/apigateway/build.gradle index 8731f3f..71acfd0 100644 --- a/backend/apigateway/build.gradle +++ b/backend/apigateway/build.gradle @@ -29,8 +29,7 @@ dependencies { implementation 'io.jsonwebtoken:jjwt:0.9.1' implementation 'javax.xml.bind:jaxb-api:2.3.1' - implementation group: 'io.springfox', name: 'springfox-swagger2', version: '2.9.2' - implementation group: 'io.springfox', name: 'springfox-swagger-ui', version: '2.9.2' + implementation 'org.springdoc:springdoc-openapi-webflux-ui:1.5.8' compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' diff --git a/backend/apigateway/src/main/java/org/egovframe/cloud/apigateway/api/SwaggerResourcesController.java b/backend/apigateway/src/main/java/org/egovframe/cloud/apigateway/api/SwaggerResourcesController.java deleted file mode 100644 index 1f46a81..0000000 --- a/backend/apigateway/src/main/java/org/egovframe/cloud/apigateway/api/SwaggerResourcesController.java +++ /dev/null @@ -1,70 +0,0 @@ -package org.egovframe.cloud.apigateway.api; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import reactor.core.publisher.Mono; -import springfox.documentation.swagger.web.*; - -import java.util.Optional; - -/** - * org.egovframe.cloud.apigateway.api.SwaggerResourcesController - * - * Swagger resource 들을 모으는 controller class - * - * @author 표준프레임워크센터 shinmj - * @version 1.0 - * @since 2021/07/07 - * - *
- * << 개정이력(Modification Information) >>
- *
- *     수정일        수정자           수정내용
- *  ----------    --------    ---------------------------
- *  2021/07/07    shinmj       최초 생성
- * 
- */ -@RestController -@RequestMapping("/swagger-resources") -public class SwaggerResourcesController { - - @Autowired(required = false) - private SecurityConfiguration securityConfiguration; - - @Autowired(required = false) - private UiConfiguration uiConfiguration; - - private final SwaggerResourcesProvider swaggerResources; - - @Autowired - public SwaggerResourcesController(SwaggerResourcesProvider swaggerResources) { - this.swaggerResources = swaggerResources; - } - - @GetMapping("/configuration/security") - public Mono> securityConfiguration() { - return Mono.just(new ResponseEntity<>( - Optional.ofNullable(securityConfiguration).orElse(SecurityConfigurationBuilder.builder().build()), - HttpStatus.OK - )); - } - - @GetMapping("/configuration/ui") - public Mono> uiConfiguration() { - return Mono.just(new ResponseEntity<>( - Optional.ofNullable(uiConfiguration).orElse(UiConfigurationBuilder.builder().build()), - HttpStatus.OK - )); - } - - @GetMapping("") - public Mono swaggerResources() { - return Mono.just(new ResponseEntity( - swaggerResources.get(), HttpStatus.OK - )); - } -} diff --git a/backend/apigateway/src/main/java/org/egovframe/cloud/apigateway/config/MessageSourceConfig.java b/backend/apigateway/src/main/java/org/egovframe/cloud/apigateway/config/MessageSourceConfig.java index 37cc76f..b070d64 100644 --- a/backend/apigateway/src/main/java/org/egovframe/cloud/apigateway/config/MessageSourceConfig.java +++ b/backend/apigateway/src/main/java/org/egovframe/cloud/apigateway/config/MessageSourceConfig.java @@ -36,7 +36,7 @@ import java.nio.file.Paths; @Configuration public class MessageSourceConfig { - @Value("${messages.directory:${user.home}/msa-attach-volume/messages}") + @Value("${messages.directory}") private String messagesDirectory; @Value("${spring.profiles.active:default}") diff --git a/backend/apigateway/src/main/java/org/egovframe/cloud/apigateway/config/OpenApiDocConfig.java b/backend/apigateway/src/main/java/org/egovframe/cloud/apigateway/config/OpenApiDocConfig.java new file mode 100644 index 0000000..f6dff75 --- /dev/null +++ b/backend/apigateway/src/main/java/org/egovframe/cloud/apigateway/config/OpenApiDocConfig.java @@ -0,0 +1,30 @@ +package org.egovframe.cloud.apigateway.config; + +import java.util.ArrayList; +import java.util.List; + +import org.springdoc.core.GroupedOpenApi; +import org.springdoc.core.SwaggerUiConfigParameters; +import org.springframework.cloud.gateway.route.RouteDefinition; +import org.springframework.cloud.gateway.route.RouteDefinitionLocator; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Lazy; + +@Configuration +public class OpenApiDocConfig { + + @Bean + @Lazy(false) + public List apis(SwaggerUiConfigParameters swaggerUiConfigParameters, RouteDefinitionLocator locator) { + List groups = new ArrayList<>(); + + List definitions = locator.getRouteDefinitions().log("OpenApiDocConfig").collectList().block(); + definitions.stream().filter(routeDefinition -> routeDefinition.getId().matches(".*-service")).forEach(routeDefinition -> { + String name = routeDefinition.getId(); + swaggerUiConfigParameters.addGroup(name); + GroupedOpenApi.builder().pathsToMatch("/" + name + "/**").group(name).build(); + }); + return groups; + } +} diff --git a/backend/apigateway/src/main/java/org/egovframe/cloud/apigateway/config/SwaggerProvider.java b/backend/apigateway/src/main/java/org/egovframe/cloud/apigateway/config/SwaggerProvider.java deleted file mode 100644 index 4efcb60..0000000 --- a/backend/apigateway/src/main/java/org/egovframe/cloud/apigateway/config/SwaggerProvider.java +++ /dev/null @@ -1,78 +0,0 @@ -package org.egovframe.cloud.apigateway.config; - -import lombok.AllArgsConstructor; -import org.springframework.cloud.gateway.config.GatewayProperties; -import org.springframework.cloud.gateway.route.RouteLocator; -import org.springframework.cloud.gateway.support.NameUtils; -import org.springframework.context.annotation.Primary; -import org.springframework.stereotype.Component; -import springfox.documentation.swagger.web.SwaggerResource; -import springfox.documentation.swagger.web.SwaggerResourcesProvider; - -import java.util.ArrayList; -import java.util.List; - -/** - * org.egovframe.cloud.apigateway.config.SwaggerProvider - * - * Swagger API Doc aggregator class - * Swagger Resource인 api-docs를 가져오는 provider - * - * @author 표준프레임워크센터 shinmj - * @version 1.0 - * @since 2021/07/07 - * - *
- * << 개정이력(Modification Information) >>
- *
- *     수정일        수정자           수정내용
- *  ----------    --------    ---------------------------
- *  2021/07/07    shinmj       최초 생성
- * 
- */ -@AllArgsConstructor -@Component -@Primary -public class SwaggerProvider implements SwaggerResourcesProvider { - - public static final String API_URL = "/v2/api-docs"; - public static final String WEBFLUX_API_URL = "/v3/api-docs"; - private final RouteLocator routeLocator; - private final GatewayProperties gatewayProperties; - - @Override - public List get() { - List resources = new ArrayList<>(); - List routes = new ArrayList<>(); - - routeLocator.getRoutes().subscribe(route -> routes.add(route.getId())); - - gatewayProperties.getRoutes().stream() - .filter(routeDefinition -> routes.contains(routeDefinition.getId())) - .forEach(routeDefinition -> routeDefinition.getPredicates().stream() - .filter(predicateDefinition -> ("Path").equalsIgnoreCase(predicateDefinition.getName())) - .forEach(predicateDefinition -> - resources.add( - swaggerResource(routeDefinition.getId(), - predicateDefinition. - getArgs(). - get(NameUtils.GENERATED_NAME_PREFIX+"0"). - replace("/**", API_URL)))) - ); - - return resources; - } - - private SwaggerResource swaggerResource(String name, String location) { - SwaggerResource swaggerResource = new SwaggerResource(); - swaggerResource.setName(name); - if (name.contains("reserve")) { - swaggerResource.setLocation(location.replace(API_URL, WEBFLUX_API_URL)); - }else { - swaggerResource.setLocation(location); - } - - swaggerResource.setSwaggerVersion("2.0"); - return swaggerResource; - } -} diff --git a/backend/apigateway/src/main/java/org/egovframe/cloud/apigateway/config/WebFluxSecurityConfig.java b/backend/apigateway/src/main/java/org/egovframe/cloud/apigateway/config/WebFluxSecurityConfig.java index 5a78209..c0e8d53 100644 --- a/backend/apigateway/src/main/java/org/egovframe/cloud/apigateway/config/WebFluxSecurityConfig.java +++ b/backend/apigateway/src/main/java/org/egovframe/cloud/apigateway/config/WebFluxSecurityConfig.java @@ -35,7 +35,7 @@ public class WebFluxSecurityConfig { ReactiveAuthorization.AUTHORIZATION_URI, "/", "/csrf", "/user-service/login", "/?*-service/api/v1/messages/**", "/api/v1/messages/**", "/?*-service/actuator/?*", "/actuator/?*", - "/?*-service/v2/api-docs", "/?*-service/v3/api-docs", "**/configuration/*", "/swagger*/**", "/webjars/**" + "/v3/api-docs/**", "/?*-service/v3/api-docs", "**/configuration/*", "/swagger*/**", "/webjars/**" }; private final static String USER_JOIN_ANTPATTERNS = "/user-service/api/v1/users"; diff --git a/backend/apigateway/src/main/java/org/egovframe/cloud/apigateway/filter/SwaggerHeaderFilter.java b/backend/apigateway/src/main/java/org/egovframe/cloud/apigateway/filter/SwaggerHeaderFilter.java deleted file mode 100644 index cb6bc9e..0000000 --- a/backend/apigateway/src/main/java/org/egovframe/cloud/apigateway/filter/SwaggerHeaderFilter.java +++ /dev/null @@ -1,49 +0,0 @@ -package org.egovframe.cloud.apigateway.filter; - -import org.egovframe.cloud.apigateway.config.SwaggerProvider; -import org.springframework.cloud.gateway.filter.GatewayFilter; -import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory; -import org.springframework.http.server.reactive.ServerHttpRequest; -import org.springframework.stereotype.Component; -import org.springframework.util.StringUtils; -import org.springframework.web.server.ServerWebExchange; - -/** - * org.egovframe.cloud.apigateway.filter.SwaggerHeaderFilter - * - * Swagger header filter class - * 각 서비스 명을 붙여서 호출 할 수 있도록 filter를 추가 한다. - * - * @author 표준프레임워크센터 shinmj - * @version 1.0 - * @since 2021/07/07 - * - *
- * << 개정이력(Modification Information) >>
- *
- *     수정일        수정자           수정내용
- *  ----------    --------    ---------------------------
- *  2021/07/07    shinmj       최초 생성
- * 
- */ -@Component -public class SwaggerHeaderFilter extends AbstractGatewayFilterFactory { - private static final String HEADER_NAME = "X-Forwarded-Prefix"; - - @Override - public GatewayFilter apply(Object config) { - return (exchange, chain) -> { - ServerHttpRequest request = exchange.getRequest(); - String path = request.getURI().getPath(); - if (!StringUtils.endsWithIgnoreCase(path, SwaggerProvider.API_URL)) { - return chain.filter(exchange); - } - - String basePath = path.substring(0, path.lastIndexOf(SwaggerProvider.API_URL)); - ServerHttpRequest newRequest = request.mutate().header(HEADER_NAME, basePath).build(); - ServerWebExchange newExchange = exchange.mutate().request(newRequest).build(); - - return chain.filter(newExchange); - }; - } -} diff --git a/backend/apigateway/src/main/resources/application.yml b/backend/apigateway/src/main/resources/application.yml index cf48228..95bedc3 100644 --- a/backend/apigateway/src/main/resources/application.yml +++ b/backend/apigateway/src/main/resources/application.yml @@ -14,42 +14,42 @@ spring: filters: - RemoveRequestHeader=Cookie - RewritePath=/user-service/(?.*), /$\{segment} - - SwaggerHeaderFilter - id: portal-service uri: lb://PORTAL-SERVICE predicates: - Path=/portal-service/** filters: - RewritePath=/portal-service/(?.*), /$\{segment} - - SwaggerHeaderFilter - id: board-service uri: lb://BOARD-SERVICE predicates: - Path=/board-service/** filters: - RewritePath=/board-service/(?.*), /$\{segment} - - SwaggerHeaderFilter - id: reserve-item-service uri: lb://RESERVE-ITEM-SERVICE predicates: - Path=/reserve-item-service/** filters: - RewritePath=/reserve-item-service/(?.*), /$\{segment} - - SwaggerHeaderFilter - id: reserve-check-service uri: lb://RESERVE-CHECK-SERVICE predicates: - Path=/reserve-check-service/** filters: - RewritePath=/reserve-check-service/(?.*), /$\{segment} - - SwaggerHeaderFilter - id: reserve-request-service uri: lb://RESERVE-REQUEST-SERVICE predicates: - Path=/reserve-request-service/** filters: - RewritePath=/reserve-request-service/(?.*), /$\{segment} - - SwaggerHeaderFilter + - id: openapi + uri: http://localhost:${server.port} + predicates: + - Path=/v3/api-docs/** + filters: + - RewritePath=/v3/api-docs/(?.*), /$\{segment}/v3/api-docs default-filters: - name: GlobalFilter args: @@ -67,4 +67,4 @@ management: include: refresh, health, beans messages: - directory: ${user.dir}/msa-attach-volume/messages + directory: ${user.dir}/msa-attach-volume/messages \ No newline at end of file diff --git a/backend/board-service/build.gradle b/backend/board-service/build.gradle index 09f9bf7..f19dd1c 100644 --- a/backend/board-service/build.gradle +++ b/backend/board-service/build.gradle @@ -54,9 +54,8 @@ dependencies { implementation 'org.springframework.cloud:spring-cloud-stream' implementation 'org.springframework.cloud:spring-cloud-stream-binder-rabbit' - // swagger - implementation group: 'io.springfox', name: 'springfox-swagger2', version: '2.9.2' - implementation group: 'io.springfox', name: 'springfox-swagger-ui', version: '2.9.2' + // openapi docs + implementation 'org.springdoc:springdoc-openapi-webmvc-core:1.5.8' annotationProcessor "org.springframework.boot:spring-boot-configuration-processor" // lombok diff --git a/backend/config/src/main/resources/application.yml b/backend/config/src/main/resources/application.yml index cb85bcf..f96b0b6 100644 --- a/backend/config/src/main/resources/application.yml +++ b/backend/config/src/main/resources/application.yml @@ -11,7 +11,7 @@ spring: server: native: search-locations: ${search.location:file:///${user.home}/workspace.edu/egovframe-msa-edu/config} # Windows - # search-locations: file://${user.home}/workspace.edu/egovframe-msa-edu/config # MacOS +# search-locations: file://${user.home}/workspace.edu/egovframe-msa-edu/config # MacOS rabbitmq: host: localhost port: 5672 diff --git a/backend/discovery/src/main/java/org/egovframe/cloud/discovery/SecurityConfig.java b/backend/discovery/src/main/java/org/egovframe/cloud/discovery/SecurityConfig.java index b632d87..1498f7b 100644 --- a/backend/discovery/src/main/java/org/egovframe/cloud/discovery/SecurityConfig.java +++ b/backend/discovery/src/main/java/org/egovframe/cloud/discovery/SecurityConfig.java @@ -38,6 +38,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { .headers().frameOptions().disable() .and() .authorizeRequests() + .antMatchers("/actuator/?*").permitAll() .anyRequest().authenticated() .and() .httpBasic(); diff --git a/backend/portal-service/build.gradle b/backend/portal-service/build.gradle index ef9959f..508abf9 100644 --- a/backend/portal-service/build.gradle +++ b/backend/portal-service/build.gradle @@ -56,9 +56,8 @@ dependencies { // querydsl implementation 'com.querydsl:querydsl-jpa' - // swagger - implementation group: 'io.springfox', name: 'springfox-swagger2', version: '2.9.2' - implementation group: 'io.springfox', name: 'springfox-swagger-ui', version: '2.9.2' + // openapi docs + implementation 'org.springdoc:springdoc-openapi-webmvc-core:1.5.8' annotationProcessor "org.springframework.boot:spring-boot-configuration-processor" // lombok @@ -97,4 +96,4 @@ configurations { compileQuerydsl { options.annotationProcessorPath = configurations.querydsl } -// querydsl 추가 끝 \ No newline at end of file +// querydsl 추가 끝 diff --git a/backend/portal-service/src/test/java/org/egovframe/cloud/portalservice/api/menu/MenuApiControllerTest.java b/backend/portal-service/src/test/java/org/egovframe/cloud/portalservice/api/menu/MenuApiControllerTest.java index 9121e00..9896ff5 100644 --- a/backend/portal-service/src/test/java/org/egovframe/cloud/portalservice/api/menu/MenuApiControllerTest.java +++ b/backend/portal-service/src/test/java/org/egovframe/cloud/portalservice/api/menu/MenuApiControllerTest.java @@ -37,6 +37,7 @@ import org.springframework.test.context.TestPropertySource; @ActiveProfiles(profiles = "test") class MenuApiControllerTest { + @Autowired private TestRestTemplate restTemplate; @@ -50,9 +51,9 @@ class MenuApiControllerTest { @BeforeEach public void setup() throws Exception { siteRepository.save(Site.builder() - .name("site") - .isUse(true) - .build() + .name("site") + .isUse(true) + .build() ); } @@ -67,18 +68,18 @@ class MenuApiControllerTest { Site site = siteRepository.findAll().get(0); Menu parentMenu = menuRepository.save(Menu.builder() - .menuKorName("parent") - .sortSeq(1) - .site(site) - .build()); + .menuKorName("parent") + .sortSeq(1) + .site(site) + .build()); for (int i = 0; i < 3; i++) { Menu childMenu = Menu.builder() - .menuKorName("child_" + i) - .site(site) - .parent(parentMenu) - .sortSeq(i + 1) - .build(); + .menuKorName("child_" + i) + .site(site) + .parent(parentMenu) + .sortSeq(i + 1) + .build(); childMenu.setParentMenu(parentMenu); menuRepository.save(childMenu); } @@ -101,14 +102,14 @@ class MenuApiControllerTest { public void 메뉴관리_사이트콤보_목록_조회한다() throws Exception { //given siteRepository.save(Site.builder() - .name("portal") - .isUse(true) - .build() + .name("portal") + .isUse(true) + .build() ); siteRepository.save(Site.builder() - .name("admin") - .isUse(true) - .build() + .name("admin") + .isUse(true) + .build() ); //when @@ -126,50 +127,50 @@ class MenuApiControllerTest { Site site = siteRepository.findAll().get(0); Menu parentMenu1 = menuRepository.save(Menu.builder() - .menuKorName("parent_1") - .sortSeq(1) - .site(site) - .build()); + .menuKorName("parent_1") + .sortSeq(1) + .site(site) + .build()); Menu parentMenu2 = menuRepository.save(Menu.builder() - .menuKorName("parent_2") - .sortSeq(2) - .site(site) - .build()); + .menuKorName("parent_2") + .sortSeq(2) + .site(site) + .build()); for (int i = 0; i < 3; i++) { Menu childMenu1 = Menu.builder() - .menuKorName("child_1_" + i) - .site(site) - .parent(parentMenu1) - .sortSeq(i + 1) - .build(); + .menuKorName("child_1_" + i) + .site(site) + .parent(parentMenu1) + .sortSeq(i + 1) + .build(); childMenu1.setParentMenu(parentMenu1); menuRepository.save(childMenu1); if (i == 1) { Menu childChildMenu = Menu.builder() - .menuKorName("child_child_1") - .site(site) - .parent(childMenu1) - .sortSeq(1) - .build(); + .menuKorName("child_child_1") + .site(site) + .parent(childMenu1) + .sortSeq(1) + .build(); childChildMenu.setParentMenu(childMenu1); menuRepository.save(childChildMenu); Menu childChildMenu2 = Menu.builder() - .menuKorName("child_child_1") - .site(site) - .parent(childMenu1) - .sortSeq(2) - .build(); + .menuKorName("child_child_1") + .site(site) + .parent(childMenu1) + .sortSeq(2) + .build(); childChildMenu2.setParentMenu(childMenu1); menuRepository.save(childChildMenu2); } Menu childMenu2 = Menu.builder() - .menuKorName("child_2_" + i) - .site(site) - .parent(parentMenu2) - .sortSeq(i + 1) - .build(); + .menuKorName("child_2_" + i) + .site(site) + .parent(parentMenu2) + .sortSeq(i + 1) + .build(); childMenu1.setParentMenu(parentMenu2); menuRepository.save(childMenu2); } @@ -196,11 +197,11 @@ class MenuApiControllerTest { Site site = siteRepository.findAll().get(0); Menu parentMenu = menuRepository.save(Menu.builder() - .menuKorName("parent") - .menuKorName("parenteng") - .sortSeq(1) - .site(site) - .build()); + .menuKorName("parent") + .menuKorName("parenteng") + .sortSeq(1) + .site(site) + .build()); //when String url = "/api/v1/menus/"+parentMenu.getId(); @@ -219,11 +220,11 @@ class MenuApiControllerTest { Site site = siteRepository.findAll().get(0); MenuTreeRequestDto menuTreeRequestDto = MenuTreeRequestDto.builder() - .parentId(null) - .siteId(site.getId()) - .name("parent") - .sortSeq(1) - .build(); + .parentId(null) + .siteId(site.getId()) + .name("parent") + .sortSeq(1) + .build(); String url = "/api/v1/menus"; @@ -243,24 +244,24 @@ class MenuApiControllerTest { Site site = siteRepository.findAll().get(0); Menu parentMenu1 = menuRepository.save(Menu.builder() - .menuKorName("parent_1") - .sortSeq(1) - .site(site) - .build()); + .menuKorName("parent_1") + .sortSeq(1) + .site(site) + .build()); Menu parentMenu2 = menuRepository.save(Menu.builder() - .menuKorName("parent_2") - .sortSeq(2) - .site(site) - .build()); + .menuKorName("parent_2") + .sortSeq(2) + .site(site) + .build()); Long menuId = 0L; for (int i = 0; i < 3; i++) { Menu childMenu1 = Menu.builder() - .menuKorName("child_1_" + i) - .site(site) - .parent(parentMenu1) - .sortSeq(i + 1) - .build(); + .menuKorName("child_1_" + i) + .site(site) + .parent(parentMenu1) + .sortSeq(i + 1) + .build(); childMenu1.setParentMenu(parentMenu1); Menu save = menuRepository.save(childMenu1); menuId = save.getId(); @@ -269,13 +270,13 @@ class MenuApiControllerTest { List updateList = new ArrayList<>(); updateList.add(MenuDnDRequestDto.builder() - .menuId(menuId) - .sortSeq(1) - .parentId(parentMenu2.getId()) - .build()); + .menuId(menuId) + .sortSeq(1) + .parentId(parentMenu2.getId()) + .build()); HttpEntity> httpEntity = new HttpEntity<>( - updateList + updateList ); @@ -283,7 +284,7 @@ class MenuApiControllerTest { //when ResponseEntity responseEntity = - restTemplate.exchange(url, HttpMethod.PUT, httpEntity, Long.class); + restTemplate.exchange(url, HttpMethod.PUT, httpEntity, Long.class); //then assertThat(responseEntity.getStatusCode()).isEqualTo(HttpStatus.OK); @@ -295,19 +296,19 @@ class MenuApiControllerTest { Site site = siteRepository.findAll().get(0); Menu parentMenu1 = menuRepository.save(Menu.builder() - .menuKorName("parent_1") - .sortSeq(1) - .site(site) - .build()); + .menuKorName("parent_1") + .sortSeq(1) + .site(site) + .build()); Long menuId = 0L; for (int i = 0; i < 3; i++) { Menu childMenu1 = Menu.builder() - .menuKorName("child_1_" + i) - .site(site) - .parent(parentMenu1) - .sortSeq(i + 1) - .build(); + .menuKorName("child_1_" + i) + .site(site) + .parent(parentMenu1) + .sortSeq(i + 1) + .build(); childMenu1.setParentMenu(parentMenu1); Menu save = menuRepository.save(childMenu1); menuId = save.getId(); @@ -317,7 +318,7 @@ class MenuApiControllerTest { //when ResponseEntity responseEntity = - restTemplate.exchange(url, HttpMethod.PUT, null, MenuTreeResponseDto.class); + restTemplate.exchange(url, HttpMethod.PUT, null, MenuTreeResponseDto.class); assertThat(responseEntity.getStatusCode()).isEqualTo(HttpStatus.OK); assertThat(responseEntity.getBody().getName()).isEqualTo("updateName"); @@ -330,31 +331,31 @@ class MenuApiControllerTest { Site site = siteRepository.findAll().get(0); Menu parentMenu1 = menuRepository.save(Menu.builder() - .menuKorName("parent_1") - .sortSeq(1) - .site(site) - .build()); + .menuKorName("parent_1") + .sortSeq(1) + .site(site) + .build()); String url = "/api/v1/menus/"+parentMenu1.getId(); HttpEntity httpEntity = new HttpEntity<>( - MenuUpdateRequestDto.builder() - .description("상위메뉴") - .connectId(1) - .menuType("menuType") - .urlPath("/index") - .subName("subname") - .isUse(true) - .isShow(true) - .isBlank(false) - .icon("icon") + MenuUpdateRequestDto.builder() + .description("상위메뉴") + .connectId(1) + .menuType("menuType") + .urlPath("/index") + .subName("subname") + .isUse(true) + .isShow(true) + .isBlank(false) + .icon("icon") .build() ); //when ResponseEntity responseEntity = - restTemplate.exchange(url, HttpMethod.PUT, httpEntity, MenuResponseDto.class); + restTemplate.exchange(url, HttpMethod.PUT, httpEntity, MenuResponseDto.class); //then assertThat(responseEntity.getStatusCode()).isEqualTo(HttpStatus.OK); @@ -369,19 +370,19 @@ class MenuApiControllerTest { Site site = siteRepository.findAll().get(0); Menu parentMenu1 = menuRepository.save(Menu.builder() - .menuKorName("parent_1") - .sortSeq(1) - .site(site) - .build()); + .menuKorName("parent_1") + .sortSeq(1) + .site(site) + .build()); Long menuId = 0L; for (int i = 0; i < 3; i++) { Menu childMenu1 = Menu.builder() - .menuKorName("child_1_" + i) - .site(site) - .parent(parentMenu1) - .sortSeq(i + 1) - .build(); + .menuKorName("child_1_" + i) + .site(site) + .parent(parentMenu1) + .sortSeq(i + 1) + .build(); childMenu1.setParentMenu(parentMenu1); Menu save = menuRepository.save(childMenu1); menuId = save.getId(); @@ -403,19 +404,19 @@ class MenuApiControllerTest { Site site = siteRepository.findAll().get(0); Menu parentMenu1 = menuRepository.save(Menu.builder() - .menuKorName("parent_1") - .sortSeq(1) - .site(site) - .build()); + .menuKorName("parent_1") + .sortSeq(1) + .site(site) + .build()); Long menuId = 0L; for (int i = 0; i < 3; i++) { Menu childMenu1 = Menu.builder() - .menuKorName("child_1_" + i) - .site(site) - .parent(parentMenu1) - .sortSeq(i + 1) - .build(); + .menuKorName("child_1_" + i) + .site(site) + .parent(parentMenu1) + .sortSeq(i + 1) + .build(); childMenu1.setParentMenu(parentMenu1); Menu save = menuRepository.save(childMenu1); menuId = save.getId(); diff --git a/backend/portal-service/src/test/java/org/egovframe/cloud/portalservice/api/menu/MenuRoleApiControllerTest.java b/backend/portal-service/src/test/java/org/egovframe/cloud/portalservice/api/menu/MenuRoleApiControllerTest.java index 4480b0b..2d10b5b 100644 --- a/backend/portal-service/src/test/java/org/egovframe/cloud/portalservice/api/menu/MenuRoleApiControllerTest.java +++ b/backend/portal-service/src/test/java/org/egovframe/cloud/portalservice/api/menu/MenuRoleApiControllerTest.java @@ -30,6 +30,7 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.TestPropertySource; +import org.springframework.transaction.annotation.Transactional; @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) @EnableConfigurationProperties @@ -37,6 +38,7 @@ import org.springframework.test.context.TestPropertySource; @ActiveProfiles(profiles = "test") class MenuRoleApiControllerTest { + @Autowired private TestRestTemplate restTemplate; @@ -52,24 +54,24 @@ class MenuRoleApiControllerTest { @BeforeEach public void setup() throws Exception { Site site = Site.builder() - .name("site") - .isUse(true) - .build(); + .name("site") + .isUse(true) + .build(); siteRepository.save(site); Menu parentMenu = menuRepository.save(Menu.builder() - .menuKorName("parent") - .sortSeq(1) - .site(site) - .build()); + .menuKorName("parent") + .sortSeq(1) + .site(site) + .build()); for (int i = 0; i < 3; i++) { Menu childMenu = Menu.builder() - .menuKorName("child_" + i) - .site(site) - .parent(parentMenu) - .sortSeq(i + 1) - .build(); + .menuKorName("child_" + i) + .site(site) + .parent(parentMenu) + .sortSeq(i + 1) + .build(); childMenu.setParentMenu(parentMenu); menuRepository.save(childMenu); } @@ -87,7 +89,7 @@ class MenuRoleApiControllerTest { Site site = siteRepository.findAll().get(0); //when ResponseEntity> responseEntity = - restTemplate.exchange("/api/v1/menu-roles/role/"+site.getId(), HttpMethod.GET, null, new ParameterizedTypeReference>(){}); + restTemplate.exchange("/api/v1/menu-roles/role/"+site.getId(), HttpMethod.GET, null, new ParameterizedTypeReference>(){}); //then assertThat(responseEntity.getStatusCode()).isEqualTo(HttpStatus.OK); @@ -118,7 +120,7 @@ class MenuRoleApiControllerTest { Site site = siteRepository.findAll().get(0); //when ResponseEntity> responseEntity = - restTemplate.exchange("/api/v1/menu-roles/role/"+site.getId(), HttpMethod.GET, null, new ParameterizedTypeReference>(){}); + restTemplate.exchange("/api/v1/menu-roles/role/"+site.getId(), HttpMethod.GET, null, new ParameterizedTypeReference>(){}); //then @@ -152,39 +154,39 @@ class MenuRoleApiControllerTest { list.get(0).getChildren().stream().forEach(menuRoleResponseDto -> { if (menuRoleResponseDto.getKorName().equals("child_1")) { children.add(MenuRoleRequestDto.builder() - .menuRoleId(menuRoleResponseDto.getMenuRoleId()) - .isChecked(true) - .roleId("ROLE") - .id(menuRoleResponseDto.getId()) - .build()); + .menuRoleId(menuRoleResponseDto.getMenuRoleId()) + .isChecked(true) + .roleId("ROLE") + .id(menuRoleResponseDto.getId()) + .build()); }else { children.add(MenuRoleRequestDto.builder() - .menuRoleId(menuRoleResponseDto.getMenuRoleId()) - .isChecked(false) - .roleId("ROLE") - .id(menuRoleResponseDto.getId()) - .build()); + .menuRoleId(menuRoleResponseDto.getMenuRoleId()) + .isChecked(false) + .roleId("ROLE") + .id(menuRoleResponseDto.getId()) + .build()); } }); requestDtoList.add(MenuRoleRequestDto.builder() - .menuRoleId(list.get(0).getMenuRoleId()) - .isChecked(true) - .roleId("ROLE") - .id(list.get(0).getId()) - .children(children) - .build()); + .menuRoleId(list.get(0).getMenuRoleId()) + .isChecked(true) + .roleId("ROLE") + .id(list.get(0).getId()) + .children(children) + .build()); HttpEntity> httpEntity = new HttpEntity<>( - requestDtoList + requestDtoList ); //when ResponseEntity responseEntity = - restTemplate.exchange("/api/v1/menu-roles", HttpMethod.POST, httpEntity, String.class); + restTemplate.exchange("/api/v1/menu-roles", HttpMethod.POST, httpEntity, String.class); //then assertThat(responseEntity.getStatusCode()).isEqualTo(HttpStatus.OK); @@ -201,38 +203,38 @@ class MenuRoleApiControllerTest { //given Site site = siteRepository.findAll().get(0); Menu parentMenu = menuRepository.save(Menu.builder() - .menuKorName("parent-any") - .sortSeq(1) - .site(site) - .isUse(true) - .build()); + .menuKorName("parent-any") + .sortSeq(1) + .site(site) + .isUse(true) + .build()); MenuRole parentMenuRole = MenuRole.builder() - .roleId(Role.ANONYMOUS.getKey()) - .menu(parentMenu) - .build(); + .roleId(Role.ANONYMOUS.getKey()) + .menu(parentMenu) + .build(); parentMenuRole.setMenu(parentMenu); menuRoleRepository.save(parentMenuRole); for (int i = 0; i < 3; i++) { Menu childMenu = Menu.builder() - .menuKorName("child-any_" + i) - .site(site) - .parent(parentMenu) - .sortSeq(i + 1) - .isUse(true) - .build(); + .menuKorName("child-any_" + i) + .site(site) + .parent(parentMenu) + .sortSeq(i + 1) + .isUse(true) + .build(); childMenu.setParentMenu(parentMenu); menuRepository.save(childMenu); MenuRole role_any = MenuRole.builder() - .roleId(Role.ANONYMOUS.getKey()) - .menu(childMenu) - .build(); + .roleId(Role.ANONYMOUS.getKey()) + .menu(childMenu) + .build(); role_any.setMenu(childMenu); menuRoleRepository.save(role_any); } //when ResponseEntity> responseEntity = - restTemplate.exchange("/api/v1/menu-roles/"+site.getId(), HttpMethod.GET, null, new ParameterizedTypeReference>(){}); + restTemplate.exchange("/api/v1/menu-roles/"+site.getId(), HttpMethod.GET, null, new ParameterizedTypeReference>(){}); //then diff --git a/backend/portal-service/src/test/java/org/egovframe/cloud/portalservice/api/policy/PolicyApiControllerTest.java b/backend/portal-service/src/test/java/org/egovframe/cloud/portalservice/api/policy/PolicyApiControllerTest.java index 5598313..53cdc9f 100644 --- a/backend/portal-service/src/test/java/org/egovframe/cloud/portalservice/api/policy/PolicyApiControllerTest.java +++ b/backend/portal-service/src/test/java/org/egovframe/cloud/portalservice/api/policy/PolicyApiControllerTest.java @@ -59,12 +59,12 @@ class PolicyApiControllerTest { } policyRepository.save(Policy.builder() - .type(type) - .title(title) - .isUse(true) - .regDate(ZonedDateTime.now()) - .contents(contents) - .build()); + .type(type) + .title(title) + .isUse(true) + .regDate(ZonedDateTime.now()) + .contents(contents) + .build()); } } @@ -81,12 +81,12 @@ class PolicyApiControllerTest { String contents = "test contents"; PolicySaveRequestDto requestDto = PolicySaveRequestDto.builder() - .type(type) - .title(title) - .isUse(true) - .regDate(ZonedDateTime.now()) - .contents(contents) - .build(); + .type(type) + .title(title) + .isUse(true) + .regDate(ZonedDateTime.now()) + .contents(contents) + .build(); //when @@ -106,7 +106,7 @@ class PolicyApiControllerTest { String url = API_URL+"?size=3%page=0"; //when ResponseEntity> responseEntity = - restTemplate.exchange(url, HttpMethod.GET, null, new ParameterizedTypeReference>() {}); + restTemplate.exchange(url, HttpMethod.GET, null, new ParameterizedTypeReference>() {}); //then assertThat(responseEntity.getStatusCode()).isEqualTo(HttpStatus.OK); @@ -147,17 +147,17 @@ class PolicyApiControllerTest { public void 이용약관_수정_된다() throws Exception { //given Long id = policyRepository.save(Policy.builder() - .type("TOS") - .title("title") - .contents("contents!!!!") - .build() + .type("TOS") + .title("title") + .contents("contents!!!!") + .build() ).getId(); String url = API_URL +"/"+id; PolicyUpdateRequestDto requestDto = PolicyUpdateRequestDto.builder() - .title("update title") - .contents("update Details") - .build(); + .title("update title") + .contents("update Details") + .build(); //when HttpEntity requestEntity = new HttpEntity<>(requestDto); @@ -177,10 +177,10 @@ class PolicyApiControllerTest { public void 이용약관_삭제_한다() { //given Long id = policyRepository.save(Policy.builder() - .type("TOS") - .title("title") - .contents("contents!!!!") - .build() + .type("TOS") + .title("title") + .contents("contents!!!!") + .build() ).getId(); String url = API_URL +"/"+id; @@ -196,11 +196,11 @@ class PolicyApiControllerTest { public void 사용여부_수정_한다() throws Exception { //given Long id = policyRepository.save(Policy.builder() - .type("TOS") - .title("title") - .isUse(true) - .contents("contents!!!") - .build() + .type("TOS") + .title("title") + .isUse(true) + .contents("contents!!!") + .build() ).getId(); String url = API_URL +"/"+id+"/"+false; diff --git a/backend/portal-service/src/test/java/org/egovframe/cloud/portalservice/api/statistics/StatisticsApiControllerTest.java b/backend/portal-service/src/test/java/org/egovframe/cloud/portalservice/api/statistics/StatisticsApiControllerTest.java index 3bfb56b..c0fb4e7 100644 --- a/backend/portal-service/src/test/java/org/egovframe/cloud/portalservice/api/statistics/StatisticsApiControllerTest.java +++ b/backend/portal-service/src/test/java/org/egovframe/cloud/portalservice/api/statistics/StatisticsApiControllerTest.java @@ -5,12 +5,15 @@ import static org.assertj.core.api.Assertions.assertThat; import java.time.LocalDate; import java.util.List; +import javax.servlet.http.HttpServletRequest; + import org.egovframe.cloud.portalservice.api.statistics.dto.StatisticsResponseDto; import org.egovframe.cloud.portalservice.domain.statistics.Statistics; import org.egovframe.cloud.portalservice.domain.statistics.StatisticsRepository; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.mockito.Mock; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.test.context.SpringBootTest; @@ -38,9 +41,9 @@ class StatisticsApiControllerTest { public void setup() { for (int i = 0; i < 10; i++) { statisticsRepository.save(Statistics.builder() - .siteId(1L) - .remoteIp("testip") - .build()); + .siteId(1L) + .remoteIp("testip") + .build()); } } @@ -55,10 +58,10 @@ class StatisticsApiControllerTest { Long siteId = 1L; // when ResponseEntity< List> responseEntity = - restTemplate.exchange("/api/v1/statistics/monthly/"+siteId, - HttpMethod.GET, - null, - new ParameterizedTypeReference>(){}); + restTemplate.exchange("/api/v1/statistics/monthly/"+siteId, + HttpMethod.GET, + null, + new ParameterizedTypeReference>(){}); responseEntity.getBody().forEach(System.out::println); assertThat(responseEntity.getStatusCode()).isEqualTo(HttpStatus.OK); @@ -74,10 +77,10 @@ class StatisticsApiControllerTest { // when ResponseEntity< List> responseEntity = - restTemplate.exchange("/api/v1/statistics/daily/"+siteId+"?year="+now.getYear()+"&month="+now.getMonthValue(), - HttpMethod.GET, - null, - new ParameterizedTypeReference>(){}); + restTemplate.exchange("/api/v1/statistics/daily/"+siteId+"?year="+now.getYear()+"&month="+now.getMonthValue(), + HttpMethod.GET, + null, + new ParameterizedTypeReference>(){}); responseEntity.getBody().forEach(System.out::println); assertThat(responseEntity.getStatusCode()).isEqualTo(HttpStatus.OK); @@ -85,5 +88,4 @@ class StatisticsApiControllerTest { assertThat(responseEntity.getBody().get(0).getY()).isEqualTo(10); } - } \ No newline at end of file diff --git a/backend/reserve-check-service/build.gradle b/backend/reserve-check-service/build.gradle index 1b3cd4c..7078489 100644 --- a/backend/reserve-check-service/build.gradle +++ b/backend/reserve-check-service/build.gradle @@ -48,19 +48,18 @@ dependencies { //messaging implementation 'org.springframework.cloud:spring-cloud-stream' implementation 'org.springframework.cloud:spring-cloud-stream-binder-rabbit' -// implementation 'net.java.dev.jna:jna:5.9.0' // byte-buddy (No compatible attachment provider is available.) implementation 'io.jsonwebtoken:jjwt:0.9.1' implementation 'dev.miku:r2dbc-mysql:0.8.2.RELEASE' implementation 'mysql:mysql-connector-java' - // swagger api docs - implementation 'org.springdoc:springdoc-openapi-webflux-ui:1.5.10' + // openapi docs + implementation 'org.springdoc:springdoc-openapi-webflux-ui:1.5.8' // bolcking 호출 감지 -// implementation 'io.projectreactor:reactor-tools:3.4.9' -// implementation 'io.projectreactor.tools:blockhound:1.0.6.RELEASE' + implementation 'io.projectreactor:reactor-tools:3.4.9' + implementation 'io.projectreactor.tools:blockhound:1.0.6.RELEASE' //lombok implementation 'org.projectlombok:lombok' diff --git a/backend/reserve-item-service/build.gradle b/backend/reserve-item-service/build.gradle index 2d4ca40..08873d7 100644 --- a/backend/reserve-item-service/build.gradle +++ b/backend/reserve-item-service/build.gradle @@ -41,26 +41,25 @@ dependencies { implementation 'org.springframework.cloud:spring-cloud-starter-circuitbreaker-reactor-resilience4j' implementation 'com.playtika.reactivefeign:feign-reactor-spring-cloud-starter:3.1.0' + implementation 'io.jsonwebtoken:jjwt:0.9.1' + implementation 'org.springframework.cloud:spring-cloud-starter-sleuth' implementation 'org.springframework.cloud:spring-cloud-sleuth-zipkin' implementation 'net.logstash.logback:logstash-logback-encoder:6.6' // logstash logback - implementation 'io.jsonwebtoken:jjwt:0.9.1' - implementation 'dev.miku:r2dbc-mysql:0.8.2.RELEASE' implementation 'mysql:mysql-connector-java' - // swagger api docs - implementation 'org.springdoc:springdoc-openapi-webflux-ui:1.5.10' + // openapi docs + implementation 'org.springdoc:springdoc-openapi-webflux-ui:1.5.8' // bolcking 호출 감지 -// implementation 'io.projectreactor:reactor-tools:3.4.9' -// implementation 'io.projectreactor.tools:blockhound:1.0.6.RELEASE' + implementation 'io.projectreactor:reactor-tools:3.4.9' + implementation 'io.projectreactor.tools:blockhound:1.0.6.RELEASE' //messaging implementation 'org.springframework.cloud:spring-cloud-stream' implementation 'org.springframework.cloud:spring-cloud-stream-binder-rabbit' -// implementation 'net.java.dev.jna:jna:5.9.0' // byte-buddy (No compatible attachment provider is available.) //lombok implementation 'org.projectlombok:lombok' diff --git a/backend/reserve-request-service/build.gradle b/backend/reserve-request-service/build.gradle index f77cc4d..0330031 100644 --- a/backend/reserve-request-service/build.gradle +++ b/backend/reserve-request-service/build.gradle @@ -50,7 +50,6 @@ dependencies { implementation 'org.springframework.cloud:spring-cloud-stream' implementation 'org.springframework.cloud:spring-cloud-stream-binder-rabbit' implementation 'org.springframework.boot:spring-boot-starter-amqp' -// implementation 'net.java.dev.jna:jna:5.9.0' // byte-buddy (No compatible attachment provider is available.) implementation 'io.jsonwebtoken:jjwt:0.9.1' @@ -58,12 +57,12 @@ dependencies { implementation 'dev.miku:r2dbc-mysql:0.8.2.RELEASE' implementation 'mysql:mysql-connector-java' - // swagger api docs - implementation 'org.springdoc:springdoc-openapi-webflux-ui:1.5.10' + // openapi docs + implementation 'org.springdoc:springdoc-openapi-webflux-ui:1.5.8' // bolcking 호출 감지 -// implementation 'io.projectreactor:reactor-tools:3.4.9' -// implementation 'io.projectreactor.tools:blockhound:1.0.6.RELEASE' + implementation 'io.projectreactor:reactor-tools:3.4.9' + implementation 'io.projectreactor.tools:blockhound:1.0.6.RELEASE' //lombok implementation 'org.projectlombok:lombok' diff --git a/backend/user-service/build.gradle b/backend/user-service/build.gradle index 1cf52b9..936e666 100644 --- a/backend/user-service/build.gradle +++ b/backend/user-service/build.gradle @@ -56,9 +56,8 @@ dependencies { implementation 'com.google.api-client:google-api-client:1.32.1' - // swagger - implementation group: 'io.springfox', name: 'springfox-swagger2', version: '2.9.2' - implementation group: 'io.springfox', name: 'springfox-swagger-ui', version: '2.9.2' + // openapi docs + implementation 'org.springdoc:springdoc-openapi-webmvc-core:1.5.8' annotationProcessor "org.springframework.boot:spring-boot-configuration-processor" // lombok diff --git a/docker-compose/mysql/docker-compose.yml b/docker-compose/mysql/docker-compose.yml index 6c27b3e..bf06240 100644 --- a/docker-compose/mysql/docker-compose.yml +++ b/docker-compose/mysql/docker-compose.yml @@ -14,6 +14,7 @@ services: - --collation-server=utf8mb4_unicode_ci volumes: - "./init/:/docker-entrypoint-initdb.d/" + platform: linux/x86_64 #m1에서 플랫폼을 명시해주지 않으면 에러남 ports: - "3306:3306" container_name: mysql @@ -21,4 +22,4 @@ services: networks: default: external: - name: egov-network \ No newline at end of file + name: egov-network