AWS와 Mobaxterm을 사용하여 Spring Boot 프로젝트를 JAR 파일로 배포하는 과정을 처음부터 차근차근 기록해 보려고 한다.
Spring Boot 프로젝트를 AWS에서 배포하는 방법이 처음에는 복잡해 보일 수 있지만, 익숙해지면 꽤나 간단한 작업이다.
Gradle을 사용해 보기도 하고, WAR 파일로 내보내 보기도 하고, pom.xml 파일과 application.properties 파일을 계속 수정해 가면서 파일을 배포하기도 하면서 시행착오가 있었다.
만약 서버에 Spring Boot 프로젝트를 배포하는데 어려움을 겪고 있다면 이 글이 도움이 되길 바란다.
프로젝트 배포 단계
- AWS EC2 인스턴스 설정
- Spring Boot 프로젝트 빌드
- MobaXterm을 사용한 웹 애플리케이션 배포
크게 위 3단계를 거쳐 웹 애플리케이션을 서버에 배포해 보도록 하겠다.
💡AWS
2023.12.05 - [Programming/AWS] - [AWS] Amazon Web Services 가입하기
위 글을 참고하여 Amazon Web Services 가입을 완료한다.
아마존 웹 서비스란?
아마존 웹 서비스는 아마존닷컴의 클라우드 컴퓨팅 사업부이다. 아마존 웹 서비스는 다른 웹 사이트나 클라이언트 측 응용 프로그램에 대해 온라인 서비스를 제공하고 있다.
AWS는 클라우드 컴퓨팅을 제공하며, 한 마디로 정의하기에는 사업의 범위가 어마어마하게 넓기 때문에 하나로 정의하기는 힘들다.
💡인스턴스 생성하기
2023.12.05 - [Programming/AWS] - [AWS] 설정하기: 인스턴스 생성, IAM 설정, MFA 설정
위 글을 참고하여 AWS 인스턴스를 생성해 보도록 하자.
AWS에 가입하고 EC2를 검색하여 EC2 대시보드로 들어온다.
인스턴스를 생성하기 전에 먼저 보안 그룹과 키 페어를 생성하려고 한다.
EC2란?
Amazon Elastic Compute Cloud(Amazon EC2)는 Amazon Web Services(AWS) 클라우드에서 확장 가능 컴퓨팅 용량을 제공한다.
Amazon EC2를 사용하면 사용자는 인스턴스(가상 컴퓨팅 환경)에서 가상 서버의 크기, 운영 체제, 네트워크 설정 등을 사용자 정의할 수 있다. 또한 AWS의 다양한 보안 및 네트워킹 기능을 활용하여 인프라를 안전하게 구성할 수 있다.
보안 그룹 생성
보안 그룹은 인스턴스에 대한 인바운드 및 아웃바운드 트래픽을 제어하는 가상의 방화벽 역할을 한다.
보안 그룹 이름 및 설명 작성
보안 그룹 이름을 launch-wizard-1로, 설명을 For Spring Boot로 작성하였다.
인바운드 규칙 설정
인바운드 규칙은 외부에서 해당 보안 그룹에 속한 인스턴스로 들어오는 네트워크 트래픽을 제어하므로, 특정 포트와 프로토콜에 대한 허용 또는 거부를 설정하여 외부에서 인스턴스에 접근하는 것을 허용하거나 제한할 수 있다.
인바운드를 허용할 포트를 입력하고, CIDR 블록을 설정한 후 규칙 저장 버튼을 클릭한다.
아웃바운드 규칙 설정
아웃바운드 규칙은 서버에서 외부로 나가는 규칙을 의미하며, 만들지 않아도 알아서 설정되므로 특별한 경우가 아니라면 따로 설정하지 않아도 된다.
태그는 Amazon EC2 리소스에 할당할 수 있는 메타데이터를 의미한다. 이제 보안 그룹 생성 버튼을 클릭한다.
키 페어 생성
EC2는 키 페어를 사용하여 AWS는 퍼블릭 키를 저장하고 사용자는 개인 키를 안전한 장소에 보관하는 방식으로 인스턴스 로그인 정보를 보호한다.
인스턴스에서 설정할 키 페어의 이름을 ec2-linux으로 하고, 키 페어 유형은 RSA, 프라이빗 키 파일 형식은 .ppk로 해 주었다.
키 페어를 생성하면 .ppk 파일을 자동으로 다운로드하는데, 나중에 MobaXterm에서 사용하기 때문에 잘 보관하고 있어야 한다.
왜 .ppk 형식으로 해야 하는가?
.ppk 형식으로 해야 하는 이유는 .pem 형식으로 키 페어를 생성한 경우 파일을 다시 .ppk로 변경해야 하는 일이 발생하기 때문이다.
PuTTY에서는 기본적으로 Amazon EC2가 생성하는 프라이빗 키 형식(.pem)을 지원하지 않는다. 따라서 PuTTY를 사용해 인스턴스에 연결하려면 프라이빗 키를 .ppk 파일로 변환하는 추가 작업이 필요하므로, 생성하는 시점에서 .ppk 형식으로 설정하였다.
인스턴스 시작
인스턴스명은 보안 그룹과 키 페어처럼 자유롭게 작성하면 된다. 나는 Isaac's Web Server로 했다.
Quick Start에서 AMI를 Ubuntu Server 22.04 LTS로 선택했다.
키 페어와 보안 그룹 선택
앞서 생성한 키 페어와 보안 그룹을 선택한다.
스토리지 구성
프리 티어는 최대 용량을 30GB까지 설정할 수 있다.
그 이상으로 사용하게 되면 비용이 발생한다.
인스턴스 생성 완료
인스턴스 시작 버튼을 누르면 설정한대로 인스턴스 생성이 완료된다. 여기서 기억하고 있을 것은 퍼블릭 IPv4 주소이다.
탄력적 IP 주소(EIP)는 동적 클라우드 컴퓨팅을 위한 고정 IPv4 주소로, 인스턴스를 재실행할 때 IP 주소가 변경되는 것을 방지하는데, 탄력적 IP 주소를 할당받고 사용하지 않을 경우 비용이 발생하는 것으로 알고 있다.
참고로 서버를 중지할 수 있고, 종료할 수 있는데, 종료는 서버를 삭제하는 것을 의미하기 때문에 주의하도록 한다.
💡Ubuntu, WSL, ELK
2023.12.06 - [Programming/AWS] - [AWS] Elasticsearch 사용을 위한 Ubuntu, WSL 설치
2023.12.06 - [Programming/AWS] - [AWS] Elasticsearch 개념, ELK 설치
만약 AWS에서 Elasticsearch를 사용할 예정이라면 위 글을 참고한다.
ELK 스택을 사용하지 않는다면 바로 MobaXterm 설치로 넘어가도록 하자.
Ubuntu
Ubuntu는 오픈 소스 리눅스 운영 체제 중 하나로, 안정성과 신뢰성이 높아 다양한 개발 및 운영 환경에서 널리 사용된다.
WSL
WSL은 Windows Subsystem for Linux의 약어로, WSL을 통해 사용자는 Windows 운영 체제에서 Linux 환경을 실행할 수 있다. 따라서 Elasticsearch를 개발하거나 테스트하는 데 Windows 환경을 사용하는 경우 WSL을 설치하여 Linux 명령을 실행하고 Elasticsearch를 실행할 수 있다.
ELK
ELK는 Elasticsearch, Logstash, Kibana의 약어로, 데이터를 수집, 저장, 검색 및 시각화하기 위한 오픈 소스 도구 모음이다. Elasticsearch는 데이터를 검색하고 분석하는 엔진이며, Logstash는 다양한 소스에서 데이터를 수집하고 변환하여 Elasticsearch로 전송하는 데이터 수집 도구이다. Kibana는 Elasticsearch 데이터를 시각적으로 탐색하고 분석하기 위한 대시보드 및 시각화 도구이다.
💡MobaXterm
2023.12.07 - [Programming/AWS] - [AWS] Ubuntu Server, mobaxterm
위 글을 참고하여 MobaXterm 설치를 완료한다.
MobaXter에서 SSH를 사용하여 22 포트로 접속할 예정이다.
MobaXterm이란?
MobaXterm은 윈도우 환경에서 리눅스 및 Unix 시스템과의 원격 연결 및 작업을 용이하게 할 수 있는 종합적인 터미널 소프트웨어이다. SSH, RDP, X11, SFTP, FTP, 브라우저, 탐색기 등 다양한 프로토콜과 도구를 하나의 통합된 환경에서 제공하여 시스템 관리자 및 개발자가 원격 시스템에 접근하고 작업할 수 있도록 도와준다.
Session settings
좌측 상단의 Session 버튼을 클릭한다.
Remote host에 AWS 인스턴스를 생성하고 얻은 퍼블릭 IPv4 주소를 입력하고, username은 기본적으로 ubuntu로 설정되므로 ubuntu를 입력한다.
User private key에는 키 페어를 생성하고 받은 .ppk 파일을 첨부하면 된다.
타임존 확인
timedatectl
sudo timedatectl set-timezone Asia/Seoul
sudo apt update
세션이 해외로 설정되어 있는 상태이므로 Asia/Seoul로 업데이트한다.
MobaXterm 환경 구축
2023.12.13 - [Programming/AWS] - [AWS] MobaXterm을 이용한 Spring과 Elasticsearch 환경 구축
위 글을 참고하여 MobaXterm 환경을 구축한다. 패키지 업데이트부터 자바 설치, Tomcat 설치까지 코드와 함께 작성하였기 때문에 그대로 진행하면 된다.
2023.12.06 - [Programming/AWS] - [AWS] Elasticsearch 사용을 위한 Ubuntu, WSL 설치
중간에 리눅스 명령어를 사용하는데, exit 등의 상황에 따라 필요한 명령어가 있다. 이 경우에는 위 글의 리눅스 명령어를 참고하면 된다.
💡Spring Boot 프로젝트 서버에 배포하기
MobaXterm 설정까지 마쳤다면 이제 프로젝트의 JAR 파일을 생성할 차례이다.
가상 컴퓨터의 DB를 사용한다면 application.properties를 참고하며, 별다른 설정할 게 없을 경우 바로 "자바 버전 문제 해결" 단계로 넘어가도 무방하다.
AtlanBankApplication.java
Spring Security를 해제하고 싶을 경우
package com.test.bank;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
@SpringBootApplication
@MapperScan(basePackages = { "com.test.bank.event.mapper", "com.test.bank.benefit.mapper", "com.test.bank.news.mapper", "com.test.bank.member.mapper", "com.test.bank.ticket.mapper", "com.test.bank.card.mapper", "com.test.bank.forex.mapper", "com.test.bank.loan.mapper", "com.test.bank.deposit.mapper" })
public class AtlanBankApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(AtlanBankApplication.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(SpringApplication.class);
}
}
@SpringBootApplication(exclude = SecurityAutoConfiguration.class)
Spring Security를 적용하고 싶지 않다면 @SpringBootApplication을 위와 같이 수정하여 배포하면 된다.
SpringApplicationBuilder 메서드
SpringApplicationBuilder 메서드는 Spring Boot 프로젝트를 WAR 파일로 배포할 때 필요한 특정 설정을 구성하기 위해 오버라이드한다. 외부에서 WAR 파일을 실행할 수 있도록 SpringApplicationBuilder 객체를 반환하므로 JAR 파일이 아닌 WAR 파일로 배포할 때 사용하면 된다.
application.properties
# Server Port
server.port=8090
# JSP
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
server.servlet.context-path=/atlanbank
# JDBC + MyBatis
spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
spring.datasource.url=jdbc:oracle:thin:@퍼블릭 IPv4:1521:xe
spring.datasource.username=hr
spring.datasource.password=java1234
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.maximum-pool-size=20
spring.datasource.hikari.idle-timeout=30000
spring.datasource.hikari.max-lifetime=2000000
spring.datasource.hikari.connection-timeout=30000
# Thymeleaf
spring.thymeleaf.enabled=true
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html
spring.thymeleaf.encoding=UTF-8
spring.thymeleaf.mode=HTML
spring.thymeleaf.check-template=true
spring.thymeleaf.check-template-location=true
spring.thymeleaf.cache=true
mybatis.configuration.map-underscore-to-camel-case=true
가상 컴퓨터에 Oracle을 설치하여 DB를 사용할 것이기 때문에 접속할 Oracle의 주소도 퍼블릭 IPv4로 변경한다.
pom.xml
JAR 파일명 변경
<build>
<finalName>atlanbank</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
pom.xml 파일에서 <finalName> 요소를 설정하면 생성되는 JAR 파일의 이름을 변경할 수 있다. 기본적으로 스프링 부트 프로젝트를 빌드하면 JAR 파일의 이름은 <artifactId>-<version>.jar로 생성된다.
이를 활용하면 더 간결한 이름으로 JAR 파일을 관리하거나, 여러 버전의 JAR 파일을 구분하기 쉽게 만들 수 있다.
자바 버전 문제 해결
Error: LinkageError occurred while loading main class org.springframework.boot.loader.launch.JarLauncher
java.lang.UnsupportedClassVersionError: org/springframework/boot/loader/launch/JarLauncher has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 55.0
sudo apt update
sudo apt install openjdk-17-jdk
java.lang.UnsupportedClassVersionError는 JAVA 버전이 달라서 발생하는 오류이다. 이 경우에는 Spring Boot와 MovaXterm의 자바 버전을 동일하게 맞춰주도록 한다.
Maven build
프로젝트를 마우스 오른쪽 클릭하고, Run AS의 Maven build를 클릭한다.
Edit Configuration
Goals에 clean install을 입력하고, Skip Tests, Apply를 체크, Run 버튼을 클릭한다.
JAR 파일 생성 완료
콘솔에 BUILD SUCCESS가 출력되며 target 폴더에 JAR 파일이 생성되었다.
JAR 파일 압축 해제
java -jar bank-0.0.1-SNAPSHOT.jar
이 파일을 MobaXterm에서 /home/ubuntu/ 경로에 옮기고, 터미널에서 JAR 파일을 압축 해제하는 코드를 입력한다.
- http://localhost:8090/atlanbank/index.do?continue
- http://퍼블릭 IPv4:8090/atlanbank/index.do?continue
보기에는 동일한 웹 페이지지만, 첫 번째는 localhost, 두 번째는 서버에 올라간 웹 페이지라는 것을 알 수 있다.
이로써 Spring Boot 웹 애플리케이션을 서버에 올리는 것을 완료하였다. 만약 서버를 중지하고 싶다면 MobaXterm을 종료하거나 터미널에서 Ctrl + C 단축키를 입력하면 된다.
이 방법으로도 서버에 배포할 수 있긴 하지만, 다양한 방법이 있는 만큼 다음에는 Docker, Gradle 등의 도움을 받아 보려고 한다.
참고 자료
자습서: Amazon EC2 Linux 인스턴스 시작, AWS, 2024.02.10.
보안 그룹: 인바운드 및 아웃바운드 규칙, AWS, 2024.02.10.
Windows 및 Linux에서 .pem 파일을 .ppk로 변환하거나 .ppk에서 .pem으로 변환하려면 어떻게 해야 하나요?, AWS, 2024.02.10.