서버 내부의 이미지 파일을 저장해 보자
들어가며
프로젝트를 진행하는 동안, 이미지 파일을 배포 서버에 저장하는 등록 API를 구현하게 되었습니다. 초기 개발 단계에서는 S3를 이용하여 이미지를 업로드하는 것이 필요하지만, 이는 취업 준비생에게는 추가적인 비용이 발생하므로 부담이 될 수 있습니다. 그래서, 서버 내부에 직접 이미지를 저장하는 방법을 탐색하려고 합니다
서버 내부의 장, 단점
S3와 같은 클라우드 스토리지를 사용하지 않고 배포된 서버 내부의 이미지 파일을 저장하게 되면 장단점이 존재합니다. 먼저 장담 전에 대해서 알아보도록 하겠습니다.
장점
- 빠른 액세스 : 이미지가 서버내부의 저장되어 있기 때문에 적은 네트워크를 통해 데이터를 불러올 수 있습니다.
- 보안 : 서버 내부의 이미지를 저장하기 때문에 나름 보안이 좀 더 좋을 수 있습니다.
- 비용(취준생입장.. ): S3 같은 스토리를 통해 이미지를 저장하고 조회하면 해당 이상의 대해서는 건당의 비용이 발생해.. 부담이 발생할 수 있습니다. 더욱 개발 서버처럼 여러 번 저장 조회한다면 더욱 로컬 내부에 저장하는 것이 좋을 수 있습니다.
단점
- 자원의 한정 : 서버 내부의 저장한다는 것은 한정된 메모리를 쪼개서 남는 공간에 데이터를 저장하는 방법이 기 때문에 고해상도의 이미지파일등과 같이 용량이 높은 파일을 저장한다면 쉽게 메모리가 부족해는 현상이 발생합니다.
- 백업 및 복구 : 서버 내부의 데이터를 저장하기 때문에 서버의 의존하는 백업 및 복구 프로세스를 개발해야 합니다.
- 확장성 : 10만 개의 이미지 파일이 저장되었던 서버가 변경되게 된다면 10만개의 이미지 파일을 변경하는 것은 매우 귀찮고 복잡해 확장면에서도 좋지 않은 문제가 발생합니다.
이러한 장단점이 있지만, 개발 서버에서까지 굳이 S3를 통해 사용하지 않고 서버내부의 이미지 파일을 저장하고 개발이 완료되고 난 후에 S3로 저장하는 방법이 도 좋다고 판단해 서버 내부의 저장하도록 선택했습니다. 그럼 이제 서버 내부의 이미지 파일을 저장하는 방법을 알아보도록 하겠습니다.
DockerFile 작성
FROM openjdk:17-jdk-slim
RUN mkdir "/mnt/images"
WORKDIR /app
COPY [jar 디렉터리] [복사할 디렉터리]
ENTRYPOINT ["java", "-jar",[실행할 jar]]
- FROM : jdk-17의 slim 버전을 다운로드합니다.
- RUN : "/mnt/images/ 서버내부 디렉터리 생성합니다.
- WORKDIR : /app으로 이동합니다.
- COPY : 빌드된 Jar 파일을 복사합니다.
- ENTRYPOINT : 통해 JAR 파일을 실행해 줍니다.
간단하게 Dockerfile을 작성해 줍니다.
볼륨 생성
도커 볼륨은 도커 컨테이너에서 데이터를 영구적으로 저장하고 공유하기 위한 메커니즘입니다. 주로 컨테이너 간 데이터
공유, 데이터베이스 파일, 로그 파일 등을 저장하는 데 사용됩니다.
docker volume create [생성할 볼륨 명]
도커 파일작성 시에도 VOLUME를 통해서 볼륨을 만들 수 있지만 해당 볼륨은 컨테이너를 생성할 때마다 새로운 볼륨일 생성하기 때문에 기존의 데이터는 삭제될 수 있기 때문에 명시적으로 볼륨을 생성해 해당 볼륨을 마운트 해줍니다.
"docker run -d -p 8080:8080 -v [생성한 볼륨]:[연결 볼륨] --name [사용할 이름] [이미지 명]"
위와 같이 컨테이너를 실행해 주면 볼륨이 연결되면서 컨테이너를 삭제해서 다시 시작해도 볼륨이 연결될 것입니다.
실행
레시피 등록이라는 API의 레시피의 정보와 레시피의 사진을 전송해 저장하는 API 요청을 보냈다고 해보자.
store_file_name으로 DB에 저장된 파일명이 저장되어 있으며 , d699535 acbeb라는 컨테이너 ID 내부에 동일한 이미지 파일이 저장돼있는 것을 볼 수 있다.
이제 컨테이너를 삭제 후 다시 시작해 보면
컨테이너 ID는 c2b8378447b5로 바뀌어서 새로운 서버가 실행됐지만 서버 내부에는 동일한 이미지 파일이 있는 것을 볼 수 있다.
다음으로
정상적으로 원하는 결과를 통해 서버 내부의 이미지 파일을 저장하는 방법을 알아보았다. 다음에는 S3를 통해 이미지 파일을 저장하는 방법을 알아보도록 하겠습니다.
'Devops > AWS' 카테고리의 다른 글
[AWS] Springboot(스프링 부트) + Docker(도커) + AWS의 EC2로 배포하기 (0) | 2024.02.03 |
---|---|
[AWS] AWS 컴퓨팅 서비스의 인스턴스 및 키페어 (0) | 2024.01.26 |