AWS S3에는 파일 바이너리를 저장하고, MySQL의 tb_file_attachment 테이블에는 파일 메타데이터를 저장하는 백엔드 전용 REST API 프로젝트입니다.
- Java 17
- Spring Boot 3.x
- MyBatis (XML Mapper)
- MySQL
- AWS SDK v2 (S3, S3 Presigner)
- springdoc-openapi (Swagger UI)
src/main/java/com/example/s3files
├── config
├── controller
├── dto
│ ├── request
│ └── response
├── entity
├── exception
├── mapper
└── service
└── impl
계층은 Controller / Service / Mapper 구조로 분리했습니다.
docs/schema.sql을 사용해 테이블을 생성합니다.
mysql -u root -p s3_file_db < docs/schema.sqlsrc/main/resources/application.yml 기본값을 수정하거나,
application-example.yml을 복사해 환경별 profile 설정에 사용하세요.
spring.datasource.*: MySQL 접속 정보aws.s3.bucket: S3 버킷명aws.s3.region: 리전aws.s3.presigned-url-duration-minutes: 다운로드 URL 만료 시간(분)
mvn clean packagemvn spring-boot:run서버 기본 포트: 8080
- Swagger UI:
http://localhost:8080/swagger-ui.html - OpenAPI JSON:
http://localhost:8080/v3/api-docs
- POST
/api/files - Content-Type:
multipart/form-data - Form-data
file(MultipartFile)createUser(String)
- GET
/api/files/{fileSeq}
- GET
/api/files?useYn=Y&keyword=report
- PUT
/api/files/{fileSeq} - Body(JSON)
{
"updateUser": "admin",
"useYn": "Y"
}- DELETE
/api/files/{fileSeq}?updateUser=admin - S3 오브젝트를 삭제하고, DB는
use_yn='N'으로 업데이트합니다.
- GET
/api/files/{fileSeq}/download-url
- 업로드 시 UUID 기반
stored_file_name생성 - 파일 바이너리는 S3, 메타데이터는 MySQL 저장
- MyBatis XML Mapper 방식 사용
- 공통 예외 처리를 위한
@RestControllerAdvice적용 - Request/Response DTO 분리
AWS 인증은 기본 자격증명 체인(DefaultCredentialsProvider)을 사용합니다. 로컬에서는 다음 중 하나가 필요합니다.
~/.aws/credentials- 환경변수 (
AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY) - EC2/ECS IAM Role