TIL

24.08.04 TIL - 윈도우 스프링 프로젝트 AWS 초 간단 배포

개발공명 2024. 8. 5. 14:41

 

오늘 배운 것

  • 윈도우에서 스프링 프로젝트 AWS에 배포하는 방법

 

개요

늘 웹 프로젝트를 진행하다 보면 배포에 대해서 안 들어볼 수가 없다. 

 

이전에는 배포에 대한 막연한 두려움이 있었던 것 같다. 

 

AWS에 대한 강의도 많고 배포에 대한 자료도 많아서 강의 듣고 공부하고 진행해야만 할 것 같았다. 

 

그래서 늘 프로젝트를 진행하고 '배포 해야 하는데 공부하고 진행해야지' 하면서 배포를 못했다. 

 

하지만 알고보니 아주 간단하게 배포할 수 있었다. 

 

이 글을 보고 배포에 대한 두려움을 덜어내도 좋을 것 같다. 

 

글을 작성하다 보니 주절주절 길게 작성한 것 같다.
바쁘신 분들은 빨간 글씨와 명령어만 빠르게 읽어도 될 것 같다. 
배포의 경험을 한 글에 담으려고 하다 보니 매우 길어진 것 같다....

 

 

배포 방법

AWS에 나의 프로젝트를 배포하는 방법은 여러가지가 있는 것 같다. 

 

Jar 파일을 사용한 배포, 도커를 사용한 배포 등등...

 

도커를 이용한 배포는 역시 도커를 공부하고 해야 한다는 생각에 시도해보지 못했다...

 

초 간단 배포이기 때문에 자바를 공부했다면 누구나 아는 Jar 파일을 사용한 배포를 볼 것이다. 

 

간단히 생각하면 Jar 파일을 AWS 서버 컴퓨터에서 실행 시킨다고 생각하면 될 것 같다. 

 

 

환경

우선 배포를 진행하려면 AWS EC2 인스턴스를 생성해야 한다. 

 

인스턴스를 생성하는 방법은 검색하면 굉장히 많이 나와있다. 

 

'AWS EC2 생성 방법' 이렇게 검색하면 될 것 같다. 

 

추후에 기회가 되면 작성해보겠다. 

 

이 EC2 인스턴스가 내 프로젝트를 계속 띄워 놓을 서버 컴퓨터라고 생각하면 될 것 같다. 

 

서버 컴퓨터이니 실행할 OS를 선택해야 한다. 

 

EC2 생성할 때 아래처럼 애플리케이션 및 OS 이미지 선택하는 부분이 있는데 Amazon Linux를 기준으로 작성하겠다. 

 

Ubuntu도 많이 사용하는 것 같다. 

 

비슷한 것으로 알지만 Amazon Linux와 Ubuntu에서 명령어가 조금 다를 수 있어 OS 이미지를 잘 선택해야 한다.

 

 

그리고 배포를 진행하는 나의 로컬 PC는 윈도우 운영체제이다. 

 

개발 고수 분들은 늘 맥북을 사용하지만 나같은 개발 초보는 익숙한 윈도우를 많이 사용하기 때문에 윈도우를 기준으로 작성하였다. 

 

 

순서

  1. 로컬 PC에서 스프링 프로젝트의 Jar 파일 생성
  2. 로컬 PC에서 EC2 서버에 접속
  3. 로컬 PC의 Jar 파일을 EC2 서버에 전송
  4. EC2 서버에 필요한 것들 설치 (Java, Redis 등등)
  5. EC2 서버에서 Jar 파일 실행

 

번외

  1. EC2 서버 port forwarding
  2. EC2 서버와 RDS 연결 (MySQL)

 

1. 로컬 PC에서 스프링 프로젝트의 Jar 파일 생성

 

우선 로컬 PC에서 스프링 프로젝트의 Jar 파일을 생성해야 한다. 

 

Jar 파일 생성하는 방법은

1. 아래처럼 스프링 프로젝트의 gradlew 파일이 있는 폴더로 가서 cmd를 실행하거나

2. cmd에서 해당 폴더로 이동해야 한다. 

 

 

 

그 후 아래 명령어를 치면 위의 build 폴더 안에 libs 폴더 안에 jar 파일이 2개 생성이 된다. 

 

gradlew clean build 

 

clean build 하면 기존 jar 파일이 사라져서 유지하고 싶다면 gradlew build 하면 된다. 

 

 

