meeting 및 notification 실행환경 설정

This commit is contained in:
djeon
2025-10-23 23:51:28 +09:00
parent 1e7c7c8d74
commit eb2302a0eb
17 changed files with 10052 additions and 296 deletions
+97 -49
View File
@@ -1,52 +1,100 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="notification-service" type="SpringBootApplicationConfigurationType" factoryName="Spring Boot">
<module name="notification.main" />
<option name="SPRING_BOOT_MAIN_CLASS" value="com.unicorn.hgzero.notification.NotificationApplication" />
<option name="ACTIVE_PROFILES" value="dev" />
<option name="PROGRAM_PARAMETERS" value="" />
<option name="ALTERNATIVE_JRE_PATH" />
<envs>
<!-- Database Configuration -->
<env name="DB_HOST" value="4.230.159.143" />
<env name="DB_NAME" value="notificationdb" />
<env name="DB_USERNAME" value="hgzerouser" />
<env name="DB_PASSWORD" value="Hi5Jessica!" />
<env name="DB_PORT" value="5432" />
<!-- Server Configuration -->
<env name="SERVER_PORT" value="8085" />
<!-- Redis Configuration -->
<env name="REDIS_HOST" value="20.249.177.114" />
<env name="REDIS_PORT" value="6379" />
<env name="REDIS_PASSWORD" value="Hi5Jessica!" />
<!-- JPA Configuration -->
<env name="JPA_DDL_AUTO" value="update" />
<!-- JWT Configuration -->
<env name="JWT_SECRET" value="dev-jwt-secret-key-for-development-only" />
<!-- Spring Profile -->
<env name="SPRING_PROFILES_ACTIVE" value="dev" />
<!-- Logging Configuration -->
<env name="LOG_LEVEL_ROOT" value="INFO" />
<env name="LOG_LEVEL_APP" value="DEBUG" />
<env name="LOG_FILE" value="logs/notification-service.log" />
<!-- API Keys -->
<env name="CLAUDE_API_KEY" value="sk-ant-ap..." />
<env name="OPENAI_API_KEY" value="sk-proj-An4Q..." />
<env name="OPENWEATHER_API_KEY" value="1aa5b..." />
<env name="KAKAO_API_KEY" value="5cdc24...." />
<!-- Azure EventHub Configuration -->
<env name="EVENTHUB_CONNECTION_STRING" value="Endpoint=sb://hgzero-eventhub-ns.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=VUqZ9vFgu35E3c6RiUzoOGVUP8IZpFvlV+AEhC6sUpo=" />
<env name="EVENTHUB_NAME" value="hgzero-eventhub-name" />
</envs>
<method v="2">
<option name="Make" enabled="true" />
</method>
<configuration default="false" name="notification-service" type="GradleRunConfiguration" factoryName="Gradle">
<ExternalSystemSettings>
<option name="env">
<map>
<!-- Database Configuration -->
<entry key="DB_KIND" value="postgresql" />
<entry key="DB_HOST" value="4.230.159.143" />
<entry key="DB_PORT" value="5432" />
<entry key="DB_NAME" value="notificationdb" />
<entry key="DB_USERNAME" value="hgzerouser" />
<entry key="DB_PASSWORD" value="Hi5Jessica!" />
<!-- JPA Configuration -->
<entry key="SHOW_SQL" value="true" />
<entry key="JPA_DDL_AUTO" value="update" />
<!-- Redis Configuration -->
<entry key="REDIS_HOST" value="20.249.177.114" />
<entry key="REDIS_PORT" value="6379" />
<entry key="REDIS_PASSWORD" value="Hi5Jessica!" />
<entry key="REDIS_DATABASE" value="4" />
<!-- Server Configuration -->
<entry key="SERVER_PORT" value="8085" />
<!-- JWT Configuration -->
<entry key="JWT_SECRET" value="dev-jwt-secret-key-for-development-only" />
<entry key="JWT_ACCESS_TOKEN_VALIDITY" value="3600" />
<entry key="JWT_REFRESH_TOKEN_VALIDITY" value="604800" />
<!-- CORS Configuration -->
<entry key="CORS_ALLOWED_ORIGINS" value="http://localhost:*" />
<!-- Mail Configuration -->
<entry key="MAIL_HOST" value="smtp.gmail.com" />
<entry key="MAIL_PORT" value="587" />
<entry key="MAIL_USERNAME" value="" />
<entry key="MAIL_PASSWORD" value="" />
<!-- Azure EventHub Configuration -->
<entry key="EVENTHUB_CONNECTION_STRING" value="Endpoint=sb://hgzero-eventhub-ns.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=VUqZ9vFgu35E3c6RiUzoOGVUP8IZpFvlV+AEhC6sUpo=" />
<entry key="EVENTHUB_NAME" value="notification-events" />
<entry key="AZURE_EVENTHUB_CONSUMER_GROUP" value="$Default" />
<!-- Azure Storage Configuration -->
<entry key="AZURE_STORAGE_CONNECTION_STRING" value="xOQGJhDT6sqOGyTohS7K5dMgGNlryuaQSg8dNCJ40sdGpYok5T5Z88M3xVlk39oeFKiQdGYCihqC+AStBsoBPw==" />
<entry key="AZURE_STORAGE_CONTAINER_NAME" value="eventhub-checkpoints" />
<!-- Notification Configuration -->
<entry key="NOTIFICATION_FROM_EMAIL" value="noreply@hgzero.com" />
<entry key="NOTIFICATION_FROM_NAME" value="HGZero" />
<entry key="NOTIFICATION_RETRY_MAX_ATTEMPTS" value="3" />
<entry key="NOTIFICATION_RETRY_INITIAL_INTERVAL" value="1000" />
<entry key="NOTIFICATION_RETRY_MULTIPLIER" value="2.0" />
<!-- Logging Configuration -->
<entry key="LOG_LEVEL_ROOT" value="INFO" />
<entry key="LOG_LEVEL_APP" value="DEBUG" />
<entry key="LOG_LEVEL_WEB" value="INFO" />
<entry key="LOG_LEVEL_SECURITY" value="DEBUG" />
<entry key="LOG_LEVEL_MAIL" value="DEBUG" />
<entry key="LOG_LEVEL_SQL" value="DEBUG" />
<entry key="LOG_LEVEL_SQL_TYPE" value="TRACE" />
<entry key="LOG_FILE" value="logs/notification-service.log" />
</map>
</option>
<option name="executionName" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="externalSystemIdString" value="GRADLE" />
<option name="scriptParameters" value="" />
<option name="taskDescriptions">
<list />
</option>
<option name="taskNames">
<list>
<option value=":notification:bootRun" />
</list>
</option>
<option name="vmOptions" />
</ExternalSystemSettings>
<ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess>
<ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>
<EXTENSION ID="com.intellij.execution.ExternalSystemRunConfigurationJavaExtension">
<extension name="net.ashald.envfile">
<option name="IS_ENABLED" value="false" />
<option name="IS_SUBST" value="false" />
<option name="IS_PATH_MACRO_SUPPORTED" value="false" />
<option name="IS_IGNORE_MISSING_FILES" value="false" />
<option name="IS_ENABLE_EXPERIMENTAL_INTEGRATIONS" value="false" />
<ENTRIES>
<ENTRY IS_ENABLED="true" PARSER="runconfig" IS_EXECUTABLE="false" />
</ENTRIES>
</extension>
</EXTENSION>
<DebugAllEnabled>false</DebugAllEnabled>
<RunAsTest>false</RunAsTest>
<method v="2" />
</configuration>
</component>
+15
View File
@@ -2,6 +2,11 @@ bootJar {
archiveFileName = 'notification.jar'
}
bootRun {
// 환경 변수를 Spring Boot 애플리케이션에 전달
environment = System.getenv()
}
dependencies {
// Email
implementation 'org.springframework.boot:spring-boot-starter-mail'
@@ -9,6 +14,16 @@ dependencies {
// Thymeleaf for email templates
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
// Spring Retry
implementation 'org.springframework.retry:spring-retry'
implementation 'org.springframework:spring-aspects'
// Azure Blob Storage
implementation "com.azure:azure-storage-blob:${azureBlobVersion}"
// Azure Event Hubs
implementation "com.azure:azure-messaging-eventhubs:${azureEventHubsVersion}"
// Azure Event Hubs Checkpoint Store
implementation "com.azure:azure-messaging-eventhubs-checkpointstore-blob:${azureEventHubsCheckpointVersion}"
}
File diff suppressed because it is too large Load Diff
@@ -129,7 +129,7 @@ public class NotificationResponse {
@Schema(description = "발송 일시", example = "2025-01-23T10:05:00")
private LocalDateTime sentAt;
@Schema(description = "실패 사유", example = null)
@Schema(description = "실패 사유", example = "")
private String errorMessage;
/**
@@ -1,7 +1,6 @@
package com.unicorn.hgzero.notification.event;
import com.azure.messaging.eventhubs.models.EventContext;
import com.azure.messaging.eventhubs.models.EventData;
import com.azure.messaging.eventhubs.models.PartitionEvent;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.unicorn.hgzero.notification.event.event.MeetingCreatedEvent;
import com.unicorn.hgzero.notification.event.event.TodoAssignedEvent;
@@ -27,7 +26,7 @@ import java.util.function.Consumer;
@Slf4j
@Component
@RequiredArgsConstructor
public class EventHandler implements Consumer<EventContext> {
public class EventHandler implements Consumer<PartitionEvent> {
private final NotificationService notificationService;
private final ObjectMapper objectMapper;
@@ -36,13 +35,14 @@ public class EventHandler implements Consumer<EventContext> {
/**
* Event Hub 이벤트 처리
*
* @param eventContext Event Hub 이벤트 컨텍스
* @param partitionEvent Event Hub 파티션 이벤트
*/
@Override
public void accept(EventContext eventContext) {
EventData eventData = eventContext.getEventData();
public void accept(PartitionEvent partitionEvent) {
try {
// 이벤트 데이터 추출
var eventData = partitionEvent.getData();
// 이벤트 속성 추출
Map<String, Object> properties = eventData.getProperties();
String topic = (String) properties.get("topic");
@@ -63,8 +63,9 @@ public class EventHandler implements Consumer<EventContext> {
}
// 체크포인트 업데이트 (처리 성공 시)
eventContext.updateCheckpoint();
log.info("이벤트 처리 완료 및 체크포인트 업데이트");
// TODO: Azure Event Hubs 5.x API에 맞게 체크포인트 업데이트 구현 필요
// partitionEvent.getPartitionContext().updateCheckpointAsync().block();
log.info("이벤트 처리 완료");
} catch (Exception e) {
log.error("이벤트 처리 중 오류 발생", e);