카테고리 없음

STS로 Spring Maven 프로젝트 배포하기

코딩연습중 2026. 1. 16. 17:40

1. 우선 vm을 무료로 제공해주는 oracle cloud에서 vm 생성해줌.(OS는 우분투로 결정)

 

2. jar 파일 생성하기

2-1. pom.xml에 packaging을 war로 해놨으면 war, jar로 해놨으면 jar이 만들어지게 됨.

2-2. 나는 war로 해놨기 때문에 war로 배포 후 톰캣에서 실행하면 됨.

 

2-3. 프로젝트 우클릭 > Run As > Maven Build 클릭

 

2-4. 

Goals에 clean package -DskipTests 입력 후 Run

2-5. 

target 폴더에 war 파일 생성됨.

 

3. war 파일 vm으로 옮기기

3-1. 현재 Windows 환경에서 scp로 war 파일을 아까 만든 vm으로 옮길거다. 

3-2. cmd 들어가서 

scp -i "D:\eunbin\03_Personal_Info\04_oracle_cloud\my-server-01\ssh-key-2026-01-15.key" "D:\PJ\JSP_T02\workspace\board\target\controller-1.0.0-BUILD-SNAPSHOT.war" ubuntu@144.24.70.94:/home/ubuntu/

작성하면 원래 vm에 옮겨져야 하는데,,,, 

 

 

자꾸 이런 에러 뜸.

private 키를 나 혼자 쓰는 게 아니라서 그렇다 함.

 

해결 - 

1) cmd 관리자 권한으로 실행

2) 키 파일 권한 수정

icacls "D:\eunbin\03_Personal_Info\04_oracle_cloud\my-server-01\ssh-key-2026-01-15.key" /inheritance:r /remove "NT AUTHORITY\SYSTEM" "BUILTIN\Administrators" "BUILTIN\Users" "NT AUTHORITY\Authenticated Users"

 

icacls "D:\eunbin\03_Personal_Info\04_oracle_cloud\my-server-01\ssh-key-2026-01-15.key" /grant:r "%USERNAME%":R

순서대로 실행

 

다시 scp 명령어 치면 

 

이렇게 잘 전송됨.

 

이제 vm에 tomcat 설치 후, mysql 연동 후 구동하면 됨.

 

4. tomcat 설치

sudo apt update
sudo apt install -y tomcat9

이렇게 설치 후, sudo systemctl status tomcat9으로 active한지 확인

 

 

5. tomcat에 배포

sudo cp /home/ubuntu/controller-1.0.0-BUILD-SNAPSHOT.war /var/lib/tomcat9/webapps/
sudo systemctl restart tomcat9

로그 확인

sudo tail -n 200 /var/log/tomcat9/catalina.2026-01-16.log

로그 봤을 때 이상 없으면 배포 성공.

 

6. Java 버전 확인

내 프로젝트 java 버전이 8이기 때문에 버전 확인.

-> 버전이 11이라고 떠서 Java 8설치 후, tomcat이 Java8을 쓰도록 설정

sudo apt install -y openjdk-8-jdk
sudo update-alternatives --config java

 

 

톰캣 재시작하기.

 

 

7. DB 설치 

mysql 설치 후 확인

sudo apt install -y mysql-server
sudo systemctl status mysql

 

내 spring 설정에 맞춰서 db 만듦.

원래는 

CREATE DATABASE [데이터베이스 이름] DEFAULT CHARACTER SET utf8;
CREATE USER '[username]'@'%' IDENTIFIED BY '[password]';
GRANT ALL PRIVILEGES ON [데이터베이스 이름].* TO '[username]'@'%';
FLUSH PRIVILEGES;
EXIT;

이렇게 해야되는데 그냥 root root로 해놨기 때문에,,

CREATE DATABASE jsp_test DEFAULT CHARACTER SET utf8;
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root';
FLUSH PRIVILEGES;

 

 

아무튼 이 뒤에

mysql 접속 되는지 테스트 해보고, tomcat 로그 다시 확인.

 

 

 

이러면 접속이 돼야하는데? 안됨.

인바운드 규칙에 80 및 8080 포트 추가 안 해서 그런 것 같은데 인바운드 규칙 수정해도 안됨....

서브넷 라우팅테이블 및 igw도 문제 없어보이는데,,,,ㅜㅜ

 

gpt한테 물어봤다.

 

지금 상태 정리 (팩트)

✅ Tomcat

  • LISTEN *:8080 ✔
  • curl http://localhost:8080 ✔

✅ OCI

  • Internet Gateway 있음 ✔
  • Route 0.0.0.0/0 → IGW ✔
  • Subnet에 해당 Route Table 연결 ✔
  • Ingress 8080 열림 ✔
  • Public IP 정상 할당 ✔

