
지난 여름방학, 저는 8월 25일부터 26일까지 양재 AT센터에서 열린 멋쟁이사자처럼 해커톤 대회에 참가했습니다. 대회의 주제는 “AI로 다시 뛰는 우리 동네”, 즉 지역 경제와 삶을 AI로 연결하는 것이었습니다. 학교 앞 골목식당이나 전통시장, 청년 창업 공간, 복지 사각지대 등 지역 속 다양한 문제들을 AI 기반의 솔루션으로 풀어내는 것이 목표였죠.

저희 팀은 '역곡역을 중심으로 한 지역 맛집 추천 플랫폼'을 기획했습니다. 저는 팀에서 백엔드 개발(Gemini API 활용)과 배포 담당(DevOps & DB 오너) 역할을 맡았는데, 개발 경험은 있었지만 직접 서비스를 외부에 배포하는 것은 처음이라 긴장과 설렘이 동시에 있었습니다.
대회 측에서 AWS EC2 서버를 지원해주었기 때문에 자연스럽게 이를 배포 환경으로 선택했습니다. 백엔드는 Spring Boot, 데이터베이스는 MySQL을 사용했고, 저는 서버 세팅부터 환경 변수 관리, 로그 모니터링, 그리고 Nginx 리버스 프록시 설정까지 전체적인 배포를 맡았습니다.
처음 서버를 받았을 때는 완전히 빈 상태였기 때문에, ssh 접속부터 시작해 Java 설치, Git 클론, Gradle 빌드, 실행, 그리고 Nginx 설정까지 하나하나 직접 손으로 세팅했습니다.
가장 인상 깊었던 것은 헬스 체크 엔드포인트(
/actuator/health)를 열어두고 “UP” 메시지를 확인했을 때의 안도감이었습니다.
그 순간 비로소 “우리가 만든 서비스가 세상에 나왔다”는 실감이 들었습니다.
완전히 빈 서버(EC2)를 받았을 때, 처음부터 차근차근 배포하는 절차입니다.
ssh -i "내_키.pem" ec2-user@서버IP
sudo yum update -y
sudo yum install git -y
sudo yum install java-17-amazon-corretto -y
git clone https://github.com/팀저장소/ygup.git
cd ygup
./gradlew clean bootJar -x test
java -jar build/libs/ygup-0.0.1-SNAPSHOT.jar
등록 후 실행:
sudo systemctl daemon-reload
sudo systemctl start ygup
sudo systemctl enable ygup
sudo yum install nginx -y
sudo vi /etc/nginx/nginx.conf
server 블록 추가:
server {
listen 80;
server_name 서버IP 또는 도메인;
location / {
proxy_pass http://127.0.0.1:8080;
}
}
적용:
sudo systemctl restart nginx
curl http://서버IP/actuator/health
→ {"status":"UP"} 가 나오면 성공한 것입니다.
최초 배포 이후에는 이 간단한 사이클만 반복했습니다.
ssh -i "내_키.pem" ec2-user@서버IP
cd ~/ygup
git pull origin main
./gradlew clean bootJar -x test
sudo systemctl restart ygup
sudo systemctl status ygup -l
journalctl -u ygup -f
이렇게 하면 “코드 수정 → GitHub 반영 → 서버 반영”까지 한 번에 끝납니다.
배포 과정에서 예상치 못한 문제가 여럿 있었습니다. 가장 먼저 부딪힌 건 Gradle 빌드 에러였는데, 로컬 환경과 서버 환경의 JDK 버전이 달라서 발생한 문제였습니다. 이를 해결하기 위해 EC2에 OpenJDK 17을 새로 설치했고, 그제야 빌드가 정상적으로 통과되었습니다.
또 하나는 환경 변수 관리였습니다. 처음에는 단순히 코드에 하드코딩할 뻔했지만, API 키들이 노출되면 위험하다는 것을 알게 되어 .env 파일로 정리하고 불러오는 방식을 적용했습니다.
데이터베이스도 쉽지 않았습니다. 원래는 MySQL Workbench에 데이터를 넣어두었는데, EC2 서버에서 제 계정으로 접근할 수가 없었습니다. 결국 서버 자체에 MySQL을 새로 설치하고 그 안에 데이터를 다시 세팅해야 했습니다.
마지막으로 Nginx 리버스 프록시 설정에서도 애를 먹었습니다. 처음에는 요청이 제대로 전달되지 않아 한참 헤맸고, 결국 설정 파일 구조를 직접 뜯어보며 수정했습니다.
이 모든 과정에서 가장 크게 느낀 건, “내가 제대로 배포하지 못하면 팀 전체의 노력이 물거품이 될 수도 있다”는 압박감이었습니다.
대회 일정이 단 2~3일밖에 남지 않았다는 점도 힘들었습니다.
이번 경험을 통해 서비스는 코드 작성으로 끝나는 게 아니라, 실제 사용자에게 제공될 수 있을 때 비로소 완성된다는 사실을 깊이 깨달았습니다. 작은 설정 하나가 서비스 전체를 멈추게 할 수 있다는 것도 몸으로 배웠습니다. 무엇보다도, 문제를 마주했을 때 구글링과 공식 문서를 탐색하고, 팀원들과 소통하며 해결하는 능력이 얼마나 중요한지 실감했습니다.
“배포 담당은 팀 전체의 안정성을 책임지는 자리”라는 책임감을 느끼며, 개인적으로도 한 단계 성장할 수 있었습니다.
물론 아쉬움도 남았습니다. 배포를 수동으로 하다 보니 효율이 떨어지고, 반복 작업에서 실수가 나올 가능성도 컸습니다. 앞으로는 'CI/CD 자동화'를 도입해 GitHub Actions나 Jenkins를 공부해보고 싶습니다. 또한 AWS EC2 외에도 Vercel, Railway, Render 등 다양한 배포 환경을 직접 경험해보고 싶습니다. 장애 상황에 대비한 더 정교한 '롤백 플랜과 매뉴얼'을 준비하는 것도 앞으로의 목표입니다.
이번 해커톤 경험은 저에게 “배포까지가 진짜 개발이다”라는 큰 교훈을 남겼습니다.
다음 프로젝트에서는 더 빠르고 안정적인 배포 환경을 구축해, 팀원들이 안심하고 개발에 집중할 수 있도록 돕는 것이 제 목표입니다.
작성자.
윤시온 멋사 13기 _ 백엔드편집자.
박찬현 멋사 13기 백엔드
김가연 멋사 13기 프론트엔드