문제 발생
프로젝트를 배포 해놓은 후 변경사항이 있을 때 서버환경에서 쉽게 변경사항을 적용하기 위해
아래와 같은 쉘 스크립트를 만들고 실행하였다!
하지만 언제부턴가 스크립트를 실행하면 build를 하는 도중 서버가 먹통이 된다는 것을 알게 되었다!
그래서 처음으로 생각해낸 방법이 인스턴스를 중지 후 다시 시작하는 것이었다.
하지만 매번 이렇게 인스턴스를 중지 -> 시작 할 수 없기에 다른 방법을 찾아보았다.
#!/bin/bash
REPOSITORY=/home/ubuntu
PROJECT_NAME=PublicPlace_BE
cd $REPOSITORY/$PROJECT_NAME
echo "> Git Pull"
git pull
echo "> 프로젝트 Build 시작"
./gradlew clean bootjar
echo "> step1 디렉토리 이동"
cd $REPOSITORY
echo "> Build 파일 복사"
cp $REPOSITORY/$PROJECT_NAME/build/libs/*.jar $REPOSITORY/
echo "> 현재 구동적인 애플리케이션 pid 확인"
CURRENT_PID=$(pgrep -f ${PROJECT_NAME}.*.jar)
if [ -z "$CURRENT_PID" ]; then
echo "> 현재 구동 중인 애플리케이션이 없으므로 종료하지 않습니다."
else
echo "> kill -15 $CURRENT_PID"
kill -15 $CURRENT_PID
sleep 5
fi
echo "> 새 애플리케이션 배포"
JAR_NAME=$(ls -tr $REPOSITORY/ | grep jar | tail -n 1)
echo "> JAR Name: $JAR_NAME"
nohup java -jar $REPOSITORY/$JAR_NAME > backend.log 2>&1 &
해결방법
새로운 방법을 찾기 위해 인터넷을 찾던 도중 EC2 인스턴스에 메모리가 부족해서 이런 현상이 발생한다는 것을 알게 되었다.
그러던 와중에 문득 정보처리기사를 공부 할 때와 작년 운영체제 수업에서 들었던 가상 메모리가 생각이 났다

스왑 메모리란?
스왑 메모리는 컴퓨터 시스템에서 물리 RAM(주메모리)이 부족할 때 사용하는 디스크 공간이다.
RAM에서 사용되지 않는 데이터를 일시적으로 저장함으로써, 실제 메모리를 사용할 수 있게 돕는다.
스왑 메모리의 장점
- 비용 효율
- 추가 RAM을 구매하지 않고도 디스크 공간을 활용하여 메모리 용량을 늘릴 수 있다
- 시스템 유연성
- 시스템의 메모리 관리에 더 많은 유연성을 제공하며, RAM 사용이 최적화되도록 돕는다
- 작업 연속성 보장
- 메모리가 부족할 때 프로그램이 강제 종료되는 것을 방지하고, 사용자가 다수의 애플리케이션을 동시에 실행 할 수 있게 한다
그래서 어떻게 사용할까?
1. 스왑 파일 생성
sudo dd if=/dev/zero of=/swapfile bs=128M count=16
sudo dd: 관리자 권한으로 데이터를 복사한다
if=/dev/zero: 스왑 파일에 모두 0으로 채워진 데이터를 생성한다
of=/swapfile: 출력 파일을 /swapfile로 지정, 새롭게 생성된 스왑 파일
bs=128M count=16: 128MB 블록을 16번 작성 128MB x 16 = 2048MB, 즉 2GB 크기의 스왑 파일이 생성
2. 스왑 파일에 대한 권한 설정
sudo chmod 600 /swapfile
chmod 600 /swapfile: 관리자 권한으로 스왑 파일의 권한으로 소유자만 읽고 쓸 수 있도록 설정한다
3. 스왑 영역으로 설정
sudo mkswap /swapfile
mkswap /swapfile: 관리자 권한으로 스왑 파일을 스왑 영역으로 초기화하여 사용을 준비한다
4. 스왑 사용 시작
sudo swapon /swapfile
swapon /swapfile: 관리자 권한으로 스왑 파일을 활성화하여 스왑 메로리를 사용하기 시작한다
5. 스왑 상태 확인
sudo swapon -s

6. 재부팅 후에도 스왑이 유지되도록 설정
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
echo '/swapfile none swap sw 0 0': 스왑 파일 마운트 정보를 출력
| sudo tee -a /etc/fstab: /etc/fstab 파일에 위 내용을 추가해, 부팅 시 스왑 파일을 자동으로 마운트
느낀점
이제 프로젝트 변경사항을 손쉽게 배포된 서버에 적용할 수 있게 되었다!!!
처음 접하는 내용을 적용한 것이 아니라 내가 정보처리기사나, 학교 수업에서 배우고 공부했던 것들을 이렇게 적용할 수 있다는 점이 알게 모르게 뿌듯했다...ㅎ
참고
https://rebugs.tistory.com/654
[AWS EC2] 프리티어 인스턴스 사용시 Gradle build 시 무한 로딩 오류
환경-OS : Ubuntu 24.04 LTS (GNU/Linux 6.8.0-1008-aws x86_64) (프리티어)-인스턴스 유형 : t2.micro(1 GiB 메모리), (프리티어)-스토리지(ELB) : 1 x 30 GiB(gp3) 문제 상황./gradlew clean build위 명령어를 통해서 스프링부트
rebugs.tistory.com
https://thisisjoos.tistory.com/638
컴퓨터 구조와 Swap Memory (스왑 메모리)
CPU (Central Processing Unit) 컴퓨터의 "두뇌"로, 모든 명령어의 실행과 데이터의 처리를 담당한다. 이는 프로그램의 명령어를 해석하고, 산술 및 논리 연산을 수행하는 장치이다. 주 메모리 :: RAM (Random
thisisjoos.tistory.com
'백엔드 > AWS' 카테고리의 다른 글
| [AWS] EC2 내부 MariaDB 시간 설정 (1) | 2024.09.18 |
|---|---|
| [AWS] EC2를 이용한 서버 구축 6 (RDS mariaDB) (0) | 2024.07.09 |
| [AWS] 가상 서버에 내장 DB설치 (EC2, MariaDB) (0) | 2024.07.07 |
| [AWS] 포트 포워딩 (0) | 2024.07.07 |
| [AWS] EC2를 이용한 서버 구축 5 (Git과 배포 스크립트를 통한 프로젝트 배포) (0) | 2024.07.06 |