Skip to main content

개발 원칙

이 문서는 vivid-ai 프로젝트의 모든 개발 과정에서 일관되게 적용되는 핵심 원칙과 협업 방식을 정의합니다.


1. 기술적 원칙 (Technical Principles)

우리의 코드는 다음 원칙들을 기반으로 작성되어야 하며, 이는 장기적인 유지보수성과 확장성을 보장하기 위함입니다.

가. SOLID 원칙

  • 단일 책임 원칙 (SRP): 모든 클래스, 모듈, 컴포넌트는 단 하나의 책임만 가져야 합니다.
    • 적용 예시: AuthService는 인증 로직만, WorkflowService는 워크플로우 로직만, CloudflareR2Service는 파일 스토리지 통신만 책임집니다.
  • 개방-폐쇄 원칙 (OCP): 기존 코드의 수정에는 닫혀 있고, 기능의 확장에는 열려 있어야 합니다.
    • 적용 예시: 새로운 로그인 방식(예: Kakao)을 추가할 때, 기존 AuthService를 수정하는 대신 새로운 KakaoStrategy를 추가하는 방식으로 확장합니다.
  • 리스코프 치환 원칙 (LSP): 자식 클래스는 부모 클래스의 역할을 완벽하게 대체할 수 있어야 합니다.
  • 인터페이스 분리 원칙 (ISP): 클라이언트는 자신이 사용하지 않는 메소드에 의존해서는 안 됩니다.
    • 적용 예시: IStorageService와 같이 인터페이스를 사용하여, UIService는 스토리지의 구체적인 구현을 몰라도 되도록 설계합니다.
  • 의존관계 역전 원칙 (DIP): 상위 모듈은 하위 모듈에 의존해서는 안 되며, 둘 모두 추상화(인터페이스)에 의존해야 합니다.
    • 적용 예시: NestJS의 의존성 주입(DI) 시스템을 적극 활용하여, 모듈 간의 결합도를 낮춥니다.

나. 클린 아키텍처 (Clean Architecture)

  • 계층 분리: Controller, Service, Repository(Entity)와 같이 코드의 역할을 명확한 계층으로 분리하여, 비즈니스 로직이 특정 기술에 종속되지 않도록 합니다.
  • 의존성 규칙: 모든 의존성은 항상 바깥쪽에서 안쪽으로 향합니다. 즉, UI나 데이터베이스와 같은 외부 요소의 변경이 핵심 비즈니스 로직에 영향을 주어서는 안 됩니다.

다. 단순성 우선 (Simplicity First / KISS Principle)

  • 가장 간단하고, 명확하며, 직관적인 해결책을 항상 최우선으로 고려합니다.
  • 과도한 엔지니어링(Over-engineering)이나 불필요한 복잡성은 피합니다.

