기존 프로젝트에 http://localhost:8080 등으로 하드코딩된 부분들은 모수 상대경로로 수정했다..(이부분은 너무 많은 부분이라 세세하게 블로그 안했음)
이제 도커에 올릴텐데..
그전에 환경변수 설정할때 여러번 하지않기위해 미리 도메인 무료로 받아올준비부터 한다.
deSEC – Free Secure DNS
desec.io
여기 페이지에서 일단 가입부터하자

내 구글계정으로 이메일넣고 , 위쪽 CREATE ACCOUNT 누르면

무료로 내 dns로 만들 도메인을 만들어준다. 1개만 만들어준다고 하니 ...참고 ....(물론 하위로 몇개더만들순 있는모양이지만)
난 healthsync.dedyn.io 가 도메인 주소가 될예정이다.

추후 저 위에 content 부분에 AWS에서 나올 EC2 IP 주소를 넣고 , 우측 TTL에 3600초, 1시간동안 dns결과를 캐싱한다는 뜻으로 그냥두면된다.
이제 백엔드 DOCKER 설정을 시작해야함 ..
인텔리제이 기준 맨위에 프로젝트 루트에 오른쪽버튼 누르구..

저기 보이는 도커파일 누르면 자동으로 만들어짐
# ====================================
# 1단계 : 빌드 스테이지
# ====================================
FROM eclipse-temurin:17-jdk AS builder
WORKDIR /app
# Gradle Wrapper 복사
COPY gradlew ./
COPY gradle ./gradle
# 실행 권한 부여
RUN chmod +x gradlew
# Gradle 설정 파일 복사
COPY build.gradle settings.gradle ./
# 의존성 미리 다운로드
RUN ./gradlew dependencies --no-daemon || true
# 소스코드 복사 후 빌드
COPY src ./src
RUN ./gradlew bootJar --no-daemon -x test
# ====================================
# 2단계 : 실행 스테이지
# ====================================
FROM eclipse-temurin:17-jre
WORKDIR /app
# 빌드된 JAR만 복사
COPY --from=builder /app/build/libs/*.jar app.jar
# 포트 노출
EXPOSE 8080
# 실행
ENTRYPOINT ["java", "-jar", "app.jar"]
### 블로그용 설명
| 줄 | 의미 |
|-----|------|
| `FROM eclipse-temurin:17-jdk AS builder | Gradle + JDK 17로 빌드 환경 구성 |
| `WORKDIR /app` | 컨테이너 안에서 작업할 폴더 |
| `COPY build.gradle ...` | Gradle 설정 먼저 복사 (캐싱 효율) |
| `RUN gradle dependencies` | 의존성 미리 다운 (다음 빌드 시 캐시) |
| `COPY src ./src` | 소스코드 복사 |
| `RUN gradle bootJar` | JAR 파일 생성 (테스트 스킵) |
| `FROM eclipse-temurin:17-jre` | 실행용 가벼운 이미지 (JRE만) |
| `COPY --from=builder` | 빌드 스테이지에서 JAR만 가져옴 |
| `EXPOSE 8080` | 8080 포트 사용 |
| `ENTRYPOINT` | 컨테이너 시작 시 JAR 실행 |
---
### 왜 2단계로 나누나? (Multi-stage Build)
```
빌드 이미지: ~800MB (Gradle, JDK, 소스 전체)
↓
실행 이미지: ~200MB (JRE + JAR만)
이제 프론트엔드도 도커를 추가해야한다.. 먼저 프론트 노드버젼을 확인하자
내 터미널 경로> node -v
v24.11.1
그리고 도커는 슬림 으로~
#================================
# 1단계 : 빌드 스테이지
#================================
FROM node:22-slim AS builder
WORKDIR /app
# 패키지 파일 복사 (캐싱용)
COPY package.json package-lock.json ./
# 의존성 설치
RUN npm ci
# 소스코드 복사 후 빌드
COPY . .
RUN npm run build
#================================
# 2단계 : 실행 스테이지 (Nginx)
#================================
FROM nginx:stable
#빌드된 파일 복사
COPY --from=builder /app/dist /usr/share/nginx/html
# 포트 노출
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
이제 ... 프론트까지 dockerfile 만들었으니...
이걸 통으로 휘두르는 docker-compose.yml 파일을.. 프론트, 백엔드 위의 루트에 만든다.
project/
├── backend/
├── frontend/
├── docker-compose.yml ← 여기!
└── .env ← 이것도 만들 예정
services:
# 백엔드(Spring Boot)
backend:
build: ./backend
container_name: healthsync-backend
ports:
- "8080:8080"
env_file:
- .env
environment:
- SPRING_PROFILES_ACTIVE=prod
restart: always
# 프론트엔드(Nginx)
frontend:
build: ./frontend
container_name: healthsync-frontend
ports:
- "80:80"
depends_on:
- backend
restart: always
다음은 도커가 읽을 환경 .env 파일만들기
# 데이터베이스
DB_URL=jdbc:mysql://host.docker.internal:3306/healthsync
DB_USERNAME=root
DB_PASSWORD=1234
# JWT
JWT_SECRET=여기에_아주_긴_시크릿키_넣기
# OpenAI
OPENAI_API_KEY=sk-proj-여기에_실제키
# OAuth Google
GOOGLE_CLIENT_ID=여기에_실제값
GOOGLE_CLIENT_SECRET=여기에_실제값
# OAuth Kakao
KAKAO_CLIENT_ID=여기에_실제값
KAKAO_CLIENT_SECRET=여기에_실제값
# OAuth Naver
NAVER_CLIENT_ID=여기에_실제값
NAVER_CLIENT_SECRET=여기에_실제값
# 클라이언트 URL
CLIENT_URL=http://localhost:5173
서버에 올라가서 활용할 env.example 추가하기
# 데이터베이스
DB_URL=
DB_USERNAME=
DB_PASSWORD=
# JWT
JWT_SECRET=
# OpenAI
OPENAI_API_KEY=
# OAuth Google
GOOGLE_CLIENT_ID=
GOOGLE_CLIENT_SECRET=
# OAuth Kakao
KAKAO_CLIENT_ID=
KAKAO_CLIENT_SECRET=
# OAuth Naver
NAVER_CLIENT_ID=
NAVER_CLIENT_SECRET=
# 클라이언트 URL
CLIENT_URL=
그리고 백엔드에 .dockerignore 를 추가
backend/
├── Dockerfile ✅
├── .dockerignore ← 여기!
└── src/
# 빌드 결과물 (Docker 에서 새로 빌드함)
build/
.gradle/
# IDE 설정
.idea/
*.iml
# Git
.git/
.gitignore
# 기타
*.md
*.log
frontend/
├── Dockerfile ✅
├── .dockerignore ← 여기!
└── src/
프론트에도 .dockerignore 추가
# 의존성 (Docker에서 새로 설치)
node_modules/
# 빌드 결과물
dist/
.vite/
# IDE
.idea/
*.iml
# Git
.git/
.gitignore
# 환경변수 (compose에서 관리)
.env
.env.local
# 기타
*.md
*.log
여기까지 하면 ... 기본적인 Docker , aws 준비완료...실전은 다음에..
'Docker & AWS > 기존 팀 프로젝트 리팩토링(HealthSync)' 카테고리의 다른 글
| 기록 4 . 배포까지....HTTPS/IP고정 (1) | 2025.12.08 |
|---|---|
| 기록 3 . docker 로컬 테스트 및 aws EC2 생성 서버 접속 (1) | 2025.12.08 |
| 기록 1 . 기존 팀 프로젝트 챗봇부분의 문제점 파악 리팩토링예정 (1) | 2025.12.05 |