Swagger는 OpenAPI Specification(OAS) 표준을 기반으로, REST API의 명세를 자동으로 생성하고, 시각적인 UI로 문서화하며, 해당 UI에서 직접 API를 테스트해볼 수 있는 강력한 도구입니다.
문제점: API를 개발한 후, API 명세서를 별도의 문서(Wiki, Excel 등)로 관리하면, 코드 변경 사항이 문서에 제때 반영되지 않아 결국 코드와 문서가 불일치하게 되는 문제가 발생합니다.
Swagger의 해결책: 코드가 곧 문서(Code as Documentation)가 되도록 합니다. 코드에 추가한 어노테이션을 기반으로 항상 최신 상태의 API 문서를 자동으로 생성해줍니다.
springdoc-openapi를 이용한 설정의존성 추가 (build.gradle):
dependencies {
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.2.0'
}
접속 및 확인:
http://localhost:8080/swagger-ui.htmlhttp://localhost:8080/v3/api-docs@Tag: 컨트롤러 그룹(태그)에 대한 설명을 추가.@Operation: 각 API 엔드포인트의 기능에 대한 요약(summary) 및 설명(description)을 추가.@Schema: DTO나 모델 객체의 필드에 대한 설명을 추가.@Tag(name = "Post API", description = "게시글 관련 API")
@RestController
@RequestMapping("/api/posts")
public class PostController {
@Operation(summary = "게시글 생성", description = "새로운 게시글을 등록합니다.")
@PostMapping
public ResponseEntity<Void> createPost(@RequestBody PostCreateRequest request) {
// ...
}
}
@Schema(description = "게시글 생성 요청 DTO")
public class PostCreateRequest {
@Schema(description = "게시글 제목", example = "스프링 부트 강좌")
private String title;
// ...
}
사용자가 업로드하는 이미지, 동영상 등의 정적 파일(Static File)을 애플리케이션 서버(EC2)에 직접 저장하는 것은 여러 문제점을 야기합니다.
AWS S3: 이러한 문제를 해결하기 위해, 파일 저장을 전담하는 객체 스토리지(Object Storage) 서비스인 S3를 사용하는 것이 표준적인 방법입니다.
의존성 추가 (build.gradle): AWS SDK for Java v2를 사용하기 위한 의존성을 추가합니다.
dependencies {
implementation 'software.amazon.awssdk:s3:2.20.43'
}
application.yml 설정: AWS 자격 증명(Access Key, Secret Key)과 S3 버킷 정보를 설정합니다.
cloud:
aws:
credentials:
access-key: YOUR_ACCESS_KEY
secret-key: YOUR_SECRET_KEY
region:
static: ap-northeast-2
s3:
bucket: your-s3-bucket-name
S3 클라이언트 Bean 등록: S3와 통신할 S3Client 객체를 Spring Bean으로 등록하는 설정 클래스를 작성합니다.
Controller:
multipart/form-data 형식의 요청으로 처리됩니다.@RequestPart 어노테이션을 사용하여 MultipartFile 객체로 업로드된 파일을 받습니다.Service:
MultipartFile 객체로부터 파일의 원본 이름, 크기, InputStream 등을 얻습니다.S3Client의 putObject() 메서드를 사용하여, 파일을 S3 버킷에 업로드합니다.// FileUploadController.java
@RestController
public class FileUploadController {
private final FileUploadService fileUploadService;
@PostMapping("/api/upload")
public ResponseEntity<String> uploadFile(@RequestPart("file") MultipartFile file) {
String fileUrl = fileUploadService.uploadFile(file);
return ResponseEntity.ok(fileUrl);
}
}
// FileUploadService.java
@Service
public class FileUploadService {
private final S3Client s3Client;
private final String bucketName;
public String uploadFile(MultipartFile file) {
String uniqueFileName = UUID.randomUUID().toString() + "_" + file.getOriginalFilename();
try {
s3Client.putObject(PutObjectRequest.builder()
.bucket(bucketName)
.key(uniqueFileName)
.build(),
RequestBody.fromInputStream(file.getInputStream(), file.getSize()));
// 업로드된 파일의 URL 반환
return s3Client.utilities().getUrl(builder -> builder.bucket(bucketName).key(uniqueFileName)).toString();
} catch (IOException e) {
throw new RuntimeException("파일 업로드 실패", e);
}
}
}
springdoc-openapi)는 컨트롤러 코드의 어노테이션을 기반으로 API 문서를 자동으로 생성하고 테스트 UI를 제공하여, 개발자 간의 협업 효율을 극대화합니다.MultipartFile 객체로 처리하며, AWS SDK의 S3Client를 사용하여 S3 버킷에 파일을 업로드하고, 그 결과로 얻은 파일 URL을 DB에 저장하는 방식으로 구현합니다.