Files
sam-docs/WSL_MIGRATION_PLAN.md
강영보 220ab78041 docs: [bending] 절곡품 전용 테이블 분리 완료 문서
- README: bending_items 266건 + bending_models 62건 DB 검증 완료
- README: 하장바 검색 문제 해결 (10건 정상)
- README: bending_data JSON 통합, bending_item_mappings DROP
- README: LOT 코드 체계, 테이블 관계도, 레거시 대응표 갱신
- step1: 데이터분석 업데이트
- step5: canvas 그리기 추가
- .gitattributes CRLF→LF 정규화
2026-03-19 20:04:17 +09:00

12 KiB

WSL 내부 Docker 환경 마이그레이션 계획

1. 현재 구조 (문제점)

┌─ Windows 11 (NTFS) ─────────────────────────────────────┐
│  C:/work/@KD_SAM/SAM/                                    │
│  ├── api/     (406MB)   소스코드                          │
│  ├── react/   (649MB)   소스 20MB + node_modules 629MB   │
│  ├── mng/     (89MB)    소스코드                          │
│  ├── 5130/    (799MB)   레거시                            │
│  ├── docker/  (237MB)   Docker 설정 + SSL                │
│  └── docs/    (57MB)    문서                              │
│                                                           │
│  ──── 9P 프로토콜 (느림) ────                              │
│                                                           │
│  ┌─ Docker Desktop (WSL2 backend) ──────────────────┐    │
│  │  nginx, api, react, mng, legacy, mysql            │    │
│  │  바인드 마운트가 Windows NTFS 경유 → 느림          │    │
│  │                                                    │    │
│  │  extra_hosts: api.sam.kr → host-gateway            │    │
│  │  → React SSR API 호출이 Docker 밖으로 나감          │    │
│  └────────────────────────────────────────────────────┘    │
└───────────────────────────────────────────────────────────┘

병목 3가지

# 병목 원인 영향
1 파일 I/O 느림 Windows NTFS → WSL2 ext4 간 9P 프로토콜 HMR 3~5초, npm install 수분
2 API 호출 우회 extra_hosts로 Docker→WSL호스트→Docker 왕복 API 호출마다 +10~20ms
3 파일 감시 폴링 inotify 불가 → 3초 폴링 코드 변경 반영 3초 지연

현재 시스템 사양

항목
RAM 32GB
CPU 20 논리 코어
.wslconfig 없음 (기본값)
WSL 배포판 docker-desktop만 있음
Docker Docker Desktop (WSL2 backend)

현재 DB 크기

DB 크기
samdb 177 MB
sam 25 MB
chandj 21 MB
기타 (backup 등) ~20 MB
합계 ~250 MB

현재 실행 중 컨테이너

컨테이너 상태
nginx Running (26h)
mysql Running (25h)
api Running (19h)
mng Running (26h)
legacy Running (26h)
react Not Running
phpmyadmin Not Running

2. 목표 구조

┌─ WSL2 Ubuntu 24.04 (ext4 네이티브) ─────────────────────┐
│                                                           │
│  ~/sam/                                                   │
│  ├── api/     ← git clone (네이티브 ext4)                 │
│  ├── react/   ← git clone (네이티브 ext4)                 │
│  ├── mng/     ← git clone (네이티브 ext4)                 │
│  ├── 5130/    ← 파일 복사 (git 없으면)                    │
│  ├── docker/  ← 복사 + 수정                               │
│  └── docs/    ← 복사                                      │
│                                                           │
│  ┌─ Docker Engine (WSL 네이티브) ───────────────────┐    │
│  │  바인드 마운트 = 같은 ext4 → 네이티브 속도         │    │
│  │                                                    │    │
│  │  서비스 간 통신: Docker 내부 DNS 직접 연결          │    │
│  │  → extra_hosts 불필요                              │    │
│  │  → 파일 폴링 불필요 (inotify 정상 작동)            │    │
│  └────────────────────────────────────────────────────┘    │
│                                                           │
│  Windows에서 접근: \\wsl$\Ubuntu-24.04\home\user\sam      │
│  VSCode: Remote WSL 확장으로 편집                          │
│                                                           │
└───────────────────────────────────────────────────────────┘

개선 효과 예상

