Spring Boot
[S3] spring boot CRUD
어코링
2024. 6. 12. 11:33
프로젝트에서 S3 서비스를 도입해서 간단하게 bucket 테스트로 CRUD 코드를 작성해보려한다.
디렉토리 구성
FileNameDTO와 FileDeleteDTO
@Getter
@Setter
@NoArgsConstructor
public class FileDeleteDTO {
private String fileName;
private MultipartFile multipartFile;
@Builder
public void FileDeleteDto(String fileName, MultipartFile multipartFile) {
this.fileName = fileName;
this.multipartFile = multipartFile;
}
}
@Getter
@Setter
@NoArgsConstructor
public class FileNameDTO {
private String fileName;
@Builder
public void FileNameDto(String fileName) {
this.fileName = fileName;
}
}
C reate - upload file
controller
/**
* @Method - uploadFile
* @Date - 2024.06.03
* @Writter - ese
* @EditHistory -
* @Discript - AWS S3 Bucket C
* @param MultipartFile
* @Return - ResponseEntity
*/
@RequestMapping(value = "/create", method = RequestMethod.POST)
public ResponseEntity<?> uploadFile(@RequestParam("multipartFile") MultipartFile multipartFile) throws IOException {
return ResponseEntity.ok().body(fileStore.create(multipartFile));
}
service
@Value("${cloud.aws.s3.bucket}")
private String bucket;
private final AmazonS3 amazonS3;
public FileStoreImpl(AmazonS3 amazonS3) {
this.amazonS3 = amazonS3;
}
/**
* @Method - create
* @Date - 2024.06.03
* @Writter - ese
* @EditHistory -
* @Discript - AWS S3 Bucket C 파일 저장
* @param MultipartFile
* @Return - String
*/
@Override
public String create(MultipartFile multipartFile) throws IOException {
String fileName = UUID.randomUUID() + "-" + multipartFile.getOriginalFilename();
ObjectMetadata objectMetadata = new ObjectMetadata();
objectMetadata.setContentLength(multipartFile.getInputStream().available());
amazonS3.putObject(bucket, fileName, multipartFile.getInputStream(), objectMetadata);
return amazonS3.getUrl(bucket, fileName).toString();
}
Postman test
POST
http://localhost:8080/v1/aws/create
response
R ead - 불러오기
GET
controller
/**
* @Method - findFile
* @Date - 2024.06.03
* @Writter - ese
* @EditHistory -
* @Discript - AWS S3 Bucket R
* @param String
* @Return - ResponseEntity
*/
@RequestMapping(value = "/read/{fileName}", method = RequestMethod.GET)
public ResponseEntity<?> findFile(@PathVariable String fileName) throws IOException {
return fileStore.read(fileName);
}
Service
/**
* @Method - read
* @Date - 2024.06.03
* @Writter - ese
* @EditHistory -
* @Discript - AWS S3 Bucket R 파일 불러오기
* @param String
* @Return - ResponseEntity
*/
@Override
public ResponseEntity<?> read(String fileName) throws IOException {
S3Object s3Object = amazonS3.getObject(new GetObjectRequest(bucket, fileName));
S3ObjectInputStream s3ObjectInputStream = s3Object.getObjectContent();
byte[] bytes = IOUtils.toByteArray(s3ObjectInputStream);
int byteLength = bytes.length;
List<MediaType> mediaTypeList = new ArrayList<>();
mediaTypeList.add(MediaType.APPLICATION_OCTET_STREAM);
mediaTypeList.add(new MediaType("image", getExt(fileName)));
return new ResponseEntity<>(bytes, createHttpHeaders(byteLength, mediaTypeList), HttpStatus.OK);
}
Postman test
http://localhost:8080/v1/aws/read/{fileName}
위 처럼 사진이 깨져서 텍스트 형태로 나오는데,
이 문제는 차차 해결할 예정이다.
U pdate - 수정하기
controller
/**
* @Method - updateFile
* @Date - 2024.06.03
* @Writter - ese
* @EditHistory -
* @Discript - AWS S3 Bucket U
* @param FileDeleteDTO
* @Return - ResponseEntity
*/
@RequestMapping(value = "/update", method = RequestMethod.POST)
public ResponseEntity<?> updateFile(FileDeleteDTO fileDeleteDto) throws IOException {
return ResponseEntity.ok().body(fileStore.update(fileDeleteDto));
}
service
/**
* @Method - update
* @Date - 2024.06.03
* @Writter - ese
* @EditHistory -
* @Discript - AWS S3 Bucket U 수정
* @param FileDeleteDTO
* @Return - String
*/
@Override
public String update(FileDeleteDTO fileDeleteDto) throws IOException {
delete(fileDeleteDto.getFileName());
return create(fileDeleteDto.getMultipartFile());
}
Postman test
POST
http://localhost:8080/v1/aws/update
fileName -> 수정하려는 파일명
multipartFile -> 바꾸려는 파일
D elete - 삭제하기
controller
/**
* @Method - updateFile
* @Date - 2024.06.03
* @Writter - ese
* @EditHistory -
* @Discript - AWS S3 Bucket U
* @param FileDeleteDTO
* @Return - ResponseEntity
*/
@RequestMapping(value = "/update", method = RequestMethod.POST)
public ResponseEntity<?> updateFile(FileDeleteDTO fileDeleteDto) throws IOException {
return ResponseEntity.ok().body(fileStore.update(fileDeleteDto));
}
service
/**
* @Method - delete
* @Date - 2024.06.03
* @Writter - ese
* @EditHistory -
* @Discript - AWS S3 Bucket D 삭제
* @param String
* @Return -
*/
@Override
public void delete(String fileName) {
amazonS3.deleteObject(new DeleteObjectRequest(bucket, fileName));
}
Postman test
POST
http://localhost:8080/v1/aws/delete
삭제됨 ~