STS로 Spring Maven 프로젝트 배포하기
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 방화벽이다.
💣 핵심 포인트 (많이 헷갈리는 부분)
너가 전에 말한 이거 👇
이 의미는:
- ❌ “방화벽이 없다” 가 아님
- ✅ ufw만 없고, iptables는 살아있을 가능성 매우 높음
Oracle Ubuntu 이미지가 이 경우 많음.
sudo iptables -L -n
-> 현재 iptables 상태 확인

여기가 문제라고 한다.
❌ 왜 8080이 막히냐?
iptables는 위에서부터 순서대로 룰을 검사해.
문제 구간:
즉,
- 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
이렇게 하면 잘 됨.
