-
[S3] spring boot CRUDSpring Boot 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
삭제됨 ~
'Spring Boot' 카테고리의 다른 글
[Spring boot] Result Map 매핑 안되는 오류 (나는 진짜 바보인가) (0) 2024.07.27 [Spring boot] @RequestParam / @RequestBody + @RequestPart 구분하기 (0) 2024.07.27 [ChatGPT API] 파인튜닝하기 (1) 2024.06.12 [ChatGPT API] 프로젝트에 GPT API 적용하기(라이브러리 활용하기) (0) 2024.05.30 [MyBatis] User CRUD 구현하기 - C (Create) (0) 2024.05.26