전에 MultipartFile을 통하여 이미지를 저장하는 기능을 만들었는데, 제가 구현한 방식은 다음처럼 서버 내부 디렉토리에 이미지가 저장되어 이를 사용하는 방식으로 구현하였습니다.
그런데 같이 협업하시는 프론트 분께서 디렉토리로부터 이미지 파일을 못가져오는 문제가 발생해서 대안을 살펴보는 와중에, 요즘은 S3를 활용해서 이미지를 관리하는 것 같더라구요?
그래서 이번 기회에 한 번 경험해보고자 S3에 대하여 간단하게 알아보고, 이를 활용하여 이미지를 관리할 수 있도록 사용해보겠습니다.
S3는 Amazon Simple Storage Service의 약자로, 간단하게 설명하면 인터넷 스토리지 서비스입니다.
이전에 제가 사용하던 방식과 차이점을 알아보자면, 일단 확장성 측면에서 차이가 발생하는데, 일반 파일의 경우에는 저장할 공간이 부족한 경우 새로운 파일을 추가하여 공간을 할당해주거나, 필요없는 파일들을 삭제함으로써 문제를 해결할 수 있지만, 사용자가 직접 해줘야한다는 단점을 가지고 있습니다.
그렇지만 S3를 사용할 경우, 사실상 공간이 부족한 상황은 발생하지 않겠지만, 자동으로 저장소의 공간을 관리해 주기 때문에 개발자 입장에서는 매우 유용한 서비스입니다.
그냥 일반 디렉터리를 사용하는 방식보다 보안적으로도 더 뛰어나고, 용량이라던가 신경써줘야하는 부분들을 알아서 관리해주기 때문에 사용하면 편할 것 같아서 사용해보기로 결정하였습니다.
일단 늘 그렇듯이 프로젝트를 하나 생성하고 시작하겠습니다.
기존 작업물에 하기에는 좀 무서워서 그래요..
프로젝트 설정
일단은 다음처럼 서버가 잘 작동하는 것을 확인하였으니, 이제 S3를 사용하기 위한 의존성을 추가해줍니다.
일단 저의 경우에는 gradle을 사용하였기 때문에 다음처럼 S3와 관련된 의존성을 추가해주었습니다.
implementation group: 'com.amazonaws', name: 'aws-java-sdk-s3', version: '1.12.445'
혹시나 나중에 이 게시글을 보시는 분들을 위하여 링크를 참고하겠습니다.
https://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk-s3
의존성이 너무 구식이면 오류가 발생할 수 있다고 하더라구요..
그럼 일단 프로젝트 설정은 마쳤으니, 이미지 파일들을 저장할 버킷을 생성하고 코드를 작성해보도록 하겠습니다.
혹시 데자뷰라고 아시나요?
ㅋㅋ
열심히 글쓰고 있었는데 뭘 잘못 건드린건지는 몰라도 버킷 생성 이후로 글 작성한게 다 날아갔습니다.
아..
버킷을 삭제하려면 다음처럼 삭제할 버킷을 선택한 뒤,
우측 상단의 삭제 버튼을 누르시면 버킷이 삭제됩니다...
하하
그럼 다시 처음으로 되돌아가서 버킷 생성을 다시 해보겠습니다.
일단 AWS로 들어가서 S3 서비스를 찾아줍니다.
그리고 왼쪽 메뉴 바에 존재하는 버킷으로 들어가줍니다.
우측 상단에보시면 버킷 만들기가 있는데, 선택하여 버킷을 만들어줍니다.
버킷의 이름은 전세계적으로 고유한 이름이어야합니다.
ACL의 경우, 다른 AWS 계정 소유자가 버킷에 접근하거나 사용하는 것을 제어할 수 있는 설정인데, 비활성화 해놓도록 하겠습니다.
퍼블릭 엑세스를 차단해놓을 경우, 나중에 우리가 버킷에 저장된 이미지에 접근하지 못하는 현상이 발생하기 때문에 일단은 모두 해제해놓도록 하겠습니다.
여기서 중요한 점이 있는데, 지금 제가 하고 있는 작업은 S3가 어떤 것인지 알아보는 토이 프로젝트이기 때문에 다음처럼 엑세스 차단을 모두 해제하는 것이지만, 실무에서는 모두 차단을 하거나 ACL을 통하여 관리한다고합니다.
나머지 버전 관리나, 암호화 기능들은 비활성화 해놓은 상태로 버킷을 생성하였습니다.
다시 보네 반가워
일단은 버킷을 생성했으니, 이미지를 하나 업로드해보겠습니다.
다음처럼 업로드 된 이미지들은 선택하여 세부 정보를 볼 수 있는데,
세부 정보에 보면 접근 URL이 존재하는 것을 확인할 수 있습니다.
우리는 이 URL을 통하여 이미지에 접근할 수 있으며, 이 URL을 통하여 프론트에서도 이미지를 활용할 수 있는 것입니다.
근데 URL에 접근하면 다음처럼 오류가 발생하는 것을 확인할 수 있습니다.
아직 버킷 내부 객체에 접근할 수 있는 권한이 없기 때문인데요,
이러한 현상은 버킷 내부 정책을 수정함으로써 해결할 수 있습니다.
버킷 -> 권한으로 이동해서 하단 메뉴를 살펴보시면,
다음처럼 버킷 정책이라는 메뉴를 찾으실 수 있습니다.
여기서 우리는 버킷에 대한 설정들을 수행할 수 있는데, 편집 -> 정책 생성기를 통하여 버킷 관련 정책을 생성해보도록 하겠습니다.
버킷과 관련된 정책을 생성하기 위해서는 정해진 문법을 통하여 설정해야하지만, 정책 생성기를 활용하면 비교적 쉽게 우리가 원하는 정책을 생성할 수 있습니다.
Action이 바로 우리가 행할 작업들이고, 이에 대하여 권한을 받아야하는데, All Action을 선택하여 모든 작업을 허용하도록 설정하였습니다.
하단에 Arn의 경우, 다음과 같은 구조로 입력해줍니다.
arn:aws:s3:::${BucketName}/*
그리고 Add Statement를 선택할경우, 다음처럼
정책을 생성하는 버튼이 보일것입니다.
Generate Policy를 선택하면 다음처럼 생성된 정책이 보일 것이고, 이것을 복사하여
다음처럼 입력해줍니다.
정책을 설정하였을 경우, 다음처럼 엑세스가 퍼블릭으로 변하는 것을 확인할 수 있을텐데, 다시 이미지에 접근해보면
접근되는 것을 확인할 수 있습니다.
그럼 이제 버킷 생성까지 확인하였으니, 이제는 이미지 저장 기능을 구현하기 위하여 코드를 작성해보도록 하겠습니다.
그전에 일단 쫄리니까 한 번 끊고 가겠습니다.