본문 바로가기
DevOps/AWS

AWS S3) S3를 이용한 파일 불러오기

by 어렵다어려웡 2021. 6. 23.

개인 프로젝트를 구축해나가면서 프로젝트의 성격에 맞는 기능을 구현하는데 

상품에 대한 이미지를 나타내기 위해서 S3를 이용하게 되었습니다..

 

상품에 대한 이미지를 업로드 하는 기능같은 경우 관리자의 권한으로 우선 구현하지 않은 상태 이므로

추후에 구현 시 포스팅하는 식으로 진행하며, S3 및 IAM 과 관련된 초기설정에 대한 내용은 생략합니다.

 

1. AWS 의존성 설정.

// build.gradle
compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-aws', version: '2.2.1.RELEASE'

 

2. application.properties 설정

# s3 - 2
cloud.aws.s3.bucket=S3 버켓 명칭
cloud.aws.region.static=ap-northeast-2
cloud.aws.stack.auto=false

 

3. S3 private 키 설정

cloud.aws.credentials.access-key=개인 access key
cloud.aws.credentials.secret-key=개인 secret key

private 키의 경우 외부에 노출되면 안되기 때문에 따로 파일을 생성해서 gitignore를 해야한다.

 

4. S3 관련 Service 계층 설정

@Service
@RequiredArgsConstructor
public class S3UploadService {

    private final AmazonS3Client amazonS3Client;

    @Value("${cloud.aws.s3.bucket}")
    private String bucketName;

    public String getThumbnailPath(String path) {
        return amazonS3Client.getUrl(bucketName, path).toString();
    }
}

 

아마 작년에는 AmazonS3 를 사용해서 주입을 했었는데 언제부터인가 Deprecated되어서 

AmazonS3Client를 이용해서 사용하도록 권장되었습니다.

 

@Value를 통해서 application.properties에 설정한 S3 버켓의 이름을 가져와서 사용합니다.

 

- getThumbnailPath 메서드

해당 메서드는 S3에 업로드 되어있는 파일을 가져와서 해당 경로를 String으로 받는 메서드입니다.

저의 경우 직접 업로드를 해서 사용하는 프로젝트는 아니였기때문에 우선 임시로 업로드를 직접해놓은뒤

해당 코드를 실행했습니다.

 

S3에서 파일의 경로를 가져오려면 버켓이름과 경로가 필요한데

여기서 경로(path)는 해당 버켓에 들어갔을때를 기준으로 해당 파일이 있는 폴더의 전체 명칭을 써줘야합니다.

 

아래의 사진처럼 폴더가 없을 경우 매개변수로 "bolpen.jpg" 를 작성해주면 되지만

폴더에 존재했을 경우 "폴더명칭/bolpen.jpg" 로 path를 받아야합니다.

 

위 사진처럼 저의 S3버켓에 파일을 업로드 한 후 경로를 String으로 가져오는지 테스트를 해봅니다.

 

// in Tests class

    @Autowired
    private S3UploadService s3UploadService;

    @DisplayName("저장된 이미지(볼펜) 찾기")
    @Test
    public void findImg() {
        String imgPath = s3UploadService.getThumbnailPath("bolpen.jpg");
        log.info(imgPath);
        Assertions.assertThat(imgPath).isNotNull();
    }

성공적으로 S3의 경로로 파일이 업로드되어있는 문자열을 받았습니다.

 

해당 문자열로 HTML img 태그의 src로 사용하면 되겠습니다.