# 패키지 구조도

## 전체 프로젝트 구조

```
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)
