Spring Boot 운영 가이드 (PostgreSQL 17 · MariaDB 11.4)
OpenJDK 21 + Spring Boot 3.5 + Gradle 8 + systemd + 내장 Tomcat 환경에서 PostgreSQL 17 또는 MariaDB 11.4를 사용하는 운영 매뉴얼.
💡 요약 정리
- 런타임: OpenJDK 21 + Spring Boot 3.5.0 + Gradle 8
- DB: PostgreSQL 17 또는 MariaDB 11.4 선택
- 프로세스 매니저: systemd / 리버스 프록시: nginx 1.24
- 앱 listen:
127.0.0.1:8080(외부 직접 접근 차단) - DEV A(2GB)에서는 빌드 OOM 가능 → DEV B(4GB) 이상 권장
1. 환경 매니페스트
| 항목 | 값 |
|---|---|
| OS | Ubuntu 24.04 LTS |
| 언어 / 런타임 | OpenJDK 21 |
| 프레 임워크 | Spring Boot 3.5.0 (내장 Tomcat) |
| 빌드 도구 | Gradle 8 (wrapper) |
| 프로세스 매니저 | systemd |
| 앱 listen | 127.0.0.1:8080 |
| 리버스 프록시 | nginx 1.24 (:80/:443, Let's Encrypt 자동) |
| 앱 디렉토리 | /opt/[프로젝트] |
| 환경변수 | /etc/[프로젝트]/env |
| 로그 | /var/log/[프로젝트] |
| 서비스 단위 | [프로젝트].service |
| 주 코드 | /opt/[프로젝트]/src/main/java/com/cafe24/[프로젝트]/ |
| 빌드 산출물 | /opt/[프로젝트]/build/libs/*.jar |
⚠️ 메모리 주의: Spring Boot는 JVM 기본 사용량이 큽니다. **DEV A (2GB)**에서는 빌드 OOM 가능. DEV B (4GB) 이상 권장.
DB 매니페스트
| 항목 | PostgreSQL 17 | MariaDB 11.4 |
|---|---|---|
| 인증 | peer auth (sudo psql) | unix_socket auth (sudo mariadb) |
| 포트 | 5432 | 3306 |
| 서비스명 | postgresql@17-main | mariadb |
| JDBC URL | jdbc:postgresql://127.0.0.1:5432/[DB명] | jdbc:mariadb://127.0.0.1:3306/[DB명] |
| Driver | org.postgresql:postgresql | org.mariadb.jdbc:mariadb-java-client |
2. 서버 접속
2-1. SSH (root)
ssh root@[아이디].mycafe24.com
PROJECT_NAME=myapp; export PROJECT_NAME
2-2. SFTP / rsync
# 빌드 산출물(JAR)만 업로드 권장
rsync -avz ./build/libs/$PROJECT_NAME-*.jar root@[아이디].mycafe24.com:/opt/$PROJECT_NAME/build/libs/
# 소스 통째 업로드 시 (build/, .gradle/ 제외 필수)
rsync -avz --exclude='build/' --exclude='.gradle/' --exclude='.idea/' \
./ root@[아이디].mycafe24.com:/opt/$PROJECT_NAME/
ssh root@... "chown -R appuser:appuser /opt/$PROJECT_NAME"
2-3. appuser로 작업 (디버깅)
sudo -u appuser bash
cd /opt/$PROJECT_NAME
./gradlew bootRun --no-daemon # 빌드+실행 동시 (수동 디버깅)
jcmd $(pgrep -f $PROJECT_NAME) GC.heap_info
3. 환경 확인
ls -la /opt/$PROJECT_NAME
ls -la /opt/$PROJECT_NAME/build/libs/
sudo cat /etc/$PROJECT_NAME/env
sudo systemctl is-active $PROJECT_NAME
sudo journalctl -u $PROJECT_NAME -n 100 # JVM 시작 로그 (30~60초 소요)
ss -tlnp | grep 8080
curl -sf http://127.0.0.1:8080/actuator/health
# JVM 진단
ps aux | grep java
sudo -u appuser jcmd <PID> GC.heap_info # 힙 사용량
sudo -u appuser jstat -gc <PID> # GC 통계
4. DB 직접 접속
4-1. PostgreSQL 17
sudo -u postgres psql
\l
\du
\c [DB명]
\dt
\q
4-1'. MariaDB 11.4
sudo mariadb
SHOW DATABASES;
USE [DB명];
SHOW TABLES;
EXIT;
4-2. 앱 사용자로 접속
# PG
psql "postgresql://[DB사용자]:[비밀번호]@127.0.0.1:5432/[DB명]"
# MariaDB
mariadb -u [DB사용자] -p [DB명]
4-3. 샘플 DDL
JPA/Hibernate가 자동 생성. 수동 점검:
PG:
SELECT table_name FROM information_schema.tables WHERE table_schema = 'public';
MariaDB:
SHOW TABLES;
5. 코드 배포 워크플로우
표준 시퀀스
# 1. 빌드 (서버에서) — 메모리 주의
cd /opt/$PROJECT_NAME
sudo -u appuser ./gradlew clean build -x test
# 2. 재시작 (JAR 자동 갱신)
sudo systemctl restart $PROJECT_NAME
# 3. 검증 (시작에 30~60초 소요)
sleep 30
curl -sf http://127.0.0.1:8080/actuator/health
sudo journalctl -u $PROJECT_NAME -n 50