meeting, notification 실행환경 설정

This commit is contained in:
djeon 2025-10-23 23:53:28 +09:00
commit 0dc0e0cee6
42 changed files with 190 additions and 28 deletions

View File

@ -1,2 +1,2 @@
#Thu Oct 23 18:27:52 KST 2025 #Thu Oct 23 21:24:31 KST 2025
gradle.version=8.14 gradle.version=8.14

71
.serena/project.yml Normal file
View File

@ -0,0 +1,71 @@
# language of the project (csharp, python, rust, java, typescript, go, cpp, or ruby)
# * For C, use cpp
# * For JavaScript, use typescript
# Special requirements:
# * csharp: Requires the presence of a .sln file in the project folder.
language: java
# the encoding used by text files in the project
# For a list of possible encodings, see https://docs.python.org/3.11/library/codecs.html#standard-encodings
encoding: "utf-8"
# whether to use the project's gitignore file to ignore files
# Added on 2025-04-07
ignore_all_files_in_gitignore: true
# list of additional paths to ignore
# same syntax as gitignore, so you can use * and **
# Was previously called `ignored_dirs`, please update your config if you are using that.
# Added (renamed) on 2025-04-07
ignored_paths: []
# whether the project is in read-only mode
# If set to true, all editing tools will be disabled and attempts to use them will result in an error
# Added on 2025-04-18
read_only: false
# list of tool names to exclude. We recommend not excluding any tools, see the readme for more details.
# Below is the complete list of tools for convenience.
# To make sure you have the latest list of tools, and to view their descriptions,
# execute `uv run scripts/print_tool_overview.py`.
#
# * `activate_project`: Activates a project by name.
# * `check_onboarding_performed`: Checks whether project onboarding was already performed.
# * `create_text_file`: Creates/overwrites a file in the project directory.
# * `delete_lines`: Deletes a range of lines within a file.
# * `delete_memory`: Deletes a memory from Serena's project-specific memory store.
# * `execute_shell_command`: Executes a shell command.
# * `find_referencing_code_snippets`: Finds code snippets in which the symbol at the given location is referenced.
# * `find_referencing_symbols`: Finds symbols that reference the symbol at the given location (optionally filtered by type).
# * `find_symbol`: Performs a global (or local) search for symbols with/containing a given name/substring (optionally filtered by type).
# * `get_current_config`: Prints the current configuration of the agent, including the active and available projects, tools, contexts, and modes.
# * `get_symbols_overview`: Gets an overview of the top-level symbols defined in a given file.
# * `initial_instructions`: Gets the initial instructions for the current project.
# Should only be used in settings where the system prompt cannot be set,
# e.g. in clients you have no control over, like Claude Desktop.
# * `insert_after_symbol`: Inserts content after the end of the definition of a given symbol.
# * `insert_at_line`: Inserts content at a given line in a file.
# * `insert_before_symbol`: Inserts content before the beginning of the definition of a given symbol.
# * `list_dir`: Lists files and directories in the given directory (optionally with recursion).
# * `list_memories`: Lists memories in Serena's project-specific memory store.
# * `onboarding`: Performs onboarding (identifying the project structure and essential tasks, e.g. for testing or building).
# * `prepare_for_new_conversation`: Provides instructions for preparing for a new conversation (in order to continue with the necessary context).
# * `read_file`: Reads a file within the project directory.
# * `read_memory`: Reads the memory with the given name from Serena's project-specific memory store.
# * `remove_project`: Removes a project from the Serena configuration.
# * `replace_lines`: Replaces a range of lines within a file with new content.
# * `replace_symbol_body`: Replaces the full definition of a symbol.
# * `restart_language_server`: Restarts the language server, may be necessary when edits not through Serena happen.
# * `search_for_pattern`: Performs a search for a pattern in the project.
# * `summarize_changes`: Provides instructions for summarizing the changes made to the codebase.
# * `switch_modes`: Activates modes by providing a list of their names
# * `think_about_collected_information`: Thinking tool for pondering the completeness of collected information.
# * `think_about_task_adherence`: Thinking tool for determining whether the agent is still on track with the current task.
# * `think_about_whether_you_are_done`: Thinking tool for determining whether the task is truly completed.
# * `write_memory`: Writes a named memory (for future reference) to Serena's project-specific memory store.
excluded_tools: []
# initial prompt for the project. It will always be given to the LLM upon activating the project
# (contrary to the memories, which are loaded on demand).
initial_prompt: ""
project_name: "HGZero"

View File

@ -31,7 +31,7 @@ spring:
redis: redis:
host: ${REDIS_HOST:20.249.177.114} host: ${REDIS_HOST:20.249.177.114}
port: ${REDIS_PORT:6379} port: ${REDIS_PORT:6379}
password: ${REDIS_PASSWORD:} password: ${REDIS_PASSWORD:Hi5Jessica!}
timeout: 2000ms timeout: 2000ms
lettuce: lettuce:
pool: pool:
@ -43,13 +43,13 @@ spring:
# Server Configuration # Server Configuration
server: server:
port: ${SERVER_PORT:8084} port: ${SERVER_PORT:8083}
servlet: servlet:
context-path: ${CONTEXT_PATH:} context-path: ${CONTEXT_PATH:}
# JWT Configuration # JWT Configuration
jwt: jwt:
secret: ${JWT_SECRET:} secret: ${JWT_SECRET:dev-jwt-secret-key-for-development-only}
access-token-validity: ${JWT_ACCESS_TOKEN_VALIDITY:1800} access-token-validity: ${JWT_ACCESS_TOKEN_VALIDITY:1800}
refresh-token-validity: ${JWT_REFRESH_TOKEN_VALIDITY:86400} refresh-token-validity: ${JWT_REFRESH_TOKEN_VALIDITY:86400}
@ -67,6 +67,22 @@ azure:
max-tokens: ${AZURE_OPENAI_MAX_TOKENS:2000} max-tokens: ${AZURE_OPENAI_MAX_TOKENS:2000}
temperature: ${AZURE_OPENAI_TEMPERATURE:0.3} temperature: ${AZURE_OPENAI_TEMPERATURE:0.3}
# External AI API Configuration
external:
ai:
claude:
api-key: ${CLAUDE_API_KEY:}
base-url: ${CLAUDE_BASE_URL:https://api.anthropic.com}
openai:
api-key: ${OPENAI_API_KEY:}
base-url: ${OPENAI_BASE_URL:https://api.openai.com}
openweather:
api-key: ${OPENWEATHER_API_KEY:}
base-url: ${OPENWEATHER_BASE_URL:https://api.openweathermap.org}
kakao:
api-key: ${KAKAO_API_KEY:}
base-url: ${KAKAO_BASE_URL:https://dapi.kakao.com}
# Azure AI Search Configuration # Azure AI Search Configuration
ai-search: ai-search:
endpoint: ${AZURE_AI_SEARCH_ENDPOINT:} endpoint: ${AZURE_AI_SEARCH_ENDPOINT:}
@ -75,8 +91,9 @@ azure:
# Azure Event Hubs Configuration # Azure Event Hubs Configuration
eventhub: eventhub:
connection-string: ${AZURE_EVENTHUB_CONNECTION_STRING:} connection-string: ${AZURE_EVENTHUB_CONNECTION_STRING:Endpoint=sb://hgzero-eventhub-ns.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=VUqZ9vFgu35E3c6RiUzoOGVUP8IZpFvlV+AEhC6sUpo=}
namespace: ${AZURE_EVENTHUB_NAMESPACE:hgzero-eventhub-ns} namespace: ${AZURE_EVENTHUB_NAMESPACE:hgzero-eventhub-ns}
eventhub-name: ${AZURE_EVENTHUB_NAME:hgzero-eventhub-name}
checkpoint-storage-connection-string: ${AZURE_CHECKPOINT_STORAGE_CONNECTION_STRING:} checkpoint-storage-connection-string: ${AZURE_CHECKPOINT_STORAGE_CONNECTION_STRING:}
checkpoint-container: ${AZURE_CHECKPOINT_CONTAINER:hgzero-checkpoints} checkpoint-container: ${AZURE_CHECKPOINT_CONTAINER:hgzero-checkpoints}
consumer-group: consumer-group:
@ -113,6 +130,7 @@ springdoc:
# Logging Configuration # Logging Configuration
logging: logging:
level: level:
root: ${LOG_LEVEL_ROOT:INFO}
com.unicorn.hgzero.ai: ${LOG_LEVEL_APP:DEBUG} com.unicorn.hgzero.ai: ${LOG_LEVEL_APP:DEBUG}
org.springframework.web: ${LOG_LEVEL_WEB:INFO} org.springframework.web: ${LOG_LEVEL_WEB:INFO}
org.springframework.security: ${LOG_LEVEL_SECURITY:DEBUG} org.springframework.security: ${LOG_LEVEL_SECURITY:DEBUG}
@ -122,4 +140,9 @@ logging:
console: "%d{yyyy-MM-dd HH:mm:ss} - %msg%n" console: "%d{yyyy-MM-dd HH:mm:ss} - %msg%n"
file: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n" file: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"
file: file:
name: ${LOG_FILE_PATH:logs/ai.log} name: ${LOG_FILE:logs/ai-service.log}
logback:
rollingpolicy:
max-file-size: ${LOG_MAX_FILE_SIZE:10MB}
max-history: ${LOG_MAX_HISTORY:7}
total-size-cap: ${LOG_TOTAL_SIZE_CAP:100MB}

View File

@ -1,6 +1,8 @@
spring: spring:
application: application:
name: meeting name: meeting
profiles:
active: ${SPRING_PROFILES_ACTIVE:dev}
# Database Configuration # Database Configuration
datasource: datasource:
@ -43,7 +45,7 @@ spring:
# Server Configuration # Server Configuration
server: server:
port: ${SERVER_PORT:8081} port: ${SERVER_PORT:8082}
# JWT Configuration # JWT Configuration
jwt: jwt:
@ -85,6 +87,7 @@ springdoc:
# Logging Configuration # Logging Configuration
logging: logging:
level: level:
root: ${LOG_LEVEL_ROOT:INFO}
com.unicorn.hgzero.meeting: ${LOG_LEVEL_APP:DEBUG} com.unicorn.hgzero.meeting: ${LOG_LEVEL_APP:DEBUG}
org.springframework.web: ${LOG_LEVEL_WEB:INFO} org.springframework.web: ${LOG_LEVEL_WEB:INFO}
org.springframework.security: ${LOG_LEVEL_SECURITY:DEBUG} org.springframework.security: ${LOG_LEVEL_SECURITY:DEBUG}
@ -95,4 +98,30 @@ logging:
console: "%d{yyyy-MM-dd HH:mm:ss} - %msg%n" console: "%d{yyyy-MM-dd HH:mm:ss} - %msg%n"
file: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n" file: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"
file: file:
name: ${LOG_FILE_PATH:logs/meeting.log} name: ${LOG_FILE:logs/meeting-service.log}
logback:
rollingpolicy:
max-file-size: ${LOG_MAX_FILE_SIZE:10MB}
max-history: ${LOG_MAX_HISTORY:7}
total-size-cap: ${LOG_TOTAL_SIZE_CAP:100MB}
# External API Configuration
api:
claude:
key: ${CLAUDE_API_KEY:}
url: ${CLAUDE_API_URL:https://api.anthropic.com}
openai:
key: ${OPENAI_API_KEY:}
url: ${OPENAI_API_URL:https://api.openai.com}
openweather:
key: ${OPENWEATHER_API_KEY:}
url: ${OPENWEATHER_API_URL:https://api.openweathermap.org}
kakao:
key: ${KAKAO_API_KEY:}
url: ${KAKAO_API_URL:https://dapi.kakao.com}
# Azure EventHub Configuration
eventhub:
connection-string: ${EVENTHUB_CONNECTION_STRING:}
name: ${EVENTHUB_NAME:hgzero-eventhub-name}
consumer-group: ${EVENTHUB_CONSUMER_GROUP:$Default}

View File

@ -35,7 +35,6 @@ public class MinutesEntity extends BaseTimeEntity {
private String title; private String title;
@OneToMany(mappedBy = "minutes", cascade = CascadeType.ALL, orphanRemoval = true) @OneToMany(mappedBy = "minutes", cascade = CascadeType.ALL, orphanRemoval = true)
@OrderBy("order ASC")
@Builder.Default @Builder.Default
private List<MinutesSectionEntity> sections = new ArrayList<>(); private List<MinutesSectionEntity> sections = new ArrayList<>();

View File

@ -39,8 +39,9 @@ public class MinutesSectionEntity extends BaseTimeEntity {
@Column(name = "content", columnDefinition = "TEXT") @Column(name = "content", columnDefinition = "TEXT")
private String content; private String content;
@Column(name = "order", nullable = false) @Column(name = "\"order\"")
private Integer order; @Builder.Default
private Integer order = 0;
@Column(name = "verified", nullable = false) @Column(name = "verified", nullable = false)
@Builder.Default @Builder.Default

View File

@ -2,6 +2,8 @@ package com.unicorn.hgzero.meeting.infra.gateway.repository;
import com.unicorn.hgzero.meeting.infra.gateway.entity.MinutesSectionEntity; import com.unicorn.hgzero.meeting.infra.gateway.entity.MinutesSectionEntity;
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
import java.util.List; import java.util.List;
@ -15,7 +17,8 @@ public interface MinutesSectionJpaRepository extends JpaRepository<MinutesSectio
/** /**
* 회의록 ID로 섹션 목록 조회 (순서대로) * 회의록 ID로 섹션 목록 조회 (순서대로)
*/ */
List<MinutesSectionEntity> findByMinutesIdOrderByOrderAsc(String minutesId); @Query("SELECT m FROM MinutesSectionEntity m WHERE m.minutesId = :minutesId ORDER BY m.order ASC")
List<MinutesSectionEntity> findByMinutesIdOrderByOrderAsc(@Param("minutesId") String minutesId);
/** /**
* 회의록 ID와 타입으로 섹션 목록 조회 * 회의록 ID와 타입으로 섹션 목록 조회

View File

@ -21,6 +21,7 @@ spring:
# JPA Configuration # JPA Configuration
jpa: jpa:
show-sql: ${SHOW_SQL:true} show-sql: ${SHOW_SQL:true}
database-platform: org.hibernate.dialect.PostgreSQLDialect
properties: properties:
hibernate: hibernate:
format_sql: true format_sql: true

View File

@ -24,7 +24,7 @@ spring:
format_sql: true format_sql: true
use_sql_comments: true use_sql_comments: true
hibernate: hibernate:
ddl-auto: ${DDL_AUTO:update} ddl-auto: ${JPA_DDL_AUTO:update}
# Redis Configuration # Redis Configuration
data: data:
@ -68,7 +68,7 @@ spring:
# Server Configuration # Server Configuration
server: server:
port: ${SERVER_PORT:8084} port: ${SERVER_PORT:8085}
# JWT Configuration # JWT Configuration
jwt: jwt:
@ -83,8 +83,8 @@ cors:
# Azure Event Hubs Configuration # Azure Event Hubs Configuration
azure: azure:
eventhub: eventhub:
connection-string: ${AZURE_EVENTHUB_CONNECTION_STRING:} connection-string: ${EVENTHUB_CONNECTION_STRING:}
name: ${AZURE_EVENTHUB_NAME:notification-events} name: ${EVENTHUB_NAME:notification-events}
consumer-group: ${AZURE_EVENTHUB_CONSUMER_GROUP:$Default} consumer-group: ${AZURE_EVENTHUB_CONSUMER_GROUP:$Default}
# Azure Blob Storage Configuration (for Event Hub Checkpoint) # Azure Blob Storage Configuration (for Event Hub Checkpoint)
@ -131,6 +131,7 @@ springdoc:
# Logging Configuration # Logging Configuration
logging: logging:
level: level:
root: ${LOG_LEVEL_ROOT:INFO}
com.unicorn.hgzero.notification: ${LOG_LEVEL_APP:DEBUG} com.unicorn.hgzero.notification: ${LOG_LEVEL_APP:DEBUG}
org.springframework.web: ${LOG_LEVEL_WEB:INFO} org.springframework.web: ${LOG_LEVEL_WEB:INFO}
org.springframework.security: ${LOG_LEVEL_SECURITY:DEBUG} org.springframework.security: ${LOG_LEVEL_SECURITY:DEBUG}
@ -141,4 +142,9 @@ logging:
console: "%d{yyyy-MM-dd HH:mm:ss} - %msg%n" console: "%d{yyyy-MM-dd HH:mm:ss} - %msg%n"
file: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n" file: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"
file: file:
name: ${LOG_FILE_PATH:logs/notification.log} name: ${LOG_FILE:logs/notification-service.log}
logback:
rollingpolicy:
max-file-size: 10MB
max-history: 7
total-size-cap: 100MB

View File

@ -24,7 +24,7 @@ spring:
format_sql: true format_sql: true
use_sql_comments: true use_sql_comments: true
hibernate: hibernate:
ddl-auto: ${DDL_AUTO:update} ddl-auto: ${JPA_DDL_AUTO:update}
# Redis Configuration # Redis Configuration
data: data:
@ -43,7 +43,7 @@ spring:
# Server Configuration # Server Configuration
server: server:
port: ${SERVER_PORT:8082} port: ${SERVER_PORT:8084}
# JWT Configuration # JWT Configuration
jwt: jwt:
@ -65,8 +65,8 @@ azure:
connection-string: ${AZURE_BLOB_CONNECTION_STRING:} connection-string: ${AZURE_BLOB_CONNECTION_STRING:}
container-name: ${AZURE_BLOB_CONTAINER_NAME:recordings} container-name: ${AZURE_BLOB_CONTAINER_NAME:recordings}
eventhub: eventhub:
connection-string: ${AZURE_EVENTHUB_CONNECTION_STRING:} connection-string: ${EVENTHUB_CONNECTION_STRING:}
name: ${AZURE_EVENTHUB_NAME:transcription-events} name: ${EVENTHUB_NAME:transcription-events}
consumer-group: ${AZURE_EVENTHUB_CONSUMER_GROUP:$Default} consumer-group: ${AZURE_EVENTHUB_CONSUMER_GROUP:$Default}
# Actuator Configuration # Actuator Configuration
@ -99,6 +99,7 @@ springdoc:
# Logging Configuration # Logging Configuration
logging: logging:
level: level:
root: ${LOG_LEVEL_ROOT:INFO}
com.unicorn.hgzero.stt: ${LOG_LEVEL_APP:DEBUG} com.unicorn.hgzero.stt: ${LOG_LEVEL_APP:DEBUG}
org.springframework.web: ${LOG_LEVEL_WEB:INFO} org.springframework.web: ${LOG_LEVEL_WEB:INFO}
org.springframework.security: ${LOG_LEVEL_SECURITY:DEBUG} org.springframework.security: ${LOG_LEVEL_SECURITY:DEBUG}
@ -109,4 +110,9 @@ logging:
console: "%d{yyyy-MM-dd HH:mm:ss} - %msg%n" console: "%d{yyyy-MM-dd HH:mm:ss} - %msg%n"
file: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n" file: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"
file: file:
name: ${LOG_FILE_PATH:logs/stt.log} name: ${LOG_FILE:logs/stt-service.log}
logback:
rollingpolicy:
max-file-size: 10MB
max-history: 7
total-size-cap: 100MB

View File

@ -1,10 +1,12 @@
spring: spring:
application: application:
name: user name: user
profiles:
active: ${SPRING_PROFILES_ACTIVE:dev}
# Database Configuration # Database Configuration
datasource: datasource:
url: jdbc:${DB_KIND:postgresql}://${DB_HOST:20.214.121.121}:${DB_PORT:5432}/${DB_NAME:userdb} url: jdbc:${DB_KIND:postgresql}://${DB_HOST:localhost}:${DB_PORT:5432}/${DB_NAME:userdb}
username: ${DB_USERNAME:hgzerouser} username: ${DB_USERNAME:hgzerouser}
password: ${DB_PASSWORD:} password: ${DB_PASSWORD:}
driver-class-name: org.postgresql.Driver driver-class-name: org.postgresql.Driver
@ -24,12 +26,12 @@ spring:
format_sql: true format_sql: true
use_sql_comments: true use_sql_comments: true
hibernate: hibernate:
ddl-auto: ${DDL_AUTO:update} ddl-auto: ${JPA_DDL_AUTO:update}
# Redis Configuration # Redis Configuration
data: data:
redis: redis:
host: ${REDIS_HOST:20.249.177.114} host: ${REDIS_HOST:localhost}
port: ${REDIS_PORT:6379} port: ${REDIS_PORT:6379}
password: ${REDIS_PASSWORD:} password: ${REDIS_PASSWORD:}
timeout: 2000ms timeout: 2000ms
@ -49,16 +51,31 @@ spring:
password: ${LDAP_PASSWORD:} password: ${LDAP_PASSWORD:}
user-dn-pattern: ${LDAP_USER_DN_PATTERN:uid={0},ou=people} user-dn-pattern: ${LDAP_USER_DN_PATTERN:uid={0},ou=people}
# Event Configuration (Azure EventHub)
cloud:
azure:
eventhub:
connection-string: ${EVENTHUB_CONNECTION_STRING:}
name: ${EVENTHUB_NAME:hgzero-eventhub-name}
# Server Configuration # Server Configuration
server: server:
port: ${SERVER_PORT:8080} port: ${SERVER_PORT:8081}
# JWT Configuration # JWT Configuration
jwt: jwt:
secret: ${JWT_SECRET:} secret: ${JWT_SECRET:dev-jwt-secret-key-for-development-only}
access-token-validity: ${JWT_ACCESS_TOKEN_VALIDITY:3600} access-token-validity: ${JWT_ACCESS_TOKEN_VALIDITY:3600}
refresh-token-validity: ${JWT_REFRESH_TOKEN_VALIDITY:604800} refresh-token-validity: ${JWT_REFRESH_TOKEN_VALIDITY:604800}
# API Keys Configuration
api:
keys:
claude: ${CLAUDE_API_KEY:}
openai: ${OPENAI_API_KEY:}
openweather: ${OPENWEATHER_API_KEY:}
kakao: ${KAKAO_API_KEY:}
# CORS Configuration # CORS Configuration
cors: cors:
allowed-origins: ${CORS_ALLOWED_ORIGINS:http://localhost:*} allowed-origins: ${CORS_ALLOWED_ORIGINS:http://localhost:*}
@ -93,6 +110,7 @@ springdoc:
# Logging Configuration # Logging Configuration
logging: logging:
level: level:
root: ${LOG_LEVEL_ROOT:INFO}
com.unicorn.hgzero.user: ${LOG_LEVEL_APP:DEBUG} com.unicorn.hgzero.user: ${LOG_LEVEL_APP:DEBUG}
org.springframework.web: ${LOG_LEVEL_WEB:INFO} org.springframework.web: ${LOG_LEVEL_WEB:INFO}
org.springframework.security: ${LOG_LEVEL_SECURITY:DEBUG} org.springframework.security: ${LOG_LEVEL_SECURITY:DEBUG}
@ -102,4 +120,9 @@ logging:
console: "%d{yyyy-MM-dd HH:mm:ss} - %msg%n" console: "%d{yyyy-MM-dd HH:mm:ss} - %msg%n"
file: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n" file: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"
file: file:
name: ${LOG_FILE_PATH:logs/user.log} name: ${LOG_FILE:logs/user-service.log}
logback:
rollingpolicy:
max-file-size: 10MB
max-history: 7
total-size-cap: 100MB