#!/bin/bash # ============================================================= # (주)지오정보기술 홈페이지 스타트업 스크립트 # ============================================================= # 사용법: bash start.sh [dev|prod|build] # dev : 개발 모드 (React 핫리로드 + Spring Boot) # prod : 운영 모드 (빌드 후 단일 JAR 실행) # build : 빌드만 (서버 시작 안 함) # ============================================================= set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" BACKEND_DIR="$SCRIPT_DIR/backend" FRONTEND_DIR="$SCRIPT_DIR/frontend" MODE="${1:-dev}" GREEN='\033[0;32m'; YELLOW='\033[1;33m'; RED='\033[0;31m'; NC='\033[0m' ok() { echo -e "${GREEN}[OK]${NC} $*"; } warn() { echo -e "${YELLOW}[WARN]${NC} $*"; } fail() { echo -e "${RED}[FAIL]${NC} $*"; exit 1; } info() { echo -e " $*"; } echo "==================================================" echo " (주)지오정보기술 홈페이지 시작" echo " 모드: $MODE" echo "==================================================" # ── 1. Java 확인 ────────────────────────────────────────────── if ! command -v java &>/dev/null; then fail "Java가 설치되지 않았습니다. setup_ubuntu.sh 또는 setup_windows.ps1을 먼저 실행하세요." fi JAVA_VER=$(java -version 2>&1 | head -1 | awk -F'"' '{print $2}' | cut -d'.' -f1) ok "Java $JAVA_VER 감지" # ── 2. Maven 감지 및 설치 ──────────────────────────────────── ensure_maven() { # mvnw (Wrapper) 우선 확인 if [[ -f "$BACKEND_DIR/mvnw" ]]; then chmod +x "$BACKEND_DIR/mvnw" ok "Maven Wrapper(mvnw) 사용 — 별도 Maven 설치 불필요" MVN="$BACKEND_DIR/mvnw" return fi # 시스템 Maven 확인 if command -v mvn &>/dev/null; then MVN_VER=$(mvn --version 2>/dev/null | head -1 | awk '{print $3}') ok "시스템 Maven $MVN_VER 감지" MVN="mvn" return fi # Maven 없음 → 자동 설치 warn "Maven이 설치되지 않았습니다. 자동 설치를 진행합니다..." install_maven MVN="mvn" } install_maven() { MAVEN_VER="${MAVEN_VER:-3.9.6}" MAVEN_URL="https://archive.apache.org/dist/maven/maven-3/${MAVEN_VER}/binaries/apache-maven-${MAVEN_VER}-bin.tar.gz" MAVEN_HOME="/opt/maven" # OS 감지하여 패키지 관리자로 우선 시도 if command -v apt-get &>/dev/null; then info "apt로 Maven 설치 시도..." apt-get install -y -qq maven 2>/dev/null && { ok "Maven 설치 완료 (apt)" return } elif command -v dnf &>/dev/null; then dnf install -y maven 2>/dev/null && { ok "Maven 설치 완료 (dnf)"; return; } elif command -v yum &>/dev/null; then yum install -y maven 2>/dev/null && { ok "Maven 설치 완료 (yum)"; return; } fi # 패키지 관리자 실패 → 수동 설치 info "Maven ${MAVEN_VER} 수동 설치 중..." MIRROR="${MAVEN_MIRROR:-$MAVEN_URL}" wget -q "$MIRROR" -O /tmp/maven.tar.gz \ || fail "Maven 다운로드 실패. MAVEN_MIRROR 환경변수를 내부 미러로 설정하세요." mkdir -p "$MAVEN_HOME" tar -xzf /tmp/maven.tar.gz -C "$MAVEN_HOME" --strip-components=1 rm -f /tmp/maven.tar.gz # PATH 등록 cat > /etc/profile.d/maven.sh << MVNEOF export MAVEN_HOME=$MAVEN_HOME export PATH=\$MAVEN_HOME/bin:\$PATH MVNEOF export MAVEN_HOME="$MAVEN_HOME" export PATH="$MAVEN_HOME/bin:$PATH" ok "Maven ${MAVEN_VER} 수동 설치 완료: $MAVEN_HOME" } ensure_maven # ── 3. Node.js / npm 확인 (dev 모드) ───────────────────────── if [[ "$MODE" == "dev" ]]; then if ! command -v npm &>/dev/null; then warn "npm이 없습니다. 프론트엔드는 빌드 없이 실행됩니다." info "npm 설치: https://nodejs.org 또는 nvm 사용" MODE="spring-only" else NPM_VER=$(npm --version) ok "npm $NPM_VER 감지" fi fi # ── 4. 실행 ─────────────────────────────────────────────────── case "$MODE" in dev) echo "" info "=== 개발 모드 시작 ===" info "백엔드: http://localhost:8080" info "프론트: http://localhost:3000" echo "" # 프론트엔드 의존성 설치 if [[ ! -d "$FRONTEND_DIR/node_modules" ]]; then info "npm install 실행 중..." cd "$FRONTEND_DIR" && npm install fi # 백엔드 백그라운드 실행 cd "$BACKEND_DIR" mkdir -p data info "Spring Boot 시작 중..." $MVN spring-boot:run & SPRING_PID=$! # 프론트엔드 포그라운드 실행 cd "$FRONTEND_DIR" npm run dev & VITE_PID=$! # 종료 핸들러 trap "kill $SPRING_PID $VITE_PID 2>/dev/null; exit" INT TERM wait $SPRING_PID $VITE_PID ;; spring-only) echo "" info "=== Spring Boot만 실행 (npm 없음) ===" cd "$BACKEND_DIR" mkdir -p data $MVN spring-boot:run ;; prod) echo "" info "=== 운영 모드 빌드 후 실행 ===" # React 빌드 if command -v npm &>/dev/null; then cd "$FRONTEND_DIR" [[ ! -d node_modules ]] && npm install npm run build ok "React 빌드 완료 → backend/src/main/resources/static/" else warn "npm 없음 — 기존 빌드 결과물 사용" fi # Spring Boot 패키징 cd "$BACKEND_DIR" mkdir -p data $MVN clean package -DskipTests -q ok "Spring Boot 패키징 완료" JAR=$(find target -name "*.jar" ! -name "*sources*" | head -1) info "실행: java -jar $JAR" java -jar "$JAR" ;; build) echo "" info "=== 빌드만 실행 ===" if command -v npm &>/dev/null; then cd "$FRONTEND_DIR" [[ ! -d node_modules ]] && npm install npm run build ok "React 빌드 완료" fi cd "$BACKEND_DIR" $MVN clean package -DskipTests -q JAR=$(find target -name "*.jar" ! -name "*sources*" | head -1) ok "빌드 완료: $JAR" info "실행 명령: java -jar $BACKEND_DIR/$JAR" ;; *) echo "사용법: bash start.sh [dev|prod|build|spring-only]" exit 1 ;; esac