항목 현재 목표 개선폭
파일 I/O 9P (느림) ext4 네이티브 5~10배
Next.js HMR 3~5초 0.3~1초 3~5배
npm install 3~5분 30초~1분 3~5배
API 내부 호출 Docker→WSL→Docker Docker 내부 직접 2~3배
파일 감시 3초 폴링 inotify 즉시 즉시 반영

3. 마이그레이션 단계

Phase 1: WSL Ubuntu 설치 + 기본 설정 (10분)

# 1-1. Ubuntu 24.04 설치
wsl --install -d Ubuntu-24.04

# 1-2. 초기 설정 (Ubuntu 내부)
sudo apt update && sudo apt upgrade -y

# 1-3. 기본 도구 설치
sudo apt install -y git curl wget unzip

Phase 2: Docker Engine 설치 (10분)

Docker Desktop 대신 WSL 내부에 Docker Engine 직접 설치

# 2-1. Docker 공식 GPG 키 + 저장소 추가
sudo apt install -y ca-certificates gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo $VERSION_CODENAME) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 2-2. Docker Engine 설치
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

# 2-3. 현재 사용자를 docker 그룹에 추가
sudo usermod -aG docker $USER

# 2-4. Docker 시작
sudo service docker start

Phase 3: .wslconfig 설정 (2분)

Windows 측에서 WSL 리소스 할당

파일: C:\Users\codeb\.wslconfig

[wsl2]
memory=12GB
processors=8
swap=4GB
localhostForwarding=true

32GB RAM 중 12GB 할당 (Docker + 6개 컨테이너 충분)

Phase 4: 소스코드 가져오기 (10~15분)

# 4-1. 디렉토리 구조 생성
mkdir -p ~/sam

# 4-2. Git clone (소스코드만, vendor/node_modules 제외)
cd ~/sam
git clone http://114.203.209.83:3000/SamProject/sam-api.git api
git clone http://114.203.209.83:3000/SamProject/sam-react.git react
git clone http://114.203.209.83:3000/SamProject/sam-manage.git mng

# 4-3. 각 저장소 브랜치 맞추기
cd ~/sam/api && git checkout develop
cd ~/sam/mng && git checkout sam-kkk

# 4-4. Git 사용자 설정
git config --global user.name "강영보"
git config --global user.email "sam-kkk@codebridge-x.com"

# 4-5. 레거시(5130) - Git 저장소가 없으면 Windows에서 복사
cp -r /mnt/c/work/@KD_SAM/SAM/5130 ~/sam/5130

# 4-6. Docker 설정 복사
cp -r /mnt/c/work/@KD_SAM/SAM/docker ~/sam/docker

# 4-7. 문서 복사
cp -r /mnt/c/work/@KD_SAM/SAM/docs ~/sam/docs

# 4-8. .env 파일 복사 (git에 포함 안 된 경우)
cp /mnt/c/work/@KD_SAM/SAM/api/.env ~/sam/api/.env
cp /mnt/c/work/@KD_SAM/SAM/react/.env ~/sam/react/.env
cp /mnt/c/work/@KD_SAM/SAM/mng/.env ~/sam/mng/.env
cp /mnt/c/work/@KD_SAM/SAM/5130/.env ~/sam/5130/.env 2>/dev/null

Phase 5: Docker 설정 수정 (5분)

5-1. docker-compose.yml 수정

변경사항:

항목 변경 전 변경 후 이유
extra_hosts api.sam.kr:host-gateway 제거 Docker 내부 DNS로 충분
WATCHPACK_POLLING 3000 제거 ext4에서 inotify 정상 작동
CHOKIDAR_USEPOLLING true 제거 폴링 불필요
CHOKIDAR_INTERVAL 3000 제거 폴링 불필요

5-2. React 환경변수 수정 (SSR 내부 통신 최적화)

react:
  environment:
    - NEXT_PUBLIC_API_URL=https://api.sam.kr       # 브라우저용 (유지)
    - API_URL_INTERNAL=http://api:9000             # SSR용 (추가)
    # 아래 3줄 제거
    # - WATCHPACK_POLLING=3000
    # - CHOKIDAR_USEPOLLING=true
    # - CHOKIDAR_INTERVAL=3000
  # extra_hosts 제거

