diff --git a/.gitlab-ci.yaml b/.gitlab-ci.yaml
index c35131ed719e8b3fd1abe1e9c89d52e726ea1650..6d980230f418e2b71a7fbaa09f461184957378c6 100644
--- a/.gitlab-ci.yaml
+++ b/.gitlab-ci.yaml
@@ -1,40 +1,41 @@
-# GitLab Runner가 사용할 Docker 이미지 (Maven + JDK 포함)
-image: maven:3.9-eclipse-temurin-17
-
-services:
-  - docker:dind # Docker-in-Docker 서비스 사용
-
-variables:
-  DOCKER_DRIVER: overlay2
-  MAVEN_CLI_OPTS: "-B -Dmaven.test.skip=true"
-
 stages:
   - build
-  - dockerize
+  - deploy
 
-# Step 1: Maven 빌드
+cache:
+  paths:
+    - .m2/repository
+    - target/
+
+# 1️⃣ 빌드 단계: Maven + JDK 17 이미지 사용
 build:
+  image: maven:3.9.6-eclipse-temurin-17
   stage: build
   script:
-    - echo "✅ Maven 빌드 시작"
-    - mvn $MAVEN_CLI_OPTS clean package
+    - mvn clean package -DskipTests
   artifacts:
     paths:
       - target/*.jar
+      - Dockerfile
+  only:
+    - main
 
-# Step 2: Docker 이미지 빌드 + Docker Hub 푸시
-dockerize:
-  stage: dockerize
+# 2️⃣ 배포 단계: Docker로 이미지 빌드 & DockerHub에 푸시
+deploy:
   image: docker:latest
   services:
     - docker:dind
+  stage: deploy
+  when: manual
+  variables:
+    DOCKER_HOST: tcp://docker:2375
+    DOCKER_TLS_CERTDIR: ""
   before_script:
-    - echo "🔐 Docker Hub 로그인"
-    - docker login -u "$DOCKER_HUB_USERID" -p "$DOCKER_HUB_PASSWORD"
+    - echo "$DOCKER_HUB_PASSWORD" | docker login -u "$DOCKER_HUB_USERID" --password-stdin
   script:
-    - echo "🐳 Docker 이미지 빌드 시작"
-    - docker build -t $DOCKER_HUB_USERID/myspringweb .
-    - docker push $DOCKER_HUB_USERID/myspringweb
+    - docker build -t myspringweb .
+    - docker tag myspringweb "$DOCKER_HUB_USERID/myspringweb"
+    - docker push "$DOCKER_HUB_USERID/myspringweb"
   after_script:
     - docker logout
   only: