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

 

삭제됨 ~