이 중 -plain이 붙지 않은 '프로젝트명-0.0.1-SNAPSHOT.jar' 파일을 사용하는 것이다. 

 

 

 

2. 로컬 PC에서 EC2 서버에 접속

이제 로컬 PC에서 EC2 서버에 접속을 해야 한다. 

 

ssh를 사용해 EC2 서버에 접속을 하는데 윈도우 10 이상 버전에는 기본적으로 OpenSSH 클라이언트가 포함되어 추가적인 소프트웨어 설치 없이 SSH 접속이 가능하다. 

 

하지만 혹시 윈도우 10 아래의 버전인 분도 있을 수 있고 또 이후에 사용하는 명령어들이 윈도우의 cmd나 powershell에서 안되는 경우도 많다. 

 

뭐 추가적으로 설치해야 하고 방법이 다르고 한 것이 많아서 Git Bash에서 이제 진행할 것이다. 

 

Git Bash는 Windows 환경에서 Bash 쉘을 제공하는 도구로, 기본적으로 리눅스/유닉스 계열의 쉘 명령어들을 사용할 수 있게해준다. 

 

괜히 개발자들은 맥북을 사용한다는 것이 아니였다..... 터미널을 사용해야 할 때 맥북이 훨씬 편하고 자료도 많은 것 같다

 

Git Bash는 Git을 설치하면 같이 설치되는 것으로 Git을 사용하고 있다면 설치되어 있을 것이다. 

 

그러면 Git Bash에서 아래 명령어 치면 된다 

 

ssh -i (pem파일 경로) ec2-user@(인스턴스IP)

 

 

pem 파일은 아래 그림처럼 EC2를 생성할 때 생성한 키 페어로 EC2 서버에 접속하기 위한 열쇠 같은 것이다. 

 

이 pem 파일이 없으면 EC2 서버에 접속할 수 없다. 

 

 

이 pem 파일은 사용자 홈 디렉토리의 .ssh 폴더에 저장해 놔야 한다. 

 

즉 /c/Users/(사용자 폴더)/.ssh/(키 페어 이름).pem 이 pem 파일 경로일 것이다. 

 

개인 PC마다 설정이 다를 수 있으니 자신 PC의 홈 디렉토리에 .ssh 폴더 만들고 거기에 키 페어 저장해두고 위의 명령어 사용하자. 

 

그리고 인스턴스 IP는 EC2의 인스턴스를 생성하고 아래 그림에 나와 있는 퍼블릭 IPv4 주소를 작성하면 된다. 

 

 

그러면 아래 화면과 같이 뜨면서 EC2 서버에 접속할 수 있을 것이다. 

 

 

3. 로컬 PC의 Jar 파일을 EC2 서버에 전송

이제 로컬 PC에서 만들어 놓은 Jar 파일을 이 EC2 서버에 전송하면 된다. 

 

위에서 Git Bash가 EC2 서버에 접속하는데 사용했기 때문에 저기서 바로 하면 안된다. 

 

Git Bash를 하나 더 실행 시켜서 아래 명령어를 작성하면 된다. 

 

scp -i (pem 파일 경로) (Jar 파일 경로) ec2-user@(인스턴스IP):/home/ec2-user

 

scp (Secure Copy)는 SSH 프로토콜을 사용하여 파일을 원격 서버와 로컬 시스템 간에 안전하게 복사하는 명령어이다. 

 

scp로 로컬 PC에서 EC2 서버로 내 Jar 파일을 복사 (전송) 하는 것이다. 

 

그러면 아래처럼 진행상황 나오면서 전송이 될 것이다. 

 

 

4. EC2 서버에 필요한 것들 설치 (Java, Redis 등)

EC2 서버에 Jar 파일이 복사가 되었다. 

 

그러면 이 Jar 파일을 EC2 서버에서 실행 시키면 된다. 

 

EC2 서버는 그냥 OS만 깔린 빈 컴퓨터이기 때문에 Jar 파일을 실행 시키려면 당연히 Java를 설치해야 한다. 

 

그래서 EC2 서버에서 Java를 설치하려면 아래 명령어를 치면 된다. 

 

sudo yum install java-17

 

그리고 y를 눌러 Java를 설치하면 된다. 


 

내 프로젝트에서는 Redis도 사용해서 EC2 서버에서 내 프로젝트를 실행하려면 Redis도 설치해야 했다. 

 

아래와 같은 명령어를 차례로 치면 된다. 

 