라. 중복 제거 (Don't Repeat Yourself, DRY)

  • 동일한 로직이나 코드가 여러 곳에 반복해서 나타나지 않도록 합니다.
  • 중복되는 코드는 헬퍼 함수, 공통 서비스, 재사용 가능한 컴포넌트 등으로 만들어 한 곳에서 관리합니다.

마. 기술 문서 자동화 및 관리 (Automated Documentation & Management)

  • Gemini CLI 기반 자동화: Gemini CLI를 활용하여 코드 변경 사항(새로운 모듈 추가, 기존 모듈 수정 등)이 main 브랜치에 merge될 때, 관련 기술 문서를 docs에 자동으로 반영합니다.
  • Mermaid를 활용한 다이어그램 자동 생성: 소프트웨어 아키텍처, 기술 스택, 데이터베이스 스키마 등 복잡한 내용을 설명하는 다이어그램은 Mermaid 텍스트를 기반으로 자동 생성됩니다. Gemini CLI는 필요한 Mermaid 텍스트를 생성하여 문서에 포함시킵니다.
  • 컨텍스트 파일 활용: GEMINI.md 또는 PRINCIPLES.md와 같은 컨텍스트 파일을 작성하여 Gemini CLI가 문서 생성 및 편집 작업 시 일관된 기준을 따르도록 합니다.

2. 협업 원칙 (Collaboration Principles)

우리의 협업은 다음과 같은 방식을 따릅니다.

  • 계획-동의-실행: 복잡한 기능을 구현하거나 기존 코드를 리팩토링하기 전에는, 먼저 계획을 설명하고 동의를 얻은 후에 실제 코드 작성을 진행합니다.
  • 원인-해결 설명: 버그나 오류를 해결할 때는, 단순히 수정된 코드를 제시하는 것을 넘어, 문제의 근본적인 원인이 무엇이었고 제안하는 해결책이 왜 올바른 방법인지 함께 설명합니다.
  • 살아있는 문서 (Living Documentation):
    • 이 저장소의 모든 문서는 프로젝트의 발전에 따라 지속적으로 변경되는 **"살아있는 유기체"**로 간주합니다.
    • Docusaurus를 사용하여 모든 문서를 코드와 함께 Git으로 관리하고, CI/CD 파이프라인을 통해 자동으로 웹사이트에 배포합니다. 이를 통해 모든 구성원은 항상 최신 버전의 문서에 브라우저만으로 접근할 수 있습니다.
    • 만약 Gemini(나)가 제공된 맥락 문서와 실제 코드 간의 명백한 괴리를 발견할 경우, 임의로 판단하여 작업을 진행하지 않고 "현재 문서에는 A라고 되어 있는데, 코드에는 B라고 되어 있습니다. 어떤 것을 기준으로 진행할까요?" 와 같이 사용자에게 질문하여 맥락을 명확히 한 후 다음 단계를 진행합니다.

3. 서비스 철학 (Service Concept)

vivid-ai는 창의성과 소장 가치가 공존하는 플랫폼을 지향하며, 다음의 서비스 원칙을 고수합니다.

가. 독립적 스냅샷 모델 (Independent Snapshot Model)

  • 공유된 가치의 존중: 사용자가 창작물을 커뮤니티에 게시(Post)하거나 타인이 보관함에 담는(Pin) 순간, 해당 데이터는 원본의 생명주기와 분리된 독립적인 자산으로서의 가치를 가집니다.
  • 영속성 보장: 원본 소유자가 자신의 작업물을 삭제하더라도, 이미 다른 유저와 공유된 지점(Post, Collection)에서는 데이터가 파괴되지 않고 유지됩니다. 이는 "한 번 공개된 영감은 타인에게도 소중한 자산"이라는 철학을 반영합니다.
  • 데이터 정합성: 물리적 데이터(S3)는 시스템 내의 모든 참조가 사라진 시점에만 삭제됩니다.

나. 멱등성 기반의 견고한 상호작용 (Idempotent Interaction)

  • 불확실성 제거: 모든 유저 인터렉션(좋아요, 담기 등)은 단순 토글(Toggle)이 아닌, 명확한 행위(Pin/Unpin, Like/Unlike) 기반의 API로 설계합니다.
  • 안정성: 동일한 요청이 중복되어 발생하더라도 서버의 상태는 항상 예측 가능한 최종 상태를 유지해야 하며, 이는 네트워크 지연 상황에서도 유저에게 신뢰할 수 있는 경험을 제공합니다.

4. 문서 관리 정책 (Documentation Policy)

  • ✨ 문서의 가독성, 구조화 및 무결성:
    • docs 저장소의 모든 .md 문서를 작성할 때는, 사람과 AI 모두가 내용을 쉽고 명확하게 이해할 수 있도록 구조화된 형식을 사용합니다.
    • 제목(#, ##), 목록(-, 1.), 강조(**), 코드 블록(```) 등 마크다운(Markdown) 문법을 적극적으로 활용하여 정보의 계층과 중요도를 명확히 구분합니다.
    • 문서에 와 같이 깨진 글자가 포함되지 않도록 항상 확인하고, 발견 시 즉시 올바른 내용으로 수정하여 내용의 무결성을 유지합니다.