팥빵 먹으면서 코딩하는 블로그

[Spring Boot] AWS Lightsail로 배포하기 02 - jar파일 가상서버로 옮겨 실행하기 본문

project 일지/spring boot 01

[Spring Boot] AWS Lightsail로 배포하기 02 - jar파일 가상서버로 옮겨 실행하기

김팥빵_ 2025. 6. 3. 19:07

이전 포스트까지는 인스턴스를 생성하고 설정하는 것까지 해봤습니다.

이 포스트에서는 spring boot 프로젝트를 빌드해 jar파일을 만들고 이를 가상 서버로 옮겨 실행시키는 것까지 해보겠습니다.

 

먼저 내 프로젝트의 IDE로 가보겠습니다.

저는 인텔리제이를 쓰기 때문에, Intellij의 기준으로 설명드리겠습니다.

 

 

Spring 프로젝트 jar파일로 빌드하기

spring boot 프로젝트

 

IDE의 오른쪽에 보시면 코끼리 모양이 있습니다. Gradle이라고 합니다.

이것을 클릭해줍니다.

그런 다음, jar파일을 만들 수 있도록 빨간색 네모 중 bootJar을 눌러 이 프로젝트를 빌드시켜줍니다.

 

빌드 성공

 

빌드에 성공했다면 "BUILD SUCCESSFUL"이 뜰겁니다.

이제 jar 파일이 생성되었으므로 해당 파일이 존재하는 경로로 가봅시다.

 

 

프로젝트 폴더 최상위에서 /build/libs/ 경로로 들어가면 압축(Jar) 파일이 하나 있을 겁니다. 

 

일단 이 경로만 기억해두고 킵해둡시다.

 

 

Filezila로 가상 서버로 jar 파일 옮기기

우선, Filezila를 설치해줍시다.

다른 툴로는 winSCP라는 툴도 있고, 꼭 파일질라가 아니어도 되긴합니다.

 

filezila를 다운 받으셨다면 어플을 클릭해줍니다.

Filezila

 

뭔가... 복잡해보이죠..ㅎㅎ

근데 전혀 복잡하지 않아요! 파란 네모가 현재 내 컴퓨터이고, 오른쪽이 가상 서버가 될 예정입니다.

일단 가상 서버에 연결을 해야지 파란 네모에서 빨간 네모로 파일을 옮기겠죠?

 

사이트 관리자 열기

 

왼쪽 위에 빨간 네모상자 보이시죠?

저 버튼이 가상 서버 연결을 위한 사이트 관리자를 열어주는 버튼입니다. 눌러줍니다.

 

 

1. 새 사이트를 눌러 내 사이트 아래 새 사이트를 만들어줍니다.

2. 프로토콜 : SFTP

3. 호스트 : 아까 설정해둔 인스턴스의 static IP

4. 로그온 유형 : 키 파일

5. 사용자, 키파일 -> 이 부분을 알아내기 위해 다시 AWS Lightsail 인스턴스로 돌아갑시다.

 

해당하는 인스턴스에서 Connect 메뉴에 들어갑니다.

 

인스턴스 - Connect

 

아래에 "own SSH client" 부분이 보이실 겁니다.

 

여기서 filezila의 "사용자"는 Username 부분을 쓰시면 되고,

"키파일"은 SSH key의 디폴트 키를 다운 받으셔서 적당한 곳에 저장한 뒤 이 파일의 경로를 넣으시면 됩니다.

 

이제 filezila에서 연결을 눌러주시면 다음과 같이 서버가 연결된 걸 확인하실 수 있습니다.

 

 

아까 jar파일을 만든 경로로 들어가 해당하는 jar파일을 오른쪽, 가상 서버에 드래그해서 붙여넣으시면 됩니다.

전송 성공이 뜰 때까지 가만히 기다려 주시면 됩니다.

 

전송이 성공되었다면 가상서버로 jar파일이 무사이 전달된 겁니다.

다시 인스턴스로 돌아갑시다.

 

터미널 실행

인스턴스에 터미널 모양이 보이실 겁니다.

