ToBe끝판왕

[ AWS ] SpringBoot 프로젝트 AWS EC2 인스턴스 WAR 배포 정리 본문

■ Programming Skills/AWS

[ AWS ] SpringBoot 프로젝트 AWS EC2 인스턴스 WAR 배포 정리

업그레이드중 2025. 1. 22. 20:51
반응형



 


 

💡  AWS EC2 서버 인스턴스를 하나 구매해서 서버 배포해보기 !

※ EC2

Amazon EC2는 Amazon Web Services(AWS)의 클라우드 컴퓨팅 서비스 중 하나이다.
EC2는 Elastic Compute Cloud의 약자로, 가상서버를 제공하여 사용자가 필요에 따라 확장하거나
축소할 수 있는 유연한 컴퓨팅 환경을 제공한다.

※  인스턴스

인스턴스는 Amazon EC2에서 실행되는 가상 서버이다. 하나의 VM이라고 이해해도 무방하다.
원하는 운영체제(OS)를 선택할 수 있으며, 용량, 성능, 스토리지 등을 설정할 수 있다.
인스턴스는 고유한 식별자인 인스턴스 ID를 가지며, IP 주소와 DNS 이름을 할당받아
네트워크에 연결된다.

 

 

 

✅  AWS 세팅하기

 

1)  인스턴스 시작

 

▶️  AWS 홈페이지

•  AWS 홈페이지에서 지역은 아시아 태평양(서울) 로 지정

•  AWS 에서 EC2 항목으로 들어간다.

•  [ 인스턴스 시작 ] 버튼 클릭

 

 

 


 

 

▶️  인스턴스 생성

•  생성할 EC2 인스턴스의 이름을 정해주는 항목

•  프리티어가 제공되는 OS인 Ubuntu LTS 선택

 

※  인스턴스 유형은 프리티어를 사용하고 있다면 t2.micro 로 설정해주셔야 합니다.다른 유형으로 설정하면

     과금요소가 추가됩니다.

 

 

 


▶️  키페어 생성

•  EC2에 원격으로 접속하기 위한 필수 요소

•  한번 다운로드 받으면 재다운로드가 불가하므로 잘 보관하여야 함

•  키페어 생성을 눌러 이름과 설정을 하고 다운로드를 받도록 한다.

 

※  Windows 환경에서 Putty를 통해 EC2 인스턴스에 연결하기 위해선 .ppk 형식의 키페어 필요

 

 

 


 

 

▶️  네트워크 및 스토리지 세팅

•  보안 그룹은 추후에 따로 생성해서 세팅해줄 예정이니 넘어갑니다

•  SSH 통신으로 선택하며 이곳저곳에서 접속하기 위해서 IP 위치무관으로 선택

•  프리티어는 최대 30 GIB 까지 지원해주므로 30으로 설정해줍니다.

   (옆의 어드밴스드 탭에서 상세 설정이 가능합니다.)

•  볼륨 유형은 범용 SSD 로 선택

   

❗  만약 Provisioned IOPS SSD (프로비저닝된 IOPS SSD) 를 선택한다면 사용하지 않아도 활성화한 기간만큼

      계속 비용이 발생하게 되므로 프리티어를 사용한다면 주의가 필요하다.

 

 

 


 

 

▶️  인스턴스 최종 생성 및 확인

•  [ 인스턴스 시작 ] 버튼 누르고 최종적으로 인스턴스 생성

•  인스턴스가 생성된것을 AWS 홈페이지 인스턴스에서 확인 가능하다.

 

※  자신이 선택한 항목들이 적용되었는지 간단히 확인

 

 

 

 

 

 


 

 

2)  보안그룹 수정

💡  보안그룹이란 ?

-  인바운드 규칙 ( Inbound )
:  외부에서 EC2 나 RDS 등의 내부로 접근할때 사용되는 방화벽 규칙