의미는 내가 참고한 블로그를 보면 될 것 같다. 

 

sudo dnf update -y

sudo dnf install redis6

sudo systemctl restart redis6

sudo systemctl enable redis6

 

 

참고한 블로그

https://dangdangee.tistory.com/entry/Redis-ec2%EC%97%90-%EB%A0%88%EB%94%94%EC%8A%A4-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0

 

[Redis] ec2에 레디스 설치하기

Amazon Linux 2023을 사용하는 ec2 인스턴스에 레디스를 설치해보고자 하였다. 대부분의 블로그에서는 다음과 같은 명령어로 레디스를 ec2에 설치하고 있었다. sudo wget http://download.redis.io/redis-stable.tar.g

dangdangee.tistory.com

 

 

5. EC2 서버에서 Jar 파일 실행

이제 다 왔다.

 

EC2 서버에서 Jar 파일을 실행하면 되는 것이다. 

 

원래 자바에서 하듯이 아래 명령어를 사용해도 된다. 

 

java -jar (jar 파일명)

 

 

그런데 이렇게 하면 Git Bash를 닫는 순간 프로그램도 종료가 된다. 

 

그렇다면 Git Bash를 계속 열어둬야 하는가? 

그러면 그냥 내 컴퓨터를 서버처럼 계속 켜두는 것과 다를게 없지 않나?

 

당연히 그렇지 않다. 

 

Git Bash를 종료해도 프로그램이 종료되지 않게 하려면 아래 명령어를 작성하면 된다. 

 

nohup java -jar (jar 파일명) &

 

각각 명령어에 대한 설명은 아래와 같다. 

 

nohup: 터미널 세션이 종료되더라도 해당 명령어의 실행을 계속하도록 해서 터미널을 종료해도 명령어가 종료되지 않게 해준다.

 

&: 명령어를 백그라운드에서 실행하도록 해서 터미널을 계속 사용할 수 있으며, 명령어의 실행 결과는 터미널에서 볼 수 없다.

 

 

그렇다면 명령어 실행 결과는 어떻게 봐야 하는가?

 

로그가 nohup.out이라는 파일에 작성이 되는데 이 파일을 실시간으로 보려면 아래와 같은 명령어 작성하면 된다. 

 

tail -f nohup.out

 

 

추후에 프로그램을 종료 시키고 싶으면 어떻게 해야 하는가?

 

Git Bash를 꺼도 ctrl+c를 눌러도 프로그램은 꺼지지 않는다. 

 

이럴 때에는 프로그램이 실행되고 있는 프로세스를 직접 종료 시키면 된다. 

 

내 프로그램이 실행되고 있는 프로세스를 아는 방법은 아래 명령어 치면 된다. 

 

ps aux | grep java

 

이때 2번째에 나오는 것이 PID = 프로세스의 ID이다. 

 

 

이제 프로세스를 종료하려면 아래 명령어 작성하면 된다. 

 

kill (PID)

 

 

번외

1. EC2 서버 port forwarding

이제 EC2 서버에서 내 Jar 파일이 계속 실행되고 있는 것이다. 

 

어찌보면 백엔드 서버가 된 것이다. 

 

이제 프론트엔드 서버에서 백엔드 서버로 요청을 보낼 때 앞에서 본 퍼블릭 IPv4 주소로 보내면 된다. 

 

그런데 뒤에 :8080을 붙여야 한다.

 

또 내가 도메인 이름을 구입해 적용을 해도 예를 들어 https://naver.com:8080 이렇게 보내야 한다. 

 

뒤에 :8080 붙는 것이 난 굉장히 거슬렸다. 

 

그래서 알아보니 port forwarding을 하면 된다고 한다. 

 

그냥 https://naver.com 이렇게 한다면 즉 주소에 포트를 붙이지 않으면 80번 포트가 지정이 된다. 

 

그래서 80번 포트로 요청이 왔을 때 8080번 포트로 요청 넘겨주는 것이 port forwarding이다. 

 

 

port forwarding을 해주려면 우선 80번 포트도 열어줘야 한다. 

 

AWS EC2 홈페이지 가서 보안 그룹에 인바운드 규칙에 가서 인바운드 규칙 편집을 아래처럼 해주면 된다. 

 

 

 

그리고 다시 EC2 서버로 돌아와서 아래 명령어를 작성해주면 된다. 

 

sudo yum install iptables 

sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080

 

각각 iptables를 설치하는 명령어port forwarding을 하는 명령어이다. 

 

Amazon Linux에서는 이 명령어를 사용해야 한다. 

 

이 port forwarding 명령어 관련해서 여러 명령어가 돌아다닌다. 

 

그런데 그 중 Ubuntu에서 되는 명령어가 있고 Amazon Linux에서 되는 명령어가 있는 것 같다. 

 

유사해서 헷갈리는 경우가 많은데 아래의 명령어가 Ubuntu에서 port forwarding 하는 명령어다. 

 

iptables -t nat -A PREROUTING -i enX0 -p tcp --dport 80 -j REDIRECT --to-port 8080

 

Ubuntu의 경우에도 버전에 따라 아키텍처에 따라 명령어가 조금씩 다르다고 한다. 

 

참고한 블로그들도 같이 보면 좋을 것 같다. 

 

https://velog.io/@as9587/AWS-EC2-Amazon-Linux-2023-OS-%ED%8F%AC%ED%8A%B8-%EB%A6%AC%EB%8B%A4%EC%9D%B4%EB%A0%89%ED%8A%B8port-redirect-%ED%95%98%EB%A9%B0-%EB%B0%9C%EC%83%9D%ED%95%9C-%EC%9D%B4%EC%8A%88-%EC%A0%95%EB%A6%AC

 

[AWS EC2 - Amazon Linux 2023 OS] 포트 리다이렉트(port redirect )하며 발생한 이슈 정리

AWS EC2의 포트 리다이렉트를 하면서 겪은 이슈를 이야기 하고, 어떤 것이 문제였는지 알아보겠습니다.제가 진행중인 사이드 프로젝트를 AWS EC2에 배포 후, 80 포트로 접속을 하더라도 8080포트로 접

velog.io

 

https://promisingmoon.tistory.com/190

 

24/08/02(금) 91번째 TIL : EC2 Ubuntu 포트포워딩

문제강의 자료에 나온대로 포트포워딩을 진행했지만 실제로는 포트포워딩이 되지 않았다. 상황강의 자료에 나온 명령어는 다음과 같다. sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT

promisingmoon.tistory.com

 

 

2. EC2 서버와 RDS 연결 (MySQL)

백엔드 서버라면 DB를 거의 사용한다고 생각한다. 

 

서버에 프로젝트를 배포를 하고 DB는 내 로컬 PC의 것을 사용하면 당연히 안될 것이다. 

 

그렇다면 EC2에 MySQL을 설치해서 사용해야 하나 싶었다. 

 

 

그런데 알아보니 RDS라는 것이 있었다. 

 

RDS는 "Relational Database Service"의 약자로, AWS에서 제공하는 관리형 관계형 데이터베이스 서비스다.

 

RDS를 사용하면 DB 서버의 설치, 유지 관리, 백업, 확장 등 복잡한 작업을 자동화하여 쉽게 DB를 운영할 수 있다.

 

DB도 AWS의 것을 사용하고 EC2 인스턴스와 연결하는 것이다. 

 

 

RDS 생성하는 것도 많은 자료들이 있으니 따라서 해보도록 하자. 

 

RDS를 생성하면서 아래 그림의 마스터 사용자 이름, 마스터 암호, 초기 데이터베이스 이름을 잘 기억해두자. 

 

 

 

그리고 스프링 프로젝트로 와서 application.properties에 아래의 것들을 넣으면 된다. 

 

spring.application.name=(초기 데이터베이스 이름)
spring.datasource.username=(마스터 사용자 이름)
spring.datasource.password=(마스터 암호)
spring.datasource.url=jdbc:mysql://(엔드포인트):3306/(초기 데이터베이스 이름)

 

여기서 엔드포인트는 RDS를 생성하면 아래 그림에 있는 부분이다. 

 

 

아니면 인텔리제이의 DB 탭 가서 아래 부분을 설정해도 된다. 

 

host = 엔드포인트

database = 초기 db 이름

user = 마스터 사용자 이름

password = 마스터 암호

 

정리

이렇게 스프링 프로젝트를 AWS에 배포하고 DB까지 연결하는 것을 보았다. 

 

한 글에 다 쓰고 싶어서 너무 길어진 것 같다. 

 

그리고 글이 잘 읽힐지 모르겠다.

 

틀린 부분이나 안되는 부분이 있다면 알려주시면 감사하겠습니다!