저 버튼을 눌러 터미널을 실행시킵시다.

 

먼저 자바를 설치해야합니다.

$ sudo apt update
$ sudo apt install openjdk-21-jdk

자바 버전은 프로젝트를 만들 때, 설정한 버전을 쓰시면 됩니다.

 

이 다음 자바 버전을 확인합니다.

$ java --version

자바와 함께 버전이 잘 뜨면 잘 설치된겁니다.

 

이제 ls를 적어 최상위에 있을 jar파일이 잘 있는지 확인해봅시다.

잘 있다면 다음 명령어를 기입해 실행시켜봅시다.

$ java -jar build/libs/<프로젝트폴더명>-0.0.1-SNAPSHOT.jar

 

로그가 잘 올라가고 문제가 없다면 잘 실행된겁니다!!

 

 

 

가상 서버 메모리 문제 해결

요금제를 싼 요금제를 쓰다 보니 프로젝트를 돌리기에 메모리가 한참 부족해서 실행 도중에 급작스레 killed 될 경우가 있을 겁니다.(제가 그랬거든요..ㅋㅋ)

시스템이 강제로 프로세스를 종료시킨 건데, 보통 메모리 부족 때문에 발생합니다.

 

  • 메모리 부족 (OOM, Out Of Memory)
    • Linux 기반 시스템에서 자바 어플리케이션이 과도한 메모리를 사용하면 커널이 OOM Killer로 프로세스를 종료시킵니다.
    • Lightsail의 인스턴스는 보통 메모리가 적기 때문에 자주 발생할 수 있습니다.

 

killed 원인 진단 방법

$ dmesg | grep -i kill

이 명령어는 lightsail ssh 접속 후에 터미널에서 기입해야 합니다.

명령어를 실행시키면 아마 다음과 같은 결과가 나올 겁니다.

Out of memory: Kill process 5515 (java) score 947 or sacrifice child
Killed process 5515 (java) total-vm:2048904kB, anon-rss:1909200kB, file-rss:420kB

이처럼 나오면 OOM으로 인한 KILL이 맞습니다!!

 

 

해결 방법

 

방법 1 : 메모리 제한 명시

 

제가 이번에 쓴 방법입니다.

Spring Boot JVM 메모리를 제한하는 방법입니다.

.jar 실행 시, JVM이 사용 가능한 전체 메모리를 다 쓰려고 하기 때문에 이를 제한하는 방법입니다.

$ java -Xmx256m -Xxms128m -jar your-app.jar
  • -Xmx : 최대 heap 메모리 (예: 256MB)
  • -Xms : 초기 heap 메모리

!메모리가 512MB ~ 1GB인 인스턴스라면 -Xmx256m 이하를 권장합니다!

 

이렇게 설정해서 돌아가면 참 좋겠죠!

전 이 방법을 쓰긴 했는데 여전히 메모리가 부족한가... 여전히 kill 되더라구요....(운다

그래서 Swap 공간도 따로 만들어줬습니다.

 

 

방법 2 : Swap 공간 만들기

 

lightsail 무료 요금제는 메모리가 매우...적기 때문에, 임시로 swap을 만들어주면 안정성이 높아집니다.

swap 공간 만드는 법은 다음 명령어를 따라하시면 됩니다.

# 1. 1GB(임의 변경 가능) 스왑 파일 생성
$ sudo fallocate -l 1G /swapfile

# 2. 권한 설정
$ sudo chmod 600 /swapfile

# 3. 스왑 영역 생성
$ sudo mkswap /swapfile

# 4. 스왑 활성화
$ sudo swapon /swapfile

# 5. 시스템 재부팅 후에도 유지되게
$ echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

# 6. 스왑 확인
$ free -h

 

저는 이렇게 방법 1과 방법 2를 병행했더니 잘 돌아갔습니다.

 

지금까지 jar 파일을 만들어 가상서버로 이전시킨 뒤, 이를 실행하는 것까지 알아봤습니다.

다음 포스트에서는 lightsail에서 데이터베이스를 만드는 방법에 대해 알아보겠습니다.