diff --git a/.claude/commands/deploy-actions-cicd-guide-back.md b/.claude/commands/deploy-actions-cicd-guide-back.md new file mode 100644 index 0000000..0ec39e4 --- /dev/null +++ b/.claude/commands/deploy-actions-cicd-guide-back.md @@ -0,0 +1,14 @@ +--- +command: "/deploy-actions-cicd-guide-back" +--- + +@cicd +'백엔드GitHubActions파이프라인작성가이드'에 따라 GitHub Actions를 이용한 CI/CD 가이드를 작성해 주세요. +프롬프트에 '[실행정보]'항목이 없으면 수행을 중단하고 안내 메시지를 표시해 주세요. +{안내메시지} +'[실행정보]'섹션 하위에 아래 예와 같이 필요한 정보를 제시해 주세요. +[실행정보] +- ACR_NAME: acrdigitalgarage01 +- RESOURCE_GROUP: rg-digitalgarage-01 +- AKS_CLUSTER: aks-digitalgarage-01 +- NAMESPACE: phonebill-dg0500 diff --git a/.claude/commands/deploy-actions-cicd-guide-front.md b/.claude/commands/deploy-actions-cicd-guide-front.md new file mode 100644 index 0000000..0975422 --- /dev/null +++ b/.claude/commands/deploy-actions-cicd-guide-front.md @@ -0,0 +1,15 @@ +--- +command: "/deploy-actions-cicd-guide-front" +--- + +@cicd +'프론트엔드GitHubActions파이프라인작성가이드'에 따라 GitHub Actions를 이용한 CI/CD 가이드를 작성해 주세요. +프롬프트에 '[실행정보]'항목이 없으면 수행을 중단하고 안내 메시지를 표시해 주세요. +{안내메시지} +'[실행정보]'섹션 하위에 아래 예와 같이 필요한 정보를 제시해 주세요. +[실행정보] +- SYSTEM_NAME: phonebill +- ACR_NAME: acrdigitalgarage01 +- RESOURCE_GROUP: rg-digitalgarage-01 +- AKS_CLUSTER: aks-digitalgarage-01 +- NAMESPACE: phonebill-dg0500 diff --git a/.claude/commands/deploy-build-image-back.md b/.claude/commands/deploy-build-image-back.md new file mode 100644 index 0000000..5305a1b --- /dev/null +++ b/.claude/commands/deploy-build-image-back.md @@ -0,0 +1,6 @@ +--- +command: "/deploy-build-image-back" +--- + +@cicd +'백엔드컨테이너이미지작성가이드'에 따라 컨테이너 이미지를 작성해 주세요. diff --git a/.claude/commands/deploy-build-image-front.md b/.claude/commands/deploy-build-image-front.md new file mode 100644 index 0000000..1cfe9d1 --- /dev/null +++ b/.claude/commands/deploy-build-image-front.md @@ -0,0 +1,6 @@ +--- +command: "/deploy-build-image-front" +--- + +@cicd +'프론트엔드컨테이너이미지작성가이드'에 따라 컨테이너 이미지를 작성해 주세요. diff --git a/.claude/commands/deploy-help.md b/.claude/commands/deploy-help.md new file mode 100644 index 0000000..d6ec88f --- /dev/null +++ b/.claude/commands/deploy-help.md @@ -0,0 +1,81 @@ +--- +command: "/deploy-help" +--- + +# 배포 작업 순서 + +## 1단계: 컨테이너 이미지 작성 +### 백엔드 +``` +/deploy-build-image-back +``` +- 백엔드컨테이너이미지작성가이드를 참고하여 컨테이너 이미지를 빌드합니다 + +### 프론트엔드 +``` +/deploy-build-image-front +``` +- 프론트엔드컨테이너이미지작성가이드를 참고하여 컨테이너 이미지를 빌드합니다 + +## 2단계: 컨테이너 실행 가이드 작성 +### 백엔드 +``` +/deploy-run-container-guide-back +``` +- 백엔드컨테이너실행방법가이드를 참고하여 컨테이너 실행 방법을 작성합니다 +- 실행정보(ACR명, VM정보)가 필요합니다 + +### 프론트엔드 +``` +/deploy-run-container-guide-front +``` +- 프론트엔드컨테이너실행방법가이드를 참고하여 컨테이너 실행 방법을 작성합니다 +- 실행정보(시스템명, ACR명, VM정보)가 필요합니다 + +## 3단계: Kubernetes 배포 가이드 작성 +### 백엔드 +``` +/deploy-k8s-guide-back +``` +- 백엔드배포가이드를 참고하여 쿠버네티스 배포 방법을 작성합니다 +- 실행정보(ACR명, k8s명, 네임스페이스, 리소스 설정)가 필요합니다 + +### 프론트엔드 +``` +/deploy-k8s-guide-front +``` +- 프론트엔드배포가이드를 참고하여 쿠버네티스 배포 방법을 작성합니다 +- 실행정보(시스템명, ACR명, k8s명, 네임스페이스, Gateway Host, 리소스 설정)가 필요합니다 + +## 4단계: CI/CD 파이프라인 구성 + +### Jenkins 사용 시 +#### 백엔드 +``` +/deploy-jenkins-cicd-guide-back +``` +- 백엔드Jenkins파이프라인작성가이드를 참고하여 Jenkins CI/CD 파이프라인을 구성합니다 + +#### 프론트엔드 +``` +/deploy-jenkins-cicd-guide-front +``` +- 프론트엔드Jenkins파이프라인작성가이드를 참고하여 Jenkins CI/CD 파이프라인을 구성합니다 + +### GitHub Actions 사용 시 +#### 백엔드 +``` +/deploy-actions-cicd-guide-back +``` +- 백엔드GitHubActions파이프라인작성가이드를 참고하여 GitHub Actions CI/CD 파이프라인을 구성합니다 + +#### 프론트엔드 +``` +/deploy-actions-cicd-guide-front +``` +- 프론트엔드GitHubActions파이프라인작성가이드를 참고하여 GitHub Actions CI/CD 파이프라인을 구성합니다 + +## 참고사항 +- 각 명령 실행 전 필요한 실행정보를 프롬프트에 포함해야 합니다 +- 실행정보가 없으면 안내 메시지가 표시되며 작업이 중단됩니다 +- CI/CD 도구는 Jenkins 또는 GitHub Actions 중 선택하여 사용합니다 diff --git a/.claude/commands/deploy-jenkins-cicd-guide-back.md b/.claude/commands/deploy-jenkins-cicd-guide-back.md new file mode 100644 index 0000000..dbd3e8b --- /dev/null +++ b/.claude/commands/deploy-jenkins-cicd-guide-back.md @@ -0,0 +1,14 @@ +--- +command: "/deploy-jenkins-cicd-guide-back" +--- + +@cicd +'백엔드Jenkins파이프라인작성가이드'에 따라 Jenkins를 이용한 CI/CD 가이드를 작성해 주세요. +프롬프트에 '[실행정보]'항목이 없으면 수행을 중단하고 안내 메시지를 표시해 주세요. +{안내메시지} +'[실행정보]'섹션 하위에 아래 예와 같이 필요한 정보를 제시해 주세요. +[실행정보] +- ACR_NAME: acrdigitalgarage01 +- RESOURCE_GROUP: rg-digitalgarage-01 +- AKS_CLUSTER: aks-digitalgarage-01 +- NAMESPACE: phonebill-dg0500 diff --git a/.claude/commands/deploy-jenkins-cicd-guide-front.md b/.claude/commands/deploy-jenkins-cicd-guide-front.md new file mode 100644 index 0000000..5df6fad --- /dev/null +++ b/.claude/commands/deploy-jenkins-cicd-guide-front.md @@ -0,0 +1,15 @@ +--- +command: "/deploy-jenkins-cicd-guide-front" +--- + +@cicd +'프론트엔드Jenkins파이프라인작성가이드'에 따라 Jenkins를 이용한 CI/CD 가이드를 작성해 주세요. +프롬프트에 '[실행정보]'항목이 없으면 수행을 중단하고 안내 메시지를 표시해 주세요. +{안내메시지} +'[실행정보]'섹션 하위에 아래 예와 같이 필요한 정보를 제시해 주세요. +[실행정보] +- SYSTEM_NAME: phonebill +- ACR_NAME: acrdigitalgarage01 +- RESOURCE_GROUP: rg-digitalgarage-01 +- AKS_CLUSTER: aks-digitalgarage-01 +- NAMESPACE: phonebill-dg0500 diff --git a/.claude/commands/deploy-k8s-guide-back.md b/.claude/commands/deploy-k8s-guide-back.md new file mode 100644 index 0000000..8fccb04 --- /dev/null +++ b/.claude/commands/deploy-k8s-guide-back.md @@ -0,0 +1,16 @@ +--- +command: "/deploy-k8s-guide-back" +--- + +@cicd +'백엔드배포가이드'에 따라 백엔드 서비스 배포 방법을 작성해 주세요. +프롬프트에 '[실행정보]'항목이 없으면 수행을 중단하고 안내 메시지를 표시해 주세요. +{안내메시지} +'[실행정보]'섹션 하위에 아래 예와 같이 필요한 정보를 제시해 주세요. +[실행정보] +- ACR명: acrdigitalgarage01 +- k8s명: aks-digitalgarage-01 +- 네임스페이스: tripgen +- 파드수: 2 +- 리소스(CPU): 256m/1024m +- 리소스(메모리): 256Mi/1024Mi diff --git a/.claude/commands/deploy-k8s-guide-front.md b/.claude/commands/deploy-k8s-guide-front.md new file mode 100644 index 0000000..54a069d --- /dev/null +++ b/.claude/commands/deploy-k8s-guide-front.md @@ -0,0 +1,18 @@ +--- +command: "/deploy-k8s-guide-front" +--- + +@cicd +'프론트엔드배포가이드'에 따라 프론트엔드 서비스 배포 방법을 작성해 주세요. +프롬프트에 '[실행정보]'항목이 없으면 수행을 중단하고 안내 메시지를 표시해 주세요. +{안내메시지} +'[실행정보]'섹션 하위에 아래 예와 같이 필요한 정보를 제시해 주세요. +[실행정보] +- 시스템명: tripgen +- ACR명: acrdigitalgarage01 +- k8s명: aks-digitalgarage-01 +- 네임스페이스: tripgen +- 파드수: 2 +- 리소스(CPU): 256m/1024m +- 리소스(메모리): 256Mi/1024Mi +- Gateway Host: http://tripgen-api.20.214.196.128.nip.io diff --git a/.claude/commands/deploy-run-container-guide-back.md b/.claude/commands/deploy-run-container-guide-back.md new file mode 100644 index 0000000..c93388f --- /dev/null +++ b/.claude/commands/deploy-run-container-guide-back.md @@ -0,0 +1,15 @@ +--- +command: "/deploy-run-container-guide-back" +--- + +@cicd +'백엔드컨테이너실행방법가이드'에 따라 컨테이너 실행 가이드를 작성해 주세요. +프롬프트에 '[실행정보]'항목이 없으면 수행을 중단하고 안내 메시지를 표시해 주세요. +{안내메시지} +'[실행정보]'섹션 하위에 아래 예와 같이 필요한 정보를 제시해 주세요. +[실행정보] +- ACR명: acrdigitalgarage01 +- VM + - KEY파일: ~/home/bastion-dg0500 + - USERID: azureuser + - IP: 4.230.5.6 diff --git a/.claude/commands/deploy-run-container-guide-front.md b/.claude/commands/deploy-run-container-guide-front.md new file mode 100644 index 0000000..eb68f9a --- /dev/null +++ b/.claude/commands/deploy-run-container-guide-front.md @@ -0,0 +1,16 @@ +--- +command: "/deploy-run-container-guide-front" +--- + +@cicd +'프론트엔드컨테이너실행방법가이드'에 따라 컨테이너 실행 가이드를 작성해 주세요. +프롬프트에 '[실행정보]'항목이 없으면 수행을 중단하고 안내 메시지를 표시해 주세요. +{안내메시지} +'[실행정보]'섹션 하위에 아래 예와 같이 필요한 정보를 제시해 주세요. +[실행정보] +- 시스템명: tripgen +- ACR명: acrdigitalgarage01 +- VM + - KEY파일: ~/home/bastion-dg0500 + - USERID: azureuser + - IP: 4.230.5.6 diff --git a/.claude/commands/design-api.md b/.claude/commands/design-api.md index 5375bf7..750eae3 100644 --- a/.claude/commands/design-api.md +++ b/.claude/commands/design-api.md @@ -1,3 +1,6 @@ +--- +command: "/design-api" +--- @architecture API를 설계해 주세요: -- '공통설계원칙'과 'API설계가이드'를 준용하여 설계 +- '공통설계원칙'과 'API설계가이드'를 준용하여 설계 \ No newline at end of file diff --git a/.claude/commands/design-class.md b/.claude/commands/design-class.md index dc76da9..178bdb1 100644 --- a/.claude/commands/design-class.md +++ b/.claude/commands/design-class.md @@ -1,3 +1,6 @@ +--- +command: "/design-class" +--- @architecture '공통설계원칙'과 '클래스설계가이드'를 준용하여 클래스를 설계해 주세요. 프롬프트에 '[클래스설계 정보]'항목이 없으면 수행을 중단하고 안내 메시지를 표시합니다. @@ -9,4 +12,4 @@ - User: Layered - Trip: Clean - Location: Layered - - AI: Layered + - AI: Layered \ No newline at end of file diff --git a/.claude/commands/design-data.md b/.claude/commands/design-data.md index 8d9fd77..b5ff1dd 100644 --- a/.claude/commands/design-data.md +++ b/.claude/commands/design-data.md @@ -1,3 +1,6 @@ +--- +command: "/design-data" +--- @architecture 데이터 설계를 해주세요: -- '공통설계원칙'과 '데이터설계가이드'를 준용하여 설계 +- '공통설계원칙'과 '데이터설계가이드'를 준용하여 설계 \ No newline at end of file diff --git a/.claude/commands/design-fix-prototype.md b/.claude/commands/design-fix-prototype.md index d1ddb8a..5cc1890 100644 --- a/.claude/commands/design-fix-prototype.md +++ b/.claude/commands/design-fix-prototype.md @@ -1,5 +1,8 @@ +--- +command: "/design-fix-prototype" +--- @fix as @front '[오류내용]'섹션에 제공된 오류를 해결해 주세요. 프롬프트에 '[오류내용]'섹션이 없으면 수행 중단하고 안내 메시지 표시 {안내메시지} -'[오류내용]'섹션 하위에 오류 내용을 제공 +'[오류내용]'섹션 하위에 오류 내용을 제공 \ No newline at end of file diff --git a/.claude/commands/design-front.md b/.claude/commands/design-front.md index 67bc0a5..8dd99c9 100644 --- a/.claude/commands/design-front.md +++ b/.claude/commands/design-front.md @@ -1,3 +1,6 @@ +--- +command: "/design-front" +--- @plan as @front '프론트엔드설계가이드'를 준용하여 **프론트엔드설계서**를 작성해 주세요. 프롬프트에 '[백엔드시스템]'항목이 없으면 수행을 중단하고 안내 메시지를 표시합니다. @@ -13,4 +16,4 @@ - ai service: http://localhost:8084/v3/api-docs [요구사항] - 각 화면에 Back 아이콘 버튼과 화면 타이틀 표시 -- 하단 네비게이션 바 아이콘화: 홈, 새여행, 주변장소검색, 여행보기 +- 하단 네비게이션 바 아이콘화: 홈, 새여행, 주변장소검색, 여행보기 \ No newline at end of file diff --git a/.claude/commands/design-high-level.md b/.claude/commands/design-high-level.md index d7028b1..0debc5e 100644 --- a/.claude/commands/design-high-level.md +++ b/.claude/commands/design-high-level.md @@ -1,6 +1,9 @@ +--- +command: "/design-high-level" +--- @architecture 'HighLevel아키텍처정의가이드'를 준용하여 High Level 아키텍처 정의서를 작성해 주세요. 'CLOUD' 정보가 없으면 수행을 중단하고 안내메시지를 표시하세요. {안내메시지} 아래 예와 같이 CLOUD 제공자를 Azure, AWS, Google과 같이 제공하세요. -- CLOUD: Azure +- CLOUD: Azure \ No newline at end of file diff --git a/.claude/commands/design-improve-prototype.md b/.claude/commands/design-improve-prototype.md index 0d1b31b..22bc079 100644 --- a/.claude/commands/design-improve-prototype.md +++ b/.claude/commands/design-improve-prototype.md @@ -1,5 +1,8 @@ +--- +command: "/design-improve-prototype" +--- @improve as @front '[개선내용]'섹션에 있는 내용을 개선해 주세요. 프롬프트에 '[개선내용]'항목이 없으면 수행을 중단하고 안내 메시지 표시 {안내메시지} -'[개선내용]'섹션 하위에 개선할 내용을 제공 +'[개선내용]'섹션 하위에 개선할 내용을 제공 \ No newline at end of file diff --git a/.claude/commands/design-improve-userstory.md b/.claude/commands/design-improve-userstory.md index a1055f2..73fd453 100644 --- a/.claude/commands/design-improve-userstory.md +++ b/.claude/commands/design-improve-userstory.md @@ -1,2 +1,5 @@ +--- +command: "/design-improve-userstory" +--- @analyze as @front 프로토타입을 웹브라우저에서 분석한 후, -@document as @scribe 수정된 프로토타입에 따라 유저스토리를 업데이트 해주십시오. +@document as @scribe 수정된 프로토타입에 따라 유저스토리를 업데이트 해주십시오. \ No newline at end of file diff --git a/.claude/commands/design-logical.md b/.claude/commands/design-logical.md index 28f15e9..3d50c8f 100644 --- a/.claude/commands/design-logical.md +++ b/.claude/commands/design-logical.md @@ -1,3 +1,6 @@ +--- +command: "/design-logical" +--- @architecture 논리 아키텍처를 설계해 주세요: -- '공통설계원칙'과 '논리아키텍처 설계 가이드'를 준용하여 설계 +- '공통설계원칙'과 '논리아키텍처 설계 가이드'를 준용하여 설계 \ No newline at end of file diff --git a/.claude/commands/design-pattern.md b/.claude/commands/design-pattern.md index 06ed88d..decb145 100644 --- a/.claude/commands/design-pattern.md +++ b/.claude/commands/design-pattern.md @@ -1,3 +1,6 @@ +--- +command: "/design-pattern" +--- @design-pattern 클라우드 아키텍처 패턴 적용 방안을 작성해 주세요: -- '클라우드아키텍처패턴선정가이드'를 준용하여 작성 +- '클라우드아키텍처패턴선정가이드'를 준용하여 작성 \ No newline at end of file diff --git a/.claude/commands/design-physical.md b/.claude/commands/design-physical.md index 2dc8a51..7df5bca 100644 --- a/.claude/commands/design-physical.md +++ b/.claude/commands/design-physical.md @@ -1,6 +1,9 @@ +--- +command: "/design-physical" +--- @architecture '물리아키텍처설계가이드'를 준용하여 물리아키텍처를 설계해 주세요. 'CLOUD' 정보가 없으면 수행을 중단하고 안내메시지를 표시하세요. {안내메시지} 아래 예와 같이 CLOUD 제공자를 Azure, AWS, Google과 같이 제공하세요. -- CLOUD: Azure +- CLOUD: Azure \ No newline at end of file diff --git a/.claude/commands/design-prototype.md b/.claude/commands/design-prototype.md index f43547f..dbd24a0 100644 --- a/.claude/commands/design-prototype.md +++ b/.claude/commands/design-prototype.md @@ -1,3 +1,6 @@ +--- +command: "/design-prototype" +--- @prototype 프로토타입을 작성해 주세요: -- '프로토타입작성가이드'를 준용하여 작성 +- '프로토타입작성가이드'를 준용하여 작성 \ No newline at end of file diff --git a/.claude/commands/design-seq-inner.md b/.claude/commands/design-seq-inner.md index 5583610..d2bc4ac 100644 --- a/.claude/commands/design-seq-inner.md +++ b/.claude/commands/design-seq-inner.md @@ -1,3 +1,6 @@ +--- +command: "/design-seq-inner" +--- @architecture 내부 시퀀스 설계를 해 주세요: -- '공통설계원칙'과 '내부시퀀스설계 가이드'를 준용하여 설계 +- '공통설계원칙'과 '내부시퀀스설계 가이드'를 준용하여 설계 \ No newline at end of file diff --git a/.claude/commands/design-seq-outer.md b/.claude/commands/design-seq-outer.md index 0546370..8e05435 100644 --- a/.claude/commands/design-seq-outer.md +++ b/.claude/commands/design-seq-outer.md @@ -1,3 +1,6 @@ +--- +command: "/design-seq-outer" +--- @architecture 외부 시퀀스 설계를 해 주세요: -- '공통설계원칙'과 '외부시퀀스설계가이드'를 준용하여 설계 +- '공통설계원칙'과 '외부시퀀스설계가이드'를 준용하여 설계 \ No newline at end of file diff --git a/.claude/commands/design-test-prototype.md b/.claude/commands/design-test-prototype.md index bd45346..350788a 100644 --- a/.claude/commands/design-test-prototype.md +++ b/.claude/commands/design-test-prototype.md @@ -1,2 +1,5 @@ +--- +command: "/design-test-prototype" +--- @test-front -프로토타입을 테스트 해 주세요. +프로토타입을 테스트 해 주세요. \ No newline at end of file diff --git a/.claude/commands/design-uiux.md b/.claude/commands/design-uiux.md index 2b1c387..d68d857 100644 --- a/.claude/commands/design-uiux.md +++ b/.claude/commands/design-uiux.md @@ -1,3 +1,6 @@ +--- +command: "/design-uiux" +--- @uiux UI/UX 설계를 해주세요: -- 'UI/UX설계가이드'를 준용하여 작성 +- 'UI/UX설계가이드'를 준용하여 작성 \ No newline at end of file diff --git a/.claude/commands/design-update-uiux.md b/.claude/commands/design-update-uiux.md index 6994cd9..afd7cf9 100644 --- a/.claude/commands/design-update-uiux.md +++ b/.claude/commands/design-update-uiux.md @@ -1,2 +1,5 @@ +--- +command: "/design-update-uiux" +--- @document @front -현재 프로토타입과 유저스토리를 기준으로 UI/UX설계서와 스타일가이드를 수정해 주세요. +현재 프로토타입과 유저스토리를 기준으로 UI/UX설계서와 스타일가이드를 수정해 주세요. \ No newline at end of file diff --git a/.claude/commands/think-help.md b/.claude/commands/think-help.md index 49bc697..17ad05a 100644 --- a/.claude/commands/think-help.md +++ b/.claude/commands/think-help.md @@ -1,3 +1,6 @@ +--- +command: "/think-help" +--- 기획 작업 순서 1단계: 서비스 기획 diff --git a/.claude/commands/think-planning.md b/.claude/commands/think-planning.md index c40eaec..beec938 100644 --- a/.claude/commands/think-planning.md +++ b/.claude/commands/think-planning.md @@ -1,3 +1,6 @@ +--- +command: "/think-planning" +--- 아래 내용을 터미널에 표시만 하고 수행을 하지는 않습니다. ``` 아래 가이드를 참고하여 서비스 기획을 수행합니다. diff --git a/.claude/commands/think-userstory.md b/.claude/commands/think-userstory.md index abdcb97..a002c30 100644 --- a/.claude/commands/think-userstory.md +++ b/.claude/commands/think-userstory.md @@ -1,3 +1,7 @@ +--- +command: "/think-userstory" +--- +``` @document 유저스토리를 작성하세요. 프롬프트에 '[요구사항]'섹션이 없으면 수행을 중단하고 안내 메시지를 표시합니다. @@ -16,3 +20,5 @@ Case 2) 다른 방법으로 이벤트스토밍을 한 경우는 요구사항을 2. 유저스토리 작성 - '유저스토리작성방법'과 '유저스토리예제'를 참고하여 유저스토리를 작성 - 결과파일은 'design/userstory.md'에 생성 + +``` diff --git a/.run/EventServiceApplication.run.xml b/.run/EventServiceApplication.run.xml deleted file mode 100644 index 38d1691..0000000 --- a/.run/EventServiceApplication.run.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - diff --git a/.run/analytics-service.run.xml b/.run/analytics-service.run.xml deleted file mode 100644 index ade144d..0000000 --- a/.run/analytics-service.run.xml +++ /dev/null @@ -1,89 +0,0 @@ - - - - - - - - true - true - - - - - false - false - - - diff --git a/claude/build-image-back.md b/claude/build-image-back.md new file mode 100644 index 0000000..d7b822f --- /dev/null +++ b/claude/build-image-back.md @@ -0,0 +1,82 @@ +# 백엔드 컨테이너이미지 작성가이드 + +[요청사항] +- 백엔드 각 서비스를의 컨테이너 이미지 생성 +- 실제 빌드 수행 및 검증까지 완료 +- '[결과파일]'에 수행한 명령어를 포함하여 컨테이너 이미지 작성 과정 생성 + +[작업순서] +- 서비스명 확인 + 서비스명은 settings.gradle에서 확인 + + 예시) include 'common'하위의 4개가 서비스명임. + ``` + rootProject.name = 'tripgen' + + include 'common' + include 'user-service' + include 'location-service' + include 'ai-service' + include 'trip-service' + ``` + +- 실행Jar 파일 설정 + 실행Jar 파일명을 서비스명과 일치하도록 build.gradle에 설정 합니다. + ``` + bootJar { + archiveFileName = '{서비스명}.jar' + } + ``` + +- Dockerfile 생성 + 아래 내용으로 deployment/container/Dockerfile-backend 생성 + ``` + # Build stage + FROM openjdk:23-oraclelinux8 AS builder + ARG BUILD_LIB_DIR + ARG ARTIFACTORY_FILE + COPY ${BUILD_LIB_DIR}/${ARTIFACTORY_FILE} app.jar + + # Run stage + FROM openjdk:23-slim + ENV USERNAME=k8s + ENV ARTIFACTORY_HOME=/home/${USERNAME} + ENV JAVA_OPTS="" + + # Add a non-root user + RUN adduser --system --group ${USERNAME} && \ + mkdir -p ${ARTIFACTORY_HOME} && \ + chown ${USERNAME}:${USERNAME} ${ARTIFACTORY_HOME} + + WORKDIR ${ARTIFACTORY_HOME} + COPY --from=builder app.jar app.jar + RUN chown ${USERNAME}:${USERNAME} app.jar + + USER ${USERNAME} + + ENTRYPOINT [ "sh", "-c" ] + CMD ["java ${JAVA_OPTS} -jar app.jar"] + ``` + +- 컨테이너 이미지 생성 + 아래 명령으로 각 서비스 빌드. shell 파일을 생성하지 말고 command로 수행. + 서브에이젼트를 생성하여 병렬로 수행. + ``` + DOCKER_FILE=deployment/container/Dockerfile-backend + service={서비스명} + + docker build \ + --platform linux/amd64 \ + --build-arg BUILD_LIB_DIR="${서비스명}/build/libs" \ + --build-arg ARTIFACTORY_FILE="${서비스명}.jar" \ + -f ${DOCKER_FILE} \ + -t ${서비스명}:latest . + ``` +- 생성된 이미지 확인 + 아래 명령으로 모든 서비스의 이미지가 빌드되었는지 확인 + ``` + docker images | grep {서비스명} + ``` + +[결과파일] +deployment/container/build-image.md diff --git a/claude/design-prompt.md b/claude/design-prompt.md new file mode 100644 index 0000000..ea4ce28 --- /dev/null +++ b/claude/design-prompt.md @@ -0,0 +1,220 @@ +# 설계 프롬프트 +아래 순서대로 설계합니다. + +## UI/UX 설계 +command: "/design-uiux" +prompt: +``` +@uiux +UI/UX 설계를 해주세요: +- 'UI/UX설계가이드'를 준용하여 작성 +``` + +--- + +# 프로토타입 작성 +command: "/design-prototype" +prompt: +**1.작성** +``` +@prototype +프로토타입을 작성해 주세요: +- '프로토타입작성가이드'를 준용하여 작성 +``` + +--- + +**2.검증** +command: "/design-test-prototype" +prompt: +``` +@test-front +프로토타입을 테스트 해 주세요. +``` + +--- + +**3.오류수정** +command: "/design-fix-prototype" +prompt: +``` +@fix as @front +'[오류내용]'섹션에 제공된 오류를 해결해 주세요. +프롬프트에 '[오류내용]'섹션이 없으면 수행 중단하고 안내 메시지 표시 +{안내메시지} +'[오류내용]'섹션 하위에 오류 내용을 제공 +``` + +--- + +**4.개선** +command: "/design-improve-prototype" +prompt: +``` +@improve as @front +'[개선내용]'섹션에 있는 내용을 개선해 주세요. +프롬프트에 '[개선내용]'항목이 없으면 수행을 중단하고 안내 메시지 표시 +{안내메시지} +'[개선내용]'섹션 하위에 개선할 내용을 제공 +``` + +--- + +**5.유저스토리 품질 높이기** +command: "/design-improve-userstory" +prompt: +``` +@analyze as @front 프로토타입을 웹브라우저에서 분석한 후, +@document as @scribe 수정된 프로토타입에 따라 유저스토리를 업데이트 해주십시오. +``` + +--- + +**6.설계서 다시 업데이트** +command: "/design-update-uiux" +prompt: +``` +@document @front +현재 프로토타입과 유저스토리를 기준으로 UI/UX설계서와 스타일가이드를 수정해 주세요. +``` + +--- + +## 클라우드 아키텍처 패턴 선정 +command: "/design-pattern" +prompt: +``` +@design-pattern +클라우드 아키텍처 패턴 적용 방안을 작성해 주세요: +- '클라우드아키텍처패턴선정가이드'를 준용하여 작성 +``` + +--- + +## 논리아키텍처 설계 +command: "/design-logical" +prompt: +``` +@architecture +논리 아키텍처를 설계해 주세요: +- '공통설계원칙'과 '논리아키텍처 설계 가이드'를 준용하여 설계 + +``` + +--- + +## 외부 시퀀스 설계 +command: "/design-seq-outer" +prompt: +``` +@architecture +외부 시퀀스 설계를 해 주세요: +- '공통설계원칙'과 '외부시퀀스설계가이드'를 준용하여 설계 + +``` + +--- + +## 내부 시퀀스 설계 +command: "/design-seq-inner" +prompt: +``` +@architecture +내부 시퀀스 설계를 해 주세요: +- '공통설계원칙'과 '내부시퀀스설계 가이드'를 준용하여 설계 + +``` + +--- + +## API 설계 +command: "/design-api" +prompt: +``` +@architecture +API를 설계해 주세요: +- '공통설계원칙'과 'API설계가이드'를 준용하여 설계 + +``` + +--- + +## 클래스 설계 +command: "/design-class" +prompt: +``` +@architecture +'공통설계원칙'과 '클래스설계가이드'를 준용하여 클래스를 설계해 주세요. +프롬프트에 '[클래스설계 정보]'항목이 없으면 수행을 중단하고 안내 메시지를 표시합니다. +{안내메시지} +'[클래스설계 정보]' 섹션에 아래 예와 같은 정보를 제공해 주십시오. +[클래스설계 정보] +- 패키지 그룹: com.unicorn.tripgen +- 설계 아키텍처 패턴 + - User: Layered + - Trip: Clean + - Location: Layered + - AI: Layered +``` + +--- + +## 데이터 설계 +command: "/design-data" +prompt: +``` +@architecture +데이터 설계를 해주세요: +- '공통설계원칙'과 '데이터설계가이드'를 준용하여 설계 +``` + +--- + +## High Level 아키텍처 정의서 작성 +command: "/design-high-level" +prompt: +``` +@architecture +'HighLevel아키텍처정의가이드'를 준용하여 High Level 아키텍처 정의서를 작성해 주세요. +'CLOUD' 정보가 없으면 수행을 중단하고 안내메시지를 표시하세요. +{안내메시지} +아래 예와 같이 CLOUD 제공자를 Azure, AWS, Google과 같이 제공하세요. +- CLOUD: Azure +``` + +--- + +## 물리 아키텍처 설계 +command: "/design-physical" +prompt: +``` +@architecture +'물리아키텍처설계가이드'를 준용하여 물리아키텍처를 설계해 주세요. +'CLOUD' 정보가 없으면 수행을 중단하고 안내메시지를 표시하세요. +{안내메시지} +아래 예와 같이 CLOUD 제공자를 Azure, AWS, Google과 같이 제공하세요. +- CLOUD: Azure +``` + +## 프론트엔드 설계 +command: "/design-front" +prompt: +``` +@plan as @front +'프론트엔드설계가이드'를 준용하여 **프론트엔드설계서**를 작성해 주세요. +프롬프트에 '[백엔드시스템]'항목이 없으면 수행을 중단하고 안내 메시지를 표시합니다. +{안내메시지} +'[백엔드시스템]' 섹션에 아래 예와 같은 정보를 제공해 주십시오. +[백엔드시스템] +- 시스템: tripgen +- 마이크로서비스: user-service, location-service, trip-service, ai-service +- API문서 + - user service: http://localhost:8081/v3/api-docs + - location service: http://localhost:8082/v3/api-docs + - trip service: http://localhost:8083/v3/api-docs + - ai service: http://localhost:8084/v3/api-docs +[요구사항] +- 각 화면에 Back 아이콘 버튼과 화면 타이틀 표시 +- 하단 네비게이션 바 아이콘화: 홈, 새여행, 주변장소검색, 여행보기 +``` + diff --git a/claude/develop-prompt.md b/claude/develop-prompt.md new file mode 100644 index 0000000..57c5a06 --- /dev/null +++ b/claude/develop-prompt.md @@ -0,0 +1,180 @@ +# 개발 프롬프트 + +## 데이터베이스 설치계획서 작성 요청 +command: "/develop-db-guide" +prompt: +``` +@backing-service +"데이터베이스설치계획서가이드"에 따라 데이터베이스 설치계획서를 작성해 주십시오. +``` + +--- + +## 데이터베이스 설치 수행 요청 +command: "/develop-db-install" +prompt: +``` +@backing-service +[요구사항] +'데이터베이스설치가이드'에 따라 설치해 주세요. +'[설치정보]'섹션이 없으면 수행을 중단하고 안내 메시지를 표시하세요. +{안내메시지} +'[설치정보]'섹션 하위에 아래 예와 같이 설치에 필요한 정보를 추가해 주세요. +- 설치대상환경: 개발환경 +- AKS Resource Group: rg-digitalgarage-01 +- AKS Name: aks-digitalgarage-01 +- Namespace: tripgen-dev +``` + +--- + +## 데이터베이스 설치 제거 요청 (필요시) +command: "/develop-db-remove" +prompt: +``` +@backing-service +[요구사항] +- "데이터베이스설치결과서"를 보고 관련된 모든 리소스를 삭제 +- "캐시설치결과서"를 보고 관련된 모든 리소스를 삭제 +- 현재 OS에 맞게 수행 +- 서브 에이젼트를 병렬로 수행하여 삭제 +- 결과파일은 생성할 필요 없고 화면에만 결과 표시 +[참고자료] +- 데이터베이스설치결과서 +- 캐시설치결과서 +``` + +--- + +## Message Queue 설치 계획서 작성 요청 +command: "/develop-mq-guide" +prompt: +``` +@backing-service +"MQ설치게획서가이드"에 따라 Message Queue 설치계획서를 작성해 주세요. +``` + +--- + +## Message Queue 설치 수행 요청(필요시) +command: "/develop-mq-install" +prompt: +``` +@backing-service +[요구사항] +'MQ설치가이드'에 따라 설치해 주세요. +'[설치정보]'섹션이 없으면 수행을 중단하고 안내 메시지를 표시하세요. +{안내메시지} +'[설치정보]'섹션 하위에 아래 예와 같이 설치에 필요한 정보를 추가해 주세요. +- 설치대상환경: 개발환경 +- Resource Group: rg-digitalgarage-01 +- Namespace: tripgen-dev +``` + +--- + +## Message Queue 설치 제거 요청 +command: "/develop-mq-remove" +prompt: +``` +@backing-service +[요구사항] +- "MQ설치결과서"를 보고 관련된 모든 리소스를 삭제 +- 현재 OS에 맞게 수행 +- 서브 에이젼트를 병렬로 수행하여 삭제 +- 결과파일은 생성할 필요 없고 화면에만 결과 표시 +[참고자료] +- MQ설치결과서 +``` + +--- + +## 백엔드 개발 요청 +command: "/develop-dev-backend" +prompt: +``` +@dev-backend +"백엔드개발가이드"에 따라 개발해 주세요. +프롬프트에 '[개발정보]'항목이 없으면 수행을 중단하고 안내 메시지를 표시해 주세요. +{안내메시지} +[개발정보] +- 개발 아키텍처패턴 + - auth: Layered + - bill-inquiry: Clean + - product-change: Layered + - kos-mock: Layered +``` + +--- + +## 백엔드 오류 해결 요청 +command: "/develop-fix-backend" +prompt: +``` +@fix as @back +개발된 각 서비스와 common 모듈을 컴파일하고 에러를 해결해 주세요. +- common 모듈 우선 수행 +- 각 서비스별로 서브 에이젠트를 병렬로 수행 +- 컴파일이 모두 성공할때까지 계속 수행 +``` + +--- + +## 서비스 실행파일 작성 요청 +command: "/develop-make-run-profile" +prompt: +``` +@test-backend +'서비스실행파일작성가이드'에 따라 테스트를 해 주세요. +프롬프트에 '[작성정보]'항목이 없으면 수행을 중단하고 안내 메시지를 표시해 주세요. +DB나 Redis의 접근 정보는 지정할 필요 없습니다. 특별히 없으면 '[작성정보]'섹션에 '없음'이라고 하세요. +{안내메시지} +[작성정보] +- API Key + - Claude: sk-ant-ap... + - OpenAI: sk-proj-An4Q... + - Open Weather Map: 1aa5b... + - Kakao API Key: 5cdc24.... +``` + +--- + +## 백엔드 테스트 요청 +command: "/develop-test-backend" +prompt: +``` +@test-backend +'백엔드테스트가이드'에 따라 테스트를 해 주세요. +프롬프트에 '[테스트정보]'항목이 없으면 수행을 중단하고 안내 메시지를 표시해 주세요. +테스트 대상 서비스를 지정안하면 모든 서비스를 테스트 합니다. +{안내메시지} +'[테스트정보]'섹션 하위에 아래 예와 같이 테스트에 필요한 정보를 제시해 주세요. +테스트 대상 서비스를 콤마로 구분하여 입력할 수 있으며 전체를 테스트 할 때는 '전체'라고 입력하세요. +- 서비스: user-service +- API Key + - Claude: sk-ant-ap... + - OpenAI: sk-proj-An4Q... + - Open Weather Map: 1aa5b... + - Kakao API Key: 5cdc24.... +``` + +--- + +## 프론트엔드 개발 요청 +command: "/develop-dev-front" +prompt: +``` +@dev-front +"프론트엔드개발가이드"에 따라 개발해 주세요. +프롬프트에 '[개발정보]'항목이 없으면 수행을 중단하고 안내 메시지를 표시해 주세요. +{안내메시지} +'[개발정보]'섹션 하위에 아래 예와 같이 개발에 필요한 정보를 제시해 주세요. +[개발정보] +- 개발프레임워크: Typescript + React 18 +- UI프레임워크: MUI v5 +- 상태관리: Redux Toolkit +- 라우팅: React Router v6 +- API통신: Axios +- 스타일링: MUI + styled-components +- 빌드도구: Vite +``` \ No newline at end of file diff --git a/claude/think-prompt.md b/claude/think-prompt.md new file mode 100644 index 0000000..208728f --- /dev/null +++ b/claude/think-prompt.md @@ -0,0 +1,41 @@ +# 서비스 기획 프롬프트 + +## 서비스 기획 +command: "/think-planning" +prompt: +아래 내용을 터미널에 표시만 하고 수행을 하지는 않습니다. +``` +아래 가이드를 참고하여 서비스 기획을 수행합니다. + +https://github.com/cna-bootcamp/aiguide/blob/main/AI%ED%99%9C%EC%9A%A9%20%EC%84%9C%EB%B9%84%EC%8A%A4%20%EA%B8%B0%ED%9A%8D%20%EA%B0%80%EC%9D%B4%EB%93%9C.md + +``` + +--- + +## 유저스토리 작성 +command: "/think-userstory" +prompt: + +``` +@document +유저스토리를 작성하세요. +프롬프트에 '[요구사항]'섹션이 없으면 수행을 중단하고 안내 메시지를 표시합니다. +{안내메시지} +'[요구사항]' 섹션에 아래 예와 같은 정보를 제공해 주십시오. +[요구사항] +Case 1) 이벤트스토밍을 피그마로 수행한 경우는 피그마 채널ID를 제공 +예) 피그마 채널ID 'abcde'에 접속하여 분석 +Case 2) 다른 방법으로 이벤트스토밍을 한 경우는 요구사항을 정리한 파일 경로를 제공 +예) 요구사항문서 'design/requirement.md'를 읽어 분석 + +프롬프트에 '[요구사항]'섹션이 있으면 아래와 같이 수행합니다. +1. 요구사항 분석 +- 피그마 채널ID가 제공된 경우 figma MCP를 이용하여 해당 채널에 접속하여 분석 +- 요구사항문서 경로가 제공된 경우 해당 문서를 읽어 요구사항을 분석 +2. 유저스토리 작성 +- '유저스토리작성방법'과 '유저스토리예제'를 참고하여 유저스토리를 작성 +- 결과파일은 'design/userstory.md'에 생성 + +``` + diff --git a/deployment/container/run-container-guide-back.md b/deployment/container/run-container-guide-back.md new file mode 100644 index 0000000..6aaa614 --- /dev/null +++ b/deployment/container/run-container-guide-back.md @@ -0,0 +1,502 @@ +# 백엔드 컨테이너 실행 가이드 + +백엔드 서비스를 Azure VM에서 Docker 컨테이너로 실행하는 가이드를 제공합니다. + +## 📋 목차 + +1. [사전 준비](#사전-준비) +2. [컨테이너 이미지 확인](#컨테이너-이미지-확인) +3. [컨테이너 실행](#컨테이너-실행) +4. [컨테이너 관리](#컨테이너-관리) +5. [문제 해결](#문제-해결) + +--- + +## 사전 준비 + +### 1. VM 접속 정보 +```yaml +ACR: acrdigitalgarage01 +VM: + KEY파일: ~/home/bastion-dg0505 + 사용자: azureuser + IP: 20.196.65.160 +``` + +### 2. VM 접속 +```bash +# SSH 접속 +ssh -i ~/home/bastion-dg0505 azureuser@20.196.65.160 +``` + +### 3. Docker 및 ACR 로그인 확인 +```bash +# Docker 실행 확인 +docker --version + +# ACR 로그인 (필요시) +az acr login --name acrdigitalgarage01 +``` + +--- + +## 컨테이너 이미지 확인 + +### 1. ACR에서 이미지 목록 조회 +```bash +# 이미지 목록 확인 +az acr repository list --name acrdigitalgarage01 --output table + +# 특정 이미지의 태그 확인 +az acr repository show-tags --name acrdigitalgarage01 \ + --repository {service-name} --output table +``` + +### 2. 실행할 이미지 Pull +```bash +# 이미지 다운로드 +docker pull acrdigitalgarage01.azurecr.io/{service-name}:{tag} + +# 예: participation-service +docker pull acrdigitalgarage01.azurecr.io/participation-service:latest +``` + +--- + +## 컨테이너 실행 + +### 1. 환경 변수 준비 + +각 서비스별 환경 변수를 확인하고 준비합니다. + +```bash +# .env 파일 생성 (예시) +cat > ~/event-marketing.env << EOF +# Database +DB_HOST=your-db-host +DB_PORT=5432 +DB_NAME=event_marketing +DB_USERNAME=your-username +DB_PASSWORD=your-password + +# Redis +REDIS_HOST=your-redis-host +REDIS_PORT=6379 + +# Kafka +KAFKA_BOOTSTRAP_SERVERS=your-kafka:9092 + +# Application +SERVER_PORT=8080 +SPRING_PROFILES_ACTIVE=prod +EOF +``` + +### 2. 네트워크 생성 (선택사항) + +여러 컨테이너를 함께 실행할 경우 네트워크를 생성합니다. + +```bash +# Docker 네트워크 생성 +docker network create event-marketing-network +``` + +### 3. 컨테이너 실행 + +#### 기본 실행 +```bash +docker run -d \ + --name {service-name} \ + --env-file ~/event-marketing.env \ + -p 8080:8080 \ + acrdigitalgarage01.azurecr.io/{service-name}:latest +``` + +#### 네트워크 포함 실행 +```bash +docker run -d \ + --name {service-name} \ + --network event-marketing-network \ + --env-file ~/event-marketing.env \ + -p 8080:8080 \ + acrdigitalgarage01.azurecr.io/{service-name}:latest +``` + +#### 볼륨 마운트 포함 실행 +```bash +docker run -d \ + --name {service-name} \ + --network event-marketing-network \ + --env-file ~/event-marketing.env \ + -p 8080:8080 \ + -v ~/logs/{service-name}:/app/logs \ + acrdigitalgarage01.azurecr.io/{service-name}:latest +``` + +### 4. 여러 서비스 실행 (docker-compose 사용) + +`docker-compose.yml` 파일 생성: + +```yaml +version: '3.8' + +services: + participation-service: + image: acrdigitalgarage01.azurecr.io/participation-service:latest + container_name: participation-service + env_file: + - ./event-marketing.env + ports: + - "8080:8080" + networks: + - event-marketing-network + volumes: + - ./logs/participation:/app/logs + restart: unless-stopped + + # 다른 서비스 추가... + +networks: + event-marketing-network: + driver: bridge + +volumes: + logs: +``` + +실행: +```bash +# docker-compose로 모든 서비스 시작 +docker-compose up -d + +# 특정 서비스만 시작 +docker-compose up -d participation-service +``` + +--- + +## 컨테이너 관리 + +### 1. 컨테이너 상태 확인 +```bash +# 실행 중인 컨테이너 확인 +docker ps + +# 모든 컨테이너 확인 (중지된 것 포함) +docker ps -a + +# 특정 컨테이너 상세 정보 +docker inspect {container-name} +``` + +### 2. 로그 확인 +```bash +# 실시간 로그 확인 +docker logs -f {container-name} + +# 최근 100줄 로그 확인 +docker logs --tail 100 {container-name} + +# 타임스탬프 포함 로그 확인 +docker logs -t {container-name} +``` + +### 3. 컨테이너 중지/시작/재시작 +```bash +# 중지 +docker stop {container-name} + +# 시작 +docker start {container-name} + +# 재시작 +docker restart {container-name} + +# 강제 중지 +docker kill {container-name} +``` + +### 4. 컨테이너 삭제 +```bash +# 중지된 컨테이너 삭제 +docker rm {container-name} + +# 실행 중인 컨테이너 강제 삭제 +docker rm -f {container-name} + +# 중지된 모든 컨테이너 삭제 +docker container prune +``` + +### 5. 컨테이너 내부 접속 +```bash +# bash 쉘로 접속 +docker exec -it {container-name} bash + +# 특정 명령 실행 +docker exec {container-name} ls -la /app +``` + +### 6. 리소스 사용량 확인 +```bash +# 실시간 리소스 사용량 +docker stats + +# 특정 컨테이너의 리소스 사용량 +docker stats {container-name} +``` + +--- + +## 문제 해결 + +### 1. 컨테이너가 시작되지 않는 경우 + +```bash +# 로그 확인 +docker logs {container-name} + +# 컨테이너 상태 확인 +docker inspect {container-name} + +# 환경 변수 확인 +docker exec {container-name} env +``` + +### 2. 포트 충돌 + +```bash +# 포트 사용 확인 +netstat -tuln | grep {port} + +# 다른 포트로 매핑 +docker run -d -p 8081:8080 ... +``` + +### 3. 네트워크 연결 문제 + +```bash +# 네트워크 목록 확인 +docker network ls + +# 네트워크 상세 정보 +docker network inspect {network-name} + +# 컨테이너를 네트워크에 연결 +docker network connect {network-name} {container-name} +``` + +### 4. 이미지 Pull 실패 + +```bash +# ACR 로그인 재시도 +az acr login --name acrdigitalgarage01 + +# 수동으로 Pull +docker pull acrdigitalgarage01.azurecr.io/{service-name}:{tag} +``` + +### 5. 디스크 공간 부족 + +```bash +# 사용하지 않는 이미지 삭제 +docker image prune -a + +# 사용하지 않는 볼륨 삭제 +docker volume prune + +# 전체 정리 (주의!) +docker system prune -a +``` + +--- + +## 헬스체크 및 모니터링 + +### 1. 헬스체크 엔드포인트 확인 +```bash +# Spring Boot Actuator health endpoint +curl http://localhost:8080/actuator/health + +# 상세 헬스 정보 +curl http://localhost:8080/actuator/health/readiness +curl http://localhost:8080/actuator/health/liveness +``` + +### 2. 메트릭 확인 +```bash +# 메트릭 엔드포인트 +curl http://localhost:8080/actuator/metrics + +# 특정 메트릭 확인 +curl http://localhost:8080/actuator/metrics/jvm.memory.used +``` + +### 3. 로그 모니터링 스크립트 +```bash +#!/bin/bash +# monitor-logs.sh + +SERVICE_NAME=$1 +if [ -z "$SERVICE_NAME" ]; then + echo "Usage: ./monitor-logs.sh {service-name}" + exit 1 +fi + +# 에러 로그 모니터링 +docker logs -f $SERVICE_NAME 2>&1 | grep -i error +``` + +--- + +## 자동화 스크립트 + +### 1. 서비스 재배포 스크립트 +```bash +#!/bin/bash +# redeploy.sh + +SERVICE_NAME=$1 +IMAGE_TAG=${2:-latest} + +if [ -z "$SERVICE_NAME" ]; then + echo "Usage: ./redeploy.sh {service-name} [tag]" + exit 1 +fi + +echo "📦 Pulling latest image..." +docker pull acrdigitalgarage01.azurecr.io/$SERVICE_NAME:$IMAGE_TAG + +echo "🛑 Stopping old container..." +docker stop $SERVICE_NAME +docker rm $SERVICE_NAME + +echo "🚀 Starting new container..." +docker run -d \ + --name $SERVICE_NAME \ + --env-file ~/event-marketing.env \ + -p 8080:8080 \ + acrdigitalgarage01.azurecr.io/$SERVICE_NAME:$IMAGE_TAG + +echo "✅ Deployment complete!" +docker logs -f $SERVICE_NAME +``` + +### 2. 헬스체크 스크립트 +```bash +#!/bin/bash +# healthcheck.sh + +SERVICE_NAME=$1 +MAX_RETRIES=30 +RETRY_INTERVAL=2 + +if [ -z "$SERVICE_NAME" ]; then + echo "Usage: ./healthcheck.sh {service-name}" + exit 1 +fi + +echo "⏳ Waiting for $SERVICE_NAME to be healthy..." + +for i in $(seq 1 $MAX_RETRIES); do + if curl -f http://localhost:8080/actuator/health > /dev/null 2>&1; then + echo "✅ $SERVICE_NAME is healthy!" + exit 0 + fi + echo "Attempt $i/$MAX_RETRIES failed. Retrying in ${RETRY_INTERVAL}s..." + sleep $RETRY_INTERVAL +done + +echo "❌ $SERVICE_NAME failed to become healthy" +exit 1 +``` + +--- + +## 보안 고려사항 + +### 1. 환경 변수 보호 +```bash +# .env 파일 권한 설정 +chmod 600 ~/event-marketing.env + +# 민감 정보는 Azure Key Vault 사용 권장 +``` + +### 2. 컨테이너 보안 +```bash +# 읽기 전용 파일시스템으로 실행 +docker run -d --read-only ... + +# 리소스 제한 +docker run -d \ + --memory="512m" \ + --cpus="0.5" \ + ... +``` + +### 3. 네트워크 보안 +```bash +# 필요한 포트만 노출 +# 내부 통신은 Docker 네트워크 사용 +``` + +--- + +## 서비스별 실행 예시 + +### Participation Service +```bash +docker run -d \ + --name participation-service \ + --network event-marketing-network \ + --env-file ~/event-marketing.env \ + -e SERVER_PORT=8080 \ + -e SPRING_PROFILES_ACTIVE=prod \ + -p 8080:8080 \ + -v ~/logs/participation:/app/logs \ + acrdigitalgarage01.azurecr.io/participation-service:latest +``` + +### Event Service +```bash +docker run -d \ + --name event-service \ + --network event-marketing-network \ + --env-file ~/event-marketing.env \ + -e SERVER_PORT=8081 \ + -e SPRING_PROFILES_ACTIVE=prod \ + -p 8081:8081 \ + -v ~/logs/event:/app/logs \ + acrdigitalgarage01.azurecr.io/event-service:latest +``` + +### User Service +```bash +docker run -d \ + --name user-service \ + --network event-marketing-network \ + --env-file ~/event-marketing.env \ + -e SERVER_PORT=8082 \ + -e SPRING_PROFILES_ACTIVE=prod \ + -p 8082:8082 \ + -v ~/logs/user:/app/logs \ + acrdigitalgarage01.azurecr.io/user-service:latest +``` + +### Analytics Service +```bash +docker run -d \ + --name analytics-service \ + --network event-marketing-network \ + --env-file ~/event-marketing.env \ + -e SERVER_PORT=8083 \ + -e SPRING_PROFILES_ACTIVE=prod \ + -p 8083:8083 \ + -v ~/logs/analytics:/app/logs \ + acrdigitalgarage01.azurecr.io/analytics-service:latest +``` + +--- + +이 가이드를 통해 백엔드 서비스를 안전하고 효율적으로 컨테이너로 실행할 수 있습니다. 추가 질문이나 문제가 있으면 언제든지 문의해 주세요! 🚀 diff --git a/participation-service/src/main/java/com/kt/event/participation/domain/participant/Participant.java b/participation-service/src/main/java/com/kt/event/participation/domain/participant/Participant.java index a3ce81d..5ee4fa5 100644 --- a/participation-service/src/main/java/com/kt/event/participation/domain/participant/Participant.java +++ b/participation-service/src/main/java/com/kt/event/participation/domain/participant/Participant.java @@ -15,6 +15,7 @@ import lombok.*; indexes = { @Index(name = "idx_participant_event_id", columnList = "event_id"), @Index(name = "idx_participant_event_phone", columnList = "event_id, phone_number") + }, uniqueConstraints = { @UniqueConstraint(name = "uk_event_phone", columnNames = {"event_id", "phone_number"}) 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 b43fdfc..855ba0f 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 @@ -24,6 +24,8 @@ public class SecurityConfig { .csrf(csrf -> csrf.disable()) .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) .authorizeHttpRequests(auth -> auth + // Actuator endpoints + .requestMatchers("/actuator/**").permitAll() .anyRequest().permitAll() ); diff --git a/participation-service/src/main/resources/application.yml b/participation-service/src/main/resources/application.yml index 85752ae..f90f4c7 100644 --- a/participation-service/src/main/resources/application.yml +++ b/participation-service/src/main/resources/application.yml @@ -73,3 +73,19 @@ logging: max-file-size: 10MB max-history: 7 total-size-cap: 100MB +# Actuator +management: + endpoints: + web: + exposure: + include: health,info,metrics,prometheus + base-path: /actuator + endpoint: + health: + show-details: always + show-components: always + health: + livenessState: + enabled: true + readinessState: + enabled: true \ No newline at end of file