본문 바로가기

기록하기

나를 위한 swagger 사용법2

  • 의존성 추가
// swagger
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.2'

 

  • build.gradle
plugins {
    id 'java'
    id 'org.springframework.boot' version '3.1.5'
    id 'io.spring.dependency-management' version '1.1.3'
}

group = 'com.level4'
version = '0.0.1-SNAPSHOT'

java {
    sourceCompatibility = '17'
}

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
}

dependencies {
    // MySQL
    runtimeOnly 'com.mysql:mysql-connector-j'

    // swagger
    implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.2'

    // JWT
    compileOnly group: 'io.jsonwebtoken', name: 'jjwt-api', version: '0.11.5'
    runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-impl', version: '0.11.5'
    runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-jackson', version: '0.11.5'

    // JPA
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'

    // Security
    implementation 'org.springframework.boot:spring-boot-starter-security'

    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'

    // Validation
    implementation 'org.springframework.boot:spring-boot-starter-validation'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testImplementation 'org.springframework.security:spring-security-test'
}

tasks.named('test') {
    useJUnitPlatform()
}

 

@Configuration
public class SwaggerConfig {

    private static final String SECURITY_SCHEME_NAME = "JWTAuth";

    @Bean
    @Profile("!Prod") // 운영 환경에서 Swagger 비활성화
    public OpenAPI customOpenAPI() {
        return new OpenAPI()
                .components(new Components().addSecuritySchemes(SECURITY_SCHEME_NAME,
                        new SecurityScheme()
                                .name(SECURITY_SCHEME_NAME)
                                .type(SecurityScheme.Type.APIKEY) // Bearer가 아닌 APIKEY를 사용
                                .in(SecurityScheme.In.HEADER) // 헤더에 토큰을 위치
                                .name("Authorization"))) // Authorization 헤더를 사용합니다.
                .addSecurityItem(new SecurityRequirement().addList(SECURITY_SCHEME_NAME))

                .schema("UserLoginRequestDto", new Schema<>()
                        .type("object")
                        .addProperty("email", new StringSchema().example("user@example.com"))
                        .addProperty("password", new StringSchema().example("password123!"))
                )

                // 로그인 수동경로 지정
                .path("/api/users/login", new PathItem()
                        .post(new Operation()
                                .summary("로그인")
                                .description("사용자 로그인을 위한 엔드포인트")
                                .tags(Collections.singletonList("auth"))
                                .operationId("loginUser")
                                .requestBody(new RequestBody()
                                        .content(new Content()
                                                .addMediaType(org.springframework.http.MediaType.APPLICATION_JSON_VALUE,
                                                        new MediaType().schema(new Schema<>().$ref("#/components/schemas/UserLoginRequestDto"))))
                                )
                                .responses(new ApiResponses()
                                        .addApiResponse("200", new ApiResponse().description("로그인 성공"))
                                        .addApiResponse("401", new ApiResponse().description("인증 실패"))
                                )));
    }

    // 로그인 컨트롤러
    @Bean
    public GroupedOpenApi userApi() {
        return GroupedOpenApi.builder()
                .group("custom-auth")
                .pathsToMatch("/api/users/login")
                .build();
    }

    // 회원가입 컨트롤러
    @Bean
    public GroupedOpenApi registrationApi() {
        return GroupedOpenApi.builder()
                .group("custom-regis")
                .pathsToMatch("/api/users/join") // 회원가입 API 경로 지정
                .build();
    }

    // 장바구니 관련 컨트롤러
    @Bean
    public GroupedOpenApi cartApi() {
        return GroupedOpenApi.builder()
                .group("carts")
                .pathsToMatch("/api/carts/**")
                .build();
    }

    // 상품 관련 컨트롤러
    @Bean
    public GroupedOpenApi productApi() {
        return GroupedOpenApi.builder()
                .group("products")
                .pathsToMatch("/api/product/**")
                .build();
    }

}

 

  • 로그인 컨트롤러를 따로 만들어주지 않고, swagger 환경설정에서 로그인 경로 만들기
  • 기존에 만들어둔 컨트롤러 그룹으로 묶어서 만들기
  • 기본적인 CRUD 기능에서, 조회 빼고는 토큰인증이 다 필요해서 보안에 관한 추가사항도 설정해줬다
  • bearer token을 사용하지 않았기 때문에, 다른 블로그에서 가져온 틀에서 약간 수정해줌

'기록하기' 카테고리의 다른 글

Springboot + Mysql + Docker 연동하기 1  (0) 2023.11.10
Day + 26  (0) 2023.11.10
Day + 23  (0) 2023.11.07
나를 위한 swagger 사용법  (0) 2023.11.07
Day + 22  (0) 2023.11.06