node 업그레이드-->25 이전 서버설정 cash문제 해결.

This commit is contained in:
2026-04-08 01:10:59 +09:00
parent 9890b906b9
commit db8df83b31
7 changed files with 123 additions and 57 deletions
+46 -15
View File
@@ -134,7 +134,7 @@ INVION/
### 1. 필수 요구사항
- **Java**: 21
- **Node.js**: 20.10+ (프론트엔드 빌드용)
- **Node.js**: **22 LTS+** (`frontend/package.json``engines.node``>=22.0.0` 강제. 프로젝트 루트에 `.nvmrc` 박혀있어 `nvm use` 로 자동 전환됨)
- **PostgreSQL**: 데이터베이스 서버
- **npm**: 10.0+
@@ -148,25 +148,33 @@ cd frontend && npm install && npm run dev
cd backend-spring && ./gradlew bootRun
```
### 3. Docker 환경 실행
### 3. Docker 환경 실행 (dev)
frontend + backend 한 컴포즈 파일로 띄움. 코드 변경은 volume mount 로 컨테이너 안에 즉시 반영됨 (turbopack 자동 리로드).
```bash
# 개발 (백엔드 + 프론트엔드)
docker-compose -f docker-compose.backend.win.yml up -d
docker-compose -f docker-compose.frontend.win.yml up -d
# 개발 환경 한 번에 띄우기
docker compose -f docker/dev/docker-compose.invyone.yml up -d
# 프로덕션 배포
docker-compose -f docker/deploy/docker-compose.yml up -d
# 내리기 / 재시작 / 로그
docker compose -f docker/dev/docker-compose.invyone.yml down
docker compose -f docker/dev/docker-compose.invyone.yml restart
docker compose -f docker/dev/docker-compose.invyone.yml logs -f
# 프로덕션 배포 (별도)
docker compose -f docker/deploy/docker-compose.yml up -d
```
### 4. 서비스 접속
| 서비스 | URL | 설명 |
|--------|-----|------|
| **프론트엔드** | http://localhost:9771 | Next.js UI |
| **백엔드 API** | http://localhost:8081 | Spring Boot REST API |
| 환경 | 서비스 | URL | 설명 |
|------|--------|-----|------|
| **로컬 dev** (`npm run dev` / `gradlew bootRun`) | 프론트엔드 | http://localhost:9771 | Next.js (turbopack) |
| | 백엔드 API | http://localhost:8081 | Spring Boot |
| **도커 dev** (위 컴포즈) | 프론트엔드 | http://localhost:9772 | 컨테이너 내부 3000 → 호스트 9772 |
| | 백엔드 API | http://localhost:8083 | 컨테이너 내부 8081 → 호스트 8083 |
> 프론트엔드는 `next.config.mjs`의 rewrite 설정으로 `/api/*` 요청을 백엔드(8081)로 프록시합니다.
> 프론트엔드는 `next.config.mjs` 의 rewrites 설정으로 `/api/*` 요청을 백엔드로 프록시합니다 (도커 컴포즈에서는 컨테이너 네트워크 내부 이름 `invyone-backend-spring:8081` 로 프록시).
## 주요 기능
@@ -244,8 +252,11 @@ file:
```
```bash
# frontend/.env.local
NEXT_PUBLIC_API_URL=http://localhost:8081/api
# frontend/.env.local — 클라이언트(브라우저) 가 사용할 API base URL
# 반드시 상대경로 "/api" 로 둘 것. 절대 URL (예: http://localhost:8083/api) 을 박으면
# 다른 머신/도메인에서 접속할 때 클라이언트가 자기 자신을 찌르며 connection refused 발생함.
# next dev server 의 rewrites 가 "/api/*" 를 컨테이너 내부 backend 로 프록시한다.
NEXT_PUBLIC_API_URL=/api
```
## 배포
@@ -259,7 +270,7 @@ docker build -t invion .
멀티스테이지 빌드 과정:
1. **Stage 1** — Spring Boot 빌드 (`eclipse-temurin:21-jdk-alpine`, Gradle → bootJar)
2. **Stage 2** — Next.js 빌드 (`node:20.10-alpine`, npm → standalone)
2. **Stage 2** — Next.js 빌드 (`node:22-alpine`, npm → standalone)
3. **Stage 3** — 런타임 (`eclipse-temurin:21-jre-alpine` + Node.js, 두 서비스 병렬 실행)
### CI/CD 파이프라인
@@ -274,6 +285,26 @@ Git Push → Jenkins → Kaniko 이미지 빌드 → 프라이빗 레지스트
- **배포**: Helm 차트 + GitOps (이미지 태그 자동 업데이트)
- **프로덕션 도메인**: Traefik 리버스 프록시 + Let's Encrypt HTTPS
## 알려진 설정 정책
후임자/협업자가 "이거 왜 이렇게 짜놨지?" 헷갈리지 않도록 의도가 있는 비명시적 결정만 정리.
### `frontend/next.config.mjs` — `isDev` 분기
`output: "standalone"``experimental.webpackMemoryOptimizations`**prod build 에서만 켜진다** (`NODE_ENV !== "production"` 이면 비활성화). dev 모드에서 같이 켜면 다음 두 가지 부작용이 동시에 발생함:
- `output: standalone` 이 dev 청크 manifest 경로 처리를 깨트림 → 라우트 그룹 `(main)/(auth)` 의 layout/page 청크가 `_next/static/chunks/...` 에 못 만들어짐
- `webpackMemoryOptimizations` 가 컴파일된 SSR 청크를 GC 해버려서 첫 visit 후 ENOENT 발생 → ChunkLoadError 영구화
→ 두 옵션은 절대 dev 에서 켜지 말 것. prod build 에서만 의미 있음.
### `docker/dev/frontend.Dockerfile` — turbopack 강제
`dev:docker` 스크립트에 `--turbopack` 플래그가 박혀있다. 도커에서 webpack 으로 돌리면 next 15 + app router + 라우트 그룹 `(main)/(auth)` 조합에서 layout/page 청크가 disk 에 flush 되지 않는 케이스가 발생함. 로컬 dev (`npm run dev`) 도 동일하게 turbopack 사용. 베이스 이미지는 `node:22-alpine`.
### Frontend → Backend API 호출 — 반드시 상대경로
위 "환경 변수" 섹션 참고. `NEXT_PUBLIC_API_URL` 에 절대 URL 을 박으면 안 된다. `/api` 로 두고 `next.config.mjs` 의 rewrites 가 처리하도록 위임.
## 코드 컨벤션
### 네이밍 규칙