-  아웃바운드 규칙 ( Outbound )
:  EC2나 RDS 등의 내부에서 외부로 접근할때 사용되는 방화벽 규칙

 

 

 

▶️  보안그룹 생성

•  EC2에 접속해서 서버를 띄울것 이기 때문에 인바운드 규칙만 세팅하도록 한다.

•  아웃바운드 규칙 추가를 눌러 아래 사진과 같이 규칙을 추가한다.

•  스프링부트 기반 프로젝트이므로 포트번호를 8080으로 설정하고 url을 누구나 접근할 수 있도록 

   [  Anywhere-Ipv4  ] 로 설정

•  SSH , HTTP , HTTPS 도 [  Anywhere-Ipv4  ]로 설정한다.

 

 

 

 

 


 

 

▶️  보안그룹 설정

•  EC2 인스턴스 페이지에 접속하여 위 [ 작업 ] 버튼 -> [ 보안 ] 탭 -> 보안그룹 변경을 누른다.

•  보안그룹 변경에서 [ 보안그룹 선택 ] 을 눌러 내가 생성해놓은 보안그룹을 선택

•  해당 보안그룹을 누르고 기존에 설정되어 있던 보안그룹은 제거하고 [ 저장 ] 버튼 클릭

 

 

 

 

 


 

 

3)  Putty로 EC2 인스턴스 연결

 

▶️  PuTTY 설치

•  Windows에서 우리가 만든 EC2 인스턴스 ( = 가상 임대컴퓨터 )에 접속하기 위해서는 PuTTY 라는 프로그램이 필요

•  아래 경로에서 msi 설치 파일을 받아 PuTTY 를 설치 ( 64-bit x86 설치 )

 

https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html

 

Download PuTTY: latest release (0.82)

This page contains download links for the latest released version of PuTTY. Currently this is 0.82, released on 2024-11-27. When new releases come out, this page will update to contain the latest, so this is a good page to bookmark or link to. Alternativel

www.chiark.greenend.org.uk

 

 

 

•  PuTTY 파일을 실행

•  Host Name( or IP address ) 안에 ubuntu@퍼블릭 IP DNS 이름 의 형식으로 기재

 

※  퍼블릭 IP DNS 이름 은 AWS 인스턴스에서 해당 인스턴스를 클릭하면 하단에 나오게 된다.

 

 

 

•  [ SSH ] -> [ Auth ] -> [ Credentials ] 에서 다운받은 ppk를 검색하여 넣어준다.

 

 

 

 

•  [ Session ] 으로 돌아와 해당 연결정보에 부여할 별칭을 만들고 [ Save ] 를 누른다.

•  앞으로 해당 별칭을 사용하여 Load 가능

•  [ Open ]을 눌러 연결하면 [ PuTTY Security Alert ] 팝업창이 뜨고 [ Accept ] 를 클릭

 

 

 

 

•  아래와 같이 나왔다면 정상적으로 접속이 완료된 것이다.

 

 

 

 


 

 

 

4)  배포하기

 

 

💡 배포하기

※  Jar 와 War 배포 차이


-  JAR Java 애플리케이션 패키징
•  
JAVA 어플리케이션이 동작할 수 있도록 자바 프로젝트를 압축한 파일
•  Class ( Java 리소스 , 속성 파일 ) , 라이브러리 파일을 포함하고 있다.
•  JRE ( Java Runtime Environment ) 만 있어도 실행 가능하다.

 


-  WAR Java 웹 애플리케이션 패키징
•  Servlet / JSP 컨테이너에 배치할 수 있는 웹 애플리케이션 압축한 파일
•  웹 관련 자원을 포함한 ( JSP , Servlet , JAR , Class , XML , HTML , JavaScript ) 
•  사전 정의된 구조를 사용 ( WEB-INF , META_INF )
•  별도의 웹서버( WEB ) 혹은 웹 컨테이너 ( WAS ) 필요

 

 

