docs: 프로젝트 스펙 문서 추가 #5
Conversation
|
claude local 파일은 업로드 안하는거죠? |
|
@Jaeho-Site |
| ## 4. styles 구성 | ||
|
|
||
| ``` | ||
| app/styles/ | ||
| ├── tokens.css # CSS variables (디자인 토큰) | ||
| ├── reset.css # CSS reset (modern-normalize 권장) | ||
| ├── global.css # 폰트, html/body 기본 | ||
| └── index.ts # import 진입점 | ||
| ``` | ||
|
|
||
| `main.tsx`에서 `import '@/app/styles'`로 일괄 로드. |
There was a problem hiding this comment.
야무지네요. tailwind v4방식으로 설계된것 같은데 좋습니다.
| domain/* → pages/*, app/* ✗ | ||
| ``` | ||
|
|
||
| 타입 자체는 다른 도메인을 참조 가능 (예: `Session`이 `User`를 알고 있음). |
There was a problem hiding this comment.
순환 참조는 금지한다는 내용이 있으면 좋을것 같네요.
| ## 10. 실시간 이벤트 | ||
|
|
||
| - SSE: `shared/hooks/useEventStream.ts` (자동 재연결 + 폴링 fallback) | ||
| - WebSocket: `features/interview/lib/socket/` (면접 세션 메시지 push) |
There was a problem hiding this comment.
스택업 프로젝트에서는 웹소켓 대신 SSE 방식을 사용합니다. 초기 프로젝트 스펙을 참고하느라 웹소켓이 포함됐네요.
지적 감사합니다. 수정하겠습니다.
| ## 9. 미디어 (음성/영상) | ||
|
|
||
| - 마이크: `navigator.mediaDevices.getUserMedia({ audio: true })` | ||
| - WebRTC: RealTime 서버와 SDP/ICE 교환 | ||
| - 코덱: 음성은 Opus, 영상은 VP9 | ||
| - 권한 거부 시 텍스트 입력 fallback (US-21 AC-05) | ||
| - 구현 위치: `features/interview/lib/media/` |
There was a problem hiding this comment.
[별개 의견] 흐름 좋습니다. 이걸 구현하는 도구로 브라우저 내장 speech api를 사용해보았는데 성능이 너무 안좋았습니다. 그래서 삼성중공업 측 선박에서 음성인식으로 무엇을쓰나 물어보았을때 openai의 whisper api를 사용한다고 하는군요. 근데 이게 무료가 아니라서 이야기해보면 좋을것 같습니다.
There was a problem hiding this comment.
우선 whisper는 무료가 아니긴 합니다. faster-whisper 를 사용하면 로컬 서버에서도 STT를 돌릴 수 있으니 추후 확인해보면 좋겠습니다.
| | 시점 | 모델 | 용도 | | ||
| |------|------|------| | ||
| | 세션 시작 | Pro (Gemini 1.5 Pro 기본) | 질문 풀 (품질) | | ||
| | 세션 중 | Flash (Gemini 1.5 Flash) | 꼬리질문 (저지연 < 3s) | |
There was a problem hiding this comment.
Gemini 1.5????
3.1 Pro, 3.1 Flash로 바꿉시다
There was a problem hiding this comment.
우선 비용을 최대한 줄이기 위해 1.5로 명시했습니다.
우선 3.1 모델을 사용해보고 비용 관련해서는 추후 얘기해봅시다.
| openai_api_key: str = "" | ||
| google_api_key: str = "" | ||
| llm_pro_model: str = "gemini-1.5-pro" | ||
| llm_flash_model: str = "gemini-1.5-flash" |
|
|
||
| ┌──────────────┐ | ||
| │ Redis │ ← 세션 ephemeral state | ||
| └──────────────┘ |
There was a problem hiding this comment.
Redis 쓰는거 맞나요? RabbitMQ만 쓴다고 알고있었어요
There was a problem hiding this comment.
초기 아키텍처에서는 Redis 사용이 명시되어있어서 저렇게 들어간듯합니다.
지적 감사합니다. 수정하겠습니다.
| OPENAI_API_KEY= | ||
| LLM_DEFAULT_PROVIDER=gemini # gemini | openai | ||
| LLM_PRO_MODEL=gemini-1.5-pro | ||
| LLM_FLASH_MODEL=gemini-1.5-flash |
| | DB | PostgreSQL + pgvector | | ||
| | Build | Gradle (Groovy DSL) | | ||
| | Test | JUnit 5 + Spring Boot Test | | ||
| | 추가 예정 | Spring Security, Spring AI, RabbitMQ starter, Redis, Flyway, springdoc-openapi | |
There was a problem hiding this comment.
Spring AI의 경우 AI서버가 따로 있고 Redis의 경우에는 사용하지 않는다고 알고 있어서 삭제하면 좋을거같아요
There was a problem hiding this comment.
초기 아키텍처에서는 Redis 사용이 명시되어있어서 저렇게 들어간듯합니다.
지적 감사합니다. 수정하겠습니다.
|
|
||
| --- | ||
|
|
||
| ## 8. 테스트 |
There was a problem hiding this comment.
ArchUnit이라는 도구가 테스트 코드를 통해 잘못된 참조나 레이어 침범 등을 빌드 단계에서 막을 수 있다고 알고 있는데 좀 더 알아보고 도입을 고려하면 좋을거 같습니다
There was a problem hiding this comment.
이 부분은 좀 더 살펴보겠습니다. 감사합니다.
변경 사항
하네스 엔지니어링을 목표로 합니다. 토큰 열심히 쓰고 개발자동화 해보죠
docs/ 하위에는 프로젝트 기본 구조 및 요구사항을 정리한 문서가 저장됩니다.
Claude Code가 작업 시 알아서 저 문서들을 찾아갑니다.
사용자가 명시적으로 @로 문서를 지정하는 것도 가능합니다.
각 레이어 및 프로젝트 루트에는 CLAUDE.md 가 저장됩니다.
해당 레이어에서 작업하는 순간 자동으로 로드됩니다.
루트에 위치한 문서는 항상 로드됩니다.
하네스 구성요소 : 컨텍스트 / 권한 / 명령 / 서브에이전트 / 훅 / 검증 / 메모리 중
컨텍스트를 정의합니다.
경험공유