Skip to content

Commit

Permalink
Feat: Swagger 설정 추가 (#9)
Browse files Browse the repository at this point in the history
* Chore: swagger openapi 추가

* Feat: swagger 설정 추가

* Fix: 기본 스프링 프로필을 local로 설정
  • Loading branch information
Jaewon-pro committed Jul 21, 2024
1 parent 4840943 commit 5562fb6
Show file tree
Hide file tree
Showing 3 changed files with 104 additions and 2 deletions.
18 changes: 16 additions & 2 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,19 @@ repositories {

dependencies {
implementation("org.springframework.boot:spring-boot-starter")
implementation("org.springframework.boot:spring-boot-starter-validation")
implementation("me.paulschwarz:spring-dotenv:4.0.0")

// Web
implementation("org.springframework.boot:spring-boot-starter-web")
implementation("org.springdoc:springdoc-openapi-starter-webmvc-ui:2.4.0")

// Database
implementation("org.springframework.boot:spring-boot-starter-data-jpa")
implementation("org.springframework.boot:spring-boot-starter-validation")
implementation("org.postgresql:postgresql:42.7.3")
implementation("me.paulschwarz:spring-dotenv:4.0.0")

// Lombok
implementation("org.projectlombok:lombok:1.18.34")
annotationProcessor("org.projectlombok:lombok:1.18.34")
testCompileOnly("org.projectlombok:lombok:1.18.34")
testAnnotationProcessor("org.projectlombok:lombok:1.18.34")
Expand All @@ -49,6 +55,14 @@ tasks.bootBuildImage {
createdDate = "now"
}

springBoot {
buildInfo {
properties {
setVersion(System.getProperty("WAS_TAG") ?: "Unknown")
}
}
}

spotless {
encoding = Charsets.UTF_8

Expand Down
87 changes: 87 additions & 0 deletions src/main/java/com/dnd/runus/global/config/SwaggerConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
package com.dnd.runus.global.config;

import com.fasterxml.jackson.databind.ObjectMapper;
import io.swagger.v3.core.jackson.ModelResolver;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.Operation;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.media.Schema;
import io.swagger.v3.oas.models.media.StringSchema;
import io.swagger.v3.oas.models.parameters.Parameter;
import io.swagger.v3.oas.models.parameters.QueryParameter;
import io.swagger.v3.oas.models.security.SecurityRequirement;
import lombok.RequiredArgsConstructor;
import org.apache.commons.lang3.ObjectUtils;
import org.springdoc.core.customizers.OpenApiCustomizer;
import org.springframework.boot.info.BuildProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;

import java.time.Instant;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.function.BiConsumer;

@RequiredArgsConstructor
@Configuration
public class SwaggerConfig {
private final BuildProperties buildProperties;
private final Environment environment;

@Bean
OpenAPI openAPI() {
return new OpenAPI().info(info()).addSecurityItem(new SecurityRequirement().addList("JWT"));
}

@Bean
ModelResolver modelResolver(ObjectMapper objectMapper) { // Load formats from ObjectMapper
return new ModelResolver(objectMapper);
}

@Bean
OpenApiCustomizer projectPageableCustomizer() {
return openApi -> customizeOperations(openApi, "pageable", (operation, parameter) -> {
operation.getParameters().remove(parameter);
pageableParameter().forEach(operation::addParametersItem);
});
}

private Info info() {
String activeProfile = ObjectUtils.isEmpty(environment.getActiveProfiles())
? environment.getDefaultProfiles()[0]
: environment.getActiveProfiles()[0];

return new Info()
.title("RunUs API (" + activeProfile + ")")
.description("API 명세 문서" + "<br> 빌드 일자: " + formatTime(buildProperties.getTime()) + "<br> 실행 일자: "
+ formatTime((Instant.now())))
.version(buildProperties.getVersion());
}

private void customizeOperations(OpenAPI openApi, String paramName, BiConsumer<Operation, Parameter> customizer) {
openApi.getPaths().values().stream()
.flatMap(pathItem -> pathItem.readOperations().stream())
.filter(operation -> !ObjectUtils.isEmpty(operation.getParameters()))
.forEach(operation -> operation.getParameters().stream()
.filter(parameter -> paramName.equals(parameter.getName()))
.findFirst()
.ifPresent(parameter -> customizer.accept(operation, parameter)));
}

private List<Parameter> pageableParameter() {
Schema<?> pageSchema = new StringSchema().example("0").description("페이지 번호 (0부터 시작)");
Schema<?> sizeSchema = new StringSchema().example("20").description("한 페이지에 보여줄 항목 수");
Schema<?> sortSchema = new StringSchema().example("id,asc").description("정렬 조건 (ex. id,asc or id,desc)");

return List.of(
new QueryParameter().name("page").schema(pageSchema),
new QueryParameter().name("size").schema(sizeSchema),
new QueryParameter().name("sort").schema(sortSchema));
}

private String formatTime(Instant instant) {
return instant.atZone(ZoneId.of("Asia/Seoul")).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
}
}
1 change: 1 addition & 0 deletions src/main/resources/application.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
spring.application.name: run-us
spring.profiles.active: local

spring:
jpa:
Expand Down

0 comments on commit 5562fb6

Please sign in to comment.