#!/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 ""