군만두의 IT 공부 일지

[1주차] 내일배움캠프 Spring 프로젝트 AWS - EC2, H2를 활용하여 배포하기 본문

개발일지/스파르타코딩클럽

[1주차] 내일배움캠프 Spring 프로젝트 AWS - EC2, H2를 활용하여 배포하기

mandus 2025. 2. 5. 19:29

목차

     

    ▲ MySelectShop 로컬 테스트 영상

     

    강의를 따라 만든 Spring 프로젝트가 로컬 환경(http://localhost:8080)에서 잘 돌아가는 것을 확인했다. 내일 오전 9시까지 이것을 배포하여 제출할 예정이다. 강의자료에서 제공하는 AWS의 EC2, RDS를 활용하여 배포하는 방법으로 MySelectShop 프로젝트를 배포하려고 했는데, 아래와 같은 공지를 발견했다.

     

    ▲ 내일배움캠프 Slack 공지방

    따라서 RDS를 사용하는 대신에 매니저님의 조언에 따라 AWS EC2와 H2 데이터베이스를 사용하여 배포를 시도해 보려고 한다. 배포는 여러 블로그를 참고하면서, 오류가 발생한 부분은 GPT한테 물어보면서 진행했다.

     

    용어 정리

    • Amazon RDS: 관리형 SQL 데이터베이스 서비스로, 데이터베이스 설정, 운영, 확장을 간소화한다.
    • Amazon EC2: 가상 서버를 클라우드에서 빠르게 배포하고 관리할 수 있는 서비스이다.
    • H2 데이터베이스: 자바 기반의 경량, 오픈 소스 관계형 데이터베이스로, 개발 및 테스트에 적합하다.

    1. AWS 회원가입하기

    2. H2 다운받기

    링크를 클릭하여 H2 데이터베이스를 다운로드받는다. 윈도우 환경에서는 Windows Installer을 클릭해서 h2-setup-2024-08-11.exe 파일을 실행하면 된다.

    3. AWS에서 EC2 인스턴스 생성하기

    대시보드에서 EC2를 검색해서 클릭한다. 그리고 왼쪽 메뉴에서 인스턴스를 클릭한다.

     

    ▲ EC2 검색

    사진처럼 인스턴스 시작 페이지가 나타나는데, 차례대로 설정하면 된다. 나는 아래 설정을 제외하고는 기본 설정 그대로 했다.

    - 이름: MySelectShop
    - Amazon Machine Image(AMI): Amazon Linux 2 AMI (HVM) - Kernel 5.10, SSD Volume Type
    - 키 페어 이름: shop
    - 보안 그룹: 사용자 지정 TCP - 8080 - 0.0.0.0/0

     

    ▲ 인스턴스 시작

    필요한 설정을 모두 입력한 후, 인스턴스 시작 버튼을 클릭한다. 그러면 아래 사진처럼 성공했다고 한다.

     

    ▲ 성공

     

    ※ 주의 ※

     

    1) 키 페어 생성 시 다운되는 pem 파일은 중요하니 삭제하지 않도록 조심한다.

     

     

    2) 네트워크 설정 시 보안 그룹에 8080 포트22 포트가 꼭 있어야 한다. SSH 접속과 스프링 애플리케이션을 실행하는 데 꼭 필요하기 때문이다. 나는 다 제거하고 80 포트만 추가했다가 뒤늦게 22 포트와 8080 포트를 추가했다. 초기에 잘 설정하지 않으면, 오류를 해결하느라 시간을 낭비하게 된다.

     

    4. EC2에 H2 연결하기

    먼저, git bash가 다운되어 있어야 한다. 그리고 스프링 프로젝트 build.gradle 파일과 application.properties 파일에 H2 관련 의존성을 추가해야 한다.

    // build.gradle 
    runtimeOnly 'com.h2database:h2'
    // application.properties
    spring.datasource.url=jdbc:h2:tcp://localhost/~/test;DB_CLOSE_DELAY=-1
    spring.datasource.driverClassName=org.h2.Driver
    spring.datasource.username=sa
    spring.datasource.password=
    spring.h2.console.enabled=true
    spring.h2.console.path=/h2-console

    최종적으로 작성된 스프링 애플리케이션이 잘 동작한다면, 터미널에서 프로젝트 폴더로 이동한 후 JAR 파일을 생성한다.

    // 터미널에서 프로젝트 폴더로 이동
    cd path/to/your-spring-project
    
    // Gradle 빌드 명령어 실행
    ./gradlew build

    빌드가 완료된 후 JAR 파일의 위치는 프로젝트 폴더의 /build/libs 디렉토리이다. 예) build/libs/your-app-name.jar

     

    이제, git bash에서 아래 명령어를 실행한다. 아래 명령어부터는 pem 파일의 경로pem 파일명, 퍼블릭 IPv4 주소만 자신의 것으로 바꿔서 입력하면 된다.

     

    참고로 Windows에서는 경로에 역슬래시(\)를 사용하지만, SSH 명령어에서는 경로에 슬래시(/)를 사용해야 한다. IPv4는 AWS EC2 대시보드에서 인스턴스를 클릭하면 확인할 수 있다.

    ssh -i "your-key.pem" ec2-user@your-instance-ip
    
    예) ssh -i "C:/Users/DESKTOP/Downloads/shop.pem" ec2-user@12.345.6.789

    명령어를 입력하면 사진처럼 EC2에 SSH 접속이 되는 것이 확인된다.

     

    여기서 자바 파일을 실행해야 하므로 아래 명령어로 EC2에 자바를 설치한다.

    // 자바가 설치되었는지 확인
    java -version
    
    // 자바 17(Amazon Corretto 17) 설치
    sudo yum install java-17-amazon-corretto -y

    설치가 완료되었다면, bash창을 다시 연다. 그리고 SCP를 사용하여 .jar 파일을 EC2 인스턴스로 업로드한다. 이때 나는 SSH 접속한 상태에서 SCP 명령어를 실행하여 계속 경로 탐색 실패 문제를 겪었었다.

    scp -i "C:/Users/DESKTOP/Downloads/shop.pem" "path/to/your-app.jar" ec2-user@12.345.6.789:/home/ec2-user/

    업로드가 되었다면 마지막으로 아래 명령어로 EC2에서 스프링 애플리케이션을 실행한다.

    java -jar your-app.jar

    사진처럼 스프링 애플리케이션이 실행되는 것을 확인했다. 잘 실행되었다면, 링크(http://12.345.6.789:8080)을 클릭하여 결과물을 확인할 수 있다.

     

    git bash 창을 닫아도 애플리케이션이 계속 돌아가게 하려면, nohup 명령어를 사용한다. nohup 명령어를 사용하면 애플리케이션을 백그라운드에서 계속 실행할 수 있다.

    nohup java -jar your-app.jar > app.log 2>&1 &

    실행하면 사진처럼 되면서, git bash 창을 닫아도 계속 유지되는 것을 확인할 수 있다.

     

     

    참고로 애플리케이션이 계속 실행되는지 확인하려면 로그 파일을 모니터링할 수 있다.

    tail -f app.log

    그리고 애플리케이션을 종료하려면 ps 명령어로 프로세스를 찾고, kill 명령어로 종료할 수 있다.

    // 프로세스 확인
    ps aux | grep myselectshop
    
    // 프로세스 종료
    kill -9 <process_id>

     

    드디어 과제를 제출했다. 혼자서 제대로 배포를 해본 경험은 처음이어서 오류가 발생할 때마다 어려웠다. 처음 시작할 때는 뭐부터 해야 할지 막막하는 생각도 들었지만, 글로 정리하고 나니까 나중에 문제가 생겼을 때 유용할 것 같다.

    ▲ 과제 제출 페이지

    ⭐참고자료

    1) porongporo, "Spring 프로젝트 AWS EC2 배포하기 - H2 DB 연결", 2023.03.20 , https://porolog.tistory.com/33

    2) jooong, "[AWS] EC2 알아보기 + 인스턴스 생성하기", 2022.08.11, https://velog.io/@kyj311/AWS-EC2-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0

     

    Comments