※  War 와 Jar 개념 및 특징 

https://baby9235.tistory.com/140#google_vignette

 

[ 개념정리 ] War 와 Jar 비교하기

💡  JAR 와 WAR 의 개념과 특징에 대해서 알아보자 !!  ✅  WAR 와 JAR   ▶️  War ( Web Application Archive ) 패키징 -  외부 서블릿 컨테이너•  톰캣 , 제티 등 외부 서블릿 컨테이너에 배포•  내장

baby9235.tistory.com

 

 

 

 

▶️  로컬 PC에서 스프링부트 프로젝트 War 파일 생성

 

보통 SpringBoot 프로젝트의 경우 Jar ( 내장톰캣 사용 ) 파일 배포를 하지만 필자의 경우

     SpringBoot + JSP 템플릿을 사용하였으므로 Jar를 사용할 경우 JSP 를 가져오지 못하기 때문에

     War 파일 배포로 방법을 정했다.

 

 

-  build.gradle 설정

•  플러그인 war 설정을 확인 ( 없을 경우 플러그인 추가 )

plugins {
	// war 플러그인 추가
	id 'war'
}

 

•  war 배포시 파일명 지정

war {
	archiveBaseName= "파일명"
	archiveFileName="파일명.war"
}

 

 

 

-  SpringBoot Application 설정

•  SpringBootServletInitializer 상속 여부 확인

•  configure 메서드 오버라이딩

 


💡  SpringApplicationServletInitializer 는 무엇이며 왜 상속받는걸까 ?


스프링부트 웹 애플리케이션을 배포할 때, 주로 Tomcat 이 내장된 Jar 방식을 사용한다.
하지만 War로 배포를 진행해야 하는 경우 SpringApplicationServletInitializer 을 상속받아
진행하게 된다.

스프링 웹 애플리케이션을 외부 Tomcat 에서 동작하게 하기 위해서는 web.xml에
애플리케이션 컨텍스트를 등록해야 한다. 이는 Apache Tomcat 이 구동될 때
/WEB-INF 디렉터리에 존재하는 web.xml을 읽어 웹 애플리케이션을 구성하기 때문이다.
web.xml 이 없는 SpringBoot 프로젝트의 경우, 외부 Tomcat에서 동작하게 하기 위해서
WebApplicationInitializer 인터페이스를 구현한 SpringApplicationServletInitializer 을
상속받는것이 필요하다.

 

 

package com.wsd.MyApp;

import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;

@SpringBootApplication
public class MyAppApplication extends SpringApplicationServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(MyAppApplication.class);
    }


    public static void main(String[] args) {
        SpringApplication.run(MyAppApplication.class, args);
    }

}

 

 

 

 

-  War 파일 생성

 

•  InteliJ 우측의 Gradle > Tasks > build > war 실행

 

 

•  프로젝트 디렉터리 위치의 /libs/{파일명}.war 생성 확인

  

 

 


 

 

▶️  인스턴스 접속 ( Java 설치 / Tomcat 설치  )

 

•  PuTTY로 인스턴스 접속

•  ubuntu 아래 명령어를 입력하여 Java 설치

•  배포할려는 프로젝트는 Java 17 사용

 

❗  특정한 패키지를 다운 받기 전 apt 업데이트를 함으로써 설치 가능한 리스트를 업데이트 한다

      ( 최신 싱크 맞추기 ) 

// apt 업데이트
sudo apt-get update

// java 설치
sudo apt-get install openjdk-17-jdk

// java 버전 확인
java -version

 

 

 

•  프로젝트의 spring-boot-starter-tomcat 라이브러리의 버전을 확인한 후 mvnrepository 사이트에 들어가서 

   해당 라이브러리의 Tomcat 버전을 확인한다. ( 배포 후 버전으로 인한 오류 예방 차원 )

 

 

 

 

 

•  tomcat 다운로드 페이지에 가서 링크 주소 복사를 해줍니다.

