๐ณ ๋ก์ปฌ Docker ํ๊ฒฝ ๋ฌธ์ ํด๊ฒฐ ๊ฐ์ด๋
๋ก์ปฌ์์๋ ์ ๋๋๋ฐ Docker์์ ์ ๋ ๋ ํ์ธํ ์ฌํญ๋ค
โ ๏ธ ์ฐธ๊ณ : ์์์
doll_gacha์ด๋ฆ์ ์ด์ ํ๋ก์ ํธ ์ฐธ์กฐ์ ๋๋ค. ์ค์ ํ๋ก์ ํธ๋ช ์ ๋ง๊ฒ ๋ณ๊ฒฝํ์ธ์.๐ ํ์ผ ๊ฒฝ๋ก ๊ฒฐํฉ ๋ฌธ์
๋ฌธ์ ํ์
- ์๋ํฐ์์ ์ด๋ฏธ์ง ์ ๋ก๋ โ 201 ์ฑ๊ณต, ํ์ง๋ง ์ด๋ฏธ์ง ํ์ ์๋จ
- ์ฒจ๋ถํ์ผ ๋ค์ด๋ก๋ โ 404 ์๋ฌ
<img src="/uploads/xxx.png">์ด๋ฏธ์ง ๊นจ์ง์์ธ
๊ฒฝ๋ก ๊ฒฐํฉ ์ ๋ฌธ์์ด ๋จ์ ๊ฒฐํฉ(
+) ์ฌ์ฉ ๋ฐ application.yml์๋ ./uploads application-prod.yml์๋ /app/uploads ์ด๋ ๊ฒ ๋ค์ / ๊ฐ ์๋ ์๋ ์ฐจ์ด์๋ค. ```java // โ ๋ฌธ์์ด ๋จ์ ๊ฒฐํฉ - yml ์ค์ ์ ๋ฐ๋ผ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง uploadDir + filename = โ/app/uploadsโ + โtest.pngโ = โ/app/uploadstest.pngโ โ uploadDir + filename = โ/app/uploads/โ + โtest.pngโ = โ/app/uploads/test.pngโ โ
// โ Paths.resolve() - yml ์ค์ ์ ์๊ด์์ด ํญ์ ์ ์ ์๋ Paths.get(โ/app/uploadsโ).resolve(โtest.pngโ) = โ/app/uploads/test.pngโ โ Paths.get(โ/app/uploads/โ).resolve(โtest.pngโ) = โ/app/uploads/test.pngโ โ
### ์ Paths.resolve()์ธ๊ฐ?
- **yml ์ค์ ์ `/` ๋ถ์ด๋ ์ ๋ถ์ด๋ ์๊ด์์** โ ์ค์ ์ค์ ๋ฐฉ์ง
- **๊ทผ๋ณธ์ ์ธ ํด๊ฒฐ์ฑ
** - ๊ฒฝ๋ก ๊ด๋ จ ๋ฒ๊ทธ ์์ฒ ์ฐจ๋จ
#### 3. Docker ๋ณผ๋ฅจ ๋งคํ ํ์ธ
```yaml
# docker-compose.yml
services:
app:
volumes:
- ./uploads:/app/uploads # ํธ์คํธ โ ์ปจํ
์ด๋ ์ฐ๊ฒฐ
์ฐธ๊ณ : yml์์ ์๋์ฐ๋ ๋ฆฌ๋ ์ค๋ / ๋ก ๊ฒฝ๋กํด๋ ์์์ jvm์ด ์ฒ๋ฆฌํจ
๐ฏ 1. ํ๊ฒฝ๋ณ ์ค์ ์ฒดํฌ๋ฆฌ์คํธ
๋ก์ปฌ โ Docker ๋ฐฐํฌ ์ ํ์ธ์ฌํญ
| ์ฒดํฌ | ํญ๋ชฉ | ์ ์ฉ ์์น |
|---|---|---|
| โ | ํ์ผ ๊ฒฝ๋ก ๊ฒฐํฉ ์ Paths.resolve() ์ฌ์ฉ | FileUtil.java, FileController.java |
| โ | ๋ณผ๋ฅจ ๋งคํ์ผ๋ก ํ์ผ ์์์ฑ ํ๋ณด | docker-compose.yml โ ./uploads:/app/uploads |
| โ | ํ๊ฒฝ๋ณ์ ์ ๋ฌ | docker-compose.yml โ environment: ์น์
|
| โ | DB ์ฐ๊ฒฐ ๋ฌธ์์ด (localhost โ ์ปจํ ์ด๋๋ช ) | application-prod.yml + docker-compose.yml |
| โ | ๋ธ๋ผ์ฐ์ ์ฟ ํค ์ ๋ฆฌ | ํ๊ฒฝ ์ ํ ์ ์๋ ์ญ์ ํ์ |
๊ฐ ํญ๋ชฉ ์์ธ ์ค๋ช
1๏ธโฃ ๋ณผ๋ฅจ ๋งคํ (docker-compose.yml)
app:
volumes:
- ./uploads:/app/uploads # ํธ์คํธ โ ์ปจํ
์ด๋ ์ฐ๊ฒฐ
- ์ญํ : ์ปจํ ์ด๋ ์ฌ์์ํด๋ ์ ๋ก๋ ํ์ผ ์ ์ง
- ๋ก์ปฌ ํด๋
./uploadsโ ์ปจํ ์ด๋ ํด๋/app/uploads๋๊ธฐํ
2๏ธโฃ ํ๊ฒฝ๋ณ์ ์ ๋ฌ (docker-compose.yml)
app:
environment:
# DB ์ค์ - ์ปจํ
์ด๋๋ช
'db' ์ฌ์ฉ
SPRING_DATASOURCE_URL: jdbc:mariadb://db:3306/doll_gacha
SPRING_DATASOURCE_USERNAME: doll_gacha
SPRING_DATASOURCE_PASSWORD: ${DB_PASSWORD:-ckdlsk13!}
# OAuth2 ์ค์ - .env ํ์ผ์์ ์ฝ์ด์ด
KAKAO_CLIENT_ID: ${KAKAO_CLIENT_ID}
KAKAO_CLIENT_SECRET: ${KAKAO_CLIENT_SECRET}
GOOGLE_CLIENT_ID: ${GOOGLE_CLIENT_ID}
GOOGLE_CLIENT_SECRET: ${GOOGLE_CLIENT_SECRET}
# JWT ์ค์
JWT_SECRET_KEY: ${JWT_SECRET_KEY}
# ์ฑ URL
APP_BASE_URL: ${APP_BASE_URL:-http://localhost:8080}
- ์ญํ :
.envํ์ผ์ ๊ฐ์ ์ปจํ ์ด๋์ ์ ๋ฌ ${VAR:-default}ํํ๋ก ๊ธฐ๋ณธ๊ฐ ์ง์ ๊ฐ๋ฅ
3๏ธโฃ DB ์ฐ๊ฒฐ ๋ฌธ์์ด ๋ณ๊ฒฝ
# application.yml (๋ก์ปฌ)
url: jdbc:mariadb://localhost:3406/doll_gacha
# application-prod.yml (Docker)
url: ${SPRING_DATASOURCE_URL:jdbc:mariadb://localhost:3406/doll_gacha}
# โ docker-compose์์ jdbc:mariadb://db:3306/doll_gacha ๋ก ๋ฎ์ด์
- ํต์ฌ: Docker ๋คํธ์ํฌ์์๋
localhost๋์ ์ปจํ ์ด๋๋ช (db) ์ฌ์ฉ - ํฌํธ๋ ๋ด๋ถ ํต์ ์ด๋ฏ๋ก
3306์ฌ์ฉ (ํธ์คํธ ๋งคํ ํฌํธ3407์๋)
4๏ธโฃ ๋ธ๋ผ์ฐ์ ์ฟ ํค ์ ๋ฆฌ
๋ก์ปฌ โ Docker ์ ํ ์:
1. F12 (๊ฐ๋ฐ์๋๊ตฌ) โ Application ํญ
2. Cookies โ localhost
3. access_token, refresh_token ์ญ์
4. ์๋ก๊ณ ์นจ
- ์ด์ : ๋ก์ปฌ์์ ๋ฐ๊ธ๋ฐ์ JWT๊ฐ Docker ํ๊ฒฝ์์ ์ ํจํ์ง ์์ ์ ์์
ํ๊ฒฝ๋ณ ์ค์ ๋น๊ต
| ์ค์ | ๋ก์ปฌ (application.yml) |
Docker (application-prod.yml + docker-compose.yml) |
|---|---|---|
| DB URL | localhost:3406 |
db:3306 (์ปจํ
์ด๋๋ช
) |
| ํ์ผ ๊ฒฝ๋ก | C:/workspace/.../uploads |
/app/uploads |
| ํ๋กํ์ผ | default |
prod (Dockerfile์์ ์ง์ ) |
| ํฌํธ | 8080 |
8080:8080 (ํธ์คํธ:์ปจํ
์ด๋) |
| OAuth redirect | localhost:8080 |
${APP_BASE_URL} (ํ๊ฒฝ๋ณ์) |
๐ 2. ๋๋ฒ๊น ๋ช ๋ น์ด ๋ชจ์
Docker ๋ก๊ทธ ํ์ธ
# ์ค์๊ฐ ๋ก๊ทธ ํ์ธ
docker-compose logs -f app
# ์ต๊ทผ 100์ค๋ง ํ์ธ
docker-compose logs --tail=100 app
์ปจํ ์ด๋ ๋ด๋ถ ํ์ธ
# ์
๋ก๋ ํด๋ ํ์ผ ๋ชฉ๋ก
docker exec -it doll_gacha_app ls -la /app/uploads/
# ํ๊ฒฝ๋ณ์ ํ์ธ
docker exec -it doll_gacha_app env | grep -E "(SPRING|FILE)"
# ์ปจํ
์ด๋ ์ ์ ์
docker exec -it doll_gacha_app /bin/sh
๐ 4. ํต์ฌ ๊ตํ
โ ํํ ์ฐฉ๊ฐ๋ค
- โ๋ก์ปฌ์์ ๋๋ฉด Docker์์๋ ๋๋คโ
- ๊ฒฝ๋ก, DB, ํ๊ฒฝ๋ณ์ ๋ชจ๋ ๋ค๋ฆ
- โ์๋ ๊ฒฝ๋ก๊ฐ ํธํ๋คโ
- Docker์์๋ ์ ๋ ๊ฒฝ๋ก๊ฐ ์์
โ ๊ถ์ฅ ์ฌํญ
- Docker์์๋ ์ ๋ ๊ฒฝ๋ก๊ฐ ์์
- ๊ฒฝ๋ก ์ฒ๋ฆฌ๋ ํญ์
Paths.get().toAbsolutePath().normalize()์ฌ์ฉ -
์ถฉ๋ถํ ๋ก๊ทธ ๋จ๊ธฐ๊ธฐ (Docker ๋๋ฒ๊น ์ ๋ก๊ทธ๊ฐ ์๋ช )
๐ ๊ด๋ จ ํ์ผ ๋ชฉ๋ก
src/main/resources/application-prod.yml- Docker ํ๊ฒฝ ์ค์ docker-compose.yml- Docker ๊ตฌ์ฑDockerfile- ์ด๋ฏธ์ง ๋น๋ ์ค์