hgzero/develop/dev/package-structure.md
2025-10-23 14:55:33 +09:00

14 KiB

패키지 구조도

전체 프로젝트 구조

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)