π This README was written on May 15, 2025.
Helloπ This is team Ondaum. Ondaum is a pure Korean word, meaning 'a warm and genuine self'.
We want to help people around the world live healthier lives by being with Um, an AI professional psychological counseling companion, anytime and anywhere.
Let's start on https://ondaum.revimal.me/
- Architecture Pattern: Vertical Slice Architecture
- Design Methodology: Domain-Driven Design (DDD)
- Dependency Injection: Uber Fx - A dependency injection system for Go applications
- Language: Go
- Command Line: spf13/cobra - A Commander for modern Go CLI interactions
- Configuration: spf13/viper - Go configuration with fangs
- Testing: uber-go/gomock - A mocking framework for Go interfaces
- Main Database: MySQL
- ORM: Bun - A fast and simple ORM for Go
- Development DB: dolthub/go-mysql-server - In-memory MySQL server for development and testing
- HTTP Framework: gofiber/fiber - Express inspired web framework built on top of Fasthttp
- API Style: REST API
- API Documentation: swaggo/swag - Swagger documentation generator for Go
- Live API Documentation: Swagger UI
- Authentication:
- OAuth 2.0
- golang-jwt/jwt - Go implementation of JSON Web Tokens
- LLM: google.golang.org/genai - Official Go client library for Google's Generative AI API
- spf13/cobra - A Commander for modern Go CLI interactions
- spf13/viper - Go configuration with fangs
- dolthub/go-mysql-server - In-memory MySQL server for development and testing
.
βββ cmd/ # Application running commands
β
βββ config/ # Configuration files
β
βββ docs/ # Swagger documentations
β
βββ internal/ # Private application code
β βββ domain/ # Domain models and business logic
β β βββ chat/ # Chat domain models
β β βββ common/ # Common domain models
β β βββ diagnosis/ # Diagnosis domai
8000
n models
β β βββ user/ # User domain models
β β
β βββ handler/ # HTTP request handlers
β β βββ future/ # Future-Job handlers
β β βββ rest/ # REST-API handlers
β β βββ websocket/ # Websocket handlers
β β
β βββ dependency/ # Dependency injection
β β
β βββ entrypoint/ # Application entry points
β βββ http/ # HTTP server entrypoint
β
βββ migration/ # Database migration files
β βββ sql/ # Migration SQL scripts
β
βββ pkg/ # Public library code
β βββ database/ # Database utilities
β β βββ mysql/ # MySQL implementation
β β βββ memdb/ # In-memory database
β β
β βββ future/ # Future utilities
β β βββ database/ # Database-backed implementation
β β
β βββ http/ # HTTP utilities
β β
β βββ jwt/ # JWT authentication
β β
β βββ llm/ # LLM integration
β β βββ gemini/ # Google Gemini integration
β β
β βββ oauth/ # OAuth integration
β β βββ google/ # Google OAuth
β β
β βββ utils/ # Common utilities
β β
β βββ websocket/ # WebSocket utilities
β
βββ resource/ # Static resources
β βββ diagnosis/ # Diagnosis resources
β βββ llm/ # LLM resources
β βββ attachment/ # LLM attachments
β βββ prompt/ # LLM prompts
β
βββ test/ # Test files
β βββ mock/ # Test mocks
β
βββ .deploy/ # Deployment configurations
β
βββ .github/ # GitHub related files
β βββ workflows/ # GitHub Actions workflows
β
βββ main.go # Main application entry
βββ go.mod # Go module definition
# 1. Install dependencies
go mod download
# 2. Set up environment variables
vi .envrc
# 3. Apply environment variables
source .envrc
# 4. Start the server with local configurations
go run main.go http -n "local"
Benchmarked on a GKE Managed Pod (180 mCPU / 256 MiB)
- AI Counseling With Um
- Psychological Assessments
- International standard tests PHQ-9 / GAD-7 / PSS
- AI Analysis of Conversation Content
- Summary and organization of the conversation
- Sharing feedback and areas for improvement
- Available for consultation anytime, anywhere
- Personalized consultation possible
- Reduced barriers to seeking counseling
- Access to a pre-trained professional psychological counseling AI
This project was developed under a tight timeline to build a functional end-to-end service. As a result, some pragmatic architectural trade-offs were made, which are outlined below as part of a transparent technical roadmap.
- Issue: The current implementation of the chat list endpoint (
GET /chats
), specifically when using thematching_content
filter, performs its search logic in the application layer. - Impact: This pattern results in a classic N+1 query problem. It was a calculated risk to accelerate initial development for the current user base, but this approach will not scale efficiently and can lead to significant latency under heavy load.
- Path Forward: The filtering logic will be delegated to the database. The roadmap includes refactoring the query to use efficient
JOIN
s. For a definitive, long-term solution, implementing a Full-Text Search index is planned to handle large-scale text searches with minimal latency.
- Current Approach: To maintain a lean architecture and maximize development velocity, most features follow a simple two-layer vertical slice (
Handler
->Domain
). - Potential Challenge: For features with more complex business logic, such as the report generation in
GetChatReportHandler
, some orchestration logic currently resides within the handler, which could lead to overly complex handlers as the application grows. - Future Consideration: If a feature's complexity warrants it, a dedicated
usecase
layer can be introduced. This provides a clear and scalable pattern for managing increased complexity as it arises, without prematurely over-engineering simpler features.