ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [S3] spring boot CRUD
    Spring 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

     

    삭제됨 ~

Designed by Tistory.