diff --git a/.github/kustomize/base/distribution-service-deployment.yaml b/.github/kustomize/base/distribution-service-deployment.yaml index 6eeb27d..feb2698 100644 --- a/.github/kustomize/base/distribution-service-deployment.yaml +++ b/.github/kustomize/base/distribution-service-deployment.yaml @@ -41,21 +41,21 @@ spec: memory: "1024Mi" startupProbe: httpGet: - path: /actuator/health + path: /api/v1/distribution/actuator/health port: 8085 initialDelaySeconds: 30 periodSeconds: 10 failureThreshold: 30 readinessProbe: httpGet: - path: /actuator/health/readiness + path: /api/v1/distribution/actuator/health/readiness port: 8085 initialDelaySeconds: 10 periodSeconds: 5 failureThreshold: 3 livenessProbe: httpGet: - path: /actuator/health/liveness + path: /api/v1/distribution/actuator/health/liveness port: 8085 initialDelaySeconds: 30 periodSeconds: 10 diff --git a/analytics-service/.run/analytics-service.run.xml b/analytics-service/.run/analytics-service.run.xml index 15941a1..de874e9 100644 --- a/analytics-service/.run/analytics-service.run.xml +++ b/analytics-service/.run/analytics-service.run.xml @@ -39,7 +39,7 @@ - + diff --git a/analytics-service/src/main/resources/application.yml b/analytics-service/src/main/resources/application.yml index dc4c969..660fc41 100644 --- a/analytics-service/src/main/resources/application.yml +++ b/analytics-service/src/main/resources/application.yml @@ -84,7 +84,11 @@ jwt: # CORS Configuration cors: - allowed-origins: ${CORS_ALLOWED_ORIGINS:http://localhost:*} + allowed-origins: ${CORS_ALLOWED_ORIGINS:http://localhost:8081,http://localhost:8082,http://localhost:8083,http://localhost:8084,http://kt-event-marketing.20.214.196.128.nip.io} + allowed-methods: ${CORS_ALLOWED_METHODS:GET,POST,PUT,DELETE,OPTIONS,PATCH} + allowed-headers: ${CORS_ALLOWED_HEADERS:*} + allow-credentials: ${CORS_ALLOW_CREDENTIALS:true} + max-age: ${CORS_MAX_AGE:3600} # Actuator management: diff --git a/content-service/src/main/resources/application.yml b/content-service/src/main/resources/application.yml index 1ff0b87..db1b79b 100644 --- a/content-service/src/main/resources/application.yml +++ b/content-service/src/main/resources/application.yml @@ -40,7 +40,11 @@ replicate: # CORS Configuration cors: - allowed-origins: ${CORS_ALLOWED_ORIGINS:http://localhost:*} + allowed-origins: ${CORS_ALLOWED_ORIGINS:http://localhost:8081,http://localhost:8082,http://localhost:8083,http://localhost:8084,http://kt-event-marketing.20.214.196.128.nip.io} + allowed-methods: ${CORS_ALLOWED_METHODS:GET,POST,PUT,DELETE,OPTIONS,PATCH} + allowed-headers: ${CORS_ALLOWED_HEADERS:*} + allow-credentials: ${CORS_ALLOW_CREDENTIALS:true} + max-age: ${CORS_MAX_AGE:3600} # Actuator management: diff --git a/deployment/container/build-image.md b/deployment/container/build-image.md index 010d937..3632fe7 100644 --- a/deployment/container/build-image.md +++ b/deployment/container/build-image.md @@ -1,68 +1,57 @@ -# 백엔드 컨테이너 이미지 작성 결과 +# 백엔드 컨테이너 이미지 빌드 결과 -## 작업 개요 -- **작업일시**: 2025-10-29 -- **작성자**: DevOps Engineer (송근정 "데브옵스 마스터") -- **대상 서비스**: 6개 백엔드 마이크로서비스 +## 개요 +KT 이벤트 마케팅 서비스의 백엔드 마이크로서비스들에 대한 컨테이너 이미지를 생성하였습니다. -## 1. 서비스 확인 +## 작업 일시 +- 날짜: 2025-10-29 +- 빌드 환경: Windows (MINGW64_NT-10.0-19045) -### settings.gradle 분석 -```gradle +## 서비스 목록 확인 + +settings.gradle에서 확인한 서비스 목록: +``` rootProject.name = 'kt-event-marketing' -// Common module include 'common' - -// Microservices include 'user-service' include 'event-service' include 'ai-service' -include 'content-service' include 'distribution-service' include 'participation-service' include 'analytics-service' ``` -### 빌드 가능한 서비스 (6개) -Main Application 클래스가 존재하는 서비스: -1. **user-service** - `UserServiceApplication.java` -2. **event-service** - `EventServiceApplication.java` -3. **ai-service** - `AiServiceApplication.java` -4. **content-service** - `ContentApplication.java` -5. **participation-service** - `ParticipationServiceApplication.java` -6. **analytics-service** - `AnalyticsServiceApplication.java` +**빌드 대상 서비스 (6개):** +- user-service (Java/Spring Boot) +- event-service (Java/Spring Boot) +- ai-service (Java/Spring Boot) +- distribution-service (Java/Spring Boot) +- participation-service (Java/Spring Boot) +- analytics-service (Java/Spring Boot) -### 제외된 서비스 -- **distribution-service**: 소스 코드 미구현 상태 (src/main/java 디렉토리 없음) +**제외 대상:** +- common: 공통 라이브러리 모듈 (독립 실행 서비스 아님) +- content-service: Python 기반 서비스 (별도 빌드 필요) -## 2. bootJar 설정 +## bootJar 설정 확인 -각 서비스의 `build.gradle`에 bootJar 설정 추가/수정: +모든 Java 서비스의 build.gradle에 bootJar 설정이 올바르게 구성되어 있음을 확인: -### 설정 추가된 서비스 (5개) -```gradle -bootJar { - archiveFileName = '{service-name}.jar' -} -``` +| 서비스명 | JAR 파일명 | 경로 | +|---------|-----------|------| +| user-service | user-service.jar | user-service/build/libs/user-service.jar | +| event-service | event-service.jar | event-service/build/libs/event-service.jar | +| ai-service | ai-service.jar | ai-service/build/libs/ai-service.jar | +| distribution-service | distribution-service.jar | distribution-service/build/libs/distribution-service.jar | +| participation-service | participation-service.jar | participation-service/build/libs/participation-service.jar | +| analytics-service | analytics-service.jar | analytics-service/build/libs/analytics-service.jar | -- user-service/build.gradle -- ai-service/build.gradle -- distribution-service/build.gradle (향후 구현 대비) -- participation-service/build.gradle -- analytics-service/build.gradle +## Dockerfile 생성 -### 기존 설정 확인된 서비스 (2개) -- event-service/build.gradle ✅ -- content-service/build.gradle ✅ +**파일 위치:** `deployment/container/Dockerfile-backend` -## 3. Dockerfile 생성 - -### 파일 경로 -`deployment/container/Dockerfile-backend` - -### Dockerfile 내용 +**Dockerfile 구성:** ```dockerfile # Build stage FROM openjdk:23-oraclelinux8 AS builder @@ -91,58 +80,34 @@ ENTRYPOINT [ "sh", "-c" ] CMD ["java ${JAVA_OPTS} -jar app.jar"] ``` -### Dockerfile 특징 -- **Multi-stage build**: 빌드와 실행 스테이지 분리 -- **Non-root user**: 보안을 위한 k8s 사용자 실행 -- **플랫폼**: linux/amd64 (K8s 클러스터 호환) -- **Java 버전**: OpenJDK 23 +**주요 특징:** +- Multi-stage 빌드: 빌드 이미지와 런타임 이미지 분리 +- Base Image: openjdk:23-slim (경량화) +- 보안: 비root 사용자(k8s)로 실행 +- 플랫폼: linux/amd64 -## 4. JAR 파일 빌드 +## Gradle 빌드 실행 -### 빌드 명령어 +**실행 명령:** ```bash -./gradlew user-service:bootJar ai-service:bootJar event-service:bootJar \ - content-service:bootJar participation-service:bootJar analytics-service:bootJar +./gradlew clean build -x test ``` -### 빌드 결과 -``` -BUILD SUCCESSFUL in 27s -33 actionable tasks: 15 executed, 18 up-to-date -``` +**빌드 결과:** +- 상태: ✅ BUILD SUCCESSFUL +- 소요 시간: 33초 +- 실행된 태스크: 56개 -### 생성된 JAR 파일 -```bash -$ ls -lh */build/libs/*.jar +## 컨테이너 이미지 빌드 --rw-r--r-- 1 KTDS 197121 94M 10월 29 09:49 ai-service/build/libs/ai-service.jar --rw-r--r-- 1 KTDS 197121 95M 10월 29 09:48 analytics-service/build/libs/analytics-service.jar --rw-r--r-- 1 KTDS 197121 78M 10월 29 09:49 content-service/build/libs/content-service.jar --rw-r--r-- 1 KTDS 197121 94M 10월 29 09:49 event-service/build/libs/event-service.jar --rw-r--r-- 1 KTDS 197121 85M 10월 29 09:49 participation-service/build/libs/participation-service.jar --rw-r--r-- 1 KTDS 197121 96M 10월 29 09:49 user-service/build/libs/user-service.jar -``` +### 병렬 빌드 전략 +서브 에이전트를 활용하여 6개 서비스를 동시에 빌드하여 시간 단축 -## 5. Docker 이미지 빌드 +### 1. user-service -### 사전 준비사항 -⚠️ **Docker Desktop이 실행 중이어야 합니다** - -Docker Desktop 시작 확인: -```bash -# Docker 상태 확인 -docker version -docker ps - -# Docker Desktop이 정상 실행되면 위 명령들이 정상 동작합니다 -``` - -### 빌드 명령어 - -#### 5.1 user-service +**빌드 명령:** ```bash DOCKER_FILE=deployment/container/Dockerfile-backend - docker build \ --platform linux/amd64 \ --build-arg BUILD_LIB_DIR="user-service/build/libs" \ @@ -151,22 +116,17 @@ docker build \ -t user-service:latest . ``` -#### 5.2 ai-service +**결과:** +- 상태: ✅ SUCCESS +- 이미지 ID: fb07547604be +- 이미지 크기: 1.09GB +- Image SHA: sha256:fb07547604bee7e8ff69e56e8423299b7dec277e80d865ee5013ddd876a0b4c6 + +### 2. event-service + +**빌드 명령:** ```bash DOCKER_FILE=deployment/container/Dockerfile-backend - -docker build \ - --platform linux/amd64 \ - --build-arg BUILD_LIB_DIR="ai-service/build/libs" \ - --build-arg ARTIFACTORY_FILE="ai-service.jar" \ - -f ${DOCKER_FILE} \ - -t ai-service:latest . -``` - -#### 5.3 event-service -```bash -DOCKER_FILE=deployment/container/Dockerfile-backend - docker build \ --platform linux/amd64 \ --build-arg BUILD_LIB_DIR="event-service/build/libs" \ @@ -175,22 +135,56 @@ docker build \ -t event-service:latest . ``` -#### 5.4 content-service +**결과:** +- 상태: ✅ SUCCESS +- 이미지 ID: 191a9882a628 +- 이미지 크기: 1.08GB +- 빌드 시간: ~20초 + +### 3. ai-service + +**빌드 명령:** ```bash DOCKER_FILE=deployment/container/Dockerfile-backend - docker build \ --platform linux/amd64 \ - --build-arg BUILD_LIB_DIR="content-service/build/libs" \ - --build-arg ARTIFACTORY_FILE="content-service.jar" \ + --build-arg BUILD_LIB_DIR="ai-service/build/libs" \ + --build-arg ARTIFACTORY_FILE="ai-service.jar" \ -f ${DOCKER_FILE} \ - -t content-service:latest . + -t ai-service:latest . ``` -#### 5.5 participation-service +**결과:** +- 상태: ✅ SUCCESS +- 이미지 ID: 498feb888dc5 +- 이미지 크기: 1.08GB +- Image SHA: sha256:498feb888dc58a98715841c4e50f191bc8434eccd12baefa79e82b0e44a5bc40 + +### 4. distribution-service + +**빌드 명령:** ```bash DOCKER_FILE=deployment/container/Dockerfile-backend +docker build \ + --platform linux/amd64 \ + --build-arg BUILD_LIB_DIR="distribution-service/build/libs" \ + --build-arg ARTIFACTORY_FILE="distribution-service.jar" \ + -f ${DOCKER_FILE} \ + -t distribution-service:latest . +``` +**결과:** +- 상태: ✅ SUCCESS +- 이미지 ID: e0ad31c51b63 +- 이미지 크기: 1.08GB +- Image SHA: sha256:e0ad31c51b63b44d67f017cca8a729ae9cbb5e9e9503feddb308c09f19b70fba +- 빌드 시간: ~60초 + +### 5. participation-service + +**빌드 명령:** +```bash +DOCKER_FILE=deployment/container/Dockerfile-backend docker build \ --platform linux/amd64 \ --build-arg BUILD_LIB_DIR="participation-service/build/libs" \ @@ -199,10 +193,18 @@ docker build \ -t participation-service:latest . ``` -#### 5.6 analytics-service +**결과:** +- 상태: ✅ SUCCESS +- 이미지 ID: 9bd60358659b +- 이미지 크기: 1.04GB +- Image SHA: sha256:9bd60358659b528190edcab699152b5126dc906070e05d355310303ac292f02b +- 빌드 시간: ~37초 + +### 6. analytics-service + +**빌드 명령:** ```bash DOCKER_FILE=deployment/container/Dockerfile-backend - docker build \ --platform linux/amd64 \ --build-arg BUILD_LIB_DIR="analytics-service/build/libs" \ @@ -211,186 +213,55 @@ docker build \ -t analytics-service:latest . ``` -### 빌드 스크립트 (일괄 실행) +**결과:** +- 상태: ✅ SUCCESS +- 이미지 ID: 33b53299ec16 +- 이미지 크기: 1.08GB +- Image SHA: sha256:33b53299ec16e0021a9adca4fb32535708021073df03c30b8a0ea335348547de + +## 생성된 이미지 확인 + +**확인 명령:** ```bash -#!/bin/bash -# build-all-images.sh - -DOCKER_FILE=deployment/container/Dockerfile-backend - -services=( - "user-service" - "ai-service" - "event-service" - "content-service" - "participation-service" - "analytics-service" -) - -for service in "${services[@]}"; do - echo "Building ${service}..." - docker build \ - --platform linux/amd64 \ - --build-arg BUILD_LIB_DIR="${service}/build/libs" \ - --build-arg ARTIFACTORY_FILE="${service}.jar" \ - -f ${DOCKER_FILE} \ - -t ${service}:latest . - - if [ $? -eq 0 ]; then - echo "✅ ${service} build successful" - else - echo "❌ ${service} build failed" - exit 1 - fi -done - -echo "🎉 All images built successfully!" +docker images | grep -E "(user-service|event-service|ai-service|distribution-service|participation-service|analytics-service)" | grep latest ``` -## 6. 이미지 확인 - -### 생성된 이미지 확인 명령어 -```bash -# 모든 서비스 이미지 확인 -docker images | grep -E "(user-service|ai-service|event-service|content-service|participation-service|analytics-service)" - -# 개별 서비스 확인 -docker images user-service:latest -docker images ai-service:latest -docker images event-service:latest -docker images content-service:latest -docker images participation-service:latest -docker images analytics-service:latest +**확인 결과:** +``` +event-service latest 191a9882a628 39 seconds ago 1.08GB +ai-service latest 498feb888dc5 46 seconds ago 1.08GB +analytics-service latest 33b53299ec16 46 seconds ago 1.08GB +user-service latest fb07547604be 47 seconds ago 1.09GB +participation-service latest 9bd60358659b 48 seconds ago 1.04GB +distribution-service latest e0ad31c51b63 48 seconds ago 1.08GB ``` -### 빌드 결과 ✅ -``` -REPOSITORY TAG IMAGE ID CREATED SIZE -user-service latest 91c511ef86bd About a minute ago 1.09GB -ai-service latest 9477022fa493 About a minute ago 1.08GB -event-service latest add81de69536 About a minute ago 1.08GB -content-service latest aa9cc16ad041 About a minute ago 1.01GB -participation-service latest 9b044a3854dd About a minute ago 1.04GB -analytics-service latest ac569de42545 About a minute ago 1.08GB -``` +## 빌드 결과 요약 -**빌드 일시**: 2025-10-29 09:50 KST -**빌드 소요 시간**: 약 13초 (병렬 빌드) -**총 이미지 크기**: 6.48GB +| 서비스명 | 이미지 태그 | 이미지 ID | 크기 | 상태 | +|---------|-----------|----------|------|------| +| user-service | user-service:latest | fb07547604be | 1.09GB | ✅ | +| event-service | event-service:latest | 191a9882a628 | 1.08GB | ✅ | +| ai-service | ai-service:latest | 498feb888dc5 | 1.08GB | ✅ | +| distribution-service | distribution-service:latest | e0ad31c51b63 | 1.08GB | ✅ | +| participation-service | participation-service:latest | 9bd60358659b | 1.04GB | ✅ | +| analytics-service | analytics-service:latest | 33b53299ec16 | 1.08GB | ✅ | -## 7. 이미지 테스트 +**총 6개 서비스 이미지 빌드 성공** -### 로컬 실행 테스트 (예시: user-service) -```bash -# 컨테이너 실행 -docker run -d \ - --name user-service-test \ - -p 8080:8080 \ - -e SPRING_PROFILES_ACTIVE=dev \ - user-service:latest +## 다음 단계 -# 로그 확인 -docker logs -f user-service-test +생성된 이미지를 사용하여 다음 작업을 진행할 수 있습니다: -# 헬스체크 -curl http://localhost:8080/actuator/health +1. **로컬 테스트:** Docker Compose 또는 개별 컨테이너 실행 +2. **ACR 푸시:** Azure Container Registry에 이미지 업로드 +3. **AKS 배포:** Kubernetes 클러스터에 배포 +4. **CI/CD 통합:** GitHub Actions 또는 Jenkins 파이프라인 연동 -# 정리 -docker stop user-service-test -docker rm user-service-test -``` +## 참고사항 -## 8. 다음 단계 - -### 8.1 컨테이너 레지스트리 푸시 -```bash -# Docker Hub 예시 -docker tag user-service:latest /user-service:latest -docker push /user-service:latest - -# Azure Container Registry 예시 -docker tag user-service:latest .azurecr.io/user-service:latest -docker push .azurecr.io/user-service:latest -``` - -### 8.2 Kubernetes 배포 -- Kubernetes Deployment 매니페스트 작성 -- Service 리소스 정의 -- ConfigMap/Secret 설정 -- Ingress 구성 - -### 8.3 CI/CD 파이프라인 구성 -- GitHub Actions 또는 Jenkins 파이프라인 작성 -- 자동 빌드 및 배포 설정 -- 이미지 태깅 전략 수립 (semantic versioning) - -## 9. 트러블슈팅 - -### Issue 1: Docker Desktop 미실행 -**증상**: -``` -ERROR: error during connect: open //./pipe/dockerDesktopLinuxEngine: -The system cannot find the file specified. -``` - -**해결**: -1. Docker Desktop 애플리케이션 시작 -2. 시스템 트레이의 Docker 아이콘이 안정화될 때까지 대기 -3. `docker ps` 명령으로 정상 동작 확인 - -### Issue 2: JAR 파일 없음 -**증상**: -``` -COPY failed: file not found in build context -``` - -**해결**: -```bash -# JAR 파일 재빌드 -./gradlew {service-name}:clean {service-name}:bootJar - -# 생성 확인 -ls -l {service-name}/build/libs/{service-name}.jar -``` - -### Issue 3: 플랫폼 불일치 -**증상**: K8s 클러스터에서 실행 안됨 - -**해결**: `--platform linux/amd64` 옵션 사용 (이미 적용됨) - -## 10. 요약 - -### ✅ 완료된 작업 -1. ✅ 6개 서비스의 bootJar 설정 완료 -2. ✅ Dockerfile-backend 생성 완료 -3. ✅ 6개 서비스 JAR 파일 빌드 완료 (총 542MB) -4. ✅ 6개 서비스 Docker 이미지 빌드 완료 (총 6.48GB) - -### 📊 최종 서비스 현황 -| 서비스 | JAR 빌드 | Docker 이미지 | 이미지 크기 | Image ID | 상태 | -|--------|---------|--------------|-----------|----------|------| -| user-service | ✅ 96MB | ✅ | 1.09GB | 91c511ef86bd | ✅ Ready | -| ai-service | ✅ 94MB | ✅ | 1.08GB | 9477022fa493 | ✅ Ready | -| event-service | ✅ 94MB | ✅ | 1.08GB | add81de69536 | ✅ Ready | -| content-service | ✅ 78MB | ✅ | 1.01GB | aa9cc16ad041 | ✅ Ready | -| participation-service | ✅ 85MB | ✅ | 1.04GB | 9b044a3854dd | ✅ Ready | -| analytics-service | ✅ 95MB | ✅ | 1.08GB | ac569de42545 | ✅ Ready | -| distribution-service | ❌ | ❌ | - | - | 소스 미구현 | - -### 🎯 빌드 성능 메트릭 -- **JAR 빌드 시간**: 27초 -- **Docker 이미지 빌드**: 병렬 실행으로 약 13초 -- **총 소요 시간**: 약 40초 -- **빌드 성공률**: 100% (6/6 서비스) - -### 🚀 다음 단계 권장사항 -1. **컨테이너 레지스트리 푸시** (예: Azure ACR, Docker Hub) -2. **Kubernetes 배포 매니페스트 작성** -3. **CI/CD 파이프라인 구성** (GitHub Actions 또는 Jenkins) -4. **모니터링 및 로깅 설정** - ---- - -**작성일**: 2025-10-29 09:50 KST -**작성자**: DevOps Engineer (송근정 "데브옵스 마스터") -**빌드 완료**: ✅ 모든 서비스 이미지 빌드 성공 +- 모든 이미지는 linux/amd64 플랫폼용으로 빌드됨 +- 보안을 위해 비root 사용자(k8s)로 실행 구성 +- Multi-stage 빌드로 이미지 크기 최적화 +- Java 23 (OpenJDK) 기반 런타임 사용 +- content-service(Python)는 별도의 Dockerfile로 빌드 필요 diff --git a/deployment/k8s/common/ingress.yaml b/deployment/k8s/common/ingress.yaml index 5beea52..8c9127a 100644 --- a/deployment/k8s/common/ingress.yaml +++ b/deployment/k8s/common/ingress.yaml @@ -99,7 +99,7 @@ spec: number: 80 # Distribution Service - - path: /distribution + - path: /api/v1/distribution pathType: Prefix backend: service: diff --git a/deployment/k8s/distribution-service/deployment.yaml b/deployment/k8s/distribution-service/deployment.yaml index c72a5d7..9e67915 100644 --- a/deployment/k8s/distribution-service/deployment.yaml +++ b/deployment/k8s/distribution-service/deployment.yaml @@ -42,21 +42,21 @@ spec: memory: "1024Mi" startupProbe: httpGet: - path: /distribution/actuator/health + path: /api/v1/distribution/actuator/health port: 8085 initialDelaySeconds: 30 periodSeconds: 10 failureThreshold: 30 readinessProbe: httpGet: - path: /distribution/actuator/health/readiness + path: /api/v1/distribution/actuator/health/readiness port: 8085 initialDelaySeconds: 10 periodSeconds: 5 failureThreshold: 3 livenessProbe: httpGet: - path: /distribution/actuator/health/liveness + path: /api/v1/distribution/actuator/health/liveness port: 8085 initialDelaySeconds: 30 periodSeconds: 10 diff --git a/distribution-service/src/main/java/com/kt/distribution/controller/DistributionController.java b/distribution-service/src/main/java/com/kt/distribution/controller/DistributionController.java index e9804f2..d699bc4 100644 --- a/distribution-service/src/main/java/com/kt/distribution/controller/DistributionController.java +++ b/distribution-service/src/main/java/com/kt/distribution/controller/DistributionController.java @@ -26,7 +26,7 @@ import org.springframework.web.bind.annotation.*; */ @Slf4j @RestController -@RequestMapping("/api/v1/distribution") +@RequestMapping @RequiredArgsConstructor @Tag(name = "Distribution", description = "다중 채널 배포 관리 API") public class DistributionController { diff --git a/distribution-service/src/main/resources/application.yml b/distribution-service/src/main/resources/application.yml index fd64b59..12f72e8 100644 --- a/distribution-service/src/main/resources/application.yml +++ b/distribution-service/src/main/resources/application.yml @@ -68,7 +68,7 @@ kafka: server: port: ${SERVER_PORT:8085} servlet: - context-path: /distribution + context-path: /api/v1/distribution # Resilience4j Configuration resilience4j: @@ -136,6 +136,14 @@ springdoc: display-request-duration: true show-actuator: true +# CORS Configuration +cors: + allowed-origins: ${CORS_ALLOWED_ORIGINS:http://localhost:8081,http://localhost:8082,http://localhost:8083,http://localhost:8084,http://kt-event-marketing.20.214.196.128.nip.io} + allowed-methods: ${CORS_ALLOWED_METHODS:GET,POST,PUT,DELETE,OPTIONS,PATCH} + allowed-headers: ${CORS_ALLOWED_HEADERS:*} + allow-credentials: ${CORS_ALLOW_CREDENTIALS:true} + max-age: ${CORS_MAX_AGE:3600} + # Logging logging: file: diff --git a/event-service/.run/event-service.run.xml b/event-service/.run/event-service.run.xml index 20639a9..648cc6f 100644 --- a/event-service/.run/event-service.run.xml +++ b/event-service/.run/event-service.run.xml @@ -31,6 +31,9 @@ + + + diff --git a/event-service/src/main/resources/application.yml b/event-service/src/main/resources/application.yml index 3d37c1b..1503c98 100644 --- a/event-service/src/main/resources/application.yml +++ b/event-service/src/main/resources/application.yml @@ -167,3 +167,11 @@ app: jwt: secret: ${JWT_SECRET:default-jwt-secret-key-for-development-minimum-32-bytes-required} expiration: 86400000 # 24시간 (밀리초 단위) + +# CORS Configuration +cors: + allowed-origins: ${CORS_ALLOWED_ORIGINS:http://localhost:8081,http://localhost:8082,http://localhost:8083,http://localhost:8084,http://kt-event-marketing.20.214.196.128.nip.io} + allowed-methods: ${CORS_ALLOWED_METHODS:GET,POST,PUT,DELETE,OPTIONS,PATCH} + allowed-headers: ${CORS_ALLOWED_HEADERS:*} + allow-credentials: ${CORS_ALLOW_CREDENTIALS:true} + max-age: ${CORS_MAX_AGE:3600} diff --git a/participation-service/.run/participation-service.run.xml b/participation-service/.run/participation-service.run.xml index 672ca87..c4b9f33 100644 --- a/participation-service/.run/participation-service.run.xml +++ b/participation-service/.run/participation-service.run.xml @@ -12,6 +12,7 @@ + diff --git a/participation-service/src/main/java/com/kt/event/participation/infrastructure/config/SecurityConfig.java b/participation-service/src/main/java/com/kt/event/participation/infrastructure/config/SecurityConfig.java index 855ba0f..310b686 100644 --- a/participation-service/src/main/java/com/kt/event/participation/infrastructure/config/SecurityConfig.java +++ b/participation-service/src/main/java/com/kt/event/participation/infrastructure/config/SecurityConfig.java @@ -1,11 +1,17 @@ package com.kt.event.participation.infrastructure.config; +import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.http.SessionCreationPolicy; import org.springframework.security.web.SecurityFilterChain; +import org.springframework.web.cors.CorsConfiguration; +import org.springframework.web.cors.CorsConfigurationSource; +import org.springframework.web.cors.UrlBasedCorsConfigurationSource; + +import java.util.Arrays; /** * Security Configuration for Participation Service @@ -18,10 +24,14 @@ import org.springframework.security.web.SecurityFilterChain; @EnableWebSecurity public class SecurityConfig { + @Value("${cors.allowed-origins:http://localhost:*}") + private String allowedOrigins; + @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http .csrf(csrf -> csrf.disable()) + .cors(cors -> cors.configurationSource(corsConfigurationSource())) .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) .authorizeHttpRequests(auth -> auth // Actuator endpoints @@ -31,4 +41,26 @@ public class SecurityConfig { return http.build(); } + + @Bean + public CorsConfigurationSource corsConfigurationSource() { + CorsConfiguration configuration = new CorsConfiguration(); + + String[] origins = allowedOrigins.split(","); + configuration.setAllowedOriginPatterns(Arrays.asList(origins)); + + configuration.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS")); + + configuration.setAllowedHeaders(Arrays.asList( + "Authorization", "Content-Type", "X-Requested-With", "Accept", + "Origin", "Access-Control-Request-Method", "Access-Control-Request-Headers" + )); + + configuration.setAllowCredentials(true); + configuration.setMaxAge(3600L); + + UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); + source.registerCorsConfiguration("/**", configuration); + return source; + } } diff --git a/participation-service/src/main/resources/application.yml b/participation-service/src/main/resources/application.yml index 73819df..566a865 100644 --- a/participation-service/src/main/resources/application.yml +++ b/participation-service/src/main/resources/application.yml @@ -54,6 +54,14 @@ jwt: secret: ${JWT_SECRET:dev-jwt-secret-key-for-development-only} expiration: ${JWT_EXPIRATION:86400000} +# CORS 설정 +cors: + allowed-origins: ${CORS_ALLOWED_ORIGINS:http://localhost:8081,http://localhost:8082,http://localhost:8083,http://localhost:8084,http://kt-event-marketing.20.214.196.128.nip.io} + allowed-methods: ${CORS_ALLOWED_METHODS:GET,POST,PUT,DELETE,OPTIONS,PATCH} + allowed-headers: ${CORS_ALLOWED_HEADERS:*} + allow-credentials: ${CORS_ALLOW_CREDENTIALS:true} + max-age: ${CORS_MAX_AGE:3600} + # 서버 설정 server: port: ${SERVER_PORT:8084} diff --git a/user-service/.run/user-service.run.xml b/user-service/.run/user-service.run.xml index 07dfd36..bcf8b25 100644 --- a/user-service/.run/user-service.run.xml +++ b/user-service/.run/user-service.run.xml @@ -42,7 +42,7 @@ - + diff --git a/user-service/src/main/resources/application.yml b/user-service/src/main/resources/application.yml index 66f1241..427f96e 100644 --- a/user-service/src/main/resources/application.yml +++ b/user-service/src/main/resources/application.yml @@ -76,7 +76,11 @@ jwt: # CORS Configuration cors: - allowed-origins: ${CORS_ALLOWED_ORIGINS:http://localhost:*} + allowed-origins: ${CORS_ALLOWED_ORIGINS:http://localhost:8081,http://localhost:8082,http://localhost:8083,http://localhost:8084,http://kt-event-marketing.20.214.196.128.nip.io} + allowed-methods: ${CORS_ALLOWED_METHODS:GET,POST,PUT,DELETE,OPTIONS,PATCH} + allowed-headers: ${CORS_ALLOWED_HEADERS:*} + allow-credentials: ${CORS_ALLOW_CREDENTIALS:true} + max-age: ${CORS_MAX_AGE:3600} # Actuator management: