mirror of
https://github.com/cna-bootcamp/phonebill.git
synced 2025-12-06 08:06:24 +00:00
Compare commits
4 Commits
d4a379196a
...
21b9c77109
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
21b9c77109 | ||
|
|
77fd4a56a5 | ||
|
|
054e14b922 | ||
|
|
4390a0a7a4 |
365
CLAUDE.md
365
CLAUDE.md
@ -142,366 +142,6 @@ QA Engineer
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
[가이드]
|
|
||||||
```
|
|
||||||
# Clauding Guide
|
|
||||||
최종 수정일시: 2025-08-22 11:50
|
|
||||||
|
|
||||||
## 서비스기획 가이드
|
|
||||||
- 서비스기획프롬프트
|
|
||||||
- 설명: 유저스토리 작성 등 서비스 기획을 위한 프롬프트 예시
|
|
||||||
- URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/prompt/02.think-prompt.md
|
|
||||||
- 파일명: think-prompt.md
|
|
||||||
|
|
||||||
- 서비스기획가이드
|
|
||||||
- 설명: 서비스 기획 방법 안내
|
|
||||||
- URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/think/think-guide.md
|
|
||||||
- 파일명: think-guide.md
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 설계 가이드
|
|
||||||
- 설계실행프롬프트
|
|
||||||
- 설명: 각 설계 단계 실행을 위한 프롬프트 모음
|
|
||||||
- URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/prompt/03.design-prompt.md
|
|
||||||
- 파일명: design-prompt.md
|
|
||||||
|
|
||||||
- 공통설계원칙
|
|
||||||
- 설명: 모든 설계 시 적용할 공통설계원칙
|
|
||||||
- URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/design/common-principles.md
|
|
||||||
- 파일명: common-principles.md
|
|
||||||
|
|
||||||
- UI/UX설계가이드
|
|
||||||
- 설명: UI/UX 설계 방법 안내
|
|
||||||
- URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/design/uiux-design.md
|
|
||||||
- 파일명: uiux-design.md
|
|
||||||
|
|
||||||
- 프로토타입작성가이드
|
|
||||||
- 설명: 프로토타입 작성 방법 안내
|
|
||||||
- URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/design/uiux-prototype.md
|
|
||||||
- 파일명: uiux-prototype.md
|
|
||||||
|
|
||||||
- 아키텍처패턴선정 가이드
|
|
||||||
- 설명: 클라우드 아키텍처 패턴 선정 방법 안내
|
|
||||||
- URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/design/architecture-patterns.md
|
|
||||||
- 파일명: architecture-patterns.md
|
|
||||||
|
|
||||||
- 논리아키텍처설계가이드
|
|
||||||
- 설명: 논리 아키텍처 설계 방법 안내
|
|
||||||
- URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/design/logical-architecture-design.md
|
|
||||||
- 파일명: logical-architecture-design.md
|
|
||||||
|
|
||||||
- API설계가이드
|
|
||||||
- 설명: API 설계 방법 안내
|
|
||||||
- URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/design/api-design.md
|
|
||||||
- 파일명: api-design.md
|
|
||||||
|
|
||||||
- 외부시퀀스설계가이드
|
|
||||||
- 설명: 외부 시퀀스 설계 방법 안내
|
|
||||||
- URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/design/sequence-outer-design.md
|
|
||||||
- 파일명: sequence-outer-design.md
|
|
||||||
|
|
||||||
- 내부시퀀스설계 가이드
|
|
||||||
- 설명: 내부 시퀀스 설계 방법 안내
|
|
||||||
- URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/design/sequence-inner-design.md
|
|
||||||
- 파일명: sequence-inner-design.md
|
|
||||||
|
|
||||||
- 클래스설계가이드
|
|
||||||
- 설명: 클래스 설계 방법 안내
|
|
||||||
- URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/design/class-design.md
|
|
||||||
- 파일명: class-design.md
|
|
||||||
|
|
||||||
- 데이터설계가이드
|
|
||||||
- 설명: 데이터 설계 방법 안내
|
|
||||||
- URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/design/data-design.md
|
|
||||||
- 파일명: data-design.md
|
|
||||||
|
|
||||||
- HighLevel아키텍처정의가이드
|
|
||||||
- 설명: 상위수준 아키텍처 정의 방법 안내
|
|
||||||
- URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/design/architecture-highlevel.md
|
|
||||||
- 파일명: architecture-highlevel.md
|
|
||||||
|
|
||||||
- 물리아키텍처설계가이드
|
|
||||||
- 설명: 물리 아키텍처 설계 방법 안내
|
|
||||||
- URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/design/physical-architecture-design.md
|
|
||||||
- 파일명: physical-architecture-design.md
|
|
||||||
|
|
||||||
- 프론트엔드설계가이드
|
|
||||||
- 설명: 프론트엔드 설계 방법 안내
|
|
||||||
- URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/design/frontend-design.md
|
|
||||||
- 파일명: frontend-design.md
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 개발 가이드
|
|
||||||
- 개발실행프롬프트
|
|
||||||
- 설명: 각 개발 단계 실행을 위한 프롬프트 모음
|
|
||||||
- URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/prompt/04.develop-prompt.md
|
|
||||||
- 파일명: develop-prompt.md
|
|
||||||
|
|
||||||
- 데이터베이스설치계획서가이드
|
|
||||||
- 설명: 데이터베이스 설치 방법 안내 요청 시 참조
|
|
||||||
- URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/develop/database-plan.md
|
|
||||||
- 파일명: database-plan.md
|
|
||||||
|
|
||||||
- 데이터베이스설치가이드
|
|
||||||
- 설명: 데이터베이스 설치 방법 안내 요청 시 참조
|
|
||||||
- URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/develop/database-install.md
|
|
||||||
- 파일명: database-install.md
|
|
||||||
|
|
||||||
- MQ설치게획서가이드
|
|
||||||
- 설명: Message Queue 설치 방법 안내 요청 시 참조
|
|
||||||
- URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/develop/mq-plan.md
|
|
||||||
- 파일명: mq-plan.md
|
|
||||||
|
|
||||||
- MQ설치가이드
|
|
||||||
- 설명: Message Queue 설치 방법 안내 요청 시 참조
|
|
||||||
- URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/develop/mq-install.md
|
|
||||||
- 파일명: mq-install.md
|
|
||||||
|
|
||||||
- 백엔드개발가이드
|
|
||||||
- 설명: 백엔드 개발 가이드
|
|
||||||
- URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/develop/dev-backend.md
|
|
||||||
- 파일명: dev-backend.md
|
|
||||||
|
|
||||||
- 서비스실행프로파일작성가이드
|
|
||||||
- 설명: 백엔드 서비스 실행 프로파일 작성 가이드
|
|
||||||
- URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/develop/make-run-profile.md
|
|
||||||
- 파일명: make-run-profile.md
|
|
||||||
|
|
||||||
- 백엔드테스트가이드
|
|
||||||
- 설명: 백엔드 테스트 가이드
|
|
||||||
- URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/develop/test-backend.md
|
|
||||||
- 파일명: test-backend.md
|
|
||||||
|
|
||||||
- 프론트엔드개발가이드
|
|
||||||
- 설명: 프론트엔드 개발 가이드
|
|
||||||
- URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/develop/dev-frontend.md
|
|
||||||
- 파일명: dev-frontend.md
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 배포 가이드
|
|
||||||
- 백엔드컨테이너이미지작성가이드
|
|
||||||
- 설명: 백엔드 컨테이너 이미지 작성 가이드
|
|
||||||
- URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/deploy/build-image-back.md
|
|
||||||
- 파일명: build-image-back.md
|
|
||||||
- 프론트엔드컨테이너이미지작성가이드
|
|
||||||
- 설명: 프론트엔드 컨테이너 이미지 작성 가이드
|
|
||||||
- URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/deploy/build-image-front.md
|
|
||||||
- 파일명: build-image-front.md
|
|
||||||
- 백엔드컨테이너실행방법가이드
|
|
||||||
- 설명: 백엔드 컨테이너 실행방법 가이드
|
|
||||||
- URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/deploy/run-container-guide-back.md
|
|
||||||
- 파일명: run-container-guide-back.md
|
|
||||||
- 프론트엔드컨테이너실행방법가이드
|
|
||||||
- 설명: 프론트엔드 컨테이너 실행방법 가이드
|
|
||||||
- URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/deploy/run-container-guide-front.md
|
|
||||||
- 파일명: run-container-guide-front.md
|
|
||||||
- 백엔드배포가이드
|
|
||||||
- 설명: 백엔드 서비스를 쿠버네티스 클러스터에 배포하는 가이드
|
|
||||||
- URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/deploy/deploy-k8s-back.md
|
|
||||||
- 파일명: deploy-k8s-back.md
|
|
||||||
- 프론트엔드배포가이드
|
|
||||||
- 설명: 프론트엔드 서비스를 쿠버네티스 클러스터에 배포하는 가이드
|
|
||||||
- URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/deploy/deploy-k8s-front.md
|
|
||||||
- 파일명: deploy-k8s-front.md
|
|
||||||
- 백엔드Jenkins파이프라인작성가이드
|
|
||||||
- 설명: 백엔드 서비스를 Jenkins를 이용하여 CI/CD하는 배포 가이드
|
|
||||||
- URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/deploy/deploy-jenkins-cicd-back.md
|
|
||||||
- 파일명: deploy-jenkins-cicd-back.md
|
|
||||||
- 백엔드GitHubActions파이프라인작성가이드
|
|
||||||
- 설명: 백엔드 서비스를 GitHub Actions를 이용하여 CI/CD하는 배포 가이드
|
|
||||||
- URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/deploy/deploy-actions-cicd-back.md
|
|
||||||
- 파일명: deploy-actions-cicd-back.md
|
|
||||||
|
|
||||||
## 참조 문서
|
|
||||||
- 프로젝트지침템플릿
|
|
||||||
- 설명: 프로젝트 지침인 CLAUDE.md 파일 템플릿
|
|
||||||
- URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/references/instruction-template.md
|
|
||||||
- 파일명: instruction-template.md
|
|
||||||
|
|
||||||
- 유저스토리작성방법
|
|
||||||
- 설명: 유저스토리 형식과 작성법
|
|
||||||
- URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/references/유저스토리작성방법.md
|
|
||||||
- 파일명: userstory-writing.md
|
|
||||||
|
|
||||||
- 유저스토리예제
|
|
||||||
- 설명: 유저스토리 예제
|
|
||||||
- URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/samples/sample-%EC%9C%A0%EC%A0%80%EC%8A%A4%ED%86%A0%EB%A6%AC.md
|
|
||||||
- 파일명: sample-userstory.md
|
|
||||||
|
|
||||||
- 클라우드아키텍처패턴요약표
|
|
||||||
- 설명: 클라우드 디자인 패턴 요약표
|
|
||||||
- URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/references/Cloud%20Design%20Patterns(%EA%B0%9C%EC%9A%94).md
|
|
||||||
- 파일명: cloud-design-patterns.md
|
|
||||||
|
|
||||||
- HighLevel아키텍처정의서템플릿
|
|
||||||
- 설명: MSA 7대 컴포넌트별로 상위 수준의 아키텍처를 정의한 문서
|
|
||||||
- URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/references/highlevel-architecture-template.md
|
|
||||||
- 파일명: highlevel-architecture-template.md
|
|
||||||
|
|
||||||
- 제품별버전가이드
|
|
||||||
- 설명: 개발언어, 개발 프레임워크, AI제품 등의 버전 참조를 위한 페이지 링크 제공
|
|
||||||
- URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/references/제품버전참조.md
|
|
||||||
- 파일명: version-link.md
|
|
||||||
|
|
||||||
- 백킹서비스설치방법
|
|
||||||
- 설명: 데이터베이스, Message Queue 등 백킹서비스설치방법 설명
|
|
||||||
- URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/references/백킹서비스설치방법.md
|
|
||||||
- 파일명: backing-service-method.md
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 표준
|
|
||||||
- 개발주석표준
|
|
||||||
- 설명: 개발 주석 표준
|
|
||||||
- URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/standards/standard_comment.md
|
|
||||||
- 파일명: standard_comment.md
|
|
||||||
|
|
||||||
- 패키지구조표준
|
|
||||||
- 설명: 패키지 구조 표준과 설계 아키텍처 패턴(Layered, Clean, Hexagonal)별 예시
|
|
||||||
- URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/standards/standard_package_structure.md
|
|
||||||
- 파일명: standard_package_structure.md
|
|
||||||
|
|
||||||
- 테스트코드표준
|
|
||||||
- 설명: 테스트 코드 작성 표준
|
|
||||||
- URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/standards/standard_testcode.md
|
|
||||||
- 파일명: standard_testcode.md
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 기술 도구
|
|
||||||
- PlantUML문법검사가이드
|
|
||||||
- 설명: PlantUML 문법 검사하는 방법 안내
|
|
||||||
- URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/tools/plantuml-guide.md
|
|
||||||
- 파일명: plantuml-guide.md
|
|
||||||
|
|
||||||
- Mermaid문법검사가이드
|
|
||||||
- 설명: Mermaid 문법 검사하는 방법 안내
|
|
||||||
- URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/tools/mermaid-guide.md
|
|
||||||
- 파일명: mermaid-guide.md
|
|
||||||
|
|
||||||
- MCP동기화도구
|
|
||||||
- 설명: Window에서 Cloude Desktop의 MCP설정을 읽어 Claude Code에 MCP 서버를 동기화하는 툴
|
|
||||||
- URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/tools/sync-mcp.md
|
|
||||||
- 파일명: sync-mcp.md
|
|
||||||
|
|
||||||
- PlantUML문법검사기(Window)
|
|
||||||
- 설명: Window용 PlantUML 스크립트 문법 검사기
|
|
||||||
- URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/tools/check-plantuml.ps1
|
|
||||||
- 파일명: check-plantuml.ps1
|
|
||||||
|
|
||||||
- Mermaid문법검사기(Window)
|
|
||||||
- 설명: Window용 PlantUML 스크립트 문법 검사기
|
|
||||||
- URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/tools/check-mermaid.ps1
|
|
||||||
- 파일명: check-mermaid.ps1
|
|
||||||
|
|
||||||
- PlantUML문법검사기(Linux/Mac)
|
|
||||||
- 설명: Linux/Mac용 PlantUML 스크립트 문법 검사기
|
|
||||||
- URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/tools/check-plantuml.sh
|
|
||||||
- 파일명: check-plantuml.sh
|
|
||||||
|
|
||||||
- Mermaid문법검사기(Linux/Mac)
|
|
||||||
- 설명: Linux/Mac용 PlantUML 스크립트 문법 검사기
|
|
||||||
- URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/tools/check-mermaid.sh
|
|
||||||
- 파일명: check-mermaid.sh
|
|
||||||
|
|
||||||
- IntelliJ서비스실행기
|
|
||||||
- 설명: IntelliJ에 등록된 실행프로파일을 이용하여 서비스 실행
|
|
||||||
- URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/tools/run-intellij-service-profile.py
|
|
||||||
- 파일명: run-intellij-service-profile.py
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 산출물 디렉토리
|
|
||||||
- 유저스토리: design/userstory.md
|
|
||||||
- UI/UX설계서: design/uiux/uiux.md
|
|
||||||
- 스타일가이드: design/uiux/style-guide.md
|
|
||||||
- 프로토타입: design/uiux/prototype/*.html
|
|
||||||
- 아키텍처패턴: design/pattern/architecture-pattern.md
|
|
||||||
- 논리아키텍처: design/backend/logical/*
|
|
||||||
- API설계서: design/backend/api/*
|
|
||||||
- API명세서: design/backend/api/spec/*
|
|
||||||
- 외부시퀀스설계서: design/backend/sequence/outer/{플로우명}.puml
|
|
||||||
- 내부시퀀스설계서: design/backend/sequence/inner/{service-name}-{flow-name}.puml
|
|
||||||
- 클래스설계서: design/backend/class/*
|
|
||||||
- 백엔드패키지구조도: 클래스설계 결과(design/backend/class/class.md)의 '패키지 구조도' 섹션
|
|
||||||
- 데이터설계서: design/backend/database/*
|
|
||||||
- HighLevel아키텍처정의서: design/high-level-architecture.md
|
|
||||||
- 물리아키텍처: design/backend/physical/*
|
|
||||||
- 데이터베이스설치계획서
|
|
||||||
- develop/database/plan/db-plan-{service-name}-dev.md
|
|
||||||
- develop/database/plan/db-plan-{service-name}-prod.md
|
|
||||||
- 캐시설치계획서:
|
|
||||||
- develop/mq/mq-plan-dev.md
|
|
||||||
- develop/mq/mq-plan-prod.md
|
|
||||||
- MQ설치계획서
|
|
||||||
- develop/database/plan/mq-plan-{service-name}-dev.md
|
|
||||||
- develop/database/plan/mq-plan-{service-name}-prod.md
|
|
||||||
- 데이터베이스설치결과서
|
|
||||||
- develop/database/exec/db-exec-dev.md
|
|
||||||
- develop/database/exec/db-exec-prod.md
|
|
||||||
- 캐시설치결과서
|
|
||||||
- develop/database/exec/cache-exec-{service-name}-dev.md
|
|
||||||
- develop/database/exec/cache-exec-{service-name}-prod.md
|
|
||||||
- MQ설치결과서
|
|
||||||
- develop/mq/mq-exec-dev.md
|
|
||||||
- develop/mq/mq-exec-prod.md
|
|
||||||
- 백엔드개발결과서: develop/dev/dev-backend.md
|
|
||||||
- 백엔드테스트결과서: develop/dev/test-backend.md
|
|
||||||
- 프론트엔드설계서: design/frontend/frontend-design.md
|
|
||||||
|
|
||||||
## 프롬프트 약어
|
|
||||||
### 역할 약어
|
|
||||||
- "@archi": "--persona-architect"
|
|
||||||
- "@front": "--persona-front"
|
|
||||||
- "@back": "--persona-backend"
|
|
||||||
- "@secu": "--persona-security"
|
|
||||||
- "@qa": "--persona-qa"
|
|
||||||
- "@refact": "--persona-refactor"
|
|
||||||
- "@devops": "--persona-devops"
|
|
||||||
- "@scribe": "--persona-scriber"
|
|
||||||
|
|
||||||
### 작업 약어
|
|
||||||
- "@complex-flag": --seq --c7 --uc --wave-mode auto --wave-strategy systematic --delegate auto
|
|
||||||
|
|
||||||
- "@userstory": /sc:document @scribe @archi --think --wave-strategy systematic
|
|
||||||
- "@uiux": /sc:design --think @front --uc --wave-mode auto --wave-strategy systematic
|
|
||||||
- "@prototype": /sc:implement @front --answer-only
|
|
||||||
- "@design-pattern": /sc:design @archi --think-hard @complex-flag
|
|
||||||
- "@architecture": /sc:design @archi @back @refact --think-hard @complex-flag
|
|
||||||
- "@plan": --plan --think
|
|
||||||
- "@backing-service": /sc:implement @devops @back --think-hard @complex-flag
|
|
||||||
- "@dev-backend": /sc:implement @back --think-hard @complex-flag
|
|
||||||
- "@dev-front": /sc:implement @front --think-hard @complex-flag
|
|
||||||
- "@test-backend": /sc:test @back @qa --think @complex-flag
|
|
||||||
- "@test-api": /sc:test @back @qa --think 1) 소스 수정 후 컴파일하고 서버 시작 요청. 2) API경로와 DTO를 분석하여 정확하게 요청하여 테스트
|
|
||||||
- "@run-back":
|
|
||||||
- 'IntelliJ서비스실행기'를 'tools' 디렉토리에 다운로드
|
|
||||||
- python 또는 python3 명령으로 백그라우드로 실행하고 결과 로그를 분석
|
|
||||||
nohup python3 tools/run-intellij-service-profile.py {service-name} > logs/{service-name}.log 2>&1 & echo "Started {service-name} with PID: $!"
|
|
||||||
- "@test-front": /sc:test @front @qa --play --think @complex-flag
|
|
||||||
- "@cicd": /sc:implement @devops --think @complex-flag
|
|
||||||
- "@document": /sc:document --think @scribe @complex-flag
|
|
||||||
- "@fix": /sc:troubleshoot --think @complex-flag
|
|
||||||
- "@estimate": /sc:estimate --think-hard @complex-flag
|
|
||||||
- "@improve": /sc:improve --think @complex-flag
|
|
||||||
- "@analyze": /sc:analyze --think --seq
|
|
||||||
- "@explain": /sc:explain --think --seq --answer-only
|
|
||||||
|
|
||||||
### 파일 약어
|
|
||||||
- "@error": debug/error.png파일을 의미함
|
|
||||||
- "@info": debug/info.png파일을 의미함
|
|
||||||
|
|
||||||
### 작업 단계 가이드 약어
|
|
||||||
- "@think-help": "기획실행프롬프트 내용을 터미널에 출력"
|
|
||||||
- "@design-help": "설계실행프롬프트 내용을 터미널에 출력"
|
|
||||||
- "@develop-help": "개발실행프롬프트 내용을 터미널에 출력"
|
|
||||||
- "@deploy-help": "배포실행프롬프트 내용을 터미널에 출력"
|
|
||||||
```
|
|
||||||
|
|
||||||
# Lessons Learned
|
|
||||||
|
|
||||||
## 개발 워크플로우
|
## 개발 워크플로우
|
||||||
- **❗ 핵심 원칙**: 코드 수정 → 컴파일 → 사람에게 서버 시작 요청 → 테스트
|
- **❗ 핵심 원칙**: 코드 수정 → 컴파일 → 사람에게 서버 시작 요청 → 테스트
|
||||||
@ -544,3 +184,8 @@ QA Engineer
|
|||||||
- **환경변수 확인**: `kubectl exec -n {namespace} {pod-name} -c postgresql -- env | grep POSTGRES`
|
- **환경변수 확인**: `kubectl exec -n {namespace} {pod-name} -c postgresql -- env | grep POSTGRES`
|
||||||
- **SQL 실행**: `kubectl exec -n {namespace} {pod-name} -c postgresql -- bash -c 'PGPASSWORD="$POSTGRES_POSTGRES_PASSWORD" psql -U postgres -d {database} -c "{SQL}"'`
|
- **SQL 실행**: `kubectl exec -n {namespace} {pod-name} -c postgresql -- bash -c 'PGPASSWORD="$POSTGRES_POSTGRES_PASSWORD" psql -U postgres -d {database} -c "{SQL}"'`
|
||||||
- **예시**: `kubectl exec -n phonebill-dev product-change-postgres-dev-postgresql-0 -c postgresql -- bash -c 'PGPASSWORD="$POSTGRES_POSTGRES_PASSWORD" psql -U postgres -d product_change_db -c "ALTER TABLE product_change.pc_product_change_history ALTER COLUMN customer_id TYPE VARCHAR(100);"'`
|
- **예시**: `kubectl exec -n phonebill-dev product-change-postgres-dev-postgresql-0 -c postgresql -- bash -c 'PGPASSWORD="$POSTGRES_POSTGRES_PASSWORD" psql -U postgres -d product_change_db -c "ALTER TABLE product_change.pc_product_change_history ALTER COLUMN customer_id TYPE VARCHAR(100);"'`
|
||||||
|
[가이드]
|
||||||
|
```
|
||||||
|
$(cat claude/guide.md)
|
||||||
|
```
|
||||||
|
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
<map>
|
<map>
|
||||||
<entry key="CORS_ALLOWED_ORIGINS" value="http://localhost:3000" />
|
<entry key="CORS_ALLOWED_ORIGINS" value="http://localhost:3000" />
|
||||||
<entry key="DB_CONNECTION_TIMEOUT" value="30000" />
|
<entry key="DB_CONNECTION_TIMEOUT" value="30000" />
|
||||||
<entry key="DB_HOST" value="20.249.175.46" />
|
<entry key="DB_HOST" value="localhost" />
|
||||||
<entry key="DB_IDLE_TIMEOUT" value="600000" />
|
<entry key="DB_IDLE_TIMEOUT" value="600000" />
|
||||||
<entry key="DB_KIND" value="postgresql" />
|
<entry key="DB_KIND" value="postgresql" />
|
||||||
<entry key="DB_LEAK_DETECTION" value="60000" />
|
<entry key="DB_LEAK_DETECTION" value="60000" />
|
||||||
@ -13,8 +13,8 @@
|
|||||||
<entry key="DB_MAX_POOL" value="20" />
|
<entry key="DB_MAX_POOL" value="20" />
|
||||||
<entry key="DB_MIN_IDLE" value="5" />
|
<entry key="DB_MIN_IDLE" value="5" />
|
||||||
<entry key="DB_NAME" value="bill_inquiry_db" />
|
<entry key="DB_NAME" value="bill_inquiry_db" />
|
||||||
<entry key="DB_PASSWORD" value="BillUser2025!" />
|
<entry key="DB_PASSWORD" value="BillUser2025@" />
|
||||||
<entry key="DB_PORT" value="5432" />
|
<entry key="DB_PORT" value="25432" />
|
||||||
<entry key="DB_USERNAME" value="bill_inquiry_user" />
|
<entry key="DB_USERNAME" value="bill_inquiry_user" />
|
||||||
<entry key="JWT_ACCESS_TOKEN_VALIDITY" value="18000000" />
|
<entry key="JWT_ACCESS_TOKEN_VALIDITY" value="18000000" />
|
||||||
<entry key="JWT_REFRESH_TOKEN_VALIDITY" value="86400000" />
|
<entry key="JWT_REFRESH_TOKEN_VALIDITY" value="86400000" />
|
||||||
@ -22,12 +22,12 @@
|
|||||||
<entry key="KOS_BASE_URL" value="http://localhost:8084" />
|
<entry key="KOS_BASE_URL" value="http://localhost:8084" />
|
||||||
<entry key="LOG_FILE_NAME" value="logs/bill-service.log" />
|
<entry key="LOG_FILE_NAME" value="logs/bill-service.log" />
|
||||||
<entry key="REDIS_DATABASE" value="1" />
|
<entry key="REDIS_DATABASE" value="1" />
|
||||||
<entry key="REDIS_HOST" value="20.249.193.103" />
|
<entry key="REDIS_HOST" value="localhost" />
|
||||||
<entry key="REDIS_MAX_ACTIVE" value="8" />
|
<entry key="REDIS_MAX_ACTIVE" value="8" />
|
||||||
<entry key="REDIS_MAX_IDLE" value="8" />
|
<entry key="REDIS_MAX_IDLE" value="8" />
|
||||||
<entry key="REDIS_MAX_WAIT" value="-1" />
|
<entry key="REDIS_MAX_WAIT" value="-1" />
|
||||||
<entry key="REDIS_MIN_IDLE" value="0" />
|
<entry key="REDIS_MIN_IDLE" value="0" />
|
||||||
<entry key="REDIS_PASSWORD" value="Redis2025Dev!" />
|
<entry key="REDIS_PASSWORD" value="Redis2025Dev@" />
|
||||||
<entry key="REDIS_PORT" value="6379" />
|
<entry key="REDIS_PORT" value="6379" />
|
||||||
<entry key="REDIS_TIMEOUT" value="2000" />
|
<entry key="REDIS_TIMEOUT" value="2000" />
|
||||||
<entry key="SERVER_PORT" value="8082" />
|
<entry key="SERVER_PORT" value="8082" />
|
||||||
|
|||||||
Binary file not shown.
@ -62,9 +62,10 @@ public class BillEntity {
|
|||||||
private String dueDate;
|
private String dueDate;
|
||||||
|
|
||||||
@CreationTimestamp
|
@CreationTimestamp
|
||||||
@Column(name = "created_at", nullable = false)
|
@Column(name = "created_at", nullable = false, updatable = false)
|
||||||
private LocalDateTime createdAt;
|
@Builder.Default
|
||||||
|
private LocalDateTime createdAt = LocalDateTime.now();
|
||||||
|
|
||||||
// 고객 정보와의 관계
|
// 고객 정보와의 관계
|
||||||
@ManyToOne(fetch = FetchType.LAZY)
|
@ManyToOne(fetch = FetchType.LAZY)
|
||||||
@JoinColumn(name = "line_number", insertable = false, updatable = false)
|
@JoinColumn(name = "line_number", insertable = false, updatable = false)
|
||||||
|
|||||||
@ -41,12 +41,14 @@ public class CustomerEntity {
|
|||||||
private LocalDateTime contractDate;
|
private LocalDateTime contractDate;
|
||||||
|
|
||||||
@CreationTimestamp
|
@CreationTimestamp
|
||||||
@Column(name = "created_at", nullable = false)
|
@Column(name = "created_at", nullable = false, updatable = false)
|
||||||
private LocalDateTime createdAt;
|
@Builder.Default
|
||||||
|
private LocalDateTime createdAt = LocalDateTime.now();
|
||||||
|
|
||||||
@UpdateTimestamp
|
@UpdateTimestamp
|
||||||
@Column(name = "updated_at", nullable = false)
|
@Column(name = "updated_at", nullable = false)
|
||||||
private LocalDateTime updatedAt;
|
@Builder.Default
|
||||||
|
private LocalDateTime updatedAt = LocalDateTime.now();
|
||||||
|
|
||||||
// 상품 엔티티와의 관계 설정 (조회 성능을 위해)
|
// 상품 엔티티와의 관계 설정 (조회 성능을 위해)
|
||||||
@ManyToOne(fetch = FetchType.LAZY)
|
@ManyToOne(fetch = FetchType.LAZY)
|
||||||
|
|||||||
@ -54,10 +54,12 @@ public class ProductEntity {
|
|||||||
private String description;
|
private String description;
|
||||||
|
|
||||||
@CreationTimestamp
|
@CreationTimestamp
|
||||||
@Column(name = "created_at", nullable = false)
|
@Column(name = "created_at", nullable = false, updatable = false)
|
||||||
private LocalDateTime createdAt;
|
@Builder.Default
|
||||||
|
private LocalDateTime createdAt = LocalDateTime.now();
|
||||||
|
|
||||||
@UpdateTimestamp
|
@UpdateTimestamp
|
||||||
@Column(name = "updated_at", nullable = false)
|
@Column(name = "updated_at", nullable = false)
|
||||||
private LocalDateTime updatedAt;
|
@Builder.Default
|
||||||
|
private LocalDateTime updatedAt = LocalDateTime.now();
|
||||||
}
|
}
|
||||||
@ -4,11 +4,11 @@
|
|||||||
<option name="env">
|
<option name="env">
|
||||||
<map>
|
<map>
|
||||||
<entry key="CORS_ALLOWED_ORIGINS" value="http://localhost:3000" />
|
<entry key="CORS_ALLOWED_ORIGINS" value="http://localhost:3000" />
|
||||||
<entry key="DB_HOST" value="20.249.107.185" />
|
<entry key="DB_HOST" value="localhost" />
|
||||||
<entry key="DB_KIND" value="postgresql" />
|
<entry key="DB_KIND" value="postgresql" />
|
||||||
<entry key="DB_NAME" value="product_change_db" />
|
<entry key="DB_NAME" value="product_change_db" />
|
||||||
<entry key="DB_PASSWORD" value="ProductUser2025!" />
|
<entry key="DB_PASSWORD" value="ProductUser2025@" />
|
||||||
<entry key="DB_PORT" value="5432" />
|
<entry key="DB_PORT" value="35432" />
|
||||||
<entry key="DB_USERNAME" value="product_change_user" />
|
<entry key="DB_USERNAME" value="product_change_user" />
|
||||||
<entry key="DDL_AUTO" value="update" />
|
<entry key="DDL_AUTO" value="update" />
|
||||||
<entry key="JWT_ACCESS_TOKEN_VALIDITY" value="18000000" />
|
<entry key="JWT_ACCESS_TOKEN_VALIDITY" value="18000000" />
|
||||||
@ -19,8 +19,8 @@
|
|||||||
<entry key="KOS_CLIENT_ID" value="product-service-dev" />
|
<entry key="KOS_CLIENT_ID" value="product-service-dev" />
|
||||||
<entry key="KOS_MOCK_ENABLED" value="true" />
|
<entry key="KOS_MOCK_ENABLED" value="true" />
|
||||||
<entry key="REDIS_DATABASE" value="2" />
|
<entry key="REDIS_DATABASE" value="2" />
|
||||||
<entry key="REDIS_HOST" value="20.249.193.103" />
|
<entry key="REDIS_HOST" value="localhost" />
|
||||||
<entry key="REDIS_PASSWORD" value="Redis2025Dev!" />
|
<entry key="REDIS_PASSWORD" value="Redis2025Dev@" />
|
||||||
<entry key="REDIS_PORT" value="6379" />
|
<entry key="REDIS_PORT" value="6379" />
|
||||||
<entry key="SERVER_PORT" value="8083" />
|
<entry key="SERVER_PORT" value="8083" />
|
||||||
<entry key="SPRING_PROFILES_ACTIVE" value="dev" />
|
<entry key="SPRING_PROFILES_ACTIVE" value="dev" />
|
||||||
|
|||||||
@ -4,19 +4,19 @@
|
|||||||
<option name="env">
|
<option name="env">
|
||||||
<map>
|
<map>
|
||||||
<entry key="CORS_ALLOWED_ORIGINS" value="http://localhost:3000" />
|
<entry key="CORS_ALLOWED_ORIGINS" value="http://localhost:3000" />
|
||||||
<entry key="DB_HOST" value="20.249.70.6" />
|
<entry key="DB_HOST" value="localhost" />
|
||||||
<entry key="DB_KIND" value="postgresql" />
|
<entry key="DB_KIND" value="postgresql" />
|
||||||
<entry key="DB_NAME" value="phonebill_auth" />
|
<entry key="DB_NAME" value="phonebill_auth" />
|
||||||
<entry key="DB_PASSWORD" value="AuthUser2025!" />
|
<entry key="DB_PASSWORD" value="AuthUser2025@" />
|
||||||
<entry key="DB_PORT" value="5432" />
|
<entry key="DB_PORT" value="15432" />
|
||||||
<entry key="DB_USERNAME" value="auth_user" />
|
<entry key="DB_USERNAME" value="auth_user" />
|
||||||
<entry key="DDL_AUTO" value="update" />
|
<entry key="DDL_AUTO" value="update" />
|
||||||
<entry key="JWT_ACCESS_TOKEN_VALIDITY" value="18000000" />
|
<entry key="JWT_ACCESS_TOKEN_VALIDITY" value="18000000" />
|
||||||
<entry key="JWT_REFRESH_TOKEN_VALIDITY" value="86400000" />
|
<entry key="JWT_REFRESH_TOKEN_VALIDITY" value="86400000" />
|
||||||
<entry key="JWT_SECRET" value="nwe5Yo9qaJ6FBD/Thl2/j6/SFAfNwUorAY1ZcWO2KI7uA4bmVLOCPxE9hYuUpRCOkgV2UF2DdHXtqHi3+BU/ecbz2zpHyf/720h48UbA3XOMYOX1sdM+dQ==" />
|
<entry key="JWT_SECRET" value="nwe5Yo9qaJ6FBD/Thl2/j6/SFAfNwUorAY1ZcWO2KI7uA4bmVLOCPxE9hYuUpRCOkgV2UF2DdHXtqHi3+BU/ecbz2zpHyf/720h48UbA3XOMYOX1sdM+dQ==" />
|
||||||
<entry key="REDIS_DATABASE" value="0" />
|
<entry key="REDIS_DATABASE" value="0" />
|
||||||
<entry key="REDIS_HOST" value="20.249.193.103" />
|
<entry key="REDIS_HOST" value="localhost" />
|
||||||
<entry key="REDIS_PASSWORD" value="Redis2025Dev!" />
|
<entry key="REDIS_PASSWORD" value="Redis2025Dev@" />
|
||||||
<entry key="REDIS_PORT" value="6379" />
|
<entry key="REDIS_PORT" value="6379" />
|
||||||
<entry key="SERVER_PORT" value="8081" />
|
<entry key="SERVER_PORT" value="8081" />
|
||||||
<entry key="SHOW_SQL" value="true" />
|
<entry key="SHOW_SQL" value="true" />
|
||||||
|
|||||||
@ -21,9 +21,12 @@ public class AuthUserEntity extends BaseTimeEntity {
|
|||||||
@Column(name = "user_id", length = 50)
|
@Column(name = "user_id", length = 50)
|
||||||
private String userId;
|
private String userId;
|
||||||
|
|
||||||
|
@Column(name = "password", nullable = false, length = 255)
|
||||||
|
private String password;
|
||||||
|
|
||||||
@Column(name = "password_hash", nullable = false, length = 255)
|
@Column(name = "password_hash", nullable = false, length = 255)
|
||||||
private String passwordHash;
|
private String passwordHash;
|
||||||
|
|
||||||
@Column(name = "password_salt", nullable = false, length = 100)
|
@Column(name = "password_salt", nullable = false, length = 100)
|
||||||
private String passwordSalt;
|
private String passwordSalt;
|
||||||
|
|
||||||
@ -35,7 +38,15 @@ public class AuthUserEntity extends BaseTimeEntity {
|
|||||||
|
|
||||||
@Column(name = "user_name", length = 100)
|
@Column(name = "user_name", length = 100)
|
||||||
private String userName;
|
private String userName;
|
||||||
|
|
||||||
|
@Column(name = "enabled", nullable = false)
|
||||||
|
@Builder.Default
|
||||||
|
private Boolean enabled = true;
|
||||||
|
|
||||||
|
@Column(name = "locked", nullable = false)
|
||||||
|
@Builder.Default
|
||||||
|
private Boolean locked = false;
|
||||||
|
|
||||||
@Enumerated(EnumType.STRING)
|
@Enumerated(EnumType.STRING)
|
||||||
@Column(name = "account_status", length = 20)
|
@Column(name = "account_status", length = 20)
|
||||||
@Builder.Default
|
@Builder.Default
|
||||||
|
|||||||
@ -19,17 +19,23 @@ public class AuthUserPermissionEntity extends BaseTimeEntity {
|
|||||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||||
@Column(name = "user_permission_id")
|
@Column(name = "user_permission_id")
|
||||||
private Long userPermissionId;
|
private Long userPermissionId;
|
||||||
|
|
||||||
@Column(name = "user_id", nullable = false, length = 50)
|
@Column(name = "user_id", nullable = false, length = 50)
|
||||||
private String userId;
|
private String userId;
|
||||||
|
|
||||||
@Column(name = "permission_id", nullable = false)
|
@Column(name = "permission_id")
|
||||||
private Long permissionId;
|
private Long permissionId;
|
||||||
|
|
||||||
|
@Column(name = "permission_name", nullable = false, length = 50)
|
||||||
|
private String permissionName;
|
||||||
|
|
||||||
|
@Column(name = "description", length = 200)
|
||||||
|
private String description;
|
||||||
|
|
||||||
@Column(name = "granted")
|
@Column(name = "granted")
|
||||||
@Builder.Default
|
@Builder.Default
|
||||||
private Boolean granted = true;
|
private Boolean granted = true;
|
||||||
|
|
||||||
@Column(name = "granted_by", length = 50)
|
@Column(name = "granted_by", length = 50)
|
||||||
private String grantedBy;
|
private String grantedBy;
|
||||||
|
|
||||||
|
|||||||
@ -118,10 +118,12 @@ public class UserService {
|
|||||||
AuthUserPermissionEntity userPermission = AuthUserPermissionEntity.builder()
|
AuthUserPermissionEntity userPermission = AuthUserPermissionEntity.builder()
|
||||||
.userId(userId)
|
.userId(userId)
|
||||||
.permissionId(permission.getPermissionId())
|
.permissionId(permission.getPermissionId())
|
||||||
|
.permissionName(permission.getPermissionCode())
|
||||||
|
.description(permission.getPermissionDescription())
|
||||||
.granted(true)
|
.granted(true)
|
||||||
.grantedBy(grantedBy)
|
.grantedBy(grantedBy)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
authUserPermissionRepository.save(userPermission);
|
authUserPermissionRepository.save(userPermission);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -261,8 +263,11 @@ public class UserService {
|
|||||||
.customerId(request.getCustomerId())
|
.customerId(request.getCustomerId())
|
||||||
.lineNumber(request.getLineNumber())
|
.lineNumber(request.getLineNumber())
|
||||||
.userName(request.getUserName())
|
.userName(request.getUserName())
|
||||||
|
.password(hashedPassword)
|
||||||
.passwordHash(hashedPassword)
|
.passwordHash(hashedPassword)
|
||||||
.passwordSalt(salt)
|
.passwordSalt(salt)
|
||||||
|
.enabled(existingUser.getEnabled())
|
||||||
|
.locked(existingUser.getLocked())
|
||||||
.accountStatus(existingUser.getAccountStatus())
|
.accountStatus(existingUser.getAccountStatus())
|
||||||
.failedLoginCount(existingUser.getFailedLoginCount())
|
.failedLoginCount(existingUser.getFailedLoginCount())
|
||||||
.lastFailedLoginAt(existingUser.getLastFailedLoginAt())
|
.lastFailedLoginAt(existingUser.getLastFailedLoginAt())
|
||||||
@ -331,8 +336,11 @@ public class UserService {
|
|||||||
.customerId(request.getCustomerId())
|
.customerId(request.getCustomerId())
|
||||||
.lineNumber(request.getLineNumber())
|
.lineNumber(request.getLineNumber())
|
||||||
.userName(request.getUserName())
|
.userName(request.getUserName())
|
||||||
|
.password(hashedPassword)
|
||||||
.passwordHash(hashedPassword)
|
.passwordHash(hashedPassword)
|
||||||
.passwordSalt(salt)
|
.passwordSalt(salt)
|
||||||
|
.enabled(true)
|
||||||
|
.locked(false)
|
||||||
.accountStatus(AuthUserEntity.AccountStatus.ACTIVE)
|
.accountStatus(AuthUserEntity.AccountStatus.ACTIVE)
|
||||||
.failedLoginCount(0)
|
.failedLoginCount(0)
|
||||||
.build();
|
.build();
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user