Skip to content

Commit 7d9bd02

Browse files
Merge pull request #37 from gdsc-ssu/feat/#36-swagger
[COMMON] Swagger 연동
2 parents c637286 + 01810fc commit 7d9bd02

22 files changed

+125
-10
lines changed

build.gradle

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
plugins {
22
id 'java'
3-
id 'org.springframework.boot' version '3.4.2'
3+
id 'org.springframework.boot' version '3.3.6'
44
id 'io.spring.dependency-management' version '1.1.7'
55
}
66

@@ -75,6 +75,9 @@ dependencies {
7575

7676
// JSON-Simple 라이브러리 (CoolSMS 응답을 파싱하기 위해 필요)
7777
implementation 'com.googlecode.json-simple:json-simple:1.1.1'
78+
79+
// swagger
80+
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.2.0'
7881
}
7982

8083
tasks.named('test') {

src/main/java/com/weve/WeveApplication.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,19 @@
11
package com.weve;
22

3+
import io.swagger.v3.oas.annotations.OpenAPIDefinition;
4+
import io.swagger.v3.oas.annotations.servers.Server;
35
import org.springframework.boot.SpringApplication;
46
import org.springframework.boot.autoconfigure.SpringBootApplication;
57
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
68

79
@EnableJpaAuditing
810
@SpringBootApplication
11+
@OpenAPIDefinition(
12+
servers = {
13+
@Server(url = "https://gdg-weve.store", description = "Production Server"),
14+
@Server(url = "http://localhost:8080", description = "Local Development Server")
15+
}
16+
)
917
public class WeveApplication {
1018

1119
public static void main(String[] args) {
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package com.weve.common.config;
2+
3+
import io.swagger.v3.oas.models.Components;
4+
import io.swagger.v3.oas.models.OpenAPI;
5+
import io.swagger.v3.oas.models.info.Info;
6+
import io.swagger.v3.oas.models.security.SecurityRequirement;
7+
import io.swagger.v3.oas.models.security.SecurityScheme;
8+
import org.springframework.context.annotation.Bean;
9+
import org.springframework.context.annotation.Configuration;
10+
11+
@Configuration
12+
public class SwaggerConfig {
13+
14+
@Bean
15+
public OpenAPI openAPI() {
16+
// Bearer Token을 위한 SecurityScheme 정의
17+
SecurityScheme securityScheme = new SecurityScheme()
18+
.type(SecurityScheme.Type.HTTP)
19+
.scheme("bearer")
20+
.bearerFormat("JWT");
21+
22+
// SecurityRequirement 정의
23+
SecurityRequirement securityRequirement = new SecurityRequirement()
24+
.addList("bearerAuth");
25+
26+
return new OpenAPI()
27+
.info(new Info()
28+
.title("weve API")
29+
.description("weve API입니다.")
30+
.version("1.0.0"))
31+
.components(new Components().addSecuritySchemes("bearerAuth", securityScheme))
32+
.addSecurityItem(securityRequirement);
33+
}
34+
}

src/main/java/com/weve/controller/AuthController.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,15 @@
44
import com.weve.common.api.payload.code.status.ErrorStatus;
55
import com.weve.dto.request.UserRequestDto;
66
import com.weve.service.AuthService;
7+
import io.swagger.v3.oas.annotations.tags.Tag;
78
import jakarta.persistence.Basic;
89
import lombok.RequiredArgsConstructor;
910
import org.springframework.web.bind.annotation.*;
1011

1112
@RestController
1213
@RequestMapping("/api/auth")
1314
@RequiredArgsConstructor
15+
@Tag(name = "Auth", description = "Auth 관련 API입니다.")
1416
public class AuthController {
1517

1618
private final AuthService authService;

src/main/java/com/weve/controller/GcsController.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import com.weve.common.api.payload.BasicResponse;
44
import com.weve.dto.response.UploadFileResponse;
55
import com.weve.service.GcsService;
6+
import io.swagger.v3.oas.annotations.Operation;
7+
import io.swagger.v3.oas.annotations.tags.Tag;
68
import lombok.RequiredArgsConstructor;
79
import lombok.extern.slf4j.Slf4j;
810
import org.springframework.validation.annotation.Validated;
@@ -19,11 +21,13 @@
1921
@Validated
2022
@Slf4j
2123
@RequestMapping("/api/storage")
24+
@Tag(name = "Storage", description = "Goolge Cloud Storage 관련 API입니다.")
2225
public class GcsController {
2326

2427
private final GcsService gcsService;
2528

2629
@PostMapping("/upload")
30+
@Operation(summary = "파일 업로드", description = "파일을 업로드하여 URL을 생성합니다.")
2731
public BasicResponse<UploadFileResponse> uploadFile(@RequestPart(value = "file") MultipartFile multipartFile) throws IOException {
2832

2933

src/main/java/com/weve/controller/HealthCheckController.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
package com.weve.controller;
22

3+
import io.swagger.v3.oas.annotations.Hidden;
34
import org.springframework.http.ResponseEntity;
45
import org.springframework.web.bind.annotation.GetMapping;
56
import org.springframework.web.bind.annotation.RestController;
67

7-
// @Hidden (스웨거 숨김)
8+
@Hidden
89
@RestController
910
public class HealthCheckController {
1011

src/main/java/com/weve/controller/MessageController.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.weve.common.api.payload.BasicResponse;
44
import com.weve.service.MessageService;
5+
import io.swagger.v3.oas.annotations.tags.Tag;
56
import jakarta.persistence.Basic;
67
import lombok.RequiredArgsConstructor;
78
import lombok.extern.slf4j.Slf4j;
@@ -14,6 +15,7 @@
1415
@Validated
1516
@Slf4j
1617
@RequestMapping("/api/auth/sms")
18+
@Tag(name = "SMS", description = "SMS 관련 API입니다.")
1719
public class MessageController {
1820

1921
private final MessageService messageService;

src/main/java/com/weve/controller/SttController.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import com.weve.common.api.payload.BasicResponse;
44
import com.weve.dto.response.SpeechToTextResponse;
55
import com.weve.service.SttService;
6+
import io.swagger.v3.oas.annotations.Operation;
7+
import io.swagger.v3.oas.annotations.tags.Tag;
68
import lombok.RequiredArgsConstructor;
79
import lombok.extern.slf4j.Slf4j;
810
import org.springframework.http.MediaType;
@@ -20,14 +22,13 @@
2022
@Validated
2123
@Slf4j
2224
@RequestMapping("/api/stt")
25+
@Tag(name = "STT", description = "STT(Speech-to-Text) 관련 API입니다.")
2326
public class SttController {
2427

2528
private final SttService sttService;
2629

27-
/**
28-
* STT(Speech-to-Text) : 오디오 파일을 받아서 텍스트로 변환하여 반환
29-
*/
3030
@PostMapping(value = "", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
31+
@Operation(summary = "STT(Speech-to-Text)", description = "오디오 파일을 업로드하여 텍스트로 변환합니다.")
3132
public BasicResponse<SpeechToTextResponse> handleAudioMessage(@RequestParam MultipartFile audioFile,
3233
@RequestParam(defaultValue = "ios") String os) throws IOException {
3334
int frequency = os.equals("android") ? 44100 : 48000; //샘플링 주파수: ios-48000, android-44100

src/main/java/com/weve/controller/TtsController.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package com.weve.controller;
22

33
import com.weve.service.TtsService;
4+
import io.swagger.v3.oas.annotations.Operation;
5+
import io.swagger.v3.oas.annotations.tags.Tag;
46
import lombok.RequiredArgsConstructor;
57
import org.springframework.http.ResponseEntity;
68
import org.springframework.web.bind.annotation.GetMapping;
@@ -9,14 +11,18 @@
911
import org.springframework.web.bind.annotation.RestController;
1012

1113
@RestController
12-
@RequestMapping("/api/tts")
14+
@RequestMapping("/tts")
1315
@RequiredArgsConstructor
16+
@Tag(name = "TTS", description = "TTS(Text-to-Speech) 관련 API입니다.")
1417
public class TtsController {
1518

1619
private final TtsService ttsService;
1720

18-
// 테스트용
1921
@GetMapping
22+
@Operation(
23+
summary = "[API 연동 X] 텍스트를 음성 파일(URL)로 변환 (TTS)",
24+
description = "입력된 텍스트를 음성 파일로 변환하고, 해당 파일의 URL을 생성합니다.(고정 음성 파일을 Swagger에서 생성하는 용도)"
25+
)
2026
public ResponseEntity<byte[]> convertTextToSpeech(@RequestParam String text) throws Exception {
2127
byte[] audio = ttsService.convertTextToSpeech(text);
2228
return ResponseEntity.ok()

src/main/java/com/weve/controller/UserController.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import com.weve.repository.UserRepository;
88
import com.weve.security.CustomUserDetails;
99
import com.weve.service.UserService;
10+
import io.swagger.v3.oas.annotations.tags.Tag;
1011
import jakarta.validation.Valid;
1112
import lombok.RequiredArgsConstructor;
1213
import lombok.extern.slf4j.Slf4j;
@@ -25,6 +26,7 @@
2526
@Validated
2627
@Slf4j
2728
@RequestMapping("/api/mypage")
29+
@Tag(name = "User", description = "User 관련 API입니다.")
2830
public class UserController {
2931

3032
private final UserService userService;

0 commit comments

Comments
 (0)