- EmbeddedRedisConfig: 외부 Redis 없으면 Embedded Redis 자동 시작 - RedisCacheAutoConfig: Redis 연결 실패 시 인메모리 캐시 fallback - install.bat/sh: Docker/Redis 필수 의존성 제거, 인메모리 전환 안내 - application yml: Redis 설정을 선택 사항으로 변경 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
262 줄
8.9 KiB
Bash
262 줄
8.9 KiB
Bash
#!/usr/bin/env bash
|
|
# ============================================================
|
|
# WBX Spring Core — Linux/macOS 설치 스크립트
|
|
# 사용법: chmod +x scripts/install.sh && ./scripts/install.sh
|
|
# ============================================================
|
|
|
|
# ---------- 색상 ----------
|
|
RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; CYAN='\033[0;36m'; NC='\033[0m'
|
|
ok() { echo -e " ${GREEN}[OK]${NC} $1"; }
|
|
warn() { echo -e " ${YELLOW}[WARN]${NC} $1"; }
|
|
fail() { echo -e " ${RED}[FAIL]${NC} $1"; }
|
|
info() { echo -e " ${CYAN}[INFO]${NC} $1"; }
|
|
|
|
ERRORS=0
|
|
|
|
# ---------- 프로젝트 루트 설정 ----------
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
|
cd "$PROJECT_ROOT" || { echo "[FAIL] 프로젝트 루트를 찾을 수 없습니다: $SCRIPT_DIR/.."; exit 1; }
|
|
|
|
echo ""
|
|
echo "=========================================="
|
|
echo " WBX Spring Core — 설치 점검"
|
|
echo "=========================================="
|
|
echo ""
|
|
|
|
# ---------- 1. JDK 21 ----------
|
|
echo "1. JDK 확인"
|
|
JDK_OK=0
|
|
if command -v java &>/dev/null; then
|
|
JAVA_VER=$(java -version 2>&1 | head -1 | awk -F '"' '{print $2}' | cut -d. -f1)
|
|
if [ "$JAVA_VER" -ge 21 ] 2>/dev/null; then
|
|
ok "JDK $JAVA_VER"
|
|
JDK_OK=1
|
|
else
|
|
info "JDK $JAVA_VER — 21 이상 필요, 자동 설치 시도..."
|
|
fi
|
|
else
|
|
info "java 명령어 없음 — 자동 설치 시도..."
|
|
fi
|
|
|
|
if [ $JDK_OK -eq 0 ]; then
|
|
if [[ "$(uname)" == "Darwin" ]]; then
|
|
# macOS — Homebrew
|
|
if command -v brew &>/dev/null; then
|
|
info "Homebrew로 Temurin JDK 21 설치 중..."
|
|
if brew install --cask temurin@21; then
|
|
export JAVA_HOME=$(/usr/libexec/java_home -v 21 2>/dev/null || true)
|
|
if [ -n "$JAVA_HOME" ]; then
|
|
export PATH="$JAVA_HOME/bin:$PATH"
|
|
ok "JDK 21 설치 완료 — $JAVA_HOME"
|
|
else
|
|
fail "JDK 설치 경로를 찾을 수 없습니다"
|
|
ERRORS=$((ERRORS + 1))
|
|
fi
|
|
else
|
|
fail "JDK 설치 실패 — 수동으로 JDK 21을 설치하세요"
|
|
ERRORS=$((ERRORS + 1))
|
|
fi
|
|
else
|
|
fail "Homebrew 없음 — https://adoptium.net 에서 JDK 21을 수동 설치하세요"
|
|
ERRORS=$((ERRORS + 1))
|
|
fi
|
|
else
|
|
# Linux — apt / yum / dnf
|
|
INSTALL_OK=0
|
|
if command -v apt-get &>/dev/null; then
|
|
info "apt로 Temurin JDK 21 설치 중..."
|
|
if sudo apt-get update -qq && sudo apt-get install -y temurin-21-jdk 2>/dev/null; then
|
|
INSTALL_OK=1
|
|
else
|
|
# Adoptium 저장소 추가 후 재시도
|
|
info "Adoptium 저장소 추가 중..."
|
|
sudo mkdir -p /etc/apt/keyrings
|
|
curl -fsSL https://packages.adoptium.net/artifactory/api/gpg/key/public | sudo tee /etc/apt/keyrings/adoptium.asc >/dev/null
|
|
echo "deb [signed-by=/etc/apt/keyrings/adoptium.asc] https://packages.adoptium.net/artifactory/deb $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/adoptium.list >/dev/null
|
|
if sudo apt-get update -qq && sudo apt-get install -y temurin-21-jdk; then
|
|
INSTALL_OK=1
|
|
fi
|
|
fi
|
|
elif command -v yum &>/dev/null; then
|
|
info "yum으로 Temurin JDK 21 설치 중..."
|
|
if sudo yum install -y temurin-21-jdk 2>/dev/null; then
|
|
INSTALL_OK=1
|
|
else
|
|
info "Adoptium 저장소 추가 중..."
|
|
cat <<-REPO | sudo tee /etc/yum.repos.d/adoptium.repo >/dev/null
|
|
[Adoptium]
|
|
name=Adoptium
|
|
baseurl=https://packages.adoptium.net/artifactory/rpm/rhel/\$releasever/\$basearch
|
|
enabled=1
|
|
gpgcheck=1
|
|
gpgkey=https://packages.adoptium.net/artifactory/api/gpg/key/public
|
|
REPO
|
|
if sudo yum install -y temurin-21-jdk; then
|
|
INSTALL_OK=1
|
|
fi
|
|
fi
|
|
else
|
|
fail "패키지 관리자를 찾을 수 없음 — https://adoptium.net 에서 JDK 21을 수동 설치하세요"
|
|
ERRORS=$((ERRORS + 1))
|
|
fi
|
|
|
|
# 설치 결과 확인
|
|
if [ $INSTALL_OK -eq 1 ]; then
|
|
if command -v java &>/dev/null; then
|
|
JAVA_VER=$(java -version 2>&1 | head -1 | awk -F '"' '{print $2}' | cut -d. -f1)
|
|
if [ "$JAVA_VER" -ge 21 ] 2>/dev/null; then
|
|
ok "JDK 21 설치 완료"
|
|
else
|
|
fail "JDK 설치 후에도 버전이 21 미만입니다"
|
|
ERRORS=$((ERRORS + 1))
|
|
fi
|
|
else
|
|
fail "JDK 설치 후 java 명령어를 찾을 수 없습니다"
|
|
ERRORS=$((ERRORS + 1))
|
|
fi
|
|
elif [ $INSTALL_OK -eq 0 ] && command -v apt-get &>/dev/null || command -v yum &>/dev/null; then
|
|
fail "JDK 설치 실패 — 수동으로 JDK 21을 설치하세요"
|
|
ERRORS=$((ERRORS + 1))
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
# ---------- 2. Git ----------
|
|
echo "2. Git 확인"
|
|
if command -v git &>/dev/null; then
|
|
ok "$(git --version)"
|
|
else
|
|
fail "git 없음"
|
|
ERRORS=$((ERRORS + 1))
|
|
fi
|
|
|
|
# ---------- 3. Docker (선택) ----------
|
|
echo "3. Docker 확인 (선택)"
|
|
if command -v docker &>/dev/null; then
|
|
ok "$(docker --version | head -1)"
|
|
else
|
|
info "Docker 미설치 — DB를 직접 설치해야 합니다"
|
|
fi
|
|
|
|
# ---------- 4. Redis 확인 ----------
|
|
echo "4. Redis 확인"
|
|
REDIS_HOST="${SPRING_DATA_REDIS_HOST:-localhost}"
|
|
REDIS_PORT="${SPRING_DATA_REDIS_PORT:-6379}"
|
|
if command -v redis-cli &>/dev/null && redis-cli -h "$REDIS_HOST" -p "$REDIS_PORT" ping 2>/dev/null | grep -q PONG; then
|
|
ok "Redis 응답 OK ($REDIS_HOST:$REDIS_PORT)"
|
|
else
|
|
info "Redis 미실행 — 인메모리 캐시로 자동 전환됩니다 (운영 환경에서는 Redis 권장)"
|
|
fi
|
|
|
|
# ---------- 5. MySQL 연결 확인 ----------
|
|
echo "5. MySQL 연결 확인"
|
|
DB_HOST="${DB_HOST:-ws.ubuilder.co.kr}"
|
|
DB_PORT="${DB_PORT:-3306}"
|
|
DB_NAME="${DB_NAME:-mos}"
|
|
DB_USER="${DB_USER:-jsh}"
|
|
if command -v mysql &>/dev/null; then
|
|
if mysql -h"$DB_HOST" -P"$DB_PORT" -u"$DB_USER" -p"${DB_PASS:-}" -e "USE $DB_NAME;" 2>/dev/null; then
|
|
ok "MySQL 연결 OK ($DB_USER@$DB_HOST:$DB_PORT/$DB_NAME)"
|
|
else
|
|
warn "MySQL 연결 실패 — .env 의 DB 설정을 확인하세요"
|
|
fi
|
|
else
|
|
info "mysql 클라이언트 없음 — DB 연결은 앱 시작 시 확인됩니다"
|
|
fi
|
|
|
|
# ---------- 6. 빌드 ----------
|
|
echo "6. Gradle 빌드"
|
|
if [ $ERRORS -gt 0 ]; then
|
|
fail "사전 요구사항 미충족 — 빌드 건너뜀"
|
|
else
|
|
chmod +x "$PROJECT_ROOT/gradlew"
|
|
if "$PROJECT_ROOT/gradlew" build -x test --console=plain -q; then
|
|
ok "BUILD SUCCESSFUL"
|
|
else
|
|
fail "빌드 실패"
|
|
ERRORS=$((ERRORS + 1))
|
|
fi
|
|
fi
|
|
|
|
# ---------- 7. .env 템플릿 ----------
|
|
echo "7. 환경변수 파일"
|
|
if [ ! -f "$PROJECT_ROOT/.env" ]; then
|
|
cat > "$PROJECT_ROOT/.env" << 'ENVEOF'
|
|
# ===== WBX Spring Core — 환경변수 =====
|
|
# 이 파일을 환경에 맞게 수정하세요.
|
|
|
|
# --- 프로필 ---
|
|
SPRING_PROFILES_ACTIVE=prod,mysql
|
|
|
|
# --- 서버 ---
|
|
SERVER_CONTEXT_PATH=/
|
|
|
|
# --- JWT (필수 변경!) ---
|
|
JWT_SECRET=your-production-secret-key-minimum-256-bits-long
|
|
|
|
# --- DB ---
|
|
DB_HOST=ws.ubuilder.co.kr
|
|
DB_PORT=3306
|
|
DB_NAME=mos
|
|
DB_USER=jsh
|
|
DB_PASS=jsh@
|
|
|
|
# --- Redis (선택 — 미설정 시 인메모리 캐시 자동 사용) ---
|
|
# SPRING_DATA_REDIS_HOST=localhost
|
|
|
|
# --- CORS ---
|
|
CORS_ORIGINS=https://app.company.com
|
|
|
|
# --- 로그 경로 ---
|
|
LOG_PATH=/opt/wbx-app/logs/app.log
|
|
|
|
# --- Azure SSO (azure 프로필 사용 시) ---
|
|
# AZURE_CLIENT_ID=
|
|
# AZURE_CLIENT_SECRET=
|
|
# AZURE_TENANT_ID=
|
|
|
|
# --- Azure Blob Storage ---
|
|
# AZURE_STORAGE_ACCOUNT=
|
|
# AZURE_STORAGE_KEY=
|
|
# AZURE_CONTAINER=uploads
|
|
|
|
# --- AWS Cognito (aws 프로필 사용 시) ---
|
|
# AWS_COGNITO_CLIENT_ID=
|
|
# AWS_COGNITO_CLIENT_SECRET=
|
|
# AWS_USER_POOL_ID=
|
|
# AWS_REGION=ap-northeast-2
|
|
|
|
# --- AWS S3 ---
|
|
# AWS_S3_BUCKET=
|
|
# AWS_ACCESS_KEY=
|
|
# AWS_SECRET_KEY=
|
|
ENVEOF
|
|
chmod 600 "$PROJECT_ROOT/.env"
|
|
ok ".env 생성 완료 (값을 수정하세요)"
|
|
else
|
|
warn ".env 이미 존재 — 건너뜀"
|
|
fi
|
|
|
|
# ---------- 8. 디렉토리 ----------
|
|
echo "8. 디렉토리 생성"
|
|
mkdir -p "$PROJECT_ROOT/logs" "$PROJECT_ROOT/uploads" "$PROJECT_ROOT/backup"
|
|
ok "logs/ uploads/ backup/"
|
|
|
|
# ---------- 결과 ----------
|
|
echo ""
|
|
echo "=========================================="
|
|
if [ $ERRORS -eq 0 ]; then
|
|
echo -e " ${GREEN}설치 점검 완료${NC}"
|
|
echo ""
|
|
echo " 다음 단계:"
|
|
echo " 1. .env 파일을 환경에 맞게 수정"
|
|
echo " 2. DB 생성 (또는 docker compose -f docker-compose-dev.yml up -d)"
|
|
echo " 3. ./gradlew bootRun"
|
|
echo " 4. http://localhost:8080/actuator/health 확인"
|
|
else
|
|
echo -e " ${RED}오류 ${ERRORS}건 — 위의 [FAIL] 항목을 해결하세요${NC}"
|
|
fi
|
|
echo "=========================================="
|
|
echo ""
|