diff --git a/deployment/container/run-container-guide.md b/deployment/container/run-container-guide.md index e3d11e5..173cfdd 100644 --- a/deployment/container/run-container-guide.md +++ b/deployment/container/run-container-guide.md @@ -1,209 +1,99 @@ -# 백엔드 컨테이너 실행방법 가이드 +# 백엔드 컨테이너 실행 가이드 -## 📋 실행 정보 -- **ACR명**: acrdigitalgarage01 -- **VM 접속정보**: - - KEY파일: ~/home/bastion-dg0500 - - USERID: azureuser - - IP: 4.230.5.6 - -## 🏗️ 시스템 구성 정보 +## 1. 시스템 정보 - **시스템명**: phonebill -- **서비스 목록**: +- **서비스 목록**: - api-gateway (포트: 8080) - - user-service (포트: 8081) + - user-service (포트: 8081) - bill-service (포트: 8082) - product-service (포트: 8083) - kos-mock (포트: 8084) -## 🔌 VM 접속 방법 +## 2. VM 접속 방법 -### 1. 터미널 실행 -- **Linux/Mac**: 기본 터미널 실행 -- **Windows**: Windows Terminal 실행 +### Windows 사용자 +1. **Windows Terminal** 실행 +2. 아래 명령어 순서대로 실행: -### 2. Private Key 파일 권한 설정 (최초 1회만) ```bash +# Private Key 파일 권한 설정 (최초 1회만) chmod 400 ~/home/bastion-dg0500 -``` -### 3. VM 접속 -```bash +# VM 접속 ssh -i ~/home/bastion-dg0500 azureuser@4.230.5.6 ``` -## 🏗️ 컨테이너 이미지 빌드 및 푸시 +### Linux/Mac 사용자 +1. **터미널** 실행 +2. 아래 명령어 순서대로 실행: -### 1. 로컬에서 이미지 빌드 -- `deployment/container/build-image.md` 파일의 가이드에 따라 어플리케이션 빌드 및 컨테이너 이미지 생성 - -### 2. ACR 인증정보 확인 ```bash +# Private Key 파일 권한 설정 (최초 1회만) +chmod 400 ~/home/bastion-dg0500 + +# VM 접속 +ssh -i ~/home/bastion-dg0500 azureuser@4.230.5.6 +``` + +## 3. 컨테이너 이미지 준비 + +### 3.1 이미지 빌드 (로컬에서 수행) +먼저 로컬에서 이미지를 빌드해야 합니다. 아래 가이드를 참고하여 수행하세요: +```bash +# 이미지 빌드 가이드 확인 +cat deployment/container/build-image.md +``` + +### 3.2 Azure Container Registry 로그인 +ACR 인증 정보를 확인하고 Docker 로그인을 수행합니다: + +```bash +# ACR 인증 정보 확인 az acr credential show --name acrdigitalgarage01 + +# 출력 예시: +# { +# "passwords": [ +# { +# "name": "password", +# "value": "실제암호" +# } +# ], +# "username": "acrdigitalgarage01" +# } + +# Docker 로그인 (위에서 확인한 username과 password 사용) +docker login acrdigitalgarage01.azurecr.io -u acrdigitalgarage01 -p 실제암호 ``` -결과 예시: -```json -{ - "passwords": [ - { - "name": "password", - "value": "{암호}" - } - ], - "username": "acrdigitalgarage01" -} -``` +### 3.3 이미지 Push (로컬에서 수행) +각 서비스별로 이미지를 태깅하고 푸시합니다: -### 3. 컨테이너 레지스트리 로그인 (VM에서 수행) ```bash -docker login acrdigitalgarage01.azurecr.io -u acrdigitalgarage01 -p {암호} -``` - -### 4. 이미지 태그 및 푸시 (로컬에서 수행) -```bash -# 각 서비스별로 수행 +# API Gateway docker tag api-gateway:latest acrdigitalgarage01.azurecr.io/phonebill/api-gateway:latest docker push acrdigitalgarage01.azurecr.io/phonebill/api-gateway:latest +# User Service docker tag user-service:latest acrdigitalgarage01.azurecr.io/phonebill/user-service:latest docker push acrdigitalgarage01.azurecr.io/phonebill/user-service:latest +# Bill Service docker tag bill-service:latest acrdigitalgarage01.azurecr.io/phonebill/bill-service:latest docker push acrdigitalgarage01.azurecr.io/phonebill/bill-service:latest +# Product Service docker tag product-service:latest acrdigitalgarage01.azurecr.io/phonebill/product-service:latest docker push acrdigitalgarage01.azurecr.io/phonebill/product-service:latest +# KOS Mock docker tag kos-mock:latest acrdigitalgarage01.azurecr.io/phonebill/kos-mock:latest docker push acrdigitalgarage01.azurecr.io/phonebill/kos-mock:latest ``` -## 🚀 컨테이너 실행 (VM에서 수행) +## 4. 컨테이너 실행 (VM에서 수행) -### 1. api-gateway 실행 -```bash -SERVER_PORT=8080 - -docker run -d --name api-gateway --rm -p ${SERVER_PORT}:${SERVER_PORT} \ --e SERVER_PORT=8080 \ --e SERVER_NETTY_CONNECTION_TIMEOUT=30s \ --e SERVER_NETTY_IDLE_TIMEOUT=60s \ --e SPRING_PROFILES_ACTIVE=dev \ --e JWT_SECRET=your-jwt-secret-key-here \ --e JWT_ACCESS_TOKEN_VALIDITY=180000 \ --e CORS_ALLOWED_ORIGINS="http://localhost:3000,http://4.230.5.6:3000" \ --e USER_SERVICE_URL=http://localhost:8081 \ --e BILL_SERVICE_URL=http://localhost:8082 \ --e PRODUCT_SERVICE_URL=http://localhost:8083 \ --e KOS_MOCK_URL=http://localhost:8084 \ -acrdigitalgarage01.azurecr.io/phonebill/api-gateway:latest -``` - -### 2. user-service 실행 -```bash -SERVER_PORT=8081 - -docker run -d --name user-service --rm -p ${SERVER_PORT}:${SERVER_PORT} \ --e SERVER_PORT=8081 \ --e SPRING_PROFILES_ACTIVE=dev \ --e DB_KIND=postgresql \ --e DB_HOST=localhost \ --e DB_PORT=5432 \ --e DB_NAME=phonebill_auth \ --e DB_USERNAME=phonebill_user \ --e DB_PASSWORD=phonebill_pass \ --e SHOW_SQL=true \ --e DDL_AUTO=update \ --e REDIS_HOST=localhost \ --e REDIS_PORT=6379 \ --e REDIS_PASSWORD= \ --e REDIS_DATABASE=0 \ --e CORS_ALLOWED_ORIGINS="http://localhost:3000,http://4.230.5.6:3000" \ --e JWT_SECRET=your-jwt-secret-key-here \ --e JWT_ACCESS_TOKEN_VALIDITY=1800000 \ --e JWT_REFRESH_TOKEN_VALIDITY=86400000 \ -acrdigitalgarage01.azurecr.io/phonebill/user-service:latest -``` - -### 3. bill-service 실행 -```bash -SERVER_PORT=8082 - -docker run -d --name bill-service --rm -p ${SERVER_PORT}:${SERVER_PORT} \ --e SERVER_PORT=8082 \ --e SPRING_PROFILES_ACTIVE=dev \ --e DB_HOST=20.249.107.185 \ --e DB_PORT=5432 \ --e DB_NAME=product_change \ --e DB_USERNAME=product_user \ --e DB_PASSWORD=product_pass \ --e SHOW_SQL=true \ --e DDL_AUTO=update \ --e REDIS_HOST=localhost \ --e REDIS_PORT=6379 \ --e REDIS_PASSWORD= \ --e REDIS_DATABASE=2 \ --e CORS_ALLOWED_ORIGINS="http://localhost:3000,http://4.230.5.6:3000" \ --e JWT_SECRET=your-jwt-secret-key-here \ --e JWT_ACCESS_TOKEN_VALIDITY=1800 \ --e KOS_BASE_URL=http://localhost:8084 \ --e KOS_CONNECT_TIMEOUT=5000 \ --e KOS_READ_TIMEOUT=30000 \ --e KOS_MAX_RETRIES=3 \ --e KOS_RETRY_DELAY=1000 \ --e KOS_CB_FAILURE_RATE=0.5 \ --e KOS_CB_SLOW_DURATION=10000 \ --e KOS_CB_SLOW_RATE=0.5 \ --e KOS_CB_WINDOW_SIZE=10 \ --e KOS_CB_MIN_CALLS=5 \ --e KOS_CB_HALF_OPEN_CALLS=3 \ --e KOS_CB_OPEN_DURATION=60000 \ --e LOG_PATTERN_CONSOLE= \ --e LOG_PATTERN_FILE= \ --e LOG_FILE_MAX_SIZE=100MB \ --e LOG_FILE_MAX_HISTORY=30 \ -acrdigitalgarage01.azurecr.io/phonebill/bill-service:latest -``` - -### 4. product-service 실행 -```bash -SERVER_PORT=8083 - -docker run -d --name product-service --rm -p ${SERVER_PORT}:${SERVER_PORT} \ --e SERVER_PORT=8083 \ --e SPRING_PROFILES_ACTIVE=dev \ --e DB_HOST=localhost \ --e DB_PORT=5432 \ --e DB_NAME=product_change \ --e DB_USERNAME=product_user \ --e DB_PASSWORD=product_pass \ --e SHOW_SQL=true \ --e DDL_AUTO=update \ --e REDIS_HOST=localhost \ --e REDIS_PORT=6379 \ --e REDIS_PASSWORD= \ --e REDIS_DATABASE=2 \ --e CORS_ALLOWED_ORIGINS="http://localhost:3000,http://4.230.5.6:3000" \ --e JWT_SECRET=your-jwt-secret-key-here \ --e JWT_ACCESS_TOKEN_VALIDITY=1800000 \ --e JWT_REFRESH_TOKEN_VALIDITY=86400000 \ --e KOS_BASE_URL=http://localhost:8084 \ --e KOS_CONNECT_TIMEOUT=5000 \ --e KOS_READ_TIMEOUT=10000 \ --e KOS_MAX_RETRIES=3 \ --e KOS_RETRY_DELAY=1000 \ --e KOS_CB_FAILURE_RATE=0.5 \ --e KOS_CB_SLOW_CALL_THRESHOLD=10000 \ --e KOS_CB_SLOW_CALL_RATE=0.5 \ --e KOS_CB_SLIDING_WINDOW_SIZE=10 \ --e KOS_CB_MIN_CALLS=5 \ --e KOS_CB_HALF_OPEN_CALLS=3 \ --e KOS_CB_WAIT_DURATION=60000 \ -acrdigitalgarage01.azurecr.io/phonebill/product-service:latest -``` - -### 5. kos-mock 실행 +### 4.1 KOS Mock 서비스 실행 ```bash SERVER_PORT=8084 @@ -213,15 +103,125 @@ docker run -d --name kos-mock --rm -p ${SERVER_PORT}:${SERVER_PORT} \ acrdigitalgarage01.azurecr.io/phonebill/kos-mock:latest ``` -## ✅ 실행된 컨테이너 확인 - -### 모든 서비스 상태 확인 +### 4.2 User Service 실행 ```bash -docker ps | grep -E "api-gateway|user-service|bill-service|product-service|kos-mock" +SERVER_PORT=8081 + +docker run -d --name user-service --rm -p ${SERVER_PORT}:${SERVER_PORT} \ +-e CORS_ALLOWED_ORIGINS="http://localhost:3000,http://4.230.5.6:3000" \ +-e DB_HOST=20.249.70.6 \ +-e DB_KIND=postgresql \ +-e DB_NAME=phonebill_auth \ +-e DB_PASSWORD=AuthUser2025! \ +-e DB_PORT=5432 \ +-e DB_USERNAME=auth_user \ +-e DDL_AUTO=update \ +-e JWT_ACCESS_TOKEN_VALIDITY=18000000 \ +-e JWT_REFRESH_TOKEN_VALIDITY=86400000 \ +-e JWT_SECRET="nwe5Yo9qaJ6FBD/Thl2/j6/SFAfNwUorAY1ZcWO2KI7uA4bmVLOCPxE9hYuUpRCOkgV2UF2DdHXtqHi3+BU/ecbz2zpHyf/720h48UbA3XOMYOX1sdM+dQ==" \ +-e REDIS_DATABASE=0 \ +-e REDIS_HOST=20.249.193.103 \ +-e REDIS_PASSWORD=Redis2025Dev! \ +-e REDIS_PORT=6379 \ +-e SERVER_PORT=8081 \ +-e SHOW_SQL=true \ +-e SPRING_PROFILES_ACTIVE=dev \ +acrdigitalgarage01.azurecr.io/phonebill/user-service:latest ``` -### 개별 서비스 확인 +### 4.3 Bill Service 실행 ```bash +SERVER_PORT=8082 + +docker run -d --name bill-service --rm -p ${SERVER_PORT}:${SERVER_PORT} \ +-e CORS_ALLOWED_ORIGINS="http://localhost:3000,http://4.230.5.6:3000" \ +-e DB_CONNECTION_TIMEOUT=30000 \ +-e DB_HOST=20.249.175.46 \ +-e DB_IDLE_TIMEOUT=600000 \ +-e DB_KIND=postgresql \ +-e DB_LEAK_DETECTION=60000 \ +-e DB_MAX_LIFETIME=1800000 \ +-e DB_MAX_POOL=20 \ +-e DB_MIN_IDLE=5 \ +-e DB_NAME=bill_inquiry_db \ +-e DB_PASSWORD=BillUser2025! \ +-e DB_PORT=5432 \ +-e DB_USERNAME=bill_inquiry_user \ +-e JWT_ACCESS_TOKEN_VALIDITY=18000000 \ +-e JWT_REFRESH_TOKEN_VALIDITY=86400000 \ +-e JWT_SECRET="nwe5Yo9qaJ6FBD/Thl2/j6/SFAfNwUorAY1ZcWO2KI7uA4bmVLOCPxE9hYuUpRCOkgV2UF2DdHXtqHi3+BU/ecbz2zpHyf/720h48UbA3XOMYOX1sdM+dQ==" \ +-e KOS_BASE_URL=http://4.230.5.6:8084 \ +-e LOG_FILE_NAME=logs/bill-service.log \ +-e REDIS_DATABASE=1 \ +-e REDIS_HOST=20.249.193.103 \ +-e REDIS_MAX_ACTIVE=8 \ +-e REDIS_MAX_IDLE=8 \ +-e REDIS_MAX_WAIT=-1 \ +-e REDIS_MIN_IDLE=0 \ +-e REDIS_PASSWORD=Redis2025Dev! \ +-e REDIS_PORT=6379 \ +-e REDIS_TIMEOUT=2000 \ +-e SERVER_PORT=8082 \ +-e SPRING_PROFILES_ACTIVE=dev \ +acrdigitalgarage01.azurecr.io/phonebill/bill-service:latest +``` + +### 4.4 Product Service 실행 +```bash +SERVER_PORT=8083 + +docker run -d --name product-service --rm -p ${SERVER_PORT}:${SERVER_PORT} \ +-e CORS_ALLOWED_ORIGINS="http://localhost:3000,http://4.230.5.6:3000" \ +-e DB_HOST=20.249.107.185 \ +-e DB_KIND=postgresql \ +-e DB_NAME=product_change_db \ +-e DB_PASSWORD=ProductUser2025! \ +-e DB_PORT=5432 \ +-e DB_USERNAME=product_change_user \ +-e DDL_AUTO=update \ +-e JWT_ACCESS_TOKEN_VALIDITY=18000000 \ +-e JWT_REFRESH_TOKEN_VALIDITY=86400000 \ +-e JWT_SECRET="nwe5Yo9qaJ6FBD/Thl2/j6/SFAfNwUorAY1ZcWO2KI7uA4bmVLOCPxE9hYuUpRCOkgV2UF2DdHXtqHi3+BU/ecbz2zpHyf/720h48UbA3XOMYOX1sdM+dQ==" \ +-e KOS_API_KEY=dev-api-key \ +-e KOS_BASE_URL=http://4.230.5.6:8084 \ +-e KOS_CLIENT_ID=product-service-dev \ +-e KOS_MOCK_ENABLED=true \ +-e REDIS_DATABASE=2 \ +-e REDIS_HOST=20.249.193.103 \ +-e REDIS_PASSWORD=Redis2025Dev! \ +-e REDIS_PORT=6379 \ +-e SERVER_PORT=8083 \ +-e SPRING_PROFILES_ACTIVE=dev \ +acrdigitalgarage01.azurecr.io/phonebill/product-service:latest +``` + +### 4.5 API Gateway 실행 +```bash +SERVER_PORT=8080 + +docker run -d --name api-gateway --rm -p ${SERVER_PORT}:${SERVER_PORT} \ +-e BILL_SERVICE_URL=http://4.230.5.6:8082 \ +-e CORS_ALLOWED_ORIGINS="http://localhost:3000,http://4.230.5.6:3000" \ +-e JWT_ACCESS_TOKEN_VALIDITY=18000000 \ +-e JWT_REFRESH_TOKEN_VALIDITY=86400000 \ +-e JWT_SECRET="nwe5Yo9qaJ6FBD/Thl2/j6/SFAfNwUorAY1ZcWO2KI7uA4bmVLOCPxE9hYuUpRCOkgV2UF2DdHXtqHi3+BU/ecbz2zpHyf/720h48UbA3XOMYOX1sdM+dQ==" \ +-e KOS_MOCK_URL=http://4.230.5.6:8084 \ +-e PRODUCT_SERVICE_URL=http://4.230.5.6:8083 \ +-e SERVER_PORT=8080 \ +-e SPRING_PROFILES_ACTIVE=dev \ +-e USER_SERVICE_URL=http://4.230.5.6:8081 \ +acrdigitalgarage01.azurecr.io/phonebill/api-gateway:latest +``` + +## 5. 컨테이너 실행 확인 + +전체 서비스가 정상적으로 실행되었는지 확인: + +```bash +# 모든 서비스 확인 +docker ps | grep -E "(api-gateway|user-service|bill-service|product-service|kos-mock)" + +# 개별 서비스 확인 docker ps | grep api-gateway docker ps | grep user-service docker ps | grep bill-service @@ -229,76 +229,100 @@ docker ps | grep product-service docker ps | grep kos-mock ``` -### 로그 확인 +## 6. 서비스 접속 테스트 + +각 서비스의 헬스체크 엔드포인트로 정상 동작을 확인: + ```bash -# 각 서비스별 로그 확인 -docker logs api-gateway -docker logs user-service -docker logs bill-service -docker logs product-service -docker logs kos-mock +# API Gateway +curl http://4.230.5.6:8080/actuator/health + +# User Service +curl http://4.230.5.6:8081/actuator/health + +# Bill Service +curl http://4.230.5.6:8082/actuator/health + +# Product Service +curl http://4.230.5.6:8083/actuator/health + +# KOS Mock +curl http://4.230.5.6:8084/actuator/health ``` -## 🔄 재배포 방법 +## 7. 재배포 방법 -### 1. 컨테이너 이미지 재생성 (로컬에서 수행) +### 7.1 컨테이너 이미지 재생성 (로컬에서 수행) ```bash +# 이미지 재빌드 /deploy-build-image-back ``` -### 2. 컨테이너 이미지 푸시 (로컬에서 수행) +### 7.2 컨테이너 이미지 푸시 (로컬에서 수행) +특정 서비스만 재배포하는 경우: ```bash -# 각 서비스별로 수행 -docker tag api-gateway:latest acrdigitalgarage01.azurecr.io/phonebill/api-gateway:latest -docker push acrdigitalgarage01.azurecr.io/phonebill/api-gateway:latest - +# 예: user-service 재배포 docker tag user-service:latest acrdigitalgarage01.azurecr.io/phonebill/user-service:latest docker push acrdigitalgarage01.azurecr.io/phonebill/user-service:latest - -docker tag bill-service:latest acrdigitalgarage01.azurecr.io/phonebill/bill-service:latest -docker push acrdigitalgarage01.azurecr.io/phonebill/bill-service:latest - -docker tag product-service:latest acrdigitalgarage01.azurecr.io/phonebill/product-service:latest -docker push acrdigitalgarage01.azurecr.io/phonebill/product-service:latest - -docker tag kos-mock:latest acrdigitalgarage01.azurecr.io/phonebill/kos-mock:latest -docker push acrdigitalgarage01.azurecr.io/phonebill/kos-mock:latest ``` -### 3. 컨테이너 중지 (VM에서 수행) +### 7.3 컨테이너 재시작 (VM에서 수행) ```bash -docker stop api-gateway +# 1. 기존 컨테이너 중지 docker stop user-service -docker stop bill-service -docker stop product-service -docker stop kos-mock + +# 2. 컨테이너 이미지 삭제 (캐시 갱신을 위해) +docker rmi acrdigitalgarage01.azurecr.io/phonebill/user-service:latest + +# 3. 새 이미지로 컨테이너 재실행 +SERVER_PORT=8081 + +docker run -d --name user-service --rm -p ${SERVER_PORT}:${SERVER_PORT} \ +-e CORS_ALLOWED_ORIGINS="http://localhost:3000,http://4.230.5.6:3000" \ +-e DB_HOST=20.249.70.6 \ +-e DB_KIND=postgresql \ +-e DB_NAME=phonebill_auth \ +-e DB_PASSWORD=AuthUser2025! \ +-e DB_PORT=5432 \ +-e DB_USERNAME=auth_user \ +-e DDL_AUTO=update \ +-e JWT_ACCESS_TOKEN_VALIDITY=18000000 \ +-e JWT_REFRESH_TOKEN_VALIDITY=86400000 \ +-e JWT_SECRET="nwe5Yo9qaJ6FBD/Thl2/j6/SFAfNwUorAY1ZcWO2KI7uA4bmVLOCPxE9hYuUpRCOkgV2UF2DdHXtqHi3+BU/ecbz2zpHyf/720h48UbA3XOMYOX1sdM+dQ==" \ +-e REDIS_DATABASE=0 \ +-e REDIS_HOST=20.249.193.103 \ +-e REDIS_PASSWORD=Redis2025Dev! \ +-e REDIS_PORT=6379 \ +-e SERVER_PORT=8081 \ +-e SHOW_SQL=true \ +-e SPRING_PROFILES_ACTIVE=dev \ +acrdigitalgarage01.azurecr.io/phonebill/user-service:latest ``` -### 4. 컨테이너 이미지 삭제 (VM에서 수행) +## 8. 전체 서비스 재시작 스크립트 + +모든 서비스를 한번에 재시작하려면: + ```bash +# 모든 컨테이너 중지 +docker stop api-gateway user-service bill-service product-service kos-mock + +# 모든 이미지 삭제 docker rmi acrdigitalgarage01.azurecr.io/phonebill/api-gateway:latest -docker rmi acrdigitalgarage01.azurecr.io/phonebill/user-service:latest +docker rmi acrdigitalgarage01.azurecr.io/phonebill/user-service:latest docker rmi acrdigitalgarage01.azurecr.io/phonebill/bill-service:latest docker rmi acrdigitalgarage01.azurecr.io/phonebill/product-service:latest docker rmi acrdigitalgarage01.azurecr.io/phonebill/kos-mock:latest + +# 컨테이너 재실행 (위의 4.1 ~ 4.5 단계 순서대로 실행) ``` -### 5. 컨테이너 재실행 (VM에서 수행) -위의 "컨테이너 실행" 섹션의 명령어를 다시 실행 +## 주의사항 -## ⚠️ 주의사항 +1. **실행 순서**: KOS Mock → User Service → Bill Service → Product Service → API Gateway 순서로 실행하는 것을 권장합니다. -1. **JWT_SECRET**: 실제 배포 시 보안이 강화된 비밀키로 변경 필요 -2. **CORS 설정**: 프론트엔드 주소가 변경되면 CORS_ALLOWED_ORIGINS도 함께 변경 -3. **데이터베이스**: 실제 데이터베이스 서버 주소와 포트로 변경 필요 -4. **Redis**: 실제 Redis 서버 주소와 포트로 변경 필요 -5. **네트워크**: 컨테이너 간 통신을 위해 Docker 네트워크 구성 고려 -6. **서비스 시작 순서**: kos-mock → user-service → bill-service → product-service → api-gateway 순서로 시작 권장 +2. **CORS 설정**: 프론트엔드에서 접근할 수 있도록 VM IP(4.230.5.6:3000)가 CORS_ALLOWED_ORIGINS에 포함되어 있습니다. -## 🔗 서비스 접속 확인 +3. **로그 확인**: 컨테이너 로그는 `docker logs [컨테이너명]` 명령으로 확인할 수 있습니다. -- **API Gateway**: http://4.230.5.6:8080 -- **User Service**: http://4.230.5.6:8081 -- **Bill Service**: http://4.230.5.6:8082 -- **Product Service**: http://4.230.5.6:8083 -- **KOS Mock**: http://4.230.5.6:8084 \ No newline at end of file +4. **네트워크**: 모든 서비스는 localhost로 서로 통신하도록 설정되어 있습니다. \ No newline at end of file