팀원들의 흩어진 의견을 AI가 정리하고 조율해 하나의 결과물로 완성하는 협업 워크스페이스
Wevo는 제안서와 발표 자료를 만드는 과정에서 팀원들의 의견을 실시간으로 수집하고, AI가 의견 사이의 충돌과 공백을 찾아 근거가 추적되는 초안을 생성하도록 돕습니다. 팀 검토와 확정 과정을 거쳐 최종 결과물까지 하나의 흐름으로 관리하는 것이 목표입니다.
프로젝트 생성 → 의견 수집 → AI 퍼실리테이션 → 검토·확정 → 결과물 출력
| 도메인 | 주요 역할 |
|---|---|
| 인증·팀·프로젝트 | Google·Kakao 로그인, 회원 및 팀 관리, 프로젝트와 섹션 생성 |
| 의견 수집·실시간 협업 | 의견 작성·제출, 수집 상태 관리, 상태 변화 실시간 공유 |
| AI 퍼실리테이터 | Provider 중립 AI gateway 기반 쟁점 감지, 의견 종합, 근거가 포함된 초안 생성 |
| 검토·확정·결과물 | 팀·외부 검토, 수정 요청, 섹션 확정, 결과물 내보내기 |
| 인프라·공통·DevOps | 공통 응답, 전역 예외 처리, API 문서, 로컬·배포 환경 관리 |
대표 기능과 API는 MVP 개발 과정에서 변경될 수 있습니다.
- Java 21
- Spring Boot, Spring Data JPA
- PostgreSQL 16, Redis 7
- Docker Compose
- Swagger / Springdoc OpenAPI
- Gradle, JUnit
구현 단계에서는 Spring Security·JWT·Google/Kakao OAuth, SSE 또는 WebSocket/STOMP와 서버 검증을 거치는 AI JSON 구조화 출력을 적용합니다.
현재 실행 가능한 AI Provider는 OpenAI 하나이며, 기본 모델은 gpt-5.6-luna, 기본
reasoning_effort는 medium이다. 기능 서비스는 Provider 중립 gateway 계약을 사용하고 구조화 출력은
Provider 응답 이후에도 서버의 JSON Schema·record·semantic validation을 통과해야 한다.
AI_PROVIDER=openai
OPENAI_API_KEY=
OPENAI_API_BASE_URL=https://api.openai.com
OPENAI_API_MODEL=gpt-5.6-luna
OPENAI_API_TIMEOUT=60s
OPENAI_API_MAX_TOKENS=4096
OPENAI_API_REASONING_EFFORT=medium운영 compose.prod.yml은 AI_PROVIDER, OPENAI_API_KEY, OPENAI_API_MODEL을 필수로 전달한다.
값이 누락되면 배포 설정 검증 또는
애플리케이션 기동이 실패하며, 의도적으로 AI_PROVIDER=none을 선택한 환경에서는 기존 AI 결과
조회와 비AI 기능만 유지하고 신규·재시도 AI 실행을 503 AI008로 거부한다.
로컬에서 외부 호출 없이 애플리케이션을 확인하려면 .env의 AI_PROVIDER=none을 사용한다. 기본 단위·
계약 테스트는 API key나 네트워크를 요구하지 않으며, 실제 OpenAI smoke는 key와 별도 opt-in을 모두
설정한 경우에만 실행된다.
OpenAI 연결과 opt-in synthetic smoke 절차는
docs/engineering/ai/openai-gpt-5-6-luna.md를 참고한다.
기능 단위의 도메인형 패키지 구조를 사용하며, 여러 도메인이 공유하는 코드는 global에서 관리합니다.
com.wevo.backend
├── global
│ ├── config
│ ├── security
│ ├── exception
│ └── response
├── auth
├── user
├── project
├── section
├── opinion
├── ai
├── review
└── export
로컬 데이터베이스 스키마는 Flyway가 생성하고 Hibernate는 엔티티 매핑 일치 여부만 검증합니다.
최초 실행은 .env.example을 .env로 복사해 값을 채운 뒤 진행합니다.
docker compose up -d
.\gradlew.bat bootRun --args='--spring.profiles.active=local'Flyway V1 도입 전에 ddl-auto=update로 만든 기존 로컬 DB가 있다면 필요한 데이터를 백업한 뒤
볼륨을 한 번 재생성해야 합니다. 자세한 절차와 이유는
src/main/resources/db/migration/README.md를 참고합니다.
- Base URL:
/api - 인증 방식:
Bearer JWT - Content-Type:
application/json - 모든 응답은
ApiResponse<T>형식으로 통일 - 테이블과 컬럼은
snake_case, Enum은 문자열로 저장
| 담당자 | 담당 도메인 |
|---|---|
| 한호석 | 인증·팀·프로젝트 기반 |
| 이윤호 | 의견 수집·실시간 협업 |
| 이종원 | AI 퍼실리테이터 |
| 조은솔 | 검토·확정·결과물 |
| 신진용 | 인프라·공통·DevOps |
dev브랜치에서 작업 브랜치를 생성하고 Pull Request로 병합합니다.- 브랜치명은
타입/이슈번호-기능명형식을 사용합니다. - 커밋 메시지는
타입: 설명 (#이슈번호)형식을 사용합니다. - Pull Request는 두 명 이상의 승인을 받은 뒤 Merge commit 방식으로 병합합니다.
AWS 운영 환경의 수동 배포, 상태 확인, 복구 및 롤백 절차는
DEPLOYMENT.md를 참고합니다.