Spring & Java
AWS 기반 Spring 애플리케이션 배포 및 Presigned URL 구현 본문

🔹 LV 0 — AWS 환경 준비 및 비용 관리
📌 학습 내용
- AWS 실습에 앞서 Billing Budget을 설정했다.
- 월 예산을 $100으로 제한하고,
- 80%
- 60%
- 40%
사용 시 이메일 알림을 받도록 설정했다.
- 실습 환경에서 비용이 예상치 못하게 발생할 수 있다는 점을 인지하고,
사전에 통제 장치를 마련하는 것의 중요성을 이해했다.
💭 느낀 점
기능 구현보다 먼저 비용을 통제하는 습관이 중요하다는 걸 처음으로 체감했다.
“돌아가게 만드는 것”보다 “안전하게 운영하는 것”이 더 중요한 단계라는 느낌을 받았다.
🔹 LV 1 — EC2 인스턴스 상태 확인 및 기본 접근
📌 학습 내용
- EC2 인스턴스를 생성하고 Status Check = UP 상태를 확인했다.
- .pem 키를 이용해 SSH 접속을 시도하며,
- 키 파일 경로 문제
- 권한 문제
- Git Bash 경로 인식 문제
등을 직접 해결했다.
- EC2는 실행 중이더라도 애플리케이션이 떠 있는 상태와는 다르다는 점을 명확히 이해했다.
💭 느낀 점
“EC2 실행 = 서버 동작”이라고 막연히 생각했는데,
실제로는 서버 위에 내가 직접 애플리케이션을 올려야 한다는 개념이 확실히 잡혔다.
🔹 LV 2 — Spring Boot 배포 및 설정 분리
📌 학습 내용
- 로컬 환경과 운영 환경을 분리하기 위해:
- application.properties
- application-local.properties
- application-prod.properties
구조를 사용했다.
- 운영 환경에서는 민감 정보(DB 정보 등)를 코드에 두지 않고,
AWS Parameter Store를 통해 관리했다. - EC2에서 Spring Boot 애플리케이션을 실행하고:
- nohup java -jar
- 로그 확인 (app.log)
- 프로세스 확인 (ps aux | grep java)
과정을 반복하며 서버 배포 흐름을 익혔다.
- Actuator를 활용해 /health, /info 엔드포인트 접근을 시도했다.
💭 느낀 점
설정 하나가 잘못되면 애플리케이션 전체가 동작하지 않는다는 걸 느꼈다.
특히 Profile과 실행 환경을 명확히 구분하는 설계가 얼마나 중요한지 체감했다.
🔹 LV 3 — S3 Presigned URL 구현 및 트러블슈팅
📌 학습 내용
- S3에 저장된 프로필 이미지를 직접 노출하지 않고,
Presigned URL을 통해 일정 시간만 접근 가능하도록 구현했다. - S3Presigner를 사용해 Presigned URL을 생성했다.
- Presigned URL 생성 시 반드시 필요한 요소:
- Region 명시
- AWS Credentials Provider
- 유효기간 설정
@Bean public S3Presigner s3Presigner() { return S3Presigner.builder() .region(Region.AP_NORTHEAST_2) .
credentialsProvider(DefaultCredentialsProvider.create()) .build(); }
- Presigned URL 유효기간을 **7일(604,800초)**로 설정하여 과제 요구사항을 충족했다.
- 가장 큰 문제는 AWS SDK v2 버전 충돌이었다.
- spring-cloud-aws-starter-parameter-store가 끌고 온 SDK 버전과
- 직접 사용한 S3 SDK 버전이 달라
내부에서 NullPointerException (ep == null)이 발생했다.
- 해결 방법:
- AWS SDK BOM을 사용해 모든 SDK 버전 통일
implementation platform("software.amazon.awssdk:bom:2.41.5") implementation "software.amazon.awssdk:s3"
implementation "software.amazon.awssdk:auth"
💭 느낀 점
이 단계는 단순 구현 문제가 아니라 실무에서 가장 많이 만나는 라이브러리 충돌 문제였다.
에러 메시지를 끝까지 따라가며 “내 코드 문제인지, 환경 문제인지”를 구분하는 시야가 생겼다.
특히 AWS SDK는 버전 관리가 곧 안정성이라는 걸 뼈저리게 느꼈다.
✨ 전체 느낀 점 정리
이번 TIL은 단순히 기능을 완성하는 기록이 아니라,
운영 환경을 고려한 서버 개발 흐름을 처음부터 끝까지 경험한 기록이었다.
- 비용 관리
- 서버 접근
- 환경 분리
- 보안 설계
- 외부 스토리지 접근 제어
이 모든 단계가 하나로 연결되어 있다는 점이 인상 깊었다.
🧠 한 줄 요약
서버 개발은 “코드를 잘 짜는 것”이 아니라
환경, 보안, 비용, 운영까지 함께 설계하는 일이라는 걸 처음으로 실감한 하루였다.