5-3. Windows hosts 파일 유지

C:\Windows\System32\drivers\etc\hosts (기존과 동일):

127.0.0.1  dev.sam.kr api.sam.kr mng.sam.kr admin.sam.kr 5130.sam.kr

WSL2의 localhostForwarding=true 덕분에 Windows에서 localhost로 WSL 포트 접근 가능

Phase 6: DB 마이그레이션 (5~10분)

# 6-1. Windows Docker에서 DB 덤프 (Windows 측에서 실행)
# PowerShell 또는 Git Bash에서:
docker exec docker-mysql-1 mysqldump -uroot -proot --all-databases --routines --triggers > /mnt/c/temp/sam_db_dump.sql

# 6-2. WSL Ubuntu에서 Docker 컨테이너 시작 (MySQL만 먼저)
cd ~/sam/docker
docker compose up -d mysql
# MySQL 초기화 대기 (약 30초)
sleep 30

# 6-3. DB 덤프 복원
docker exec -i $(docker compose ps -q mysql) mysql -uroot -proot < /mnt/c/temp/sam_db_dump.sql

Phase 7: 전체 서비스 빌드 + 실행 (10~15분)

cd ~/sam/docker

# 7-1. 이미지 빌드
docker compose build

# 7-2. 전체 서비스 시작
docker compose up -d

# 7-3. 상태 확인
docker compose ps

# 7-4. 로그 확인
docker compose logs -f --tail=50

Phase 8: 검증 (5분)

# 확인 항목 방법
1 서비스 실행 상태 docker compose ps - 모든 컨테이너 Up
2 Nginx 접근 브라우저에서 https://dev.sam.kr 열기
3 API 응답 curl -k https://api.sam.kr/api/health
4 관리자 접근 https://admin.sam.kr 열기
5 DB 연결 phpMyAdmin (http://localhost:8080)
6 HMR 작동 React 소스 수정 → 즉시 반영 확인
7 파일 감시 WATCHPACK_POLLING 없이 변경 감지 확인

Phase 9: Docker Desktop 정리 (선택)

# 기존 Docker Desktop 컨테이너 중지 (Windows에서)
docker compose -f C:/work/@KD_SAM/SAM/docker/docker-compose.yml down

# Docker Desktop 비활성화 또는 제거 (선택)
# → WSL Ubuntu Docker와 충돌 방지

4. 주의사항

포트 충돌

포트 용도 주의
80/443 Nginx Docker Desktop 먼저 중지해야 함
3306 MySQL 동시에 2개 MySQL 불가
8080 phpMyAdmin 충돌 가능

반드시 기존 Docker Desktop 컨테이너를 먼저 중지 후 WSL Docker 시작

VSCode 편집 환경

기존: VSCode에서 C:/work/@KD_SAM/SAM/ 직접 편집
변경: VSCode Remote WSL 확장 사용
  - Ctrl+Shift+P → "WSL: Connect to WSL"
  - ~/sam/ 폴더 열기
  - 터미널도 WSL Ubuntu 내부에서 실행

Git 작업 흐름

기존: Windows Git Bash에서 커밋/푸시
변경: WSL Ubuntu 터미널에서 커밋/푸시 (동일한 원격 저장소)
  - 또는 VSCode Remote WSL의 Git 기능 사용

백업/롤백 계획

Windows 원본 소스: C:/work/@KD_SAM/SAM/ (그대로 보존)
Windows Docker: 컨테이너 중지만 (삭제 안 함)
DB 덤프: C:/temp/sam_db_dump.sql (보존)

문제 시 롤백:
  1. WSL Docker 중지: docker compose down
  2. Windows Docker 재시작: docker compose up -d
  → 5분 이내 원복 가능

5. 일정 요약

Phase 작업 소요 시간
1 Ubuntu 설치 + 기본 설정 10분
2 Docker Engine 설치 10분
3 .wslconfig 설정 2분
4 소스코드 가져오기 10~15분
5 Docker 설정 수정 5분
6 DB 마이그레이션 5~10분
7 빌드 + 실행 10~15분
8 검증 5분
9 Docker Desktop 정리 3분
합계 약 60~75분

롤백 가능하므로 리스크 낮음. Windows 원본은 그대로 보존.