이미지를 서버에 올리면, 서버가 여러 대일 때 어떻게 클러스터링 하지???
서론
현재 배달과 관련 된 토이프로젝트를 진행하고 있다.
원래는 이미지를 업로드 할 때, 서버에 upload 폴더 혹은 images 폴더 등으로 관리를 하였다.
그러나 이 방법은, 서버가 한 대만 있을 경우 가능한 방법이다.
내가 올린 이미지가, 다른 페이지로 이동 했을 때 다른 서버로 넘어간다면, 그 이미지가 보이지 않을 수 있기 때문이다.
그럴 경우를 해결하기 위하여 AWS S3 를 사용하기로 하였다.
본론
필자는 이미 AWS 회원이므로, 회원가입 절차는 생략하였다.
1. AWS S3 버킷 생성 및 설정, 그리고 Key 발급
먼저 AWS S3 에 버킷을 만들어주어야 한다.
AWs Console 에서 S3 를 찾아 버킷을 누르고, 버킷 만들기를 누른다.
버킷 이름을 설정해주고,
아래와 같이 클릭을 해주면 된다.
다음은 사용자를 생성해주어야 한다.
AWS console 에서 IAM 을 누른 후, 엑세스 관리에서 사용자 추가를 클릭한다.
여기서 Access Key 와 Secret Key 를 발급 받아야 하기 때문이다.
다음은 엑세스 키를 생성해야 한다.
동일한 IAM 에서 엑세스 관리자를 누르고, 사용자 안에서 보안 자격 증명, 엑세스 키 만들기를 클릭해 주어야 한다.
그러면 이렇게 키를 발급 받을 수 있다.
이 키가 AWS S3 와 SpringBoot 를 연결하는데 사용 될 것이다.
2. Spring Boot 연동 ( properties 설정 )
Spring Boot 와 연동하기 위해서는 properties 혹은 yml 을 설정해주어야 한다.
필자는 properties 를 사용하였다.
이렇게 버킷 이름, access key, secret key 를 적어주면 된다.
ap-northeast-2 는 지역을 한국으로 고정하는 것이고,
stack.auto 를 false 로 두는 것은 EC2 를 사용하게 되었을 때, Spring Cloud 프로젝트를 실행시키면 기본으로 CloudFormation 구성을 시작하기 때문에, 그 CloudFormation 이 없으면 오류가 발생한다.
그걸 막기 위해 false 를 설정해두어야 한다.
3. Config 추가
properties 에 설정한 값을 토대로, Config 를 만들어 준다.
필자는 AmazonS3 와 BasicAWSCredentials 를 사용하였다.
4. Controller 와 Service 생성
원래는 Controller 는 생성하지 않아도 된다.
실제로 사용하는 Controller 에서 해당 FileService 를 불러내주면 되기 때문이다.
하지만 필자가 Controller 를 따로 만든 이유는, Test 를 하기 위함이다.
실질적인 컨트롤러는 다음과 같다.
여기서 서비스를 연결하여,
이렇게 사용할 수 있다.
5. Test
로직을 만들었으면, 당연 Test 는 따라와야 한다.
Test 를 통하여 AWS S3 에 제대로 저장이 되는지를 확인하여야 한다.
필자는 Post Man 이라는 것을 사용하였다.
Get Post 요청을 통한 테스트를 진행하기 아주 좋으니, 꼭 사용해보기를 바란다.
이렇게 AWS S3 Image Test 를 위한 폴더와, New Request 까지 생성하였고,
타입은 Post 로 바꾼 뒤, URL 를 입력해주었다,
그리고 Body 에는 File 타입으로, Test Image 를 넣어주었다.
과연 결과는 ???
성공적이었다.
모자이크로 가려두었지만, 성공적으로 저장이 되었다는 뜻이다.
실제로 AWS S3 에 들어가보면,
이렇게 저장이 잘 되어있는 것을 확인 할 수 있다.
결론
우리가 단일 서버를 운영한다면, upload 폴더 하나에 저장을 하여도 상관 없다.
그러나 요즘은 수 많은 서비스들이 다중 서버를 두고 있고
DB Connection Pool 을 튜닝 하는 것보다도, 그냥 서버를 여러대 두는 것을 선택하는 추세이다.
AWS S3 에 이미지를 저장하는 방법은 서버끼리 업로드한 이미지를 클러스터링 할 수 있는 방법 중 하나이며,
가장 유용한 방법이라고 생각한다.
'개발 회고록' 카테고리의 다른 글
[ 개발 회고록 ] 테스트 코드 작성 시, @Transactional 어노테이션을 사용하는 것에 대한 짧은 생각 (1) | 2024.01.10 |
---|---|
[ 개발 회고록 ] Redisson Lock 을 활용한, 적립 포인트 → 사용 가능 포인트 전환 기능 구현. (2) | 2024.01.03 |
[ 개발 회고록 ] JPA를 활용한, 생성 및 수정 날짜 자동 처리를 위한 공통 Entity 개발. (1) | 2024.01.02 |
[ 개발 회고록 ] Thread 와 Thread의 데이터 공유 (1) | 2024.01.02 |
[ 개발 회고록 ] 비동기 메서드 동시성 문제 발견 및 수정 (0) | 2023.12.04 |