# 패키지 구조도 ## 전체 프로젝트 구조 ``` HGZero/ ├── common/ # 공통 모듈 ├── user/ # User Service (Layered) ├── meeting/ # Meeting Service (Clean) ├── stt/ # STT Service (Layered) ├── ai/ # AI Service (Clean) ├── notification/ # Notification Service (Layered) ├── settings.gradle # Gradle 설정 └── build.gradle # 루트 build.gradle ``` ## 1. Common 모듈 ``` common/ └── src/main/java/com/unicorn/hgzero/common/ ├── dto/ │ ├── ApiResponse.java │ ├── JwtTokenDTO.java │ ├── JwtTokenRefreshDTO.java │ └── JwtTokenVerifyDTO.java ├── entity/ │ └── BaseTimeEntity.java ├── config/ │ └── JpaConfig.java ├── util/ │ ├── DateUtil.java │ └── StringUtil.java ├── aop/ │ └── LoggingAspect.java └── exception/ ├── ErrorCode.java ├── BusinessException.java └── InfraException.java ``` ## 2. User Service (Layered Architecture) ``` user/ └── src/main/java/com/unicorn/hgzero/user/ ├── UserApplication.java ├── controller/ │ └── UserController.java ├── dto/ │ ├── LoginRequest.java │ ├── LoginResponse.java │ ├── RefreshTokenRequest.java │ ├── RefreshTokenResponse.java │ ├── LogoutRequest.java │ └── TokenValidateResponse.java ├── service/ │ ├── UserService.java │ └── UserServiceImpl.java ├── domain/ │ └── User.java ├── repository/ │ ├── entity/ │ │ └── UserEntity.java │ └── jpa/ │ └── UserRepository.java └── config/ ├── SecurityConfig.java ├── SwaggerConfig.java ├── LdapConfig.java └── jwt/ ├── JwtAuthenticationFilter.java ├── JwtTokenProvider.java └── UserPrincipal.java ``` ## 3. Meeting Service (Clean Architecture) ``` meeting/ └── src/main/java/com/unicorn/hgzero/meeting/ ├── biz/ │ ├── domain/ │ │ ├── Meeting.java │ │ ├── Minutes.java │ │ ├── MinutesSection.java │ │ ├── Todo.java │ │ ├── Template.java │ │ └── Dashboard.java │ ├── dto/ │ │ ├── MeetingDto.java │ │ ├── MinutesDto.java │ │ ├── TodoDto.java │ │ ├── TemplateDto.java │ │ ├── DashboardDto.java │ │ └── WebSocketMessageDto.java │ ├── usecase/ │ │ ├── in/ │ │ │ ├── CreateMeetingUseCase.java │ │ │ ├── SelectTemplateUseCase.java │ │ │ ├── StartMeetingUseCase.java │ │ │ ├── EndMeetingUseCase.java │ │ │ ├── GetMinutesListUseCase.java │ │ │ ├── GetMinutesDetailUseCase.java │ │ │ ├── UpdateMinutesUseCase.java │ │ │ ├── FinalizeMinutesUseCase.java │ │ │ ├── VerifySectionUseCase.java │ │ │ ├── LockSectionUseCase.java │ │ │ ├── UnlockSectionUseCase.java │ │ │ ├── CreateTodoUseCase.java │ │ │ ├── CompleteTodoUseCase.java │ │ │ ├── GetTemplateListUseCase.java │ │ │ ├── GetTemplateDetailUseCase.java │ │ │ └── GetDashboardUseCase.java │ │ └── out/ │ │ ├── MeetingReader.java │ │ ├── MeetingWriter.java │ │ ├── MinutesReader.java │ │ ├── MinutesWriter.java │ │ ├── TodoReader.java │ │ ├── TodoWriter.java │ │ ├── TemplateReader.java │ │ ├── CacheManager.java │ │ └── EventPublisher.java │ └── service/ │ ├── MeetingService.java │ ├── MinutesService.java │ ├── TodoService.java │ ├── TemplateService.java │ ├── DashboardService.java │ └── WebSocketService.java └── infra/ ├── MeetingApplication.java ├── controller/ │ ├── MeetingController.java │ ├── MinutesController.java │ ├── TodoController.java │ ├── TemplateController.java │ ├── DashboardController.java │ └── WebSocketController.java ├── gateway/ │ ├── entity/ │ │ ├── MeetingEntity.java │ │ ├── MinutesEntity.java │ │ ├── MinutesSectionEntity.java │ │ ├── TodoEntity.java │ │ └── TemplateEntity.java │ ├── repository/ │ │ ├── MeetingJpaRepository.java │ │ ├── MinutesJpaRepository.java │ │ ├── TodoJpaRepository.java │ │ └── TemplateJpaRepository.java │ ├── MeetingGateway.java │ ├── MinutesGateway.java │ ├── TodoGateway.java │ ├── TemplateGateway.java │ ├── CacheGateway.java │ └── EventPublisherGateway.java └── config/ ├── SecurityConfig.java ├── SwaggerConfig.java ├── WebSocketConfig.java ├── RedisConfig.java └── jwt/ ├── JwtAuthenticationFilter.java ├── JwtTokenProvider.java └── UserPrincipal.java ``` ## 4. STT Service (Layered Architecture) ``` stt/ └── src/main/java/com/unicorn/hgzero/stt/ ├── SttApplication.java ├── controller/ │ ├── RecordingController.java │ ├── TranscriptionController.java │ └── SpeakerController.java ├── dto/ │ ├── RecordingDto.java │ ├── TranscriptionDto.java │ ├── SpeakerDto.java │ └── TranscriptSegmentDto.java ├── service/ │ ├── RecordingService.java │ ├── RecordingServiceImpl.java │ ├── TranscriptionService.java │ ├── TranscriptionServiceImpl.java │ ├── SpeakerService.java │ └── SpeakerServiceImpl.java ├── domain/ │ ├── Recording.java │ ├── Transcription.java │ ├── TranscriptSegment.java │ └── Speaker.java ├── repository/ │ ├── entity/ │ │ ├── RecordingEntity.java │ │ ├── TranscriptionEntity.java │ │ └── SpeakerEntity.java │ └── jpa/ │ ├── RecordingRepository.java │ ├── TranscriptionRepository.java │ └── SpeakerRepository.java └── config/ ├── SecurityConfig.java ├── SwaggerConfig.java ├── AzureSpeechConfig.java ├── AzureBlobConfig.java ├── WebSocketConfig.java └── jwt/ ├── JwtAuthenticationFilter.java ├── JwtTokenProvider.java └── UserPrincipal.java ``` ## 5. AI Service (Clean Architecture) ``` ai/ └── src/main/java/com/unicorn/hgzero/ai/ ├── biz/ │ ├── domain/ │ │ ├── ProcessedTranscript.java │ │ ├── ExtractedTodo.java │ │ ├── RelatedMinutes.java │ │ ├── Term.java │ │ └── Suggestion.java │ ├── dto/ │ │ ├── TranscriptDto.java │ │ ├── TodoDto.java │ │ ├── RelatedMinutesDto.java │ │ ├── TermDto.java │ │ └── SuggestionDto.java │ ├── usecase/ │ │ ├── in/ │ │ │ ├── ProcessTranscriptUseCase.java │ │ │ ├── ImproveTranscriptUseCase.java │ │ │ ├── ExtractTodoUseCase.java │ │ │ ├── GetRelatedMinutesUseCase.java │ │ │ ├── DetectTermsUseCase.java │ │ │ ├── ExplainTermUseCase.java │ │ │ ├── SuggestDiscussionUseCase.java │ │ │ └── SuggestDecisionUseCase.java │ │ └── out/ │ │ ├── TranscriptReader.java │ │ ├── TranscriptWriter.java │ │ ├── TodoWriter.java │ │ ├── RelatedMinutesReader.java │ │ ├── TermReader.java │ │ ├── LlmClient.java │ │ ├── VectorSearchClient.java │ │ └── CacheManager.java │ └── service/ │ ├── TranscriptService.java │ ├── TodoService.java │ ├── RelatedMinutesService.java │ ├── TermService.java │ └── SuggestionService.java └── infra/ ├── AiApplication.java ├── controller/ │ ├── TranscriptController.java │ ├── TodoController.java │ ├── TermController.java │ └── SuggestionController.java ├── gateway/ │ ├── entity/ │ │ ├── TranscriptEntity.java │ │ └── TermEntity.java │ ├── repository/ │ │ ├── TranscriptJpaRepository.java │ │ └── TermJpaRepository.java │ ├── TranscriptGateway.java │ ├── TodoGateway.java │ ├── RelatedMinutesGateway.java │ ├── TermGateway.java │ ├── LlmGateway.java │ ├── VectorSearchGateway.java │ └── CacheGateway.java └── config/ ├── SecurityConfig.java ├── SwaggerConfig.java ├── OpenAiConfig.java ├── AzureAiSearchConfig.java ├── RedisConfig.java └── jwt/ ├── JwtAuthenticationFilter.java ├── JwtTokenProvider.java └── UserPrincipal.java ``` ## 6. Notification Service (Layered Architecture) ``` notification/ └── src/main/java/com/unicorn/hgzero/notification/ ├── NotificationApplication.java ├── controller/ │ ├── NotificationController.java │ └── NotificationSettingsController.java ├── dto/ │ ├── NotificationDto.java │ ├── NotificationSettingsDto.java │ ├── EmailTemplateDto.java │ └── InvitationNotificationDto.java ├── service/ │ ├── NotificationService.java │ ├── NotificationServiceImpl.java │ ├── NotificationSettingsService.java │ ├── NotificationSettingsServiceImpl.java │ ├── EmailService.java │ └── EmailServiceImpl.java ├── domain/ │ ├── Notification.java │ ├── NotificationSettings.java │ └── EmailTemplate.java ├── repository/ │ ├── entity/ │ │ ├── NotificationEntity.java │ │ └── NotificationSettingsEntity.java │ └── jpa/ │ ├── NotificationRepository.java │ └── NotificationSettingsRepository.java └── config/ ├── SecurityConfig.java ├── SwaggerConfig.java ├── EmailConfig.java ├── EventHubConfig.java └── jwt/ ├── JwtAuthenticationFilter.java ├── JwtTokenProvider.java └── UserPrincipal.java ``` ## 패키지 네이밍 규칙 ### 공통 - **Base Package**: `com.unicorn.hgzero` ### Layered Architecture (User, STT, Notification) - **Package**: `com.unicorn.hgzero.{service-name}` - **구조**: - controller: REST API 컨트롤러 - service: 비즈니스 로직 - domain: 도메인 모델 - dto: 데이터 전송 객체 - repository: 데이터 액세스 - entity: JPA 엔티티 - jpa: JPA Repository - config: 설정 클래스 ### Clean Architecture (Meeting, AI) - **Base Package**: `com.unicorn.hgzero.{service-name}` - **구조**: - biz: 비즈니스 레이어 - domain: 도메인 모델 - dto: 비즈니스 DTO - usecase: 유스케이스 - in: 입력 포트 (인터페이스) - out: 출력 포트 (인터페이스) - service: 유스케이스 구현체 - infra: 인프라스트럭처 레이어 - controller: REST API 컨트롤러 - gateway: 출력 포트 구현체 - entity: JPA 엔티티 - repository: JPA Repository - config: 설정 클래스 ## 설정 파일 구조 ``` 각 서비스/ ├── src/main/resources/ │ ├── application.yml # 메인 설정 │ └── application-dev.yml # 개발 환경 설정 └── build.gradle # Gradle 빌드 설정 ``` ## 공통 라이브러리 의존성 (루트 build.gradle에 정의) - Spring Boot Starter Web - Spring Boot Starter Data JPA - Spring Boot Starter Security - Spring Boot Starter Actuator - Spring Boot Configuration Processor - Lombok - MapStruct - Springdoc OpenAPI (Swagger) - JWT (jjwt-api, jjwt-impl, jjwt-jackson) - PostgreSQL Driver - Redis (Lettuce) - Apache Commons Lang3 - Apache Commons IO ## 서비스별 추가 의존성 ### User Service - Spring LDAP ### Meeting Service - Spring WebSocket - Spring Messaging ### STT Service - Azure Speech SDK - Azure Blob Storage SDK - Spring WebSocket ### AI Service - OpenAI Java Client - Azure AI Search SDK - Spring AI ### Notification Service - Spring Mail - Azure Event Hubs SDK - Thymeleaf (Email Template)