- 의존성 추가
// 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 |