작업 계획 문서 작성 시 별도 지시가 없으면 docs/ 디렉토리에 마크다운 파일로 작성.
모든 코드 작업은 이슈 생성 → 계획 → 실행 → 검증 순서로 진행합니다. 상세 규칙은 @docs/work-planning-rules.md 참고.
- 코드 작업 요청 시
gh issue create로 GitHub 이슈를 먼저 생성 (라벨: feature/bug/refactor/chore) - 이슈 번호(#N)를 계획 디렉토리(
docs/plan/#N-{작업명}/)와 브랜치(ticket/#N)에 활용 docs/plan/#N-{작업명}/에 plan.md, checklist.md 생성 (작업 맥락은 이슈 본문, 진행 중 변경사항은 이슈 댓글에 기록)- TaskCreate/TaskUpdate로 진행 상황 추적
- 매 단계 완료 시 plan.md 체크 표시 업데이트
- 완료 전 checklist.md 필수 항목 (아키텍처 준수, 테스트 통과) 확인
프로젝트 기획, PRD, 할일 등 비코드 문서는 구글 드라이브에서 관리합니다.
- 루트 폴더:
1WGdRszch7AuMrrnntwM-5kdv7Tjf7Z0Q - 기능 구현 시 PRD나 회의록을 참고해야 하면 구글 드라이브에서 먼저 조회
- 새 기획/PRD/할일 문서 작성이 필요하면 해당 폴더에 Google Docs로 생성
- 참고 문서:
회의록(ID:1gPNIO7JsdH1Iq8FFI_SAIm5SOWBJtLE2p8OzPSSkHfg) — 회의 내용 기록
다음 경로의 코드는 학습/참고용이므로 절대 수정하지 않습니다:
src/main/kotlin/kr/io/team/loop/learning/— DGS GraphQL 학습 예제 코드 (ComponentScan에서 제외되어 엔드포인트 비활성화)src/test/kotlin/kr/io/team/loop/learning/— DGS GraphQL 학습 테스트 코드src/test/resources/schema/learning.graphqls— 학습용 GraphQL 스키마 (테스트 전용 classpath, 프로덕션 미포함)docs/learning/— 학습 가이드 문서docs/dgs-graphql-execution.md— GraphQL 실행 파이프라인 문서
- 이슈 기반 작업은
ticket/#<이슈번호>형식으로 브랜치를 생성합니다. (예:ticket/#13)
DDD + Clean Architecture 기반. 상세 구조와 코드 패턴은 @docs/architecture.md 참고. Security 설정 코드 작성 전 @docs/spring-security-7.md 참고.
- Domain Layer는 외부 의존성 없이 순수 Kotlin 코드로 작성
- Presentation, Application, Infrastructure 모두 Domain에 직접 의존
- Presentation(DGS DataFetcher)은 Application(Service 호출)과 Domain(Command, Query, VO, Entity)에 의존
- Infrastructure는 Domain(Repository 인터페이스)에만 의존
- common을 제외한 다른 BC의 코드를 직접 참조하지 않음
- BC 간 공유 VO는
common/domain/에 위치 - Domain의 Command/Query가 DataFetcher 이후 모든 레이어의 공용 입력
- Service는 기본적으로 Entity를 직접 반환 (Application DTO는 필요시에만)
- Domain model/: 엔티티, VO(
@JvmInline value class), Command(sealed interface), Query data class(nullable 필드) - Domain repository/: Command/Query를 기본 입력으로 사용.
findById,existsBy,countBy등 의도형 단건 메서드도 허용 - Domain service/: 도메인 객체 여럿이 엮이고, 100줄 이상이고, 여러 repo 조합이 아닐 때만 도입
- Application service/: BC당 1개 Service 기본, 150줄 초과시 분리.
@Service+@Transactional. Entity 직접 반환이 기본 - Application dto/: 집계/보안 필드 제외 등 변환이 필요할 때만 생성. 기본은 Service가 Entity 직접 반환
- Infrastructure persistence/: Repository 구현체 + Exposed Table 정의. Table은 각 BC가 소유
- Infrastructure external/: OpenFeign 클라이언트 (필요시에만)
- Presentation datafetcher/:
@DgsComponent. Codegen 생성 타입으로 인자 수신→Command/Query 변환, Service 호출, Entity/DTO 반환 - Presentation dataloader/:
@DgsDataLoader. N+1 방지가 필요한 관계형 필드에서만 도입 - GraphQL 스키마:
src/main/resources/schema/{bc}.graphqls에 BC별 Query, Mutation, 타입, Input 정의 - DGS Codegen 필수: GraphQL 스키마의 Type, Input, Enum에 대응하는 Kotlin 클래스는 반드시 DGS Codegen이 자동 생성. 수동으로 만들지 않음
- Common: 공유 VO(
domain/), 공통 설정(config/). 필요한 것만 생성
Domain, Application 레이어 코드 작성 시 반드시 TDD 사이클을 따릅니다. 구현 코드를 테스트 없이 먼저 작성하지 않습니다.
- RED — 실패하는 테스트를 먼저 작성
- GREEN — 테스트를 통과시키는 최소한의 구현
- REFACTOR — 테스트 통과 상태를 유지하면서 정리
기능 구현 요청 시: 요구사항에서 동작 목록 도출 → 첫 동작의 테스트 작성·실패 확인 → 최소 구현 → 리팩토링 → 다음 동작 반복. Infrastructure/Presentation은 선택적, 설정·빌드·마이그레이션은 미적용.
예외: ArchitectureTest는 ArchUnit(@AnalyzeClasses + @ArchTest)을 사용하며, TDD 대상이 아닙니다.