❌ 그런데

  • 외부 telnet 144.24.70.94 8080 ❌
  • 브라우저 접속 ❌

👉 이 패턴은 100% OS 방화벽이다.


💣 핵심 포인트 (많이 헷갈리는 부분)

너가 전에 말한 이거 👇

 
sudo ufw status sudo: ufw: command not found

이 의미는:

  • ❌ “방화벽이 없다” 가 아님
  • ✅ ufw만 없고, iptables는 살아있을 가능성 매우 높음

Oracle Ubuntu 이미지가 이 경우 많음.

 

 

sudo iptables -L -n

 

-> 현재 iptables 상태 확인

 

 

여기가 문제라고 한다.

❌ 왜 8080이 막히냐?

iptables는 위에서부터 순서대로 룰을 검사해.

문제 구간:

 
ACCEPT tcp dpt:22 REJECT all

즉,

  • SSH(22)는 허용
  • 그 외 모든 신규 TCP 요청은 전부 REJECT
  • 8080은 여기에 걸려서 외부에서 차단됨

❗ 위에 있는 ACCEPT all은 loopback/내부 트래픽용으로 들어간 룰이라
외부 NIC 트래픽에는 안 먹는 경우가 많음 (OCI 기본 이미지 특징)

그래서:

  • curl localhost:8080 ✅
  • ss -lntp ✅
  • 외부 telnet ❌

이 조합이 정확히 나온 거야.

 

해결 방법:

 8080 허용 룰을 REJECT 앞에 추가

sudo iptables -I INPUT 4 -p tcp --dport 8080 -j ACCEPT

 

이렇게 하니까 드디어 연결이 된다!

 

 

근데 

http://144.24.70.94:8080/controller-1.0.0-BUILD-SNAPSHOT/

들어가보니 500에러 뜸.

 

sudo journalctl -u tomcat9 -n 200 --no-pager

 

로 로그 확인 -> 

 

이 패턴은 거의 99%가 자바 버전 불일치(컴파일된 클래스 버전 vs 서버에서 읽는 쪽 라이브러리/환경) 또는 클래스 파일이 깨짐

 

sudo javap -verbose /var/lib/tomcat9/webapps/controller-1.0.0-BUILD-SNAPSHOT/WEB-INF/classes/com/board/controller/BoardController.class | grep "major version"

 

이거 보니 55.

 

  • 52면 Java 8
  • 55면 Java 11
  • 61면 Java 17
  • 65면 Java 21

 

sts 들어가서(로컬)

STS(로컬)에서 JDK 8로 프로젝트 설정

  • Project > Properties > Java Compiler → 1.8
  • Project Facets → Java 1.8
  • Maven은 pom에 아래 넣기(없으면 추가)
<properties>
  <maven.compiler.source>1.8</maven.compiler.source>
  <maven.compiler.target>1.8</maven.compiler.target>
</properties>

 

하고 다시 war 만들고 scp로 옮김.

 

vm으로 돌아와서

tomcat 중지

sudo systemctl stop tomcat9

 

기존 배포 + 캐시 삭제

sudo rm -rf /var/lib/tomcat9/webapps/controller-1.0.0-BUILD-SNAPSHOT
sudo rm -f  /var/lib/tomcat9/webapps/controller-1.0.0-BUILD-SNAPSHOT.war
sudo rm -rf /var/lib/tomcat9/work/*
sudo rm -rf /var/lib/tomcat9/temp/*

 

새 war 배포

sudo cp ~/controller-1.0.0-BUILD-SNAPSHOT.war /var/lib/tomcat9/webapps/
sudo chown tomcat:tomcat /var/lib/tomcat9/webapps/controller-1.0.0-BUILD-SNAPSHOT.war

 

-> tomcat 재시작

 

아... 되긴 하는데 css 및 js 파일을 못 불러옴... 보니까 현재 war 이름이 controller~로 되어있는데, 이러면 css path를 못 찾아서 그런 것. 따라서 war 파일 이름을 ROOT로 바꾸는 게 가장 깔끔할 것 같다.

 

# 1. 기존 앱 완전 제거
sudo systemctl stop tomcat9
sudo rm -rf /var/lib/tomcat9/webapps/*

# 2. war 이름을 ROOT.war 로 복사
sudo cp ~/controller-1.0.0-BUILD-SNAPSHOT.war /var/lib/tomcat9/webapps/ROOT.war

# 3. 권한 정리 (중요)
sudo chown tomcat:tomcat /var/lib/tomcat9/webapps/ROOT.war

# 4. 톰캣 재시작
sudo systemctl start tomcat9

이렇게 하면 잘 됨.