MQ 설정 변경 (kafka -> EventHub)

This commit is contained in:
djeon 2025-10-24 10:35:59 +09:00
parent b790d1b31a
commit d9261bad2c
7 changed files with 419 additions and 179 deletions

File diff suppressed because one or more lines are too long

View File

@ -22,6 +22,14 @@ dependencies {
implementation 'org.springframework.boot:spring-boot-starter-websocket'
implementation 'org.springframework.boot:spring-boot-starter-reactor-netty'
// Kafka
implementation 'org.springframework.kafka:spring-kafka'
// Azure EventHub
implementation 'com.azure:azure-messaging-eventhubs:5.15.0'
implementation 'com.azure:azure-messaging-eventhubs-checkpointstore-blob:1.16.1'
implementation 'com.azure:azure-identity:1.9.0'
// Jackson for JSON processing
implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310'
// Retry support
implementation 'org.springframework.retry:spring-retry'
}

View File

@ -781,3 +781,258 @@ This generated password is for development use only. Your security configuration
2025-10-24 10:00:22 [SpringApplicationShutdownHook] DEBUG o.h.type.spi.TypeConfiguration$Scope - Un-scoping TypeConfiguration [org.hibernate.type.spi.TypeConfiguration$Scope@6d1e60ad] from SessionFactory [org.hibernate.internal.SessionFactoryImpl@5444c63f]
2025-10-24 10:00:22 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown initiated...
2025-10-24 10:00:22 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown completed.
2025-10-24 10:34:45 [main] INFO c.u.h.meeting.MeetingApplication - Starting MeetingApplication using Java 21.0.8 with PID 96972 (/Users/daewoong/home/workspace/HGZero/meeting/build/classes/java/main started by daewoong in /Users/daewoong/home/workspace/HGZero/meeting)
2025-10-24 10:34:45 [main] DEBUG c.u.h.meeting.MeetingApplication - Running with Spring Boot v3.3.5, Spring v6.1.14
2025-10-24 10:34:45 [main] INFO c.u.h.meeting.MeetingApplication - The following 1 profile is active: "dev"
2025-10-24 10:34:46 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Multiple Spring Data modules found, entering strict repository configuration mode
2025-10-24 10:34:46 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Bootstrapping Spring Data JPA repositories in DEFAULT mode.
2025-10-24 10:34:46 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 57 ms. Found 5 JPA repository interfaces.
2025-10-24 10:34:46 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Multiple Spring Data modules found, entering strict repository configuration mode
2025-10-24 10:34:46 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Bootstrapping Spring Data Redis repositories in DEFAULT mode.
2025-10-24 10:34:46 [main] INFO o.s.d.r.c.RepositoryConfigurationExtensionSupport - Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.unicorn.hgzero.meeting.infra.gateway.repository.MeetingJpaRepository; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository
2025-10-24 10:34:46 [main] INFO o.s.d.r.c.RepositoryConfigurationExtensionSupport - Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.unicorn.hgzero.meeting.infra.gateway.repository.MinutesJpaRepository; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository
2025-10-24 10:34:46 [main] INFO o.s.d.r.c.RepositoryConfigurationExtensionSupport - Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.unicorn.hgzero.meeting.infra.gateway.repository.MinutesSectionJpaRepository; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository
2025-10-24 10:34:46 [main] INFO o.s.d.r.c.RepositoryConfigurationExtensionSupport - Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.unicorn.hgzero.meeting.infra.gateway.repository.TemplateJpaRepository; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository
2025-10-24 10:34:46 [main] INFO o.s.d.r.c.RepositoryConfigurationExtensionSupport - Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.unicorn.hgzero.meeting.infra.gateway.repository.TodoJpaRepository; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository
2025-10-24 10:34:46 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 11 ms. Found 0 Redis repository interfaces.
2025-10-24 10:34:46 [main] INFO o.s.b.w.e.tomcat.TomcatWebServer - Tomcat initialized with port 8082 (http)
2025-10-24 10:34:46 [main] INFO o.a.catalina.core.StandardService - Starting service [Tomcat]
2025-10-24 10:34:46 [main] INFO o.a.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/10.1.31]
2025-10-24 10:34:46 [main] INFO o.a.c.c.C.[Tomcat].[localhost].[/] - Initializing Spring embedded WebApplicationContext
2025-10-24 10:34:46 [main] INFO o.s.b.w.s.c.ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 962 ms
2025-10-24 10:34:46 [main] INFO o.h.jpa.internal.util.LogHelper - HHH000204: Processing PersistenceUnitInfo [name: default]
2025-10-24 10:34:46 [main] INFO org.hibernate.Version - HHH000412: Hibernate ORM core version 6.5.3.Final
2025-10-24 10:34:46 [main] INFO o.h.c.i.RegionFactoryInitiator - HHH000026: Second-level cache disabled
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration boolean -> org.hibernate.type.BasicTypeReference@1a8b22b5
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration boolean -> org.hibernate.type.BasicTypeReference@1a8b22b5
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Boolean -> org.hibernate.type.BasicTypeReference@1a8b22b5
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration numeric_boolean -> org.hibernate.type.BasicTypeReference@5f781173
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration org.hibernate.type.NumericBooleanConverter -> org.hibernate.type.BasicTypeReference@5f781173
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration true_false -> org.hibernate.type.BasicTypeReference@43cf5bff
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration org.hibernate.type.TrueFalseConverter -> org.hibernate.type.BasicTypeReference@43cf5bff
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration yes_no -> org.hibernate.type.BasicTypeReference@2b464384
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration org.hibernate.type.YesNoConverter -> org.hibernate.type.BasicTypeReference@2b464384
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration byte -> org.hibernate.type.BasicTypeReference@681b42d3
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration byte -> org.hibernate.type.BasicTypeReference@681b42d3
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Byte -> org.hibernate.type.BasicTypeReference@681b42d3
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration binary -> org.hibernate.type.BasicTypeReference@77f7352a
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration byte[] -> org.hibernate.type.BasicTypeReference@77f7352a
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration [B -> org.hibernate.type.BasicTypeReference@77f7352a
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration binary_wrapper -> org.hibernate.type.BasicTypeReference@4ede8888
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration wrapper-binary -> org.hibernate.type.BasicTypeReference@4ede8888
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration image -> org.hibernate.type.BasicTypeReference@571db8b4
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration blob -> org.hibernate.type.BasicTypeReference@65a2755e
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.sql.Blob -> org.hibernate.type.BasicTypeReference@65a2755e
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_blob -> org.hibernate.type.BasicTypeReference@2b3242a5
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_blob_wrapper -> org.hibernate.type.BasicTypeReference@11120583
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration short -> org.hibernate.type.BasicTypeReference@2bf0c70d
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration short -> org.hibernate.type.BasicTypeReference@2bf0c70d
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Short -> org.hibernate.type.BasicTypeReference@2bf0c70d
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration integer -> org.hibernate.type.BasicTypeReference@5d8e4fa8
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration int -> org.hibernate.type.BasicTypeReference@5d8e4fa8
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Integer -> org.hibernate.type.BasicTypeReference@5d8e4fa8
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration long -> org.hibernate.type.BasicTypeReference@649009d6
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration long -> org.hibernate.type.BasicTypeReference@649009d6
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Long -> org.hibernate.type.BasicTypeReference@649009d6
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration float -> org.hibernate.type.BasicTypeReference@652f26da
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration float -> org.hibernate.type.BasicTypeReference@652f26da
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Float -> org.hibernate.type.BasicTypeReference@652f26da
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration double -> org.hibernate.type.BasicTypeReference@484a5ddd
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration double -> org.hibernate.type.BasicTypeReference@484a5ddd
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Double -> org.hibernate.type.BasicTypeReference@484a5ddd
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration big_integer -> org.hibernate.type.BasicTypeReference@6796a873
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.math.BigInteger -> org.hibernate.type.BasicTypeReference@6796a873
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration big_decimal -> org.hibernate.type.BasicTypeReference@3acc3ee
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.math.BigDecimal -> org.hibernate.type.BasicTypeReference@3acc3ee
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration character -> org.hibernate.type.BasicTypeReference@1f293cb7
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration char -> org.hibernate.type.BasicTypeReference@1f293cb7
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Character -> org.hibernate.type.BasicTypeReference@1f293cb7
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration character_nchar -> org.hibernate.type.BasicTypeReference@5972e3a
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration string -> org.hibernate.type.BasicTypeReference@5790cbcb
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.String -> org.hibernate.type.BasicTypeReference@5790cbcb
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration nstring -> org.hibernate.type.BasicTypeReference@32c6d164
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration characters -> org.hibernate.type.BasicTypeReference@645c9f0f
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration char[] -> org.hibernate.type.BasicTypeReference@645c9f0f
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration [C -> org.hibernate.type.BasicTypeReference@645c9f0f
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration wrapper-characters -> org.hibernate.type.BasicTypeReference@58068b40
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration text -> org.hibernate.type.BasicTypeReference@999cd18
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration ntext -> org.hibernate.type.BasicTypeReference@dd060be
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration clob -> org.hibernate.type.BasicTypeReference@df432ec
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.sql.Clob -> org.hibernate.type.BasicTypeReference@df432ec
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration nclob -> org.hibernate.type.BasicTypeReference@6144e499
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.sql.NClob -> org.hibernate.type.BasicTypeReference@6144e499
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_clob -> org.hibernate.type.BasicTypeReference@26f204a4
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_clob_char_array -> org.hibernate.type.BasicTypeReference@28295554
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_clob_character_array -> org.hibernate.type.BasicTypeReference@4e671ef
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_nclob -> org.hibernate.type.BasicTypeReference@42403dc6
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_nclob_character_array -> org.hibernate.type.BasicTypeReference@74a1d60e
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_nclob_char_array -> org.hibernate.type.BasicTypeReference@16c0be3b
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration Duration -> org.hibernate.type.BasicTypeReference@219edc05
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.Duration -> org.hibernate.type.BasicTypeReference@219edc05
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration LocalDateTime -> org.hibernate.type.BasicTypeReference@62f37bfd
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.LocalDateTime -> org.hibernate.type.BasicTypeReference@62f37bfd
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration LocalDate -> org.hibernate.type.BasicTypeReference@1818d00b
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.LocalDate -> org.hibernate.type.BasicTypeReference@1818d00b
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration LocalTime -> org.hibernate.type.BasicTypeReference@b3a8455
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.LocalTime -> org.hibernate.type.BasicTypeReference@b3a8455
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetDateTime -> org.hibernate.type.BasicTypeReference@5c930fc3
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.OffsetDateTime -> org.hibernate.type.BasicTypeReference@5c930fc3
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetDateTimeWithTimezone -> org.hibernate.type.BasicTypeReference@25c6ab3f
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetDateTimeWithoutTimezone -> org.hibernate.type.BasicTypeReference@7b80af04
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetTime -> org.hibernate.type.BasicTypeReference@2447940d
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.OffsetTime -> org.hibernate.type.BasicTypeReference@2447940d
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetTimeUtc -> org.hibernate.type.BasicTypeReference@60ee7a51
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetTimeWithTimezone -> org.hibernate.type.BasicTypeReference@70e1aa20
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetTimeWithoutTimezone -> org.hibernate.type.BasicTypeReference@e67d3b7
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration ZonedDateTime -> org.hibernate.type.BasicTypeReference@1618c98a
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.ZonedDateTime -> org.hibernate.type.BasicTypeReference@1618c98a
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration ZonedDateTimeWithTimezone -> org.hibernate.type.BasicTypeReference@5b715ea
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration ZonedDateTimeWithoutTimezone -> org.hibernate.type.BasicTypeReference@787a0fd6
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration date -> org.hibernate.type.BasicTypeReference@48b09105
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.sql.Date -> org.hibernate.type.BasicTypeReference@48b09105
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration time -> org.hibernate.type.BasicTypeReference@18b45500
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.sql.Time -> org.hibernate.type.BasicTypeReference@18b45500
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration timestamp -> org.hibernate.type.BasicTypeReference@25110bb9
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.sql.Timestamp -> org.hibernate.type.BasicTypeReference@25110bb9
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.util.Date -> org.hibernate.type.BasicTypeReference@25110bb9
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration calendar -> org.hibernate.type.BasicTypeReference@dbda472
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.util.Calendar -> org.hibernate.type.BasicTypeReference@dbda472
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.util.GregorianCalendar -> org.hibernate.type.BasicTypeReference@dbda472
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration calendar_date -> org.hibernate.type.BasicTypeReference@41492479
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration calendar_time -> org.hibernate.type.BasicTypeReference@7bef7505
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration instant -> org.hibernate.type.BasicTypeReference@568ef502
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.Instant -> org.hibernate.type.BasicTypeReference@568ef502
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration uuid -> org.hibernate.type.BasicTypeReference@36f05595
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.util.UUID -> org.hibernate.type.BasicTypeReference@36f05595
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration pg-uuid -> org.hibernate.type.BasicTypeReference@36f05595
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration uuid-binary -> org.hibernate.type.BasicTypeReference@3e12c5de
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration uuid-char -> org.hibernate.type.BasicTypeReference@3e55d844
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration class -> org.hibernate.type.BasicTypeReference@1f521c69
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Class -> org.hibernate.type.BasicTypeReference@1f521c69
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration currency -> org.hibernate.type.BasicTypeReference@2b3abeeb
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration Currency -> org.hibernate.type.BasicTypeReference@2b3abeeb
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.util.Currency -> org.hibernate.type.BasicTypeReference@2b3abeeb
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration locale -> org.hibernate.type.BasicTypeReference@3aeb267
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.util.Locale -> org.hibernate.type.BasicTypeReference@3aeb267
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration serializable -> org.hibernate.type.BasicTypeReference@13a9cdae
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.io.Serializable -> org.hibernate.type.BasicTypeReference@13a9cdae
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration timezone -> org.hibernate.type.BasicTypeReference@1c972ae6
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.util.TimeZone -> org.hibernate.type.BasicTypeReference@1c972ae6
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration ZoneOffset -> org.hibernate.type.BasicTypeReference@62a41279
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.ZoneOffset -> org.hibernate.type.BasicTypeReference@62a41279
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration url -> org.hibernate.type.BasicTypeReference@146fa9c0
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.net.URL -> org.hibernate.type.BasicTypeReference@146fa9c0
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration vector -> org.hibernate.type.BasicTypeReference@49f6c25e
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration row_version -> org.hibernate.type.BasicTypeReference@6c13019c
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration object -> org.hibernate.type.JavaObjectType@1c79d093
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Object -> org.hibernate.type.JavaObjectType@1c79d093
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration null -> org.hibernate.type.NullType@7a587e84
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_date -> org.hibernate.type.BasicTypeReference@622ba721
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_time -> org.hibernate.type.BasicTypeReference@7509226c
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_timestamp -> org.hibernate.type.BasicTypeReference@4c9cce17
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_calendar -> org.hibernate.type.BasicTypeReference@73316a0a
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_calendar_date -> org.hibernate.type.BasicTypeReference@63a7af06
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_calendar_time -> org.hibernate.type.BasicTypeReference@5f01fb5c
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_binary -> org.hibernate.type.BasicTypeReference@75c77add
2025-10-24 10:34:46 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_serializable -> org.hibernate.type.BasicTypeReference@d5e3f55
2025-10-24 10:34:47 [main] INFO o.s.o.j.p.SpringPersistenceUnitInfo - No LoadTimeWeaver setup: ignoring JPA class transformer
2025-10-24 10:34:47 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting...
2025-10-24 10:34:47 [main] INFO com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Added connection org.postgresql.jdbc.PgConnection@244f356
2025-10-24 10:34:47 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed.
2025-10-24 10:34:47 [main] WARN org.hibernate.orm.deprecation - HHH90000025: PostgreSQLDialect does not need to be specified explicitly using 'hibernate.dialect' (remove the property setting and it will be selected by default)
2025-10-24 10:34:47 [main] DEBUG o.h.t.d.sql.spi.DdlTypeRegistry - addDescriptor(2003, org.hibernate.type.descriptor.sql.internal.ArrayDdlTypeImpl@2cd2c764) replaced previous registration(org.hibernate.type.descriptor.sql.internal.ArrayDdlTypeImpl@d17d554)
2025-10-24 10:34:47 [main] DEBUG o.h.t.d.sql.spi.DdlTypeRegistry - addDescriptor(6, org.hibernate.type.descriptor.sql.internal.CapacityDependentDdlType@1f1c7fde) replaced previous registration(org.hibernate.type.descriptor.sql.internal.DdlTypeImpl@2b409174)
2025-10-24 10:34:47 [main] DEBUG o.h.t.d.jdbc.spi.JdbcTypeRegistry - addDescriptor(2004, BlobTypeDescriptor(BLOB_BINDING)) replaced previous registration(BlobTypeDescriptor(DEFAULT))
2025-10-24 10:34:47 [main] DEBUG o.h.t.d.jdbc.spi.JdbcTypeRegistry - addDescriptor(2005, ClobTypeDescriptor(CLOB_BINDING)) replaced previous registration(ClobTypeDescriptor(DEFAULT))
2025-10-24 10:34:47 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration JAVA_OBJECT -> org.hibernate.type.JavaObjectType@571c7572
2025-10-24 10:34:47 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Object -> org.hibernate.type.JavaObjectType@571c7572
2025-10-24 10:34:47 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Type registration key [java.lang.Object] overrode previous entry : `org.hibernate.type.JavaObjectType@1c79d093`
2025-10-24 10:34:47 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration org.hibernate.type.DurationType -> basicType@1(java.time.Duration,3015)
2025-10-24 10:34:47 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration Duration -> basicType@1(java.time.Duration,3015)
2025-10-24 10:34:47 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.Duration -> basicType@1(java.time.Duration,3015)
2025-10-24 10:34:47 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration org.hibernate.type.OffsetDateTimeType -> basicType@2(java.time.OffsetDateTime,3003)
2025-10-24 10:34:47 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetDateTime -> basicType@2(java.time.OffsetDateTime,3003)
2025-10-24 10:34:47 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.OffsetDateTime -> basicType@2(java.time.OffsetDateTime,3003)
2025-10-24 10:34:47 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration org.hibernate.type.ZonedDateTimeType -> basicType@3(java.time.ZonedDateTime,3003)
2025-10-24 10:34:47 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration ZonedDateTime -> basicType@3(java.time.ZonedDateTime,3003)
2025-10-24 10:34:47 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.ZonedDateTime -> basicType@3(java.time.ZonedDateTime,3003)
2025-10-24 10:34:47 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration org.hibernate.type.OffsetTimeType -> basicType@4(java.time.OffsetTime,3007)
2025-10-24 10:34:47 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetTime -> basicType@4(java.time.OffsetTime,3007)
2025-10-24 10:34:47 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.OffsetTime -> basicType@4(java.time.OffsetTime,3007)
2025-10-24 10:34:47 [main] DEBUG o.h.type.spi.TypeConfiguration$Scope - Scoping TypeConfiguration [org.hibernate.type.spi.TypeConfiguration@28100232] to MetadataBuildingContext [org.hibernate.boot.internal.MetadataBuildingContextRootImpl@26728255]
2025-10-24 10:34:48 [main] INFO o.h.e.t.j.p.i.JtaPlatformInitiator - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration)
2025-10-24 10:34:48 [main] DEBUG o.h.type.spi.TypeConfiguration$Scope - Scoping TypeConfiguration [org.hibernate.type.spi.TypeConfiguration@28100232] to SessionFactoryImplementor [org.hibernate.internal.SessionFactoryImpl@4c9235c0]
2025-10-24 10:34:48 [main] DEBUG org.hibernate.SQL -
alter table if exists meetings
alter column description set data type TEXT
2025-10-24 10:34:48 [main] DEBUG org.hibernate.SQL -
alter table if exists meetings
alter column participants set data type TEXT
2025-10-24 10:34:48 [main] DEBUG org.hibernate.SQL -
alter table if exists minutes_sections
alter column content set data type TEXT
2025-10-24 10:34:48 [main] DEBUG org.hibernate.SQL -
alter table if exists templates
alter column description set data type TEXT
2025-10-24 10:34:48 [main] DEBUG org.hibernate.SQL -
alter table if exists templates
alter column sections set data type TEXT
2025-10-24 10:34:48 [main] DEBUG org.hibernate.SQL -
alter table if exists todos
alter column description set data type TEXT
2025-10-24 10:34:48 [main] TRACE o.h.type.spi.TypeConfiguration$Scope - Handling #sessionFactoryCreated from [org.hibernate.internal.SessionFactoryImpl@4c9235c0] for TypeConfiguration
2025-10-24 10:34:48 [main] INFO o.s.o.j.LocalContainerEntityManagerFactoryBean - Initialized JPA EntityManagerFactory for persistence unit 'default'
2025-10-24 10:34:48 [main] INFO o.s.d.j.r.query.QueryEnhancerFactory - Hibernate is in classpath; If applicable, HQL parser will be used.
2025-10-24 10:34:49 [main] INFO c.u.h.m.infra.cache.CacheConfig - Redis 연결 설정 - host: 20.249.177.114, port: 6379, database: 1
2025-10-24 10:34:49 [main] ERROR i.n.r.d.DnsServerAddressStreamProviders - Unable to load io.netty.resolver.dns.macos.MacOSDnsServerAddressStreamProvider, fallback to system defaults. This may result in incorrect DNS resolutions on MacOS. Check whether you have a dependency on 'io.netty:netty-resolver-dns-native-macos'. Use DEBUG level to see the full stack: java.lang.UnsatisfiedLinkError: failed to load the required native library
2025-10-24 10:34:49 [main] INFO c.u.h.m.infra.cache.CacheConfig - Redis 템플릿 설정 완료
2025-10-24 10:34:49 [main] INFO c.u.h.m.infra.cache.CacheConfig - ObjectMapper 설정 완료
2025-10-24 10:34:49 [main] INFO c.u.h.m.infra.config.EventHubConfig - Initializing Azure EventHub configuration with hub name: hgzero-eventhub-name
2025-10-24 10:34:49 [main] INFO c.u.h.m.infra.config.EventHubConfig - Creating EventHub producer for hub: hgzero-eventhub-name
2025-10-24 10:34:49 [main] INFO c.a.m.e.EventHubClientBuilder - {"az.sdk.message":"Emitting a single connection.","connectionId":"MF_f60409_1761269689442"}
2025-10-24 10:34:49 [main] INFO c.a.m.e.i.EventHubConnectionProcessor - {"az.sdk.message":"Setting next AMQP channel.","entityPath":"hgzero-eventhub-name"}
2025-10-24 10:34:49 [main] WARN o.s.b.a.o.j.JpaBaseConfiguration$JpaWebConfiguration - spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning
2025-10-24 10:34:49 [main] WARN o.s.b.a.s.s.UserDetailsServiceAutoConfiguration -
Using generated security password: 7caeb7e6-784c-4408-aecd-e7bec17a7d2d
This generated password is for development use only. Your security configuration must be updated before running your application in production.
2025-10-24 10:34:49 [main] INFO o.s.s.c.a.a.c.InitializeUserDetailsBeanManagerConfigurer$InitializeUserDetailsManagerConfigurer - Global AuthenticationManager configured with UserDetailsService bean with name inMemoryUserDetailsManager
2025-10-24 10:34:49 [main] INFO c.u.h.m.infra.config.WebSocketConfig - WebSocket 핸들러 등록 완료 - endpoint: /ws/minutes/{minutesId}
2025-10-24 10:34:49 [main] INFO o.s.b.a.e.web.EndpointLinksResolver - Exposing 3 endpoints beneath base path '/actuator'
2025-10-24 10:34:49 [main] DEBUG o.s.s.web.DefaultSecurityFilterChain - Will secure any request with filters: DisableEncodeUrlFilter, WebAsyncManagerIntegrationFilter, SecurityContextHolderFilter, HeaderWriterFilter, CorsFilter, LogoutFilter, JwtAuthenticationFilter, RequestCacheAwareFilter, SecurityContextHolderAwareRequestFilter, AnonymousAuthenticationFilter, SessionManagementFilter, ExceptionTranslationFilter, AuthorizationFilter
2025-10-24 10:34:50 [main] INFO o.s.b.w.e.tomcat.TomcatWebServer - Tomcat started on port 8082 (http) with context path '/'
2025-10-24 10:34:50 [main] INFO c.u.h.meeting.MeetingApplication - Started MeetingApplication in 4.678 seconds (process running for 4.839)
2025-10-24 10:34:56 [http-nio-8082-exec-1] INFO o.a.c.c.C.[Tomcat].[localhost].[/] - Initializing Spring DispatcherServlet 'dispatcherServlet'
2025-10-24 10:34:56 [http-nio-8082-exec-1] INFO o.s.web.servlet.DispatcherServlet - Initializing Servlet 'dispatcherServlet'
2025-10-24 10:34:56 [http-nio-8082-exec-1] INFO o.s.web.servlet.DispatcherServlet - Completed initialization in 1 ms
2025-10-24 10:34:56 [http-nio-8082-exec-1] DEBUG o.s.security.web.FilterChainProxy - Securing GET /swagger-ui/index.html
2025-10-24 10:34:56 [http-nio-8082-exec-1] DEBUG o.s.s.w.a.AnonymousAuthenticationFilter - Set SecurityContextHolder to anonymous SecurityContext
2025-10-24 10:34:56 [http-nio-8082-exec-1] DEBUG o.s.security.web.FilterChainProxy - Secured GET /swagger-ui/index.html
2025-10-24 10:34:56 [http-nio-8082-exec-2] DEBUG o.s.security.web.FilterChainProxy - Securing GET /swagger-ui/swagger-ui.css
2025-10-24 10:34:56 [http-nio-8082-exec-3] DEBUG o.s.security.web.FilterChainProxy - Securing GET /swagger-ui/index.css
2025-10-24 10:34:56 [http-nio-8082-exec-2] DEBUG o.s.s.w.a.AnonymousAuthenticationFilter - Set SecurityContextHolder to anonymous SecurityContext
2025-10-24 10:34:56 [http-nio-8082-exec-5] DEBUG o.s.security.web.FilterChainProxy - Securing GET /swagger-ui/swagger-ui-standalone-preset.js
2025-10-24 10:34:56 [http-nio-8082-exec-6] DEBUG o.s.security.web.FilterChainProxy - Securing GET /swagger-ui/swagger-initializer.js
2025-10-24 10:34:56 [http-nio-8082-exec-2] DEBUG o.s.security.web.FilterChainProxy - Secured GET /swagger-ui/swagger-ui.css
2025-10-24 10:34:56 [http-nio-8082-exec-5] DEBUG o.s.s.w.a.AnonymousAuthenticationFilter - Set SecurityContextHolder to anonymous SecurityContext
2025-10-24 10:34:56 [http-nio-8082-exec-6] DEBUG o.s.s.w.a.AnonymousAuthenticationFilter - Set SecurityContextHolder to anonymous SecurityContext
2025-10-24 10:34:56 [http-nio-8082-exec-3] DEBUG o.s.s.w.a.AnonymousAuthenticationFilter - Set SecurityContextHolder to anonymous SecurityContext
2025-10-24 10:34:56 [http-nio-8082-exec-5] DEBUG o.s.security.web.FilterChainProxy - Secured GET /swagger-ui/swagger-ui-standalone-preset.js
2025-10-24 10:34:56 [http-nio-8082-exec-6] DEBUG o.s.security.web.FilterChainProxy - Secured GET /swagger-ui/swagger-initializer.js
2025-10-24 10:34:56 [http-nio-8082-exec-4] DEBUG o.s.security.web.FilterChainProxy - Securing GET /swagger-ui/swagger-ui-bundle.js
2025-10-24 10:34:56 [http-nio-8082-exec-3] DEBUG o.s.security.web.FilterChainProxy - Secured GET /swagger-ui/index.css
2025-10-24 10:34:56 [http-nio-8082-exec-4] DEBUG o.s.s.w.a.AnonymousAuthenticationFilter - Set SecurityContextHolder to anonymous SecurityContext
2025-10-24 10:34:56 [http-nio-8082-exec-4] DEBUG o.s.security.web.FilterChainProxy - Secured GET /swagger-ui/swagger-ui-bundle.js
2025-10-24 10:34:56 [http-nio-8082-exec-7] DEBUG o.s.security.web.FilterChainProxy - Securing GET /v3/api-docs/swagger-config
2025-10-24 10:34:56 [http-nio-8082-exec-7] DEBUG o.s.s.w.a.AnonymousAuthenticationFilter - Set SecurityContextHolder to anonymous SecurityContext
2025-10-24 10:34:56 [http-nio-8082-exec-7] DEBUG o.s.security.web.FilterChainProxy - Secured GET /v3/api-docs/swagger-config
2025-10-24 10:34:56 [http-nio-8082-exec-7] INFO c.u.hgzero.common.aop.LoggingAspect - [Controller] org.springdoc.webmvc.ui.SwaggerConfigResource.openapiJson 호출 - 파라미터: [SecurityContextHolderAwareRequestWrapper[ org.springframework.security.web.header.HeaderWriterFilter$HeaderWriterRequest@5b7947ec]]
2025-10-24 10:34:56 [http-nio-8082-exec-7] INFO c.u.hgzero.common.aop.LoggingAspect - [Controller] org.springdoc.webmvc.ui.SwaggerConfigResource.openapiJson 완료 - 실행시간: 0ms
2025-10-24 10:34:56 [http-nio-8082-exec-8] DEBUG o.s.security.web.FilterChainProxy - Securing GET /v3/api-docs
2025-10-24 10:34:56 [http-nio-8082-exec-8] DEBUG o.s.s.w.a.AnonymousAuthenticationFilter - Set SecurityContextHolder to anonymous SecurityContext
2025-10-24 10:34:56 [http-nio-8082-exec-8] DEBUG o.s.security.web.FilterChainProxy - Secured GET /v3/api-docs
2025-10-24 10:34:56 [http-nio-8082-exec-8] INFO c.u.hgzero.common.aop.LoggingAspect - [Controller] org.springdoc.webmvc.api.OpenApiWebMvcResource.openapiJson 호출 - 파라미터: [SecurityContextHolderAwareRequestWrapper[ org.springframework.security.web.header.HeaderWriterFilter$HeaderWriterRequest@7089f4a5], /v3/api-docs, ko_KR]
2025-10-24 10:34:57 [http-nio-8082-exec-8] INFO o.s.api.AbstractOpenApiResource - Init duration for springdoc-openapi is: 340 ms
2025-10-24 10:34:57 [http-nio-8082-exec-8] INFO c.u.hgzero.common.aop.LoggingAspect - [Controller] org.springdoc.webmvc.api.OpenApiWebMvcResource.openapiJson 완료 - 실행시간: 349ms

View File

@ -1,91 +1,40 @@
package com.unicorn.hgzero.meeting.infra.config;
import com.azure.messaging.eventhubs.EventHubClientBuilder;
import com.azure.messaging.eventhubs.EventHubProducerClient;
import jakarta.annotation.PostConstruct;
import lombok.extern.slf4j.Slf4j;
import org.apache.kafka.clients.producer.ProducerConfig;
import org.apache.kafka.common.serialization.StringSerializer;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.kafka.core.DefaultKafkaProducerFactory;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.kafka.core.ProducerFactory;
import java.util.HashMap;
import java.util.Map;
/**
* Event Hub (Kafka) 설정
* 이벤트 발행을 위한 Kafka 설정
* Azure EventHub 설정
* 이벤트 발행을 위한 EventHub 설정
*/
@Configuration
@Slf4j
public class EventHubConfig {
@Value("${spring.kafka.bootstrap-servers:localhost:9092}")
private String bootstrapServers;
@Value("${eventhub.connection-string}")
private String connectionString;
@Value("${spring.kafka.producer.client-id:meeting-service}")
private String clientId;
@Value("${eventhub.name}")
private String eventHubName;
@Value("${spring.kafka.producer.acks:all}")
private String acks;
@Value("${spring.kafka.producer.retries:3}")
private Integer retries;
@Value("${spring.kafka.producer.batch-size:16384}")
private Integer batchSize;
@Value("${spring.kafka.producer.linger-ms:5}")
private Integer lingerMs;
@Value("${spring.kafka.producer.buffer-memory:33554432}")
private Long bufferMemory;
/**
* Kafka Producer 설정
*/
@Bean
public ProducerFactory<String, String> producerFactory() {
Map<String, Object> configProps = new HashMap<>();
// 기본 설정
configProps.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);
configProps.put(ProducerConfig.CLIENT_ID_CONFIG, clientId);
configProps.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
configProps.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
// 성능 안정성 설정
configProps.put(ProducerConfig.ACKS_CONFIG, acks);
configProps.put(ProducerConfig.RETRIES_CONFIG, retries);
configProps.put(ProducerConfig.BATCH_SIZE_CONFIG, batchSize);
configProps.put(ProducerConfig.LINGER_MS_CONFIG, lingerMs);
configProps.put(ProducerConfig.BUFFER_MEMORY_CONFIG, bufferMemory);
// 중복 방지 설정
configProps.put(ProducerConfig.ENABLE_IDEMPOTENCE_CONFIG, true);
configProps.put(ProducerConfig.MAX_IN_FLIGHT_REQUESTS_PER_CONNECTION, 5);
// 압축 설정
configProps.put(ProducerConfig.COMPRESSION_TYPE_CONFIG, "snappy");
log.info("Kafka Producer 설정 완료 - bootstrapServers: {}, clientId: {}",
bootstrapServers, clientId);
return new DefaultKafkaProducerFactory<>(configProps);
@PostConstruct
public void init() {
log.info("Initializing Azure EventHub configuration with hub name: {}", eventHubName);
}
/**
* Kafka Template
* EventHub Producer Client 생성
*/
@Bean
public KafkaTemplate<String, String> kafkaTemplate() {
KafkaTemplate<String, String> template = new KafkaTemplate<>(producerFactory());
// 메시지 전송 결과 로깅
template.setProducerListener(new org.springframework.kafka.support.LoggingProducerListener<>());
log.info("Kafka Template 설정 완료");
return template;
@Bean(name = "eventProducer")
public EventHubProducerClient eventProducer() {
log.info("Creating EventHub producer for hub: {}", eventHubName);
return new EventHubClientBuilder()
.connectionString(connectionString, eventHubName)
.buildProducerClient();
}
}

View File

@ -0,0 +1,30 @@
package com.unicorn.hgzero.meeting.infra.event.constant;
/**
* EventHub 이벤트 관련 상수 정의
* Azure EventHub에서 사용하는 이벤트 타입과 토픽 정의
*/
public class EventHubConstants {
// 이벤트 타입 상수
public static final String EVENT_TYPE_MEETING_STARTED = "MEETING_STARTED";
public static final String EVENT_TYPE_MEETING_ENDED = "MEETING_ENDED";
public static final String EVENT_TYPE_TODO_ASSIGNED = "TODO_ASSIGNED";
public static final String EVENT_TYPE_TODO_COMPLETED = "TODO_COMPLETED";
public static final String EVENT_TYPE_MINUTES_FINALIZED = "MINUTES_FINALIZED";
public static final String EVENT_TYPE_NOTIFICATION_REQUEST = "NOTIFICATION_REQUEST";
// 토픽 이름 상수
public static final String TOPIC_MEETING = "meeting";
public static final String TOPIC_TODO = "todo";
public static final String TOPIC_MINUTES = "minutes";
public static final String TOPIC_NOTIFICATION = "notification";
// 속성 상수
public static final String PROPERTY_TYPE = "type";
public static final String PROPERTY_TOPIC = "topic";
private EventHubConstants() {
// 유틸리티 클래스는 인스턴스화 방지
}
}

View File

@ -1,100 +1,67 @@
package com.unicorn.hgzero.meeting.infra.event.publisher;
import com.azure.messaging.eventhubs.EventData;
import com.azure.messaging.eventhubs.EventDataBatch;
import com.azure.messaging.eventhubs.EventHubProducerClient;
import com.azure.messaging.eventhubs.models.CreateBatchOptions;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.unicorn.hgzero.meeting.infra.event.constant.EventHubConstants;
import com.unicorn.hgzero.meeting.infra.event.dto.MeetingStartedEvent;
import com.unicorn.hgzero.meeting.infra.event.dto.MeetingEndedEvent;
import com.unicorn.hgzero.meeting.infra.event.dto.TodoAssignedEvent;
import com.unicorn.hgzero.meeting.infra.event.dto.NotificationRequestEvent;
import java.time.LocalDate;
import java.time.LocalDateTime;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
/**
* Event Hub 이벤트 발행 구현체
* Kafka 통한 이벤트 발행
* Azure EventHub 이벤트 발행 구현체
* Azure EventHub 통한 이벤트 발행
*/
@Component
@RequiredArgsConstructor
@Slf4j
public class EventHubPublisher implements EventPublisher {
private final KafkaTemplate<String, String> kafkaTemplate;
private final EventHubProducerClient eventProducer;
private final ObjectMapper objectMapper;
@Value("${app.event.topic.meeting-started:meeting-started}")
private String meetingStartedTopic;
@Value("${app.event.topic.meeting-ended:meeting-ended}")
private String meetingEndedTopic;
@Value("${app.event.topic.todo-assigned:todo-assigned}")
private String todoAssignedTopic;
@Value("${app.event.topic.notification-request:notification-request}")
private String notificationRequestTopic;
@Value("${app.event.topic.todo-completed:todo-completed}")
private String todoCompletedTopic;
@Value("${app.event.topic.minutes-finalized:minutes-finalized}")
private String minutesFinalizedTopic;
public EventHubPublisher(
@Qualifier("eventProducer") EventHubProducerClient eventProducer,
ObjectMapper objectMapper) {
this.eventProducer = eventProducer;
this.objectMapper = objectMapper;
}
@Override
public void publishMeetingStarted(MeetingStartedEvent event) {
try {
String payload = objectMapper.writeValueAsString(event);
kafkaTemplate.send(meetingStartedTopic, event.getMeetingId(), payload);
log.info("회의 시작 이벤트 발행 완료 - meetingId: {}", event.getMeetingId());
} catch (Exception e) {
log.error("회의 시작 이벤트 발행 실패 - meetingId: {}", event.getMeetingId(), e);
throw new RuntimeException("회의 시작 이벤트 발행 실패", e);
}
publishEvent(event, event.getMeetingId(),
EventHubConstants.TOPIC_MEETING,
EventHubConstants.EVENT_TYPE_MEETING_STARTED);
}
@Override
public void publishMeetingEnded(MeetingEndedEvent event) {
try {
String payload = objectMapper.writeValueAsString(event);
kafkaTemplate.send(meetingEndedTopic, event.getMeetingId(), payload);
log.info("회의 종료 이벤트 발행 완료 - meetingId: {}", event.getMeetingId());
} catch (Exception e) {
log.error("회의 종료 이벤트 발행 실패 - meetingId: {}", event.getMeetingId(), e);
throw new RuntimeException("회의 종료 이벤트 발행 실패", e);
}
publishEvent(event, event.getMeetingId(),
EventHubConstants.TOPIC_MEETING,
EventHubConstants.EVENT_TYPE_MEETING_ENDED);
}
@Override
public void publishTodoAssigned(TodoAssignedEvent event) {
try {
String payload = objectMapper.writeValueAsString(event);
kafkaTemplate.send(todoAssignedTopic, event.getTodoId(), payload);
log.info("Todo 할당 이벤트 발행 완료 - todoId: {}", event.getTodoId());
} catch (Exception e) {
log.error("Todo 할당 이벤트 발행 실패 - todoId: {}", event.getTodoId(), e);
throw new RuntimeException("Todo 할당 이벤트 발행 실패", e);
}
publishEvent(event, event.getTodoId(),
EventHubConstants.TOPIC_TODO,
EventHubConstants.EVENT_TYPE_TODO_ASSIGNED);
}
@Override
public void publishNotificationRequest(NotificationRequestEvent event) {
try {
String payload = objectMapper.writeValueAsString(event);
kafkaTemplate.send(notificationRequestTopic, event.getRecipientId(), payload);
log.info("알림 요청 이벤트 발행 완료 - type: {}, recipientId: {}",
event.getNotificationType(), event.getRecipientId());
} catch (Exception e) {
log.error("알림 요청 이벤트 발행 실패 - type: {}, recipientId: {}",
event.getNotificationType(), event.getRecipientId(), e);
throw new RuntimeException("알림 요청 이벤트 발행 실패", e);
}
publishEvent(event, event.getRecipientId(),
EventHubConstants.TOPIC_NOTIFICATION,
EventHubConstants.EVENT_TYPE_NOTIFICATION_REQUEST);
}
// 편의 메서드 구현
@Override
public void publishTodoAssigned(String todoId, String title, String assigneeId, String assigneeName,
String assignedBy, String assignedByName, LocalDate dueDate) {
@ -114,54 +81,79 @@ public class EventHubPublisher implements EventPublisher {
@Override
public void publishTodoCompleted(String todoId, String title, String assigneeId, String assigneeName,
String completedBy, String completedByName) {
try {
// Todo 완료 이벤트는 NotificationRequestEvent로 발행
NotificationRequestEvent event = NotificationRequestEvent.builder()
.notificationType("TODO_COMPLETED")
.recipientId(assigneeId)
.recipientName(assigneeName)
.title("Todo 완료")
.message(String.format("Todo '%s'가 완료되었습니다", title))
.relatedEntityId(todoId)
.relatedEntityType("TODO")
.requestedBy(completedBy)
.requestedByName(completedByName)
.eventTime(LocalDateTime.now())
.build();
String completedBy, String completedByName) {
NotificationRequestEvent event = NotificationRequestEvent.builder()
.notificationType("TODO_COMPLETED")
.recipientId(assigneeId)
.recipientName(assigneeName)
.title("Todo 완료")
.message(String.format("Todo '%s'가 완료되었습니다", title))
.relatedEntityId(todoId)
.relatedEntityType("TODO")
.requestedBy(completedBy)
.requestedByName(completedByName)
.eventTime(LocalDateTime.now())
.build();
String payload = objectMapper.writeValueAsString(event);
kafkaTemplate.send(todoCompletedTopic, todoId, payload);
log.info("Todo 완료 이벤트 발행 완료 - todoId: {}", todoId);
} catch (Exception e) {
log.error("Todo 완료 이벤트 발행 실패 - todoId: {}", todoId, e);
throw new RuntimeException("Todo 완료 이벤트 발행 실패", e);
}
publishEvent(event, todoId,
EventHubConstants.TOPIC_TODO,
EventHubConstants.EVENT_TYPE_TODO_COMPLETED);
}
@Override
public void publishMinutesFinalized(String minutesId, String title, String finalizedBy, String finalizedByName) {
try {
// 회의록 확정 이벤트는 NotificationRequestEvent로 발행
NotificationRequestEvent event = NotificationRequestEvent.builder()
.notificationType("MINUTES_FINALIZED")
.recipientId(finalizedBy)
.recipientName(finalizedByName)
.title("회의록 확정")
.message(String.format("회의록 '%s'가 확정되었습니다", title))
.relatedEntityId(minutesId)
.relatedEntityType("MINUTES")
.requestedBy(finalizedBy)
.requestedByName(finalizedByName)
.eventTime(LocalDateTime.now())
.build();
NotificationRequestEvent event = NotificationRequestEvent.builder()
.notificationType("MINUTES_FINALIZED")
.recipientId(finalizedBy)
.recipientName(finalizedByName)
.title("회의록 확정")
.message(String.format("회의록 '%s'가 확정되었습니다", title))
.relatedEntityId(minutesId)
.relatedEntityType("MINUTES")
.requestedBy(finalizedBy)
.requestedByName(finalizedByName)
.eventTime(LocalDateTime.now())
.build();
publishEvent(event, minutesId,
EventHubConstants.TOPIC_MINUTES,
EventHubConstants.EVENT_TYPE_MINUTES_FINALIZED);
}
/**
* 이벤트 발행 공통 메서드
*
* @param event 발행할 이벤트 객체
* @param partitionKey 파티션 (이벤트 ID )
* @param topic 토픽 이름
* @param eventType 이벤트 타입
* @param <T> 이벤트 타입
*/
private <T> void publishEvent(T event, String partitionKey, String topic, String eventType) {
try {
CreateBatchOptions options = new CreateBatchOptions()
.setPartitionKey(partitionKey);
EventDataBatch batch = eventProducer.createBatch(options);
String eventJson = objectMapper.writeValueAsString(event);
EventData eventData = new EventData(eventJson);
// 이벤트 속성 설정
eventData.getProperties().put(EventHubConstants.PROPERTY_TYPE, eventType);
eventData.getProperties().put(EventHubConstants.PROPERTY_TOPIC, topic);
if (!batch.tryAdd(eventData)) {
throw new RuntimeException("이벤트 크기가 너무 큽니다");
}
eventProducer.send(batch);
log.info("이벤트 발행 완료: topic={}, type={}, partitionKey={}",
topic, eventType, partitionKey);
String payload = objectMapper.writeValueAsString(event);
kafkaTemplate.send(minutesFinalizedTopic, minutesId, payload);
log.info("회의록 확정 이벤트 발행 완료 - minutesId: {}", minutesId);
} catch (Exception e) {
log.error("회의록 확정 이벤트 발행 실패 - minutesId: {}", minutesId, e);
throw new RuntimeException("회의록 확정 이벤트 발행 실패", e);
log.error("이벤트 발행 실패: topic={}, type={}, partitionKey={}, error={}",
topic, eventType, partitionKey, e.getMessage(), e);
throw new RuntimeException("이벤트 발행 중 오류가 발생했습니다", e);
}
}
}

View File

@ -125,5 +125,11 @@ api:
# Azure EventHub Configuration
eventhub:
connection-string: ${EVENTHUB_CONNECTION_STRING:}
name: ${EVENTHUB_NAME:hgzero-eventhub-name}
name: ${EVENTHUB_NAME:hgzero-events}
consumer-group: ${EVENTHUB_CONSUMER_GROUP:$Default}
# Azure Storage Configuration (for EventHub checkpoints)
azure:
storage:
connection-string: ${AZURE_STORAGE_CONNECTION_STRING:}
container: ${AZURE_STORAGE_CONTAINER:hgzero-checkpoints}