https://tomcat.apache.org/download-10.cgi#10.1.34

 

Apache Tomcat® - Apache Tomcat 10 Software Downloads

Welcome to the Apache Tomcat® 10.x software download page. This page provides download links for obtaining the latest version of Tomcat 10.1.x software, as well as links to the archives of older releases. Unsure which version you need? Specification versi

tomcat.apache.org

 

 

 

•  ubuntu 아래 명령어 입력 ( = 주소 복사 + Tomcat 압축 해제 )

// 링크 주소 복사
wget [ 마우스 우클릭 ]

// 톰캣 압축 파일 해제
sudo tar xvfz apache-tomcat-10.1.34.tar.gz

 

 

 

•  Tomcat 실행 / 실행 종료 명령어

// Tomcat 폴더 / bin 으로 이동
cd apache-tomcat-10.1.34/bin

// Tomcat 실행
./startup.sh

// Tomcat 실행 종료
./shutdown.sh

 

 

 


 

 

▶️  war 파일 이동 및 프로젝트 실행 확인

 

-  FileZila 다운로드

•   배포한 war 파일을 apache-tomcat-10.1.34/webapps 에 옮기기 위해 FileZila 를 사용했다.

    아래 링크에 들어가서 FileZila 를 다운로드 받는다.

 

https://filezilla-project.org/download.php?type=client

 

 

 

 

 

-  FileZila 실행 및 연결

•  FileZila 를 실행하여 왼쪽 상단의 파일 > 사이트관리자 를 클릭하여 연결정보를 입력하여 연결한다.

•  프로토콜  :  SFTP - SSH File Transfer Protocol

•  호스트  :  AWS 해당 인스턴스 퍼블릭 IPv4 DNS

•  로그온 유형  :  키 파일

•  사용자  :  ubuntu

•  키 파일  :  저장해놓은 .ppk 키페어

 

 

 

 

-  WAR 파일 이동

•  해당 프로젝트 디렉터리/build/libs 디렉터리 안에 있는 WAR 파일 확인

•  해당 WAR 파일의 이름을 ROOT.war 로 변경해준다.

•  우측 Tomcat 폴더/webapps 안으로 ROOT.war 를 이동한다. ( 드래그 앤 드롭 )

•  webapps 안에 WAR 파일과 WAR파일이 해제되어 같은 이름의 폴더가 생성되는것을 확인할 수 있다.

 

 

 

-  프로젝트 실행

 

  해당 URL 를 쳤을때 만약 프로젝트의 웹페이지가 CSS 가 깨지면서 나온다면 아래 자료를 참고하면 된다.

https://baby9235.tistory.com/141

 

[ 삽질 해결 ] AWS EC2 인스턴스 배포 시, 정적 리소스( CSS, js 등 ) 미적용 문제

💡  WAR 파일을 배포 이후 프로젝트 실행시 정적 리소스가 미적용 되는 문제를 해결해보자 !※  정적리소스일반적으로 HTML , CSS , javaScript , 이미지 / 동영상 파일 등과 같이 클라이언트로부터 요

baby9235.tistory.com

 

 

•  ubuntu에서 Tomcat 폴더/bin 으로 이동하여 Tomcat을 실행한다.

•  웹브라우저에 [ 할당된 IP 주소:8080/ ] 를 쳐본다.

 

 

 

 

 

※  [  IP:8080/  ] URL 로 입력했을 경우 /user/main 이 보이게  redirect 를 시키기 위해서 HomeController 소스 추가

package com.wsd.invest.config;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class HomeController {

    /**
     * ip:8080/ URL 요청시 메인페이지로 리다이렉트
     * @return
     */
    @GetMapping("/")
    public String redirectMain() {
        return "redirect:/user/main";
    }
}

 

 

 

👉  프로젝트의 메인 페이지가 정확히 나오는것을 확인할 수 있었다.

 

 

 

 

반응형
Comments