This commit is contained in:
yabo0812 2025-10-24 15:02:24 +09:00
commit ce2dfab9f9
50 changed files with 2568 additions and 1896 deletions

View File

@ -296,3 +296,485 @@ This generated password is for development use only. Your security configuration
2025-10-23 16:27:13 [SpringApplicationShutdownHook] INFO o.s.o.j.LocalContainerEntityManagerFactoryBean - Closing JPA EntityManagerFactory for persistence unit 'default' 2025-10-23 16:27:13 [SpringApplicationShutdownHook] INFO o.s.o.j.LocalContainerEntityManagerFactoryBean - Closing JPA EntityManagerFactory for persistence unit 'default'
2025-10-23 16:27:13 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown initiated... 2025-10-23 16:27:13 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown initiated...
2025-10-23 16:27:13 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown completed. 2025-10-23 16:27:13 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown completed.
2025-10-23 17:10:12 [main] INFO com.unicorn.hgzero.ai.AiApplication - Starting AiApplication using Java 23.0.2 with PID 43825 (/Users/jominseo/HGZero/ai/build/classes/java/main started by jominseo in /Users/jominseo/HGZero/ai)
2025-10-23 17:10:12 [main] DEBUG com.unicorn.hgzero.ai.AiApplication - Running with Spring Boot v3.3.0, Spring v6.1.8
2025-10-23 17:10:12 [main] INFO com.unicorn.hgzero.ai.AiApplication - The following 1 profile is active: "dev"
2025-10-23 17:10:12 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Multiple Spring Data modules found, entering strict repository configuration mode
2025-10-23 17:10:12 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Bootstrapping Spring Data JPA repositories in DEFAULT mode.
2025-10-23 17:10:12 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 3 ms. Found 0 JPA repository interfaces.
2025-10-23 17:10:12 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Multiple Spring Data modules found, entering strict repository configuration mode
2025-10-23 17:10:12 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Bootstrapping Spring Data Redis repositories in DEFAULT mode.
2025-10-23 17:10:12 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 0 ms. Found 0 Redis repository interfaces.
2025-10-23 17:10:13 [main] INFO o.s.b.w.e.tomcat.TomcatWebServer - Tomcat initialized with port 8083 (http)
2025-10-23 17:10:13 [main] INFO o.a.catalina.core.StandardService - Starting service [Tomcat]
2025-10-23 17:10:13 [main] INFO o.a.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/10.1.24]
2025-10-23 17:10:13 [main] INFO o.a.c.c.C.[Tomcat].[localhost].[/] - Initializing Spring embedded WebApplicationContext
2025-10-23 17:10:13 [main] INFO o.s.b.w.s.c.ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 668 ms
2025-10-23 17:10:13 [main] INFO o.h.jpa.internal.util.LogHelper - HHH000204: Processing PersistenceUnitInfo [name: default]
2025-10-23 17:10:13 [main] INFO org.hibernate.Version - HHH000412: Hibernate ORM core version 6.5.2.Final
2025-10-23 17:10:13 [main] INFO o.h.c.i.RegionFactoryInitiator - HHH000026: Second-level cache disabled
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration boolean -> org.hibernate.type.BasicTypeReference@66716959
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration boolean -> org.hibernate.type.BasicTypeReference@66716959
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Boolean -> org.hibernate.type.BasicTypeReference@66716959
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration numeric_boolean -> org.hibernate.type.BasicTypeReference@34e07e65
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration org.hibernate.type.NumericBooleanConverter -> org.hibernate.type.BasicTypeReference@34e07e65
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration true_false -> org.hibernate.type.BasicTypeReference@7ca0166c
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration org.hibernate.type.TrueFalseConverter -> org.hibernate.type.BasicTypeReference@7ca0166c
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration yes_no -> org.hibernate.type.BasicTypeReference@1dcad16f
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration org.hibernate.type.YesNoConverter -> org.hibernate.type.BasicTypeReference@1dcad16f
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration byte -> org.hibernate.type.BasicTypeReference@701c482e
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration byte -> org.hibernate.type.BasicTypeReference@701c482e
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Byte -> org.hibernate.type.BasicTypeReference@701c482e
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration binary -> org.hibernate.type.BasicTypeReference@4738131e
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration byte[] -> org.hibernate.type.BasicTypeReference@4738131e
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration [B -> org.hibernate.type.BasicTypeReference@4738131e
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration binary_wrapper -> org.hibernate.type.BasicTypeReference@3b576ee3
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration wrapper-binary -> org.hibernate.type.BasicTypeReference@3b576ee3
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration image -> org.hibernate.type.BasicTypeReference@705d914f
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration blob -> org.hibernate.type.BasicTypeReference@6212ea52
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.sql.Blob -> org.hibernate.type.BasicTypeReference@6212ea52
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_blob -> org.hibernate.type.BasicTypeReference@65b5b5ed
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_blob_wrapper -> org.hibernate.type.BasicTypeReference@6595ffce
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration short -> org.hibernate.type.BasicTypeReference@795eddda
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration short -> org.hibernate.type.BasicTypeReference@795eddda
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Short -> org.hibernate.type.BasicTypeReference@795eddda
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration integer -> org.hibernate.type.BasicTypeReference@c6bf8d9
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration int -> org.hibernate.type.BasicTypeReference@c6bf8d9
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Integer -> org.hibernate.type.BasicTypeReference@c6bf8d9
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration long -> org.hibernate.type.BasicTypeReference@44392e64
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration long -> org.hibernate.type.BasicTypeReference@44392e64
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Long -> org.hibernate.type.BasicTypeReference@44392e64
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration float -> org.hibernate.type.BasicTypeReference@e18d2a2
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration float -> org.hibernate.type.BasicTypeReference@e18d2a2
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Float -> org.hibernate.type.BasicTypeReference@e18d2a2
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration double -> org.hibernate.type.BasicTypeReference@1a77eb6
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration double -> org.hibernate.type.BasicTypeReference@1a77eb6
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Double -> org.hibernate.type.BasicTypeReference@1a77eb6
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration big_integer -> org.hibernate.type.BasicTypeReference@52d9f36b
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.math.BigInteger -> org.hibernate.type.BasicTypeReference@52d9f36b
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration big_decimal -> org.hibernate.type.BasicTypeReference@5f9ebd5a
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.math.BigDecimal -> org.hibernate.type.BasicTypeReference@5f9ebd5a
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration character -> org.hibernate.type.BasicTypeReference@175bf9c9
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration char -> org.hibernate.type.BasicTypeReference@175bf9c9
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Character -> org.hibernate.type.BasicTypeReference@175bf9c9
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration character_nchar -> org.hibernate.type.BasicTypeReference@2db3675a
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration string -> org.hibernate.type.BasicTypeReference@306c9b2c
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.String -> org.hibernate.type.BasicTypeReference@306c9b2c
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration nstring -> org.hibernate.type.BasicTypeReference@1ab28416
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration characters -> org.hibernate.type.BasicTypeReference@52efb338
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration char[] -> org.hibernate.type.BasicTypeReference@52efb338
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration [C -> org.hibernate.type.BasicTypeReference@52efb338
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration wrapper-characters -> org.hibernate.type.BasicTypeReference@64508788
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration text -> org.hibernate.type.BasicTypeReference@30b1c5d5
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration ntext -> org.hibernate.type.BasicTypeReference@3e2d65e1
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration clob -> org.hibernate.type.BasicTypeReference@1174676f
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.sql.Clob -> org.hibernate.type.BasicTypeReference@1174676f
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration nclob -> org.hibernate.type.BasicTypeReference@71f8ce0e
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.sql.NClob -> org.hibernate.type.BasicTypeReference@71f8ce0e
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_clob -> org.hibernate.type.BasicTypeReference@4fd92289
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_clob_char_array -> org.hibernate.type.BasicTypeReference@1a8e44fe
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_clob_character_array -> org.hibernate.type.BasicTypeReference@287317df
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_nclob -> org.hibernate.type.BasicTypeReference@1fcc3461
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_nclob_character_array -> org.hibernate.type.BasicTypeReference@1987807b
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_nclob_char_array -> org.hibernate.type.BasicTypeReference@71469e01
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration Duration -> org.hibernate.type.BasicTypeReference@41bbb219
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.Duration -> org.hibernate.type.BasicTypeReference@41bbb219
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration LocalDateTime -> org.hibernate.type.BasicTypeReference@3f2ae973
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.LocalDateTime -> org.hibernate.type.BasicTypeReference@3f2ae973
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration LocalDate -> org.hibernate.type.BasicTypeReference@1a8b22b5
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.LocalDate -> org.hibernate.type.BasicTypeReference@1a8b22b5
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration LocalTime -> org.hibernate.type.BasicTypeReference@5f781173
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.LocalTime -> org.hibernate.type.BasicTypeReference@5f781173
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetDateTime -> org.hibernate.type.BasicTypeReference@43cf5bff
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.OffsetDateTime -> org.hibernate.type.BasicTypeReference@43cf5bff
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetDateTimeWithTimezone -> org.hibernate.type.BasicTypeReference@2b464384
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetDateTimeWithoutTimezone -> org.hibernate.type.BasicTypeReference@681b42d3
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetTime -> org.hibernate.type.BasicTypeReference@77f7352a
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.OffsetTime -> org.hibernate.type.BasicTypeReference@77f7352a
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetTimeUtc -> org.hibernate.type.BasicTypeReference@4ede8888
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetTimeWithTimezone -> org.hibernate.type.BasicTypeReference@571db8b4
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetTimeWithoutTimezone -> org.hibernate.type.BasicTypeReference@65a2755e
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration ZonedDateTime -> org.hibernate.type.BasicTypeReference@2b3242a5
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.ZonedDateTime -> org.hibernate.type.BasicTypeReference@2b3242a5
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration ZonedDateTimeWithTimezone -> org.hibernate.type.BasicTypeReference@11120583
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration ZonedDateTimeWithoutTimezone -> org.hibernate.type.BasicTypeReference@2bf0c70d
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration date -> org.hibernate.type.BasicTypeReference@5d8e4fa8
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.sql.Date -> org.hibernate.type.BasicTypeReference@5d8e4fa8
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration time -> org.hibernate.type.BasicTypeReference@649009d6
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.sql.Time -> org.hibernate.type.BasicTypeReference@649009d6
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration timestamp -> org.hibernate.type.BasicTypeReference@652f26da
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.sql.Timestamp -> org.hibernate.type.BasicTypeReference@652f26da
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.util.Date -> org.hibernate.type.BasicTypeReference@652f26da
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration calendar -> org.hibernate.type.BasicTypeReference@484a5ddd
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.util.Calendar -> org.hibernate.type.BasicTypeReference@484a5ddd
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.util.GregorianCalendar -> org.hibernate.type.BasicTypeReference@484a5ddd
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration calendar_date -> org.hibernate.type.BasicTypeReference@6796a873
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration calendar_time -> org.hibernate.type.BasicTypeReference@3acc3ee
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration instant -> org.hibernate.type.BasicTypeReference@1f293cb7
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.Instant -> org.hibernate.type.BasicTypeReference@1f293cb7
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration uuid -> org.hibernate.type.BasicTypeReference@5972e3a
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.util.UUID -> org.hibernate.type.BasicTypeReference@5972e3a
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration pg-uuid -> org.hibernate.type.BasicTypeReference@5972e3a
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration uuid-binary -> org.hibernate.type.BasicTypeReference@5790cbcb
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration uuid-char -> org.hibernate.type.BasicTypeReference@32c6d164
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration class -> org.hibernate.type.BasicTypeReference@645c9f0f
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Class -> org.hibernate.type.BasicTypeReference@645c9f0f
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration currency -> org.hibernate.type.BasicTypeReference@58068b40
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration Currency -> org.hibernate.type.BasicTypeReference@58068b40
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.util.Currency -> org.hibernate.type.BasicTypeReference@58068b40
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration locale -> org.hibernate.type.BasicTypeReference@999cd18
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.util.Locale -> org.hibernate.type.BasicTypeReference@999cd18
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration serializable -> org.hibernate.type.BasicTypeReference@dd060be
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.io.Serializable -> org.hibernate.type.BasicTypeReference@dd060be
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration timezone -> org.hibernate.type.BasicTypeReference@df432ec
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.util.TimeZone -> org.hibernate.type.BasicTypeReference@df432ec
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration ZoneOffset -> org.hibernate.type.BasicTypeReference@6144e499
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.ZoneOffset -> org.hibernate.type.BasicTypeReference@6144e499
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration url -> org.hibernate.type.BasicTypeReference@26f204a4
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.net.URL -> org.hibernate.type.BasicTypeReference@26f204a4
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration vector -> org.hibernate.type.BasicTypeReference@28295554
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration row_version -> org.hibernate.type.BasicTypeReference@4e671ef
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration object -> org.hibernate.type.JavaObjectType@2aac6fa7
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Object -> org.hibernate.type.JavaObjectType@2aac6fa7
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration null -> org.hibernate.type.NullType@2358443e
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_date -> org.hibernate.type.BasicTypeReference@25e796fe
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_time -> org.hibernate.type.BasicTypeReference@29ba63f0
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_timestamp -> org.hibernate.type.BasicTypeReference@4822ab4d
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_calendar -> org.hibernate.type.BasicTypeReference@516b84d1
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_calendar_date -> org.hibernate.type.BasicTypeReference@1ad1f167
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_calendar_time -> org.hibernate.type.BasicTypeReference@608eb42e
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_binary -> org.hibernate.type.BasicTypeReference@3d2b13b1
2025-10-23 17:10:13 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_serializable -> org.hibernate.type.BasicTypeReference@30eb55c9
2025-10-23 17:10:13 [main] INFO o.s.o.j.p.SpringPersistenceUnitInfo - No LoadTimeWeaver setup: ignoring JPA class transformer
2025-10-23 17:10:13 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting...
2025-10-23 17:10:14 [main] WARN o.h.e.j.e.i.JdbcEnvironmentInitiator - HHH000342: Could not obtain connection to query metadata
java.lang.NullPointerException: Cannot invoke "org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(java.sql.SQLException, String)" because the return value of "org.hibernate.resource.transaction.backend.jdbc.internal.JdbcIsolationDelegate.sqlExceptionHelper()" is null
at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcIsolationDelegate.delegateWork(JdbcIsolationDelegate.java:116)
at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.getJdbcEnvironmentUsingJdbcMetadata(JdbcEnvironmentInitiator.java:290)
at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:123)
at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:77)
at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:130)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:263)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:238)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:215)
at org.hibernate.boot.model.relational.Database.<init>(Database.java:45)
at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.getDatabase(InFlightMetadataCollectorImpl.java:221)
at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.<init>(InFlightMetadataCollectorImpl.java:189)
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:171)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1431)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1502)
at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:75)
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:390)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396)
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:366)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1835)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1784)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:600)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:522)
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:337)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:335)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:205)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:952)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:624)
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:456)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:335)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1363)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1352)
at com.unicorn.hgzero.ai.AiApplication.main(AiApplication.java:20)
2025-10-23 17:10:14 [main] ERROR o.s.o.j.LocalContainerEntityManagerFactoryBean - Failed to initialize JPA EntityManagerFactory: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] due to: Unable to determine Dialect without JDBC metadata (please set 'jakarta.persistence.jdbc.url' for common cases or 'hibernate.dialect' when a custom Dialect implementation must be provided)
2025-10-23 17:10:14 [main] WARN o.s.b.w.s.c.AnnotationConfigServletWebServerApplicationContext - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] due to: Unable to determine Dialect without JDBC metadata (please set 'jakarta.persistence.jdbc.url' for common cases or 'hibernate.dialect' when a custom Dialect implementation must be provided)
2025-10-23 17:10:14 [main] INFO o.a.catalina.core.StandardService - Stopping service [Tomcat]
2025-10-23 17:10:14 [main] INFO o.s.b.a.l.ConditionEvaluationReportLogger -
Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled.
2025-10-23 17:10:14 [main] ERROR o.s.boot.SpringApplication - Application run failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] due to: Unable to determine Dialect without JDBC metadata (please set 'jakarta.persistence.jdbc.url' for common cases or 'hibernate.dialect' when a custom Dialect implementation must be provided)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1788)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:600)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:522)
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:337)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:335)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:205)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:952)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:624)
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:456)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:335)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1363)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1352)
at com.unicorn.hgzero.ai.AiApplication.main(AiApplication.java:20)
Caused by: org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] due to: Unable to determine Dialect without JDBC metadata (please set 'jakarta.persistence.jdbc.url' for common cases or 'hibernate.dialect' when a custom Dialect implementation must be provided)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:276)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:238)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:215)
at org.hibernate.boot.model.relational.Database.<init>(Database.java:45)
at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.getDatabase(InFlightMetadataCollectorImpl.java:221)
at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.<init>(InFlightMetadataCollectorImpl.java:189)
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:171)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1431)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1502)
at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:75)
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:390)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396)
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:366)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1835)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1784)
... 15 common frames omitted
Caused by: org.hibernate.HibernateException: Unable to determine Dialect without JDBC metadata (please set 'jakarta.persistence.jdbc.url' for common cases or 'hibernate.dialect' when a custom Dialect implementation must be provided)
at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.determineDialect(DialectFactoryImpl.java:191)
at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.buildDialect(DialectFactoryImpl.java:87)
at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.getJdbcEnvironmentWithDefaults(JdbcEnvironmentInitiator.java:152)
at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.getJdbcEnvironmentUsingJdbcMetadata(JdbcEnvironmentInitiator.java:362)
at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:123)
at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:77)
at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:130)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:263)
... 30 common frames omitted
2025-10-23 17:38:09 [main] INFO com.unicorn.hgzero.ai.AiApplication - Starting AiApplication using Java 23.0.2 with PID 49971 (/Users/jominseo/HGZero/ai/build/classes/java/main started by jominseo in /Users/jominseo/HGZero/ai)
2025-10-23 17:38:09 [main] DEBUG com.unicorn.hgzero.ai.AiApplication - Running with Spring Boot v3.3.0, Spring v6.1.8
2025-10-23 17:38:09 [main] INFO com.unicorn.hgzero.ai.AiApplication - The following 1 profile is active: "dev"
2025-10-23 17:38:09 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Multiple Spring Data modules found, entering strict repository configuration mode
2025-10-23 17:38:09 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Bootstrapping Spring Data JPA repositories in DEFAULT mode.
2025-10-23 17:38:09 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 4 ms. Found 0 JPA repository interfaces.
2025-10-23 17:38:09 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Multiple Spring Data modules found, entering strict repository configuration mode
2025-10-23 17:38:09 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Bootstrapping Spring Data Redis repositories in DEFAULT mode.
2025-10-23 17:38:09 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 0 ms. Found 0 Redis repository interfaces.
2025-10-23 17:38:09 [main] INFO o.s.b.w.e.tomcat.TomcatWebServer - Tomcat initialized with port 8083 (http)
2025-10-23 17:38:09 [main] INFO o.a.catalina.core.StandardService - Starting service [Tomcat]
2025-10-23 17:38:09 [main] INFO o.a.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/10.1.24]
2025-10-23 17:38:09 [main] INFO o.a.c.c.C.[Tomcat].[localhost].[/] - Initializing Spring embedded WebApplicationContext
2025-10-23 17:38:09 [main] INFO o.s.b.w.s.c.ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 679 ms
2025-10-23 17:38:10 [main] INFO o.h.jpa.internal.util.LogHelper - HHH000204: Processing PersistenceUnitInfo [name: default]
2025-10-23 17:38:10 [main] INFO org.hibernate.Version - HHH000412: Hibernate ORM core version 6.5.2.Final
2025-10-23 17:38:10 [main] INFO o.h.c.i.RegionFactoryInitiator - HHH000026: Second-level cache disabled
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration boolean -> org.hibernate.type.BasicTypeReference@306c9b2c
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration boolean -> org.hibernate.type.BasicTypeReference@306c9b2c
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Boolean -> org.hibernate.type.BasicTypeReference@306c9b2c
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration numeric_boolean -> org.hibernate.type.BasicTypeReference@1ab28416
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration org.hibernate.type.NumericBooleanConverter -> org.hibernate.type.BasicTypeReference@1ab28416
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration true_false -> org.hibernate.type.BasicTypeReference@52efb338
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration org.hibernate.type.TrueFalseConverter -> org.hibernate.type.BasicTypeReference@52efb338
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration yes_no -> org.hibernate.type.BasicTypeReference@64508788
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration org.hibernate.type.YesNoConverter -> org.hibernate.type.BasicTypeReference@64508788
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration byte -> org.hibernate.type.BasicTypeReference@30b1c5d5
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration byte -> org.hibernate.type.BasicTypeReference@30b1c5d5
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Byte -> org.hibernate.type.BasicTypeReference@30b1c5d5
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration binary -> org.hibernate.type.BasicTypeReference@3e2d65e1
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration byte[] -> org.hibernate.type.BasicTypeReference@3e2d65e1
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration [B -> org.hibernate.type.BasicTypeReference@3e2d65e1
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration binary_wrapper -> org.hibernate.type.BasicTypeReference@1174676f
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration wrapper-binary -> org.hibernate.type.BasicTypeReference@1174676f
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration image -> org.hibernate.type.BasicTypeReference@71f8ce0e
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration blob -> org.hibernate.type.BasicTypeReference@4fd92289
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.sql.Blob -> org.hibernate.type.BasicTypeReference@4fd92289
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_blob -> org.hibernate.type.BasicTypeReference@1a8e44fe
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_blob_wrapper -> org.hibernate.type.BasicTypeReference@287317df
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration short -> org.hibernate.type.BasicTypeReference@1fcc3461
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration short -> org.hibernate.type.BasicTypeReference@1fcc3461
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Short -> org.hibernate.type.BasicTypeReference@1fcc3461
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration integer -> org.hibernate.type.BasicTypeReference@1987807b
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration int -> org.hibernate.type.BasicTypeReference@1987807b
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Integer -> org.hibernate.type.BasicTypeReference@1987807b
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration long -> org.hibernate.type.BasicTypeReference@71469e01
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration long -> org.hibernate.type.BasicTypeReference@71469e01
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Long -> org.hibernate.type.BasicTypeReference@71469e01
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration float -> org.hibernate.type.BasicTypeReference@41bbb219
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration float -> org.hibernate.type.BasicTypeReference@41bbb219
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Float -> org.hibernate.type.BasicTypeReference@41bbb219
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration double -> org.hibernate.type.BasicTypeReference@3f2ae973
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration double -> org.hibernate.type.BasicTypeReference@3f2ae973
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Double -> org.hibernate.type.BasicTypeReference@3f2ae973
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration big_integer -> org.hibernate.type.BasicTypeReference@1a8b22b5
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.math.BigInteger -> org.hibernate.type.BasicTypeReference@1a8b22b5
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration big_decimal -> org.hibernate.type.BasicTypeReference@5f781173
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.math.BigDecimal -> org.hibernate.type.BasicTypeReference@5f781173
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration character -> org.hibernate.type.BasicTypeReference@43cf5bff
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration char -> org.hibernate.type.BasicTypeReference@43cf5bff
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Character -> org.hibernate.type.BasicTypeReference@43cf5bff
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration character_nchar -> org.hibernate.type.BasicTypeReference@2b464384
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration string -> org.hibernate.type.BasicTypeReference@681b42d3
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.String -> org.hibernate.type.BasicTypeReference@681b42d3
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration nstring -> org.hibernate.type.BasicTypeReference@77f7352a
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration characters -> org.hibernate.type.BasicTypeReference@4ede8888
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration char[] -> org.hibernate.type.BasicTypeReference@4ede8888
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration [C -> org.hibernate.type.BasicTypeReference@4ede8888
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration wrapper-characters -> org.hibernate.type.BasicTypeReference@571db8b4
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration text -> org.hibernate.type.BasicTypeReference@65a2755e
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration ntext -> org.hibernate.type.BasicTypeReference@2b3242a5
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration clob -> org.hibernate.type.BasicTypeReference@11120583
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.sql.Clob -> org.hibernate.type.BasicTypeReference@11120583
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration nclob -> org.hibernate.type.BasicTypeReference@2bf0c70d
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.sql.NClob -> org.hibernate.type.BasicTypeReference@2bf0c70d
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_clob -> org.hibernate.type.BasicTypeReference@5d8e4fa8
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_clob_char_array -> org.hibernate.type.BasicTypeReference@649009d6
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_clob_character_array -> org.hibernate.type.BasicTypeReference@652f26da
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_nclob -> org.hibernate.type.BasicTypeReference@484a5ddd
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_nclob_character_array -> org.hibernate.type.BasicTypeReference@6796a873
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_nclob_char_array -> org.hibernate.type.BasicTypeReference@3acc3ee
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration Duration -> org.hibernate.type.BasicTypeReference@1f293cb7
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.Duration -> org.hibernate.type.BasicTypeReference@1f293cb7
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration LocalDateTime -> org.hibernate.type.BasicTypeReference@5972e3a
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.LocalDateTime -> org.hibernate.type.BasicTypeReference@5972e3a
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration LocalDate -> org.hibernate.type.BasicTypeReference@5790cbcb
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.LocalDate -> org.hibernate.type.BasicTypeReference@5790cbcb
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration LocalTime -> org.hibernate.type.BasicTypeReference@32c6d164
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.LocalTime -> org.hibernate.type.BasicTypeReference@32c6d164
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetDateTime -> org.hibernate.type.BasicTypeReference@645c9f0f
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.OffsetDateTime -> org.hibernate.type.BasicTypeReference@645c9f0f
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetDateTimeWithTimezone -> org.hibernate.type.BasicTypeReference@58068b40
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetDateTimeWithoutTimezone -> org.hibernate.type.BasicTypeReference@999cd18
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetTime -> org.hibernate.type.BasicTypeReference@dd060be
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.OffsetTime -> org.hibernate.type.BasicTypeReference@dd060be
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetTimeUtc -> org.hibernate.type.BasicTypeReference@df432ec
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetTimeWithTimezone -> org.hibernate.type.BasicTypeReference@6144e499
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetTimeWithoutTimezone -> org.hibernate.type.BasicTypeReference@26f204a4
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration ZonedDateTime -> org.hibernate.type.BasicTypeReference@28295554
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.ZonedDateTime -> org.hibernate.type.BasicTypeReference@28295554
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration ZonedDateTimeWithTimezone -> org.hibernate.type.BasicTypeReference@4e671ef
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration ZonedDateTimeWithoutTimezone -> org.hibernate.type.BasicTypeReference@42403dc6
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration date -> org.hibernate.type.BasicTypeReference@74a1d60e
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.sql.Date -> org.hibernate.type.BasicTypeReference@74a1d60e
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration time -> org.hibernate.type.BasicTypeReference@16c0be3b
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.sql.Time -> org.hibernate.type.BasicTypeReference@16c0be3b
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration timestamp -> org.hibernate.type.BasicTypeReference@219edc05
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.sql.Timestamp -> org.hibernate.type.BasicTypeReference@219edc05
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.util.Date -> org.hibernate.type.BasicTypeReference@219edc05
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration calendar -> org.hibernate.type.BasicTypeReference@62f37bfd
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.util.Calendar -> org.hibernate.type.BasicTypeReference@62f37bfd
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.util.GregorianCalendar -> org.hibernate.type.BasicTypeReference@62f37bfd
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration calendar_date -> org.hibernate.type.BasicTypeReference@1818d00b
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration calendar_time -> org.hibernate.type.BasicTypeReference@b3a8455
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration instant -> org.hibernate.type.BasicTypeReference@5c930fc3
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.Instant -> org.hibernate.type.BasicTypeReference@5c930fc3
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration uuid -> org.hibernate.type.BasicTypeReference@25c6ab3f
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.util.UUID -> org.hibernate.type.BasicTypeReference@25c6ab3f
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration pg-uuid -> org.hibernate.type.BasicTypeReference@25c6ab3f
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration uuid-binary -> org.hibernate.type.BasicTypeReference@7b80af04
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration uuid-char -> org.hibernate.type.BasicTypeReference@2447940d
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration class -> org.hibernate.type.BasicTypeReference@60ee7a51
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Class -> org.hibernate.type.BasicTypeReference@60ee7a51
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration currency -> org.hibernate.type.BasicTypeReference@70e1aa20
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration Currency -> org.hibernate.type.BasicTypeReference@70e1aa20
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.util.Currency -> org.hibernate.type.BasicTypeReference@70e1aa20
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration locale -> org.hibernate.type.BasicTypeReference@e67d3b7
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.util.Locale -> org.hibernate.type.BasicTypeReference@e67d3b7
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration serializable -> org.hibernate.type.BasicTypeReference@1618c98a
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.io.Serializable -> org.hibernate.type.BasicTypeReference@1618c98a
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration timezone -> org.hibernate.type.BasicTypeReference@5b715ea
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.util.TimeZone -> org.hibernate.type.BasicTypeReference@5b715ea
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration ZoneOffset -> org.hibernate.type.BasicTypeReference@787a0fd6
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.ZoneOffset -> org.hibernate.type.BasicTypeReference@787a0fd6
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration url -> org.hibernate.type.BasicTypeReference@48b09105
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.net.URL -> org.hibernate.type.BasicTypeReference@48b09105
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration vector -> org.hibernate.type.BasicTypeReference@18b45500
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration row_version -> org.hibernate.type.BasicTypeReference@25110bb9
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration object -> org.hibernate.type.JavaObjectType@30eb55c9
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Object -> org.hibernate.type.JavaObjectType@30eb55c9
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration null -> org.hibernate.type.NullType@5badeda0
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_date -> org.hibernate.type.BasicTypeReference@56a9a7b5
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_time -> org.hibernate.type.BasicTypeReference@338270ea
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_timestamp -> org.hibernate.type.BasicTypeReference@7f64bd7
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_calendar -> org.hibernate.type.BasicTypeReference@1c79d093
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_calendar_date -> org.hibernate.type.BasicTypeReference@746fd19b
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_calendar_time -> org.hibernate.type.BasicTypeReference@54caeadc
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_binary -> org.hibernate.type.BasicTypeReference@61d7bb61
2025-10-23 17:38:10 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_serializable -> org.hibernate.type.BasicTypeReference@33f81280
2025-10-23 17:38:10 [main] INFO o.s.o.j.p.SpringPersistenceUnitInfo - No LoadTimeWeaver setup: ignoring JPA class transformer
2025-10-23 17:38:10 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting...
2025-10-23 17:38:11 [main] WARN o.h.e.j.e.i.JdbcEnvironmentInitiator - HHH000342: Could not obtain connection to query metadata
java.lang.NullPointerException: Cannot invoke "org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(java.sql.SQLException, String)" because the return value of "org.hibernate.resource.transaction.backend.jdbc.internal.JdbcIsolationDelegate.sqlExceptionHelper()" is null
at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcIsolationDelegate.delegateWork(JdbcIsolationDelegate.java:116)
at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.getJdbcEnvironmentUsingJdbcMetadata(JdbcEnvironmentInitiator.java:290)
at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:123)
at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:77)
at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:130)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:263)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:238)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:215)
at org.hibernate.boot.model.relational.Database.<init>(Database.java:45)
at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.getDatabase(InFlightMetadataCollectorImpl.java:221)
at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.<init>(InFlightMetadataCollectorImpl.java:189)
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:171)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1431)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1502)
at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:75)
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:390)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396)
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:366)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1835)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1784)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:600)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:522)
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:337)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:335)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:205)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:952)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:624)
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:456)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:335)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1363)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1352)
at com.unicorn.hgzero.ai.AiApplication.main(AiApplication.java:20)
2025-10-23 17:38:11 [main] ERROR o.s.o.j.LocalContainerEntityManagerFactoryBean - Failed to initialize JPA EntityManagerFactory: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] due to: Unable to determine Dialect without JDBC metadata (please set 'jakarta.persistence.jdbc.url' for common cases or 'hibernate.dialect' when a custom Dialect implementation must be provided)
2025-10-23 17:38:11 [main] WARN o.s.b.w.s.c.AnnotationConfigServletWebServerApplicationContext - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] due to: Unable to determine Dialect without JDBC metadata (please set 'jakarta.persistence.jdbc.url' for common cases or 'hibernate.dialect' when a custom Dialect implementation must be provided)
2025-10-23 17:38:11 [main] INFO o.a.catalina.core.StandardService - Stopping service [Tomcat]
2025-10-23 17:38:11 [main] INFO o.s.b.a.l.ConditionEvaluationReportLogger -
Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled.
2025-10-23 17:38:11 [main] ERROR o.s.boot.SpringApplication - Application run failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] due to: Unable to determine Dialect without JDBC metadata (please set 'jakarta.persistence.jdbc.url' for common cases or 'hibernate.dialect' when a custom Dialect implementation must be provided)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1788)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:600)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:522)
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:337)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:335)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:205)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:952)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:624)
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:456)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:335)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1363)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1352)
at com.unicorn.hgzero.ai.AiApplication.main(AiApplication.java:20)
Caused by: org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] due to: Unable to determine Dialect without JDBC metadata (please set 'jakarta.persistence.jdbc.url' for common cases or 'hibernate.dialect' when a custom Dialect implementation must be provided)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:276)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:238)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:215)
at org.hibernate.boot.model.relational.Database.<init>(Database.java:45)
at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.getDatabase(InFlightMetadataCollectorImpl.java:221)
at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.<init>(InFlightMetadataCollectorImpl.java:189)
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:171)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1431)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1502)
at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:75)
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:390)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396)
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:366)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1835)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1784)
... 15 common frames omitted
Caused by: org.hibernate.HibernateException: Unable to determine Dialect without JDBC metadata (please set 'jakarta.persistence.jdbc.url' for common cases or 'hibernate.dialect' when a custom Dialect implementation must be provided)
at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.determineDialect(DialectFactoryImpl.java:191)
at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.buildDialect(DialectFactoryImpl.java:87)
at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.getJdbcEnvironmentWithDefaults(JdbcEnvironmentInitiator.java:152)
at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.getJdbcEnvironmentUsingJdbcMetadata(JdbcEnvironmentInitiator.java:362)
at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:123)
at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:77)
at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:130)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:263)
... 30 common frames omitted

File diff suppressed because one or more lines are too long

View File

@ -7,14 +7,12 @@ info:
**핵심 기능:** **핵심 기능:**
- 음성 녹음 시작/중지 관리 - 음성 녹음 시작/중지 관리
- 실시간 음성-텍스트 변환 (스트리밍) - 실시간 음성-텍스트 변환 (스트리밍)
- 배치 음성-텍스트 변환
- 화자 식별 및 관리
- Azure Speech Service 통합 - Azure Speech Service 통합
**차별화 포인트:** **차별화 포인트:**
- 기본 기능 (Hygiene Factor) - 경쟁사 대부분 제공 - 기본 기능 (Hygiene Factor) - 경쟁사 대부분 제공
- 실시간 스트리밍 처리로 즉각적인 자막 제공 - 실시간 스트리밍 처리로 즉각적인 자막 제공
- 화자 자동 식별 (90% 이상 정확도) - **단순화**: 배치 처리 및 화자 식별 제거, 실시간 전용 기능
version: 1.0.0 version: 1.0.0
contact: contact:
name: STT Service Team name: STT Service Team
@ -25,7 +23,7 @@ servers:
description: Production Server description: Production Server
- url: https://dev-api.example.com/stt/v1 - url: https://dev-api.example.com/stt/v1
description: Development Server description: Development Server
- url: http://localhost:8083/api/v1 - url: http://localhost:8084/api/v1
description: Local Development Server description: Local Development Server
tags: tags:
@ -33,8 +31,6 @@ tags:
description: 음성 녹음 관리 API description: 음성 녹음 관리 API
- name: Transcription - name: Transcription
description: 음성-텍스트 변환 API description: 음성-텍스트 변환 API
- name: Speaker
description: 화자 식별 및 관리 API
paths: paths:
/recordings/prepare: /recordings/prepare:
@ -50,7 +46,7 @@ paths:
2. DB에 녹음 정보 생성 2. DB에 녹음 정보 생성
3. Azure Speech 인식기 초기화 3. Azure Speech 인식기 초기화
4. Blob Storage 저장 경로 생성 4. Blob Storage 저장 경로 생성
5. RecordingStarted 이벤트 발행 5. RecordingStarted 이벤트 발행 (Kafka)
operationId: prepareRecording operationId: prepareRecording
x-user-story: UFR-STT-010 x-user-story: UFR-STT-010
x-controller: RecordingController x-controller: RecordingController
@ -243,15 +239,14 @@ paths:
**처리 흐름:** **처리 흐름:**
1. 음성 데이터 스트림 수신 1. 음성 데이터 스트림 수신
2. Azure Speech Service 실시간 인식 2. Azure Speech Service 실시간 인식
3. 화자 식별 3. 신뢰도 검증 (70% threshold)
4. 신뢰도 검증 (70% threshold) 4. DB에 세그먼트 저장
5. DB에 세그먼트 저장 5. TranscriptSegmentReady 이벤트 발행 (Kafka)
6. TranscriptSegmentReady 이벤트 발행 6. WebSocket으로 실시간 자막 전송
7. WebSocket으로 실시간 자막 전송
**성능:** **성능:**
- 실시간 인식 지연: < 1초 - 실시간 인식 지연: < 1초
- 처리 시간: 1-4 - 처리 시간: 1-3
operationId: streamTranscription operationId: streamTranscription
x-user-story: UFR-STT-020 x-user-story: UFR-STT-020
x-controller: TranscriptController x-controller: TranscriptController
@ -277,8 +272,6 @@ paths:
transcriptId: "TRS-SEG-001" transcriptId: "TRS-SEG-001"
recordingId: "REC-20250123-001" recordingId: "REC-20250123-001"
text: "안녕하세요, 오늘 회의를 시작하겠습니다." text: "안녕하세요, 오늘 회의를 시작하겠습니다."
speakerId: "SPK-001"
speakerName: "김철수"
timestamp: 1234567890 timestamp: 1234567890
duration: 3.5 duration: 3.5
confidence: 0.92 confidence: 0.92
@ -290,94 +283,6 @@ paths:
security: security:
- BearerAuth: [] - BearerAuth: []
/transcripts/batch:
post:
tags:
- Transcription
summary: 배치 음성-텍스트 변환
description: |
전체 오디오 파일을 배치로 변환 (비동기 처리)
**처리 흐름:**
1. 전체 오디오 파일 업로드
2. Azure Batch Transcription Job 생성
3. 비동기 처리 시작
4. Job ID 반환 (202 Accepted)
5. 처리 완료 시 Callback으로 결과 수신
**처리 시간:**
- 파일 업로드: 1-2초
- Azure 배치 처리: 5-30초 (파일 크기 따라)
- 총 처리 시간: 7-33초
operationId: batchTranscription
x-user-story: UFR-STT-020
x-controller: TranscriptController
requestBody:
required: true
content:
multipart/form-data:
schema:
$ref: '#/components/schemas/BatchTranscriptionRequest'
responses:
'202':
description: 배치 작업 접수됨
content:
application/json:
schema:
$ref: '#/components/schemas/BatchTranscriptionResponse'
example:
jobId: "JOB-20250123-001"
recordingId: "REC-20250123-001"
status: "PROCESSING"
estimatedCompletionTime: "2025-01-23T10:31:00Z"
callbackUrl: "https://api.example.com/stt/v1/transcripts/callback"
'400':
$ref: '#/components/responses/BadRequest'
'500':
$ref: '#/components/responses/InternalServerError'
security:
- BearerAuth: []
/transcripts/callback:
post:
tags:
- Transcription
summary: 배치 변환 완료 콜백
description: |
Azure Speech Service로부터 배치 변환 완료 콜백 수신
**처리 흐름:**
1. 배치 결과 수신
2. 세그먼트별 DB 저장
3. 전체 텍스트 병합
4. TranscriptionCompleted 이벤트 발행
operationId: batchTranscriptionCallback
x-user-story: UFR-STT-020
x-controller: TranscriptController
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/BatchCallbackRequest'
responses:
'200':
description: 콜백 처리 성공
content:
application/json:
schema:
$ref: '#/components/schemas/TranscriptionCompleteResponse'
example:
jobId: "JOB-20250123-001"
recordingId: "REC-20250123-001"
status: "COMPLETED"
segmentCount: 120
totalDuration: 1800
averageConfidence: 0.88
'400':
$ref: '#/components/responses/BadRequest'
'500':
$ref: '#/components/responses/InternalServerError'
/transcripts/{recordingId}: /transcripts/{recordingId}:
get: get:
@ -389,7 +294,7 @@ paths:
**응답 데이터:** **응답 데이터:**
- 전체 텍스트 - 전체 텍스트
- 화자별 세그먼트 목록 - 세그먼트 목록
- 타임스탬프 정보 - 타임스탬프 정보
- 신뢰도 점수 - 신뢰도 점수
operationId: getTranscription operationId: getTranscription
@ -404,13 +309,6 @@ paths:
schema: schema:
type: boolean type: boolean
default: false default: false
- name: speakerId
in: query
description: 특정 화자의 발언만 필터링
required: false
schema:
type: string
example: "SPK-001"
responses: responses:
'200': '200':
description: 변환 텍스트 조회 성공 description: 변환 텍스트 조회 성공
@ -420,16 +318,13 @@ paths:
$ref: '#/components/schemas/TranscriptionResponse' $ref: '#/components/schemas/TranscriptionResponse'
example: example:
recordingId: "REC-20250123-001" recordingId: "REC-20250123-001"
fullText: "김철수: 안녕하세요...\n이영희: 네, 안녕하세요..." fullText: "안녕하세요, 오늘 회의를 시작하겠습니다..."
segmentCount: 120 segmentCount: 120
totalDuration: 1800 totalDuration: 1800
averageConfidence: 0.88 averageConfidence: 0.88
speakerCount: 3
segments: segments:
- transcriptId: "TRS-SEG-001" - transcriptId: "TRS-SEG-001"
text: "안녕하세요, 오늘 회의를 시작하겠습니다." text: "안녕하세요, 오늘 회의를 시작하겠습니다."
speakerId: "SPK-001"
speakerName: "김철수"
timestamp: 0 timestamp: 0
duration: 3.5 duration: 3.5
confidence: 0.92 confidence: 0.92
@ -440,179 +335,6 @@ paths:
security: security:
- BearerAuth: [] - BearerAuth: []
/speakers/identify:
post:
tags:
- Speaker
summary: 화자 식별
description: |
음성 데이터로부터 화자 식별
**처리 흐름:**
1. Voice signature 생성
2. 기존 프로필과 매칭
3. 신규 화자 자동 등록
4. 화자 정보 반환
**정확도:**
- 화자 식별 정확도: > 90%
- 처리 시간: ~300ms
operationId: identifySpeaker
x-user-story: UFR-STT-010
x-controller: SpeakerController
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/IdentifySpeakerRequest'
example:
recordingId: "REC-20250123-001"
audioFrame: "base64_encoded_audio_frame"
timestamp: 1234567890
responses:
'200':
description: 화자 식별 성공
content:
application/json:
schema:
$ref: '#/components/schemas/SpeakerIdentificationResponse'
example:
speakerId: "SPK-001"
speakerName: "김철수"
confidence: 0.95
isNewSpeaker: false
profileId: "PROFILE-12345"
'400':
$ref: '#/components/responses/BadRequest'
'500':
$ref: '#/components/responses/InternalServerError'
security:
- BearerAuth: []
/speakers/{speakerId}:
get:
tags:
- Speaker
summary: 화자 정보 조회
description: 특정 화자의 상세 정보 조회
operationId: getSpeaker
x-user-story: UFR-STT-010
x-controller: SpeakerController
parameters:
- name: speakerId
in: path
description: 화자 ID
required: true
schema:
type: string
example: "SPK-001"
responses:
'200':
description: 화자 정보 조회 성공
content:
application/json:
schema:
$ref: '#/components/schemas/SpeakerDetailResponse'
example:
speakerId: "SPK-001"
speakerName: "김철수"
profileId: "PROFILE-12345"
totalSegments: 45
totalDuration: 450
averageConfidence: 0.92
firstAppeared: "2025-01-23T10:30:15Z"
lastAppeared: "2025-01-23T11:00:00Z"
'404':
$ref: '#/components/responses/NotFound'
'500':
$ref: '#/components/responses/InternalServerError'
security:
- BearerAuth: []
put:
tags:
- Speaker
summary: 화자 정보 업데이트
description: 화자 이름 등 정보 수정
operationId: updateSpeaker
x-user-story: UFR-STT-010
x-controller: SpeakerController
parameters:
- name: speakerId
in: path
description: 화자 ID
required: true
schema:
type: string
example: "SPK-001"
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/UpdateSpeakerRequest'
example:
speakerName: "김철수 팀장"
userId: "USER-123"
responses:
'200':
description: 화자 정보 업데이트 성공
content:
application/json:
schema:
$ref: '#/components/schemas/SpeakerDetailResponse'
'404':
$ref: '#/components/responses/NotFound'
'500':
$ref: '#/components/responses/InternalServerError'
security:
- BearerAuth: []
/recordings/{recordingId}/speakers:
get:
tags:
- Speaker
summary: 녹음의 화자 목록 조회
description: 특정 녹음에 참여한 모든 화자 목록 조회
operationId: getRecordingSpeakers
x-user-story: UFR-STT-010
x-controller: SpeakerController
parameters:
- $ref: '#/components/parameters/RecordingIdParam'
responses:
'200':
description: 화자 목록 조회 성공
content:
application/json:
schema:
$ref: '#/components/schemas/SpeakerListResponse'
example:
recordingId: "REC-20250123-001"
speakerCount: 3
speakers:
- speakerId: "SPK-001"
speakerName: "김철수"
segmentCount: 45
totalDuration: 450
speakingRatio: 0.45
- speakerId: "SPK-002"
speakerName: "이영희"
segmentCount: 38
totalDuration: 380
speakingRatio: 0.38
- speakerId: "SPK-003"
speakerName: "박민수"
segmentCount: 17
totalDuration: 170
speakingRatio: 0.17
'404':
$ref: '#/components/responses/NotFound'
'500':
$ref: '#/components/responses/InternalServerError'
security:
- BearerAuth: []
components: components:
securitySchemes: securitySchemes:
BearerAuth: BearerAuth:
@ -657,7 +379,7 @@ components:
example: "ko-KR" example: "ko-KR"
attendeeCount: attendeeCount:
type: integer type: integer
description: 참석자 수 (화자 식별 최적화용) description: 참석자 수
minimum: 1 minimum: 1
maximum: 50 maximum: 50
example: 5 example: 5
@ -809,10 +531,6 @@ components:
type: integer type: integer
description: 녹음 시간 (초) description: 녹음 시간 (초)
example: 300 example: 300
speakerCount:
type: integer
description: 화자 수
example: 3
segmentCount: segmentCount:
type: integer type: integer
description: 세그먼트 수 description: 세그먼트 수
@ -866,14 +584,6 @@ components:
type: string type: string
description: 변환된 텍스트 description: 변환된 텍스트
example: "안녕하세요, 오늘 회의를 시작하겠습니다." example: "안녕하세요, 오늘 회의를 시작하겠습니다."
speakerId:
type: string
description: 화자 ID
example: "SPK-001"
speakerName:
type: string
description: 화자 이름
example: "김철수"
timestamp: timestamp:
type: integer type: integer
description: 타임스탬프 (ms) description: 타임스탬프 (ms)
@ -895,89 +605,6 @@ components:
description: 낮은 신뢰도 경고 플래그 (< 60%) description: 낮은 신뢰도 경고 플래그 (< 60%)
example: false example: false
BatchTranscriptionRequest:
type: object
required:
- recordingId
- audioFile
properties:
recordingId:
type: string
description: 녹음 ID
example: "REC-20250123-001"
audioFile:
type: string
format: binary
description: 오디오 파일 (WAV, MP3 등)
language:
type: string
description: 음성 인식 언어
default: "ko-KR"
example: "ko-KR"
callbackUrl:
type: string
format: uri
description: 처리 완료 콜백 URL
example: "https://api.example.com/stt/v1/transcripts/callback"
BatchTranscriptionResponse:
type: object
properties:
jobId:
type: string
description: 배치 작업 ID
example: "JOB-20250123-001"
recordingId:
type: string
description: 녹음 ID
example: "REC-20250123-001"
status:
type: string
description: 작업 상태
enum:
- QUEUED
- PROCESSING
- COMPLETED
- FAILED
example: "PROCESSING"
estimatedCompletionTime:
type: string
format: date-time
description: 예상 완료 시간
example: "2025-01-23T10:31:00Z"
callbackUrl:
type: string
format: uri
description: 콜백 URL
example: "https://api.example.com/stt/v1/transcripts/callback"
BatchCallbackRequest:
type: object
required:
- jobId
- status
- segments
properties:
jobId:
type: string
description: 배치 작업 ID
example: "JOB-20250123-001"
status:
type: string
description: 작업 상태
enum:
- COMPLETED
- FAILED
example: "COMPLETED"
segments:
type: array
description: 변환 세그먼트 목록
items:
$ref: '#/components/schemas/TranscriptionSegment'
error:
type: string
description: 오류 메시지 (실패 시)
example: "Audio file format not supported"
TranscriptionSegment: TranscriptionSegment:
type: object type: object
@ -986,10 +613,6 @@ components:
type: string type: string
description: 변환된 텍스트 description: 변환된 텍스트
example: "안녕하세요, 오늘 회의를 시작하겠습니다." example: "안녕하세요, 오늘 회의를 시작하겠습니다."
speakerId:
type: string
description: 화자 ID
example: "SPK-001"
timestamp: timestamp:
type: integer type: integer
description: 시작 타임스탬프 (ms) description: 시작 타임스탬프 (ms)
@ -1061,10 +684,6 @@ components:
format: float format: float
description: 평균 신뢰도 점수 description: 평균 신뢰도 점수
example: 0.88 example: 0.88
speakerCount:
type: integer
description: 화자 수
example: 3
segments: segments:
type: array type: array
description: 세그먼트 목록 description: 세그먼트 목록
@ -1082,14 +701,6 @@ components:
type: string type: string
description: 변환된 텍스트 description: 변환된 텍스트
example: "안녕하세요, 오늘 회의를 시작하겠습니다." example: "안녕하세요, 오늘 회의를 시작하겠습니다."
speakerId:
type: string
description: 화자 ID
example: "SPK-001"
speakerName:
type: string
description: 화자 이름
example: "김철수"
timestamp: timestamp:
type: integer type: integer
description: 타임스탬프 (ms) description: 타임스탬프 (ms)
@ -1105,151 +716,6 @@ components:
description: 신뢰도 점수 description: 신뢰도 점수
example: 0.92 example: 0.92
IdentifySpeakerRequest:
type: object
required:
- recordingId
- audioFrame
- timestamp
properties:
recordingId:
type: string
description: 녹음 ID
example: "REC-20250123-001"
audioFrame:
type: string
format: byte
description: Base64 인코딩된 오디오 프레임
example: "UklGRiQAAABXQVZFZm10IBAAAAABA..."
timestamp:
type: integer
description: 타임스탬프 (ms)
example: 1234567890
SpeakerIdentificationResponse:
type: object
properties:
speakerId:
type: string
description: 화자 ID
example: "SPK-001"
speakerName:
type: string
description: 화자 이름
example: "김철수"
confidence:
type: number
format: float
description: 식별 신뢰도 (0-1)
minimum: 0
maximum: 1
example: 0.95
isNewSpeaker:
type: boolean
description: 신규 화자 여부
example: false
profileId:
type: string
description: Azure Speaker Profile ID
example: "PROFILE-12345"
SpeakerDetailResponse:
type: object
properties:
speakerId:
type: string
description: 화자 ID
example: "SPK-001"
speakerName:
type: string
description: 화자 이름
example: "김철수"
profileId:
type: string
description: Azure Speaker Profile ID
example: "PROFILE-12345"
userId:
type: string
description: 연결된 사용자 ID
example: "USER-123"
totalSegments:
type: integer
description: 총 발언 세그먼트 수
example: 45
totalDuration:
type: integer
description: 총 발언 시간 (초)
example: 450
averageConfidence:
type: number
format: float
description: 평균 식별 신뢰도
example: 0.92
firstAppeared:
type: string
format: date-time
description: 최초 등장 시간
example: "2025-01-23T10:30:15Z"
lastAppeared:
type: string
format: date-time
description: 최근 등장 시간
example: "2025-01-23T11:00:00Z"
UpdateSpeakerRequest:
type: object
properties:
speakerName:
type: string
description: 화자 이름
example: "김철수 팀장"
userId:
type: string
description: 연결할 사용자 ID
example: "USER-123"
SpeakerListResponse:
type: object
properties:
recordingId:
type: string
description: 녹음 ID
example: "REC-20250123-001"
speakerCount:
type: integer
description: 화자 수
example: 3
speakers:
type: array
description: 화자 목록
items:
$ref: '#/components/schemas/SpeakerSummary'
SpeakerSummary:
type: object
properties:
speakerId:
type: string
description: 화자 ID
example: "SPK-001"
speakerName:
type: string
description: 화자 이름
example: "김철수"
segmentCount:
type: integer
description: 발언 세그먼트 수
example: 45
totalDuration:
type: integer
description: 총 발언 시간 (초)
example: 450
speakingRatio:
type: number
format: float
description: 발언 비율 (0-1)
example: 0.45
ErrorResponse: ErrorResponse:
type: object type: object
properties: properties:

View File

@ -1,14 +1,13 @@
@startuml @startuml
!theme mono !theme mono
title STT Service - 음성 녹음 시작 및 화자 인식 (통합) title STT Service - 음성 녹음 시작 및 실시간 인식
participant "Frontend<<E>>" as Frontend participant "Frontend<<E>>" as Frontend
participant "API Gateway<<E>>" as Gateway participant "API Gateway<<E>>" as Gateway
participant "RecordingController" as Controller participant "RecordingController" as Controller
participant "RecordingService" as Service participant "RecordingService" as Service
participant "AudioStreamManager" as StreamManager participant "AudioStreamManager" as StreamManager
participant "SpeakerIdentifier" as Speaker
participant "RecordingRepository" as Repository participant "RecordingRepository" as Repository
participant "AzureSpeechClient" as AzureClient participant "AzureSpeechClient" as AzureClient
database "STT DB" as DB database "STT DB" as DB
@ -51,7 +50,6 @@ note right
- 언어: ko-KR - 언어: ko-KR
- Format: PCM 16kHz - Format: PCM 16kHz
- 샘플레이트: 16kHz - 샘플레이트: 16kHz
- 화자 식별 활성화
- 실시간 스트리밍 모드 - 실시간 스트리밍 모드
- Continuous recognition - Continuous recognition
end note end note
@ -108,32 +106,12 @@ deactivate AzureClient
StreamManager --> Service: recognized text StreamManager --> Service: recognized text
deactivate StreamManager deactivate StreamManager
== 화자 식별 == == 세그먼트 저장 ==
Service -> Speaker: identifySpeaker(audioFrame)
activate Speaker
Speaker -> AzureClient: analyzeSpeakerProfile()\n(Speaker Recognition API)
activate AzureClient
note right
화자 식별:
- Voice signature 생성
- 기존 프로필과 매칭
- 신규 화자 자동 등록
end note
AzureClient --> Speaker: speakerId
deactivate AzureClient
Speaker --> Service: speaker info
deactivate Speaker
== 화자별 세그먼트 저장 ==
Service -> Repository: saveSttSegment(segment) Service -> Repository: saveSttSegment(segment)
activate Repository activate Repository
Repository -> DB: STT 세그먼트 저장\n(세션ID, 텍스트, 화자ID, 타임스탬프, 신뢰도) Repository -> DB: STT 세그먼트 저장\n(세션ID, 텍스트, 타임스탬프, 신뢰도)
activate DB activate DB
DB --> Repository: segment saved DB --> Repository: segment saved
deactivate DB deactivate DB
@ -141,24 +119,13 @@ deactivate DB
Repository --> Service: saved Repository --> Service: saved
deactivate Repository deactivate Repository
Service -> Repository: updateSpeakerInfo(recordingId, speakerId) Service --> Controller: streaming response\n{text, timestamp, confidence}
activate Repository
Repository -> DB: 화자 정보 저장/업데이트\n(녹음ID, 화자ID, 세그먼트수)
activate DB
DB --> Repository: 업데이트 완료
deactivate DB
Repository --> Service: 완료
deactivate Repository
Service --> Controller: streaming response\n{text, speaker, timestamp, confidence}
deactivate Service deactivate Service
Controller --> Gateway: WebSocket message Controller --> Gateway: WebSocket message
deactivate Controller deactivate Controller
Gateway --> Frontend: 실시간 자막 전송\n{text, speaker, timestamp} Gateway --> Frontend: 실시간 자막 전송\n{text, timestamp}
deactivate Gateway deactivate Gateway
note over Frontend, EventHub note over Frontend, EventHub
@ -166,12 +133,10 @@ note over Frontend, EventHub
- DB 녹음 생성: ~100ms - DB 녹음 생성: ~100ms
- Azure 인식기 초기화: ~500ms - Azure 인식기 초기화: ~500ms
- Blob 경로 생성: ~200ms - Blob 경로 생성: ~200ms
- 화자 식별: ~300ms
- 실시간 인식 지연: < 1초 - 실시간 인식 지연: < 1초
- 총 초기화 시간: ~1.1 - 총 초기화 시간: ~0.8
정확도: 정확도:
- 화자 식별 정확도: > 90%
- 음성 인식 정확도: 60-95% - 음성 인식 정확도: 60-95%
end note end note

View File

@ -1,7 +1,7 @@
@startuml @startuml
!theme mono !theme mono
title STT Service - 음성-텍스트 변환 (실시간/배치 통합) title STT Service - 음성-텍스트 변환 (실시간 전용)
participant "Frontend<<E>>" as Frontend participant "Frontend<<E>>" as Frontend
participant "API Gateway<<E>>" as Gateway participant "API Gateway<<E>>" as Gateway
@ -15,7 +15,7 @@ database "STT DB" as DB
database "Azure Blob Storage<<E>>" as BlobStorage database "Azure Blob Storage<<E>>" as BlobStorage
queue "Azure Event Hubs<<E>>" as EventHub queue "Azure Event Hubs<<E>>" as EventHub
== 음성 데이터 스트리밍 수신 (실시간 모드) == == 음성 데이터 스트리밍 수신 ==
Frontend -> Gateway: POST /api/transcripts/stream\n(audioData, recordingId, timestamp) Frontend -> Gateway: POST /api/transcripts/stream\n(audioData, recordingId, timestamp)
activate Gateway activate Gateway
@ -26,9 +26,8 @@ activate Controller
Controller -> Service: processAudioStream(audioData, recordingId) Controller -> Service: processAudioStream(audioData, recordingId)
activate Service activate Service
alt 실시간 변환 모드 Service -> Engine: streamingTranscribe(audioData)
Service -> Engine: streamingTranscribe(audioData) activate Engine
activate Engine
Engine -> AzureClient: recognizeAsync(audioData) Engine -> AzureClient: recognizeAsync(audioData)
activate AzureClient activate AzureClient
@ -38,7 +37,6 @@ alt 실시간 변환 모드
Azure Speech 설정: Azure Speech 설정:
- Mode: Continuous - Mode: Continuous
- 언어: ko-KR - 언어: ko-KR
- 화자 식별 활성화
- 타임스탬프 자동 기록 - 타임스탬프 자동 기록
- 신뢰도 점수 계산 - 신뢰도 점수 계산
- Profanity filter - Profanity filter
@ -49,7 +47,7 @@ alt 실시간 변환 모드
BlobStorage --> AzureClient: 저장 완료 BlobStorage --> AzureClient: 저장 완료
deactivate BlobStorage deactivate BlobStorage
AzureClient --> Engine: RecognitionResult\n(text, speakerId, confidence, timestamp, duration) AzureClient --> Engine: RecognitionResult\n(text, confidence, timestamp, duration)
deactivate AzureClient deactivate AzureClient
== 정확도 검증 및 처리 == == 정확도 검증 및 처리 ==
@ -71,7 +69,7 @@ alt 실시간 변환 모드
Service -> TranscriptRepo: createTranscript(recordingId, segment) Service -> TranscriptRepo: createTranscript(recordingId, segment)
activate TranscriptRepo activate TranscriptRepo
TranscriptRepo -> DB: 변환 결과 저장\n(텍스트ID, 녹음ID, 화자ID, 텍스트, 신뢰도, 타임스탬프, 경고플래그) TranscriptRepo -> DB: 변환 결과 저장\n(텍스트ID, 녹음ID, 텍스트, 신뢰도, 타임스탬프, 경고플래그)
activate DB activate DB
DB --> TranscriptRepo: transcriptId 반환 DB --> TranscriptRepo: transcriptId 반환
deactivate DB deactivate DB
@ -79,19 +77,6 @@ alt 실시간 변환 모드
TranscriptRepo --> Service: TranscriptEntity 반환 TranscriptRepo --> Service: TranscriptEntity 반환
deactivate TranscriptRepo deactivate TranscriptRepo
== 화자 정보 업데이트 ==
Service -> RecordingRepo: updateSpeakerInfo(recordingId, speakerId)
activate RecordingRepo
RecordingRepo -> DB: 화자 정보 저장/업데이트\n(녹음ID, 화자ID, 세그먼트수)
activate DB
DB --> RecordingRepo: 업데이트 완료
deactivate DB
RecordingRepo --> Service: 완료
deactivate RecordingRepo
== 이벤트 발행 == == 이벤트 발행 ==
Service -> EventHub: TranscriptSegmentReady 이벤트 발행 Service -> EventHub: TranscriptSegmentReady 이벤트 발행
@ -102,7 +87,6 @@ alt 실시간 변환 모드
- recordingId - recordingId
- meetingId - meetingId
- text - text
- speakerId
- timestamp - timestamp
- confidence - confidence
end note end note
@ -112,128 +96,18 @@ alt 실시간 변환 모드
Service --> Controller: TranscriptResponse\n(transcriptId, text, confidence, warningFlag) Service --> Controller: TranscriptResponse\n(transcriptId, text, confidence, warningFlag)
deactivate Service deactivate Service
Controller --> Gateway: 200 OK\n(transcriptId, text, speakerId, timestamp, confidence) Controller --> Gateway: 200 OK\n(transcriptId, text, timestamp, confidence)
deactivate Controller deactivate Controller
Gateway --> Frontend: 실시간 자막 응답 Gateway --> Frontend: 실시간 자막 응답
deactivate Gateway deactivate Gateway
else 배치 변환 모드
Gateway -> Controller: POST /api/v1/stt/transcribe\n{sessionId, audioFile}
activate Controller
Controller -> Service: transcribeAudio(sessionId, audioFile)
activate Service
Service -> RecordingRepo: findSessionById(sessionId)
activate RecordingRepo
RecordingRepo -> DB: STT 세션 조회\n(세션ID 기준)
DB --> RecordingRepo: session data
RecordingRepo --> Service: RecordingEntity
deactivate RecordingRepo
Service -> Engine: batchTranscribe(audioFile)
activate Engine
Engine -> AzureClient: batchTranscriptionAsync(audioUrl)
activate AzureClient
note right
배치 처리:
- 전체 파일 업로드
- 백그라운드 처리
- Callback URL 제공
- 화자별 그룹화
- 문장 경계 보정
end note
AzureClient --> Engine: transcription job ID
deactivate AzureClient
Engine --> Service: job submitted
deactivate Engine
Service -> RecordingRepo: updateSessionStatus(sessionId, "PROCESSING")
activate RecordingRepo
RecordingRepo -> DB: 세션 상태 업데이트\n(상태='처리중')
DB --> RecordingRepo: updated
RecordingRepo --> Service: updated
deactivate RecordingRepo
Service --> Controller: 202 Accepted\n{jobId, status}
deactivate Service
Controller --> Gateway: 202 Accepted
deactivate Controller
== 배치 처리 완료 (Callback) ==
AzureClient -> Controller: POST /api/v1/stt/callback\n{jobId, segments}
activate Controller
Controller -> Service: processBatchResult(jobId, segments)
activate Service
loop 각 세그먼트 처리
Service -> TranscriptRepo: createTranscript(recordingId, segment)
activate TranscriptRepo
TranscriptRepo -> DB: 변환 결과 저장
DB --> TranscriptRepo: saved
TranscriptRepo --> Service: saved
deactivate TranscriptRepo
end
== 전체 텍스트 통합 ==
Service -> TranscriptRepo: aggregateTranscription(sessionId)
activate TranscriptRepo
TranscriptRepo -> DB: 세그먼트 목록 조회\n(세션ID 기준, 타임스탬프 순 정렬)
DB --> TranscriptRepo: ordered segments
TranscriptRepo --> Service: segments
deactivate TranscriptRepo
Service -> Service: mergeSegments(segments)
note right
세그먼트 병합:
- 화자별 그룹화
- 시간 순서 정렬
- 문장 경계 보정
end note
Service -> RecordingRepo: saveTranscription(fullText)
activate RecordingRepo
RecordingRepo -> DB: 전체 텍스트 저장 및 상태 업데이트\n(전체텍스트, 상태='완료')
DB --> RecordingRepo: saved
RecordingRepo --> Service: updated session
deactivate RecordingRepo
Service -> EventHub: TranscriptionCompletedEvent 발행
note right
Event:
- sessionId
- meetingId
- fullText
- completedAt
end note
Service --> Controller: TranscriptionResponse\n{sessionId, text, segments}
deactivate Service
Controller --> Gateway: 200 OK\n{transcription, metadata}
deactivate Controller
end
note over Frontend, EventHub note over Frontend, EventHub
**실시간 모드 처리 시간:** **처리 시간:**
- Azure STT 처리: 1-3초 - Azure STT 처리: 1-3초
- DB 저장: ~100ms - DB 저장: ~100ms
- Event 발행: ~50ms - Event 발행: ~50ms
- 총 처리 시간: 1-4초 - 총 처리 시간: 1-3초
**배치 모드 처리 시간:**
- 파일 업로드: ~1-2초
- Azure 배치 처리: 5-30초 (파일 크기에 따라)
- DB 저장: ~500ms
- 총 처리 시간: 7-33초
**정확도 경고 기준:** **정확도 경고 기준:**
- < 60%: 수동 수정 권장 (경고 플래그) - < 60%: 수동 수정 권장 (경고 플래그)

View File

@ -49,7 +49,7 @@
- 실시간 협업: WebSocket 기반 실시간 동기화, 버전 관리, 충돌 해결 - 실시간 협업: WebSocket 기반 실시간 동기화, 버전 관리, 충돌 해결
- 템플릿 관리: 회의록 템플릿 관리 - 템플릿 관리: 회의록 템플릿 관리
- 통계 생성: 회의 및 Todo 통계 - 통계 생성: 회의 및 Todo 통계
3. **STT** - 음성 녹음 관리, 음성-텍스트 변환, 화자 식별 (기본 기능) 3. **STT** - 음성 스트리밍 처리, 실시간 음성-텍스트 변환 (기본 기능)
4. **AI** - AI 기반 회의록 자동화, Todo 추출, 지능형 검색 (RAG 통합) 4. **AI** - AI 기반 회의록 자동화, Todo 추출, 지능형 검색 (RAG 통합)
- LLM 기반 회의록 자동 작성 - LLM 기반 회의록 자동 작성
- Todo 자동 추출 및 담당자 식별 - Todo 자동 추출 및 담당자 식별
@ -477,30 +477,29 @@ UFR-MEET-055: [회의록수정] 회의 참석자로서 | 나는, 검증이 완
3. STT 서비스 (음성 인식 및 변환 - 기본 기능) 3. STT 서비스 (음성 인식 및 변환 - 기본 기능)
1) 음성 인식 및 변환 1) 음성 인식 및 변환
UFR-STT-010: [음성녹음인식] 회의 참석자로서 | 나는, 발언 내용이 자동으로 기록되기 위해 | 음성이 실시간으로 녹음되고 인식되기를 원한다. UFR-STT-010: [음성녹음인식] 회의 참석자로서 | 나는, 발언 내용이 자동으로 기록되기 위해 | 음성이 실시간으로 녹음되고 인식되기를 원한다.
- 시나리오: 음성 녹음 및 발언 인식 - 시나리오: 음성 실시간 인식
회의가 시작된 상황에서 | 참석자가 발언을 시작하면 | 음성이 자동으로 녹음되고 화자가 식별되며 발언이 인식된다. 회의가 시작된 상황에서 | 참석자가 발언을 시작하면 | 음성이 실시간으로 텍스트로 변환된다.
[음성 녹음 처리] [음성 스트리밍 처리]
- 오디오 스트림 실시간 캡처 - 오디오 스트림 실시간 캡처
- 회의 ID와 연결 - 회의 ID와 연결
- 음성 데이터 저장 (Azure 스토리지) - **음성 파일은 저장하지 않음** (실시간 스트리밍만 처리)
[발언 인식 처리] [음성 인식 처리]
- AI 음성인식 엔진 연동 (Azure Speech 등) - AI 음성인식 엔진 연동 (Azure Speech 등)
- 화자 자동 식별 - 실시간 텍스트 변환
- 참석자 목록 매칭
- 음성 특징 분석
- 타임스탬프 기록 - 타임스탬프 기록
- 발언 구간 구분
[처리 결과] [처리 결과]
- 음성 녹음이 시작됨 (녹음 ID) - 음성 스트리밍이 시작됨 (세션 ID)
- 발언이 인식됨 (발언 ID, 화자, 타임스탬프) - 텍스트가 변환됨 (세그먼트 ID, 텍스트, 타임스탬프)
- 실시간으로 텍스트 변환 요청 (UFR-STT-020 연동) - 실시간으로 텍스트 변환 요청 (UFR-STT-020 연동)
- **음성 파일은 저장되지 않고 스트리밍만 처리됨**
- **화자 식별 기능 없음** (단순 텍스트 변환만)
[성능 요구사항] [성능 요구사항]
- 발언 인식 지연 시간: 1초 이내 - 음성 인식 지연 시간: 1초 이내
- 화자 식별 정확도: 90% 이상 - 변환 정확도: 85% 이상
[비고] [비고]
- STT는 기본 기능으로 경쟁사 대부분이 제공하는 기능임 - STT는 기본 기능으로 경쟁사 대부분이 제공하는 기능임

46
docker-compose.test.yml Normal file
View File

@ -0,0 +1,46 @@
version: '3.8'
services:
# Test Database
postgres-test:
image: postgres:15-alpine
environment:
POSTGRES_DB: sttdb_test
POSTGRES_USER: testuser
POSTGRES_PASSWORD: testpass
ports:
- "5433:5432"
volumes:
- postgres_test_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U testuser -d sttdb_test"]
interval: 5s
timeout: 5s
retries: 5
# Test Redis
redis-test:
image: redis:7-alpine
ports:
- "6380:6379"
command: redis-server --requirepass testpass
healthcheck:
test: ["CMD", "redis-cli", "-a", "testpass", "ping"]
interval: 5s
timeout: 3s
retries: 5
# Test Azure Storage Emulator (Azurite)
azurite-test:
image: mcr.microsoft.com/azure-storage/azurite
ports:
- "10000:10000" # Blob service
- "10001:10001" # Queue service
- "10002:10002" # Table service
command: azurite --blobHost 0.0.0.0 --queueHost 0.0.0.0 --tableHost 0.0.0.0
volumes:
- azurite_data:/data
volumes:
postgres_test_data:
azurite_data:

View File

@ -1438,3 +1438,282 @@ Caused by: io.lettuce.core.RedisCommandExecutionException: NOAUTH HELLO must be
2025-10-23 16:37:29 [SpringApplicationShutdownHook] DEBUG o.h.type.spi.TypeConfiguration$Scope - Un-scoping TypeConfiguration [org.hibernate.type.spi.TypeConfiguration$Scope@1d9c4491] from SessionFactory [org.hibernate.internal.SessionFactoryImpl@20505460] 2025-10-23 16:37:29 [SpringApplicationShutdownHook] DEBUG o.h.type.spi.TypeConfiguration$Scope - Un-scoping TypeConfiguration [org.hibernate.type.spi.TypeConfiguration$Scope@1d9c4491] from SessionFactory [org.hibernate.internal.SessionFactoryImpl@20505460]
2025-10-23 16:37:29 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown initiated... 2025-10-23 16:37:29 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown initiated...
2025-10-23 16:37:29 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown completed. 2025-10-23 16:37:29 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown completed.
2025-10-23 17:10:40 [main] INFO com.unicorn.hgzero.ai.AiApplication - Starting AiApplication using Java 23.0.2 with PID 43872 (/Users/jominseo/HGZero/ai/build/classes/java/main started by jominseo in /Users/jominseo/HGZero)
2025-10-23 17:10:40 [main] DEBUG com.unicorn.hgzero.ai.AiApplication - Running with Spring Boot v3.3.0, Spring v6.1.8
2025-10-23 17:10:40 [main] INFO com.unicorn.hgzero.ai.AiApplication - No active profile set, falling back to 1 default profile: "default"
2025-10-23 17:10:40 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Multiple Spring Data modules found, entering strict repository configuration mode
2025-10-23 17:10:40 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Bootstrapping Spring Data JPA repositories in DEFAULT mode.
2025-10-23 17:10:40 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 3 ms. Found 0 JPA repository interfaces.
2025-10-23 17:10:40 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Multiple Spring Data modules found, entering strict repository configuration mode
2025-10-23 17:10:40 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Bootstrapping Spring Data Redis repositories in DEFAULT mode.
2025-10-23 17:10:40 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 0 ms. Found 0 Redis repository interfaces.
2025-10-23 17:10:41 [main] INFO o.s.b.w.e.tomcat.TomcatWebServer - Tomcat initialized with port 8084 (http)
2025-10-23 17:10:41 [main] INFO o.a.catalina.core.StandardService - Starting service [Tomcat]
2025-10-23 17:10:41 [main] INFO o.a.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/10.1.24]
2025-10-23 17:10:41 [main] INFO o.a.c.c.C.[Tomcat].[localhost].[/] - Initializing Spring embedded WebApplicationContext
2025-10-23 17:10:41 [main] INFO o.s.b.w.s.c.ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 776 ms
2025-10-23 17:10:41 [main] INFO o.h.jpa.internal.util.LogHelper - HHH000204: Processing PersistenceUnitInfo [name: default]
2025-10-23 17:10:41 [main] INFO org.hibernate.Version - HHH000412: Hibernate ORM core version 6.5.2.Final
2025-10-23 17:10:41 [main] INFO o.h.c.i.RegionFactoryInitiator - HHH000026: Second-level cache disabled
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration boolean -> org.hibernate.type.BasicTypeReference@3e2d65e1
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration boolean -> org.hibernate.type.BasicTypeReference@3e2d65e1
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Boolean -> org.hibernate.type.BasicTypeReference@3e2d65e1
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration numeric_boolean -> org.hibernate.type.BasicTypeReference@1174676f
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration org.hibernate.type.NumericBooleanConverter -> org.hibernate.type.BasicTypeReference@1174676f
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration true_false -> org.hibernate.type.BasicTypeReference@71f8ce0e
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration org.hibernate.type.TrueFalseConverter -> org.hibernate.type.BasicTypeReference@71f8ce0e
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration yes_no -> org.hibernate.type.BasicTypeReference@4fd92289
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration org.hibernate.type.YesNoConverter -> org.hibernate.type.BasicTypeReference@4fd92289
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration byte -> org.hibernate.type.BasicTypeReference@1a8e44fe
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration byte -> org.hibernate.type.BasicTypeReference@1a8e44fe
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Byte -> org.hibernate.type.BasicTypeReference@1a8e44fe
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration binary -> org.hibernate.type.BasicTypeReference@287317df
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration byte[] -> org.hibernate.type.BasicTypeReference@287317df
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration [B -> org.hibernate.type.BasicTypeReference@287317df
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration binary_wrapper -> org.hibernate.type.BasicTypeReference@1fcc3461
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration wrapper-binary -> org.hibernate.type.BasicTypeReference@1fcc3461
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration image -> org.hibernate.type.BasicTypeReference@1987807b
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration blob -> org.hibernate.type.BasicTypeReference@71469e01
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.sql.Blob -> org.hibernate.type.BasicTypeReference@71469e01
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_blob -> org.hibernate.type.BasicTypeReference@41bbb219
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_blob_wrapper -> org.hibernate.type.BasicTypeReference@3f2ae973
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration short -> org.hibernate.type.BasicTypeReference@1a8b22b5
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration short -> org.hibernate.type.BasicTypeReference@1a8b22b5
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Short -> org.hibernate.type.BasicTypeReference@1a8b22b5
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration integer -> org.hibernate.type.BasicTypeReference@5f781173
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration int -> org.hibernate.type.BasicTypeReference@5f781173
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Integer -> org.hibernate.type.BasicTypeReference@5f781173
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration long -> org.hibernate.type.BasicTypeReference@43cf5bff
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration long -> org.hibernate.type.BasicTypeReference@43cf5bff
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Long -> org.hibernate.type.BasicTypeReference@43cf5bff
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration float -> org.hibernate.type.BasicTypeReference@2b464384
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration float -> org.hibernate.type.BasicTypeReference@2b464384
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Float -> org.hibernate.type.BasicTypeReference@2b464384
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration double -> org.hibernate.type.BasicTypeReference@681b42d3
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration double -> org.hibernate.type.BasicTypeReference@681b42d3
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Double -> org.hibernate.type.BasicTypeReference@681b42d3
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration big_integer -> org.hibernate.type.BasicTypeReference@77f7352a
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.math.BigInteger -> org.hibernate.type.BasicTypeReference@77f7352a
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration big_decimal -> org.hibernate.type.BasicTypeReference@4ede8888
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.math.BigDecimal -> org.hibernate.type.BasicTypeReference@4ede8888
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration character -> org.hibernate.type.BasicTypeReference@571db8b4
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration char -> org.hibernate.type.BasicTypeReference@571db8b4
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Character -> org.hibernate.type.BasicTypeReference@571db8b4
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration character_nchar -> org.hibernate.type.BasicTypeReference@65a2755e
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration string -> org.hibernate.type.BasicTypeReference@2b3242a5
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.String -> org.hibernate.type.BasicTypeReference@2b3242a5
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration nstring -> org.hibernate.type.BasicTypeReference@11120583
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration characters -> org.hibernate.type.BasicTypeReference@2bf0c70d
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration char[] -> org.hibernate.type.BasicTypeReference@2bf0c70d
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration [C -> org.hibernate.type.BasicTypeReference@2bf0c70d
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration wrapper-characters -> org.hibernate.type.BasicTypeReference@5d8e4fa8
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration text -> org.hibernate.type.BasicTypeReference@649009d6
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration ntext -> org.hibernate.type.BasicTypeReference@652f26da
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration clob -> org.hibernate.type.BasicTypeReference@484a5ddd
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.sql.Clob -> org.hibernate.type.BasicTypeReference@484a5ddd
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration nclob -> org.hibernate.type.BasicTypeReference@6796a873
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.sql.NClob -> org.hibernate.type.BasicTypeReference@6796a873
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_clob -> org.hibernate.type.BasicTypeReference@3acc3ee
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_clob_char_array -> org.hibernate.type.BasicTypeReference@1f293cb7
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_clob_character_array -> org.hibernate.type.BasicTypeReference@5972e3a
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_nclob -> org.hibernate.type.BasicTypeReference@5790cbcb
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_nclob_character_array -> org.hibernate.type.BasicTypeReference@32c6d164
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_nclob_char_array -> org.hibernate.type.BasicTypeReference@645c9f0f
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration Duration -> org.hibernate.type.BasicTypeReference@58068b40
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.Duration -> org.hibernate.type.BasicTypeReference@58068b40
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration LocalDateTime -> org.hibernate.type.BasicTypeReference@999cd18
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.LocalDateTime -> org.hibernate.type.BasicTypeReference@999cd18
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration LocalDate -> org.hibernate.type.BasicTypeReference@dd060be
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.LocalDate -> org.hibernate.type.BasicTypeReference@dd060be
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration LocalTime -> org.hibernate.type.BasicTypeReference@df432ec
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.LocalTime -> org.hibernate.type.BasicTypeReference@df432ec
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetDateTime -> org.hibernate.type.BasicTypeReference@6144e499
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.OffsetDateTime -> org.hibernate.type.BasicTypeReference@6144e499
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetDateTimeWithTimezone -> org.hibernate.type.BasicTypeReference@26f204a4
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetDateTimeWithoutTimezone -> org.hibernate.type.BasicTypeReference@28295554
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetTime -> org.hibernate.type.BasicTypeReference@4e671ef
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.OffsetTime -> org.hibernate.type.BasicTypeReference@4e671ef
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetTimeUtc -> org.hibernate.type.BasicTypeReference@42403dc6
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetTimeWithTimezone -> org.hibernate.type.BasicTypeReference@74a1d60e
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetTimeWithoutTimezone -> org.hibernate.type.BasicTypeReference@16c0be3b
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration ZonedDateTime -> org.hibernate.type.BasicTypeReference@219edc05
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.ZonedDateTime -> org.hibernate.type.BasicTypeReference@219edc05
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration ZonedDateTimeWithTimezone -> org.hibernate.type.BasicTypeReference@62f37bfd
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration ZonedDateTimeWithoutTimezone -> org.hibernate.type.BasicTypeReference@1818d00b
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration date -> org.hibernate.type.BasicTypeReference@b3a8455
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.sql.Date -> org.hibernate.type.BasicTypeReference@b3a8455
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration time -> org.hibernate.type.BasicTypeReference@5c930fc3
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.sql.Time -> org.hibernate.type.BasicTypeReference@5c930fc3
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration timestamp -> org.hibernate.type.BasicTypeReference@25c6ab3f
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.sql.Timestamp -> org.hibernate.type.BasicTypeReference@25c6ab3f
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.util.Date -> org.hibernate.type.BasicTypeReference@25c6ab3f
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration calendar -> org.hibernate.type.BasicTypeReference@7b80af04
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.util.Calendar -> org.hibernate.type.BasicTypeReference@7b80af04
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.util.GregorianCalendar -> org.hibernate.type.BasicTypeReference@7b80af04
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration calendar_date -> org.hibernate.type.BasicTypeReference@2447940d
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration calendar_time -> org.hibernate.type.BasicTypeReference@60ee7a51
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration instant -> org.hibernate.type.BasicTypeReference@70e1aa20
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.Instant -> org.hibernate.type.BasicTypeReference@70e1aa20
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration uuid -> org.hibernate.type.BasicTypeReference@e67d3b7
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.util.UUID -> org.hibernate.type.BasicTypeReference@e67d3b7
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration pg-uuid -> org.hibernate.type.BasicTypeReference@e67d3b7
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration uuid-binary -> org.hibernate.type.BasicTypeReference@1618c98a
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration uuid-char -> org.hibernate.type.BasicTypeReference@5b715ea
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration class -> org.hibernate.type.BasicTypeReference@787a0fd6
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Class -> org.hibernate.type.BasicTypeReference@787a0fd6
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration currency -> org.hibernate.type.BasicTypeReference@48b09105
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration Currency -> org.hibernate.type.BasicTypeReference@48b09105
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.util.Currency -> org.hibernate.type.BasicTypeReference@48b09105
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration locale -> org.hibernate.type.BasicTypeReference@18b45500
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.util.Locale -> org.hibernate.type.BasicTypeReference@18b45500
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration serializable -> org.hibernate.type.BasicTypeReference@25110bb9
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.io.Serializable -> org.hibernate.type.BasicTypeReference@25110bb9
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration timezone -> org.hibernate.type.BasicTypeReference@dbda472
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.util.TimeZone -> org.hibernate.type.BasicTypeReference@dbda472
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration ZoneOffset -> org.hibernate.type.BasicTypeReference@41492479
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.ZoneOffset -> org.hibernate.type.BasicTypeReference@41492479
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration url -> org.hibernate.type.BasicTypeReference@7bef7505
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.net.URL -> org.hibernate.type.BasicTypeReference@7bef7505
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration vector -> org.hibernate.type.BasicTypeReference@568ef502
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration row_version -> org.hibernate.type.BasicTypeReference@36f05595
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration object -> org.hibernate.type.JavaObjectType@3c46e6f6
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Object -> org.hibernate.type.JavaObjectType@3c46e6f6
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration null -> org.hibernate.type.NullType@1c79d093
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_date -> org.hibernate.type.BasicTypeReference@746fd19b
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_time -> org.hibernate.type.BasicTypeReference@61d7bb61
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_timestamp -> org.hibernate.type.BasicTypeReference@33f81280
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_calendar -> org.hibernate.type.BasicTypeReference@3991fe6d
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_calendar_date -> org.hibernate.type.BasicTypeReference@3a0e7f89
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_calendar_time -> org.hibernate.type.BasicTypeReference@665ed71a
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_binary -> org.hibernate.type.BasicTypeReference@15c1b543
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_serializable -> org.hibernate.type.BasicTypeReference@23954300
2025-10-23 17:10:41 [main] INFO o.s.o.j.p.SpringPersistenceUnitInfo - No LoadTimeWeaver setup: ignoring JPA class transformer
2025-10-23 17:10:41 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting...
2025-10-23 17:10:41 [main] INFO com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Added connection org.postgresql.jdbc.PgConnection@5f5c0eda
2025-10-23 17:10:41 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed.
2025-10-23 17:10:41 [main] DEBUG o.h.t.d.sql.spi.DdlTypeRegistry - addDescriptor(2003, org.hibernate.type.descriptor.sql.internal.ArrayDdlTypeImpl@31b7112d) replaced previous registration(org.hibernate.type.descriptor.sql.internal.ArrayDdlTypeImpl@47fc9ce)
2025-10-23 17:10:41 [main] DEBUG o.h.t.d.sql.spi.DdlTypeRegistry - addDescriptor(6, org.hibernate.type.descriptor.sql.internal.CapacityDependentDdlType@1b5d1d9) replaced previous registration(org.hibernate.type.descriptor.sql.internal.DdlTypeImpl@703a2bc9)
2025-10-23 17:10:41 [main] DEBUG o.h.t.d.jdbc.spi.JdbcTypeRegistry - addDescriptor(2004, BlobTypeDescriptor(BLOB_BINDING)) replaced previous registration(BlobTypeDescriptor(DEFAULT))
2025-10-23 17:10:41 [main] DEBUG o.h.t.d.jdbc.spi.JdbcTypeRegistry - addDescriptor(2005, ClobTypeDescriptor(CLOB_BINDING)) replaced previous registration(ClobTypeDescriptor(DEFAULT))
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration JAVA_OBJECT -> org.hibernate.type.JavaObjectType@e460ca1
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Object -> org.hibernate.type.JavaObjectType@e460ca1
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Type registration key [java.lang.Object] overrode previous entry : `org.hibernate.type.JavaObjectType@3c46e6f6`
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration org.hibernate.type.DurationType -> basicType@1(java.time.Duration,3015)
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration Duration -> basicType@1(java.time.Duration,3015)
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.Duration -> basicType@1(java.time.Duration,3015)
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration org.hibernate.type.OffsetDateTimeType -> basicType@2(java.time.OffsetDateTime,3003)
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetDateTime -> basicType@2(java.time.OffsetDateTime,3003)
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.OffsetDateTime -> basicType@2(java.time.OffsetDateTime,3003)
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration org.hibernate.type.ZonedDateTimeType -> basicType@3(java.time.ZonedDateTime,3003)
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration ZonedDateTime -> basicType@3(java.time.ZonedDateTime,3003)
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.ZonedDateTime -> basicType@3(java.time.ZonedDateTime,3003)
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration org.hibernate.type.OffsetTimeType -> basicType@4(java.time.OffsetTime,3007)
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetTime -> basicType@4(java.time.OffsetTime,3007)
2025-10-23 17:10:41 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.OffsetTime -> basicType@4(java.time.OffsetTime,3007)
2025-10-23 17:10:41 [main] DEBUG o.h.type.spi.TypeConfiguration$Scope - Scoping TypeConfiguration [org.hibernate.type.spi.TypeConfiguration@268e30d4] to MetadataBuildingContext [org.hibernate.boot.internal.MetadataBuildingContextRootImpl@7c50709a]
2025-10-23 17:10:41 [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-23 17:10:41 [main] DEBUG o.h.type.spi.TypeConfiguration$Scope - Scoping TypeConfiguration [org.hibernate.type.spi.TypeConfiguration@268e30d4] to SessionFactoryImplementor [org.hibernate.internal.SessionFactoryImpl@263f6e96]
2025-10-23 17:10:41 [main] TRACE o.h.type.spi.TypeConfiguration$Scope - Handling #sessionFactoryCreated from [org.hibernate.internal.SessionFactoryImpl@263f6e96] for TypeConfiguration
2025-10-23 17:10:41 [main] INFO o.s.o.j.LocalContainerEntityManagerFactoryBean - Initialized JPA EntityManagerFactory for persistence unit 'default'
2025-10-23 17:10:41 [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-23 17:10:42 [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-23 17:10:42 [main] WARN o.s.b.a.s.s.UserDetailsServiceAutoConfiguration -
Using generated security password: 4d9e182a-5838-4fd3-8e57-70219ebe9076
This generated password is for development use only. Your security configuration must be updated before running your application in production.
2025-10-23 17:10:42 [main] INFO o.s.s.c.a.a.c.InitializeUserDetailsBeanManagerConfigurer$InitializeUserDetailsManagerConfigurer - Global AuthenticationManager configured with UserDetailsService bean with name inMemoryUserDetailsManager
2025-10-23 17:10:42 [main] INFO o.s.b.a.e.web.EndpointLinksResolver - Exposing 3 endpoints beneath base path '/actuator'
2025-10-23 17:10:42 [main] INFO o.s.s.web.DefaultSecurityFilterChain - Will secure any request with [org.springframework.security.web.session.DisableEncodeUrlFilter@23d1090, org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@46c6541f, org.springframework.security.web.context.SecurityContextHolderFilter@67744663, org.springframework.security.web.header.HeaderWriterFilter@1a2bcce1, org.springframework.web.filter.CorsFilter@aba3735, org.springframework.security.web.csrf.CsrfFilter@417c9b17, org.springframework.security.web.authentication.logout.LogoutFilter@75b598a5, org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter@401b7109, org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter@24a024c8, org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter@16bba8ae, org.springframework.security.web.authentication.www.BasicAuthenticationFilter@7f36b021, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@387cd426, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@6295cc30, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@7c689379, org.springframework.security.web.access.ExceptionTranslationFilter@ae5eeee, org.springframework.security.web.access.intercept.AuthorizationFilter@431bf770]
2025-10-23 17:10:42 [main] INFO o.s.b.w.e.tomcat.TomcatWebServer - Tomcat started on port 8084 (http) with context path '/'
2025-10-23 17:10:42 [main] INFO com.unicorn.hgzero.ai.AiApplication - Started AiApplication in 2.293 seconds (process running for 2.491)
2025-10-23 17:10:42 [RMI TCP Connection(1)-127.0.0.1] INFO o.a.c.c.C.[Tomcat].[localhost].[/] - Initializing Spring DispatcherServlet 'dispatcherServlet'
2025-10-23 17:10:42 [RMI TCP Connection(1)-127.0.0.1] INFO o.s.web.servlet.DispatcherServlet - Initializing Servlet 'dispatcherServlet'
2025-10-23 17:10:42 [RMI TCP Connection(1)-127.0.0.1] INFO o.s.web.servlet.DispatcherServlet - Completed initialization in 1 ms
2025-10-23 17:10:42 [boundedElastic-1] WARN o.s.b.a.d.r.RedisReactiveHealthIndicator - Redis health check failed
org.springframework.data.redis.RedisConnectionFailureException: Unable to connect to Redis
at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$ExceptionTranslatingConnectionProvider.translateException(LettuceConnectionFactory.java:1847)
at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$ExceptionTranslatingConnectionProvider.getConnection(LettuceConnectionFactory.java:1778)
at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$SharedConnection.getNativeConnection(LettuceConnectionFactory.java:1580)
at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$SharedConnection.lambda$getConnection$0(LettuceConnectionFactory.java:1560)
at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory.doInLock(LettuceConnectionFactory.java:1521)
at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$SharedConnection.getConnection(LettuceConnectionFactory.java:1557)
at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory.getSharedReactiveConnection(LettuceConnectionFactory.java:1268)
at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory.getReactiveConnection(LettuceConnectionFactory.java:1143)
at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory.getReactiveConnection(LettuceConnectionFactory.java:119)
at reactor.core.publisher.MonoSupplier.call(MonoSupplier.java:67)
at reactor.core.publisher.FluxSubscribeOnCallable$CallableSubscribeOnSubscription.run(FluxSubscribeOnCallable.java:228)
at reactor.core.scheduler.SchedulerTask.call(SchedulerTask.java:68)
at reactor.core.scheduler.SchedulerTask.call(SchedulerTask.java:28)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)
at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
at java.base/java.lang.Thread.run(Thread.java:1575)
Caused by: io.lettuce.core.RedisConnectionException: Unable to connect to 20.249.177.114/<unresolved>:6379
at io.lettuce.core.RedisConnectionException.create(RedisConnectionException.java:78)
at io.lettuce.core.RedisConnectionException.create(RedisConnectionException.java:56)
at io.lettuce.core.AbstractRedisClient.getConnection(AbstractRedisClient.java:350)
at io.lettuce.core.RedisClient.connect(RedisClient.java:215)
at org.springframework.data.redis.connection.lettuce.StandaloneConnectionProvider.lambda$getConnection$1(StandaloneConnectionProvider.java:112)
at java.base/java.util.Optional.orElseGet(Optional.java:364)
at org.springframework.data.redis.connection.lettuce.StandaloneConnectionProvider.getConnection(StandaloneConnectionProvider.java:112)
at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$ExceptionTranslatingConnectionProvider.getConnection(LettuceConnectionFactory.java:1776)
... 16 common frames omitted
Caused by: io.lettuce.core.RedisCommandExecutionException: NOAUTH HELLO must be called with the client already authenticated, otherwise the HELLO <proto> AUTH <user> <pass> option can be used to authenticate the client and select the RESP protocol version at the same time
at io.lettuce.core.internal.ExceptionFactory.createExecutionException(ExceptionFactory.java:147)
at io.lettuce.core.internal.ExceptionFactory.createExecutionException(ExceptionFactory.java:116)
at io.lettuce.core.protocol.AsyncCommand.completeResult(AsyncCommand.java:120)
at io.lettuce.core.protocol.AsyncCommand.complete(AsyncCommand.java:111)
at io.lettuce.core.protocol.CommandWrapper.complete(CommandWrapper.java:63)
at io.lettuce.core.protocol.CommandHandler.complete(CommandHandler.java:745)
at io.lettuce.core.protocol.CommandHandler.decode(CommandHandler.java:680)
at io.lettuce.core.protocol.CommandHandler.channelRead(CommandHandler.java:597)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:442)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1407)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:440)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:918)
at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166)
at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:788)
at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:724)
at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:650)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:562)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:994)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
... 1 common frames omitted
2025-10-23 17:11:28 [http-nio-8084-exec-1] DEBUG o.s.security.web.FilterChainProxy - Securing GET /swagger-ui.html
2025-10-23 17:11:28 [http-nio-8084-exec-1] DEBUG o.s.s.w.a.AnonymousAuthenticationFilter - Set SecurityContextHolder to anonymous SecurityContext
2025-10-23 17:11:28 [http-nio-8084-exec-1] DEBUG o.s.s.w.s.HttpSessionRequestCache - Saved request http://localhost:8084/swagger-ui.html?continue to session
2025-10-23 17:11:28 [http-nio-8084-exec-1] DEBUG o.s.s.w.a.DelegatingAuthenticationEntryPoint - Trying to match using And [Not [RequestHeaderRequestMatcher [expectedHeaderName=X-Requested-With, expectedHeaderValue=XMLHttpRequest]], MediaTypeRequestMatcher [contentNegotiationStrategy=org.springframework.web.accept.ContentNegotiationManager@49c72fb7, matchingMediaTypes=[application/xhtml+xml, image/*, text/html, text/plain], useEquals=false, ignoredMediaTypes=[*/*]]]
2025-10-23 17:11:28 [http-nio-8084-exec-1] DEBUG o.s.s.w.a.DelegatingAuthenticationEntryPoint - Match found! Executing org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint@7d91e9c9
2025-10-23 17:11:28 [http-nio-8084-exec-1] DEBUG o.s.s.web.DefaultRedirectStrategy - Redirecting to http://localhost:8084/login
2025-10-23 17:11:28 [http-nio-8084-exec-2] DEBUG o.s.security.web.FilterChainProxy - Securing GET /login
2025-10-23 17:11:28 [http-nio-8084-exec-3] DEBUG o.s.security.web.FilterChainProxy - Securing GET /favicon.ico
2025-10-23 17:11:28 [http-nio-8084-exec-3] DEBUG o.s.s.w.a.AnonymousAuthenticationFilter - Set SecurityContextHolder to anonymous SecurityContext
2025-10-23 17:11:28 [http-nio-8084-exec-3] DEBUG o.s.s.w.a.DelegatingAuthenticationEntryPoint - Trying to match using And [Not [RequestHeaderRequestMatcher [expectedHeaderName=X-Requested-With, expectedHeaderValue=XMLHttpRequest]], MediaTypeRequestMatcher [contentNegotiationStrategy=org.springframework.web.accept.ContentNegotiationManager@49c72fb7, matchingMediaTypes=[application/xhtml+xml, image/*, text/html, text/plain], useEquals=false, ignoredMediaTypes=[*/*]]]
2025-10-23 17:11:28 [http-nio-8084-exec-3] DEBUG o.s.s.w.a.DelegatingAuthenticationEntryPoint - Match found! Executing org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint@7d91e9c9
2025-10-23 17:11:28 [http-nio-8084-exec-3] DEBUG o.s.s.web.DefaultRedirectStrategy - Redirecting to http://localhost:8084/login
2025-10-23 17:11:28 [http-nio-8084-exec-4] DEBUG o.s.security.web.FilterChainProxy - Securing GET /login
2025-10-23 17:11:43 [http-nio-8084-exec-5] DEBUG o.s.security.web.FilterChainProxy - Securing GET /swagger-ui.html
2025-10-23 17:11:43 [http-nio-8084-exec-5] DEBUG o.s.s.w.a.AnonymousAuthenticationFilter - Set SecurityContextHolder to anonymous SecurityContext
2025-10-23 17:11:43 [http-nio-8084-exec-5] DEBUG o.s.s.w.s.HttpSessionRequestCache - Saved request http://localhost:8084/swagger-ui.html?continue to session
2025-10-23 17:11:43 [http-nio-8084-exec-5] DEBUG o.s.s.w.a.DelegatingAuthenticationEntryPoint - Trying to match using And [Not [RequestHeaderRequestMatcher [expectedHeaderName=X-Requested-With, expectedHeaderValue=XMLHttpRequest]], MediaTypeRequestMatcher [contentNegotiationStrategy=org.springframework.web.accept.ContentNegotiationManager@49c72fb7, matchingMediaTypes=[application/xhtml+xml, image/*, text/html, text/plain], useEquals=false, ignoredMediaTypes=[*/*]]]
2025-10-23 17:11:43 [http-nio-8084-exec-5] DEBUG o.s.s.w.a.DelegatingAuthenticationEntryPoint - Match found! Executing org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint@7d91e9c9
2025-10-23 17:11:43 [http-nio-8084-exec-5] DEBUG o.s.s.web.DefaultRedirectStrategy - Redirecting to http://localhost:8084/login
2025-10-23 17:11:43 [http-nio-8084-exec-6] DEBUG o.s.security.web.FilterChainProxy - Securing GET /login
2025-10-23 17:11:43 [http-nio-8084-exec-7] DEBUG o.s.security.web.FilterChainProxy - Securing GET /favicon.ico
2025-10-23 17:11:43 [http-nio-8084-exec-7] DEBUG o.s.s.w.a.AnonymousAuthenticationFilter - Set SecurityContextHolder to anonymous SecurityContext
2025-10-23 17:11:43 [http-nio-8084-exec-7] DEBUG o.s.s.w.a.DelegatingAuthenticationEntryPoint - Trying to match using And [Not [RequestHeaderRequestMatcher [expectedHeaderName=X-Requested-With, expectedHeaderValue=XMLHttpRequest]], MediaTypeRequestMatcher [contentNegotiationStrategy=org.springframework.web.accept.ContentNegotiationManager@49c72fb7, matchingMediaTypes=[application/xhtml+xml, image/*, text/html, text/plain], useEquals=false, ignoredMediaTypes=[*/*]]]
2025-10-23 17:11:43 [http-nio-8084-exec-7] DEBUG o.s.s.w.a.DelegatingAuthenticationEntryPoint - Match found! Executing org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint@7d91e9c9
2025-10-23 17:11:43 [http-nio-8084-exec-7] DEBUG o.s.s.web.DefaultRedirectStrategy - Redirecting to http://localhost:8084/login
2025-10-23 17:11:43 [http-nio-8084-exec-8] DEBUG o.s.security.web.FilterChainProxy - Securing GET /login
2025-10-23 17:12:37 [SpringApplicationShutdownHook] INFO o.s.o.j.LocalContainerEntityManagerFactoryBean - Closing JPA EntityManagerFactory for persistence unit 'default'
2025-10-23 17:12:37 [SpringApplicationShutdownHook] TRACE o.h.type.spi.TypeConfiguration$Scope - Handling #sessionFactoryClosed from [org.hibernate.internal.SessionFactoryImpl@263f6e96] for TypeConfiguration
2025-10-23 17:12:37 [SpringApplicationShutdownHook] DEBUG o.h.type.spi.TypeConfiguration$Scope - Un-scoping TypeConfiguration [org.hibernate.type.spi.TypeConfiguration$Scope@7aa91cdd] from SessionFactory [org.hibernate.internal.SessionFactoryImpl@263f6e96]
2025-10-23 17:12:37 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown initiated...
2025-10-23 17:12:37 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown completed.

View File

@ -1036,3 +1036,873 @@ This generated password is for development use only. Your security configuration
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: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 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 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
2025-10-24 13:19:09 [main] INFO c.u.h.meeting.MeetingApplication - Starting MeetingApplication using Java 21.0.8 with PID 63724 (/Users/adela/home/workspace/recent/HGZero/meeting/build/classes/java/main started by adela in /Users/adela/home/workspace/recent/HGZero/meeting)
2025-10-24 13:19:09 [main] DEBUG c.u.h.meeting.MeetingApplication - Running with Spring Boot v3.3.5, Spring v6.1.14
2025-10-24 13:19:09 [main] INFO c.u.h.meeting.MeetingApplication - The following 1 profile is active: "dev"
2025-10-24 13:19:10 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Multiple Spring Data modules found, entering strict repository configuration mode
2025-10-24 13:19:10 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Bootstrapping Spring Data JPA repositories in DEFAULT mode.
2025-10-24 13:19:10 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 70 ms. Found 5 JPA repository interfaces.
2025-10-24 13:19:10 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Multiple Spring Data modules found, entering strict repository configuration mode
2025-10-24 13:19:10 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Bootstrapping Spring Data Redis repositories in DEFAULT mode.
2025-10-24 13:19:10 [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 13:19:10 [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 13:19:10 [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 13:19:10 [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 13:19:10 [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 13:19:10 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 12 ms. Found 0 Redis repository interfaces.
2025-10-24 13:19:11 [main] INFO o.s.b.w.e.tomcat.TomcatWebServer - Tomcat initialized with port 8082 (http)
2025-10-24 13:19:11 [main] INFO o.a.catalina.core.StandardService - Starting service [Tomcat]
2025-10-24 13:19:11 [main] INFO o.a.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/10.1.31]
2025-10-24 13:19:11 [main] INFO o.a.c.c.C.[Tomcat].[localhost].[/] - Initializing Spring embedded WebApplicationContext
2025-10-24 13:19:11 [main] INFO o.s.b.w.s.c.ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 1154 ms
2025-10-24 13:19:11 [main] INFO o.h.jpa.internal.util.LogHelper - HHH000204: Processing PersistenceUnitInfo [name: default]
2025-10-24 13:19:11 [main] INFO org.hibernate.Version - HHH000412: Hibernate ORM core version 6.5.3.Final
2025-10-24 13:19:11 [main] INFO o.h.c.i.RegionFactoryInitiator - HHH000026: Second-level cache disabled
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration boolean -> org.hibernate.type.BasicTypeReference@bff764c
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration boolean -> org.hibernate.type.BasicTypeReference@bff764c
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Boolean -> org.hibernate.type.BasicTypeReference@bff764c
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration numeric_boolean -> org.hibernate.type.BasicTypeReference@3beaa16d
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration org.hibernate.type.NumericBooleanConverter -> org.hibernate.type.BasicTypeReference@3beaa16d
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration true_false -> org.hibernate.type.BasicTypeReference@49153009
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration org.hibernate.type.TrueFalseConverter -> org.hibernate.type.BasicTypeReference@49153009
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration yes_no -> org.hibernate.type.BasicTypeReference@a1b7549
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration org.hibernate.type.YesNoConverter -> org.hibernate.type.BasicTypeReference@a1b7549
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration byte -> org.hibernate.type.BasicTypeReference@7aa63f50
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration byte -> org.hibernate.type.BasicTypeReference@7aa63f50
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Byte -> org.hibernate.type.BasicTypeReference@7aa63f50
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration binary -> org.hibernate.type.BasicTypeReference@142918a0
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration byte[] -> org.hibernate.type.BasicTypeReference@142918a0
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration [B -> org.hibernate.type.BasicTypeReference@142918a0
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration binary_wrapper -> org.hibernate.type.BasicTypeReference@745cf754
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration wrapper-binary -> org.hibernate.type.BasicTypeReference@745cf754
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration image -> org.hibernate.type.BasicTypeReference@25bc65ab
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration blob -> org.hibernate.type.BasicTypeReference@6eab92f3
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.sql.Blob -> org.hibernate.type.BasicTypeReference@6eab92f3
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_blob -> org.hibernate.type.BasicTypeReference@321b7b9e
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_blob_wrapper -> org.hibernate.type.BasicTypeReference@21eedcde
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration short -> org.hibernate.type.BasicTypeReference@67396475
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration short -> org.hibernate.type.BasicTypeReference@67396475
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Short -> org.hibernate.type.BasicTypeReference@67396475
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration integer -> org.hibernate.type.BasicTypeReference@55b74e6b
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration int -> org.hibernate.type.BasicTypeReference@55b74e6b
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Integer -> org.hibernate.type.BasicTypeReference@55b74e6b
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration long -> org.hibernate.type.BasicTypeReference@3c1908c8
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration long -> org.hibernate.type.BasicTypeReference@3c1908c8
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Long -> org.hibernate.type.BasicTypeReference@3c1908c8
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration float -> org.hibernate.type.BasicTypeReference@6bc62bb9
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration float -> org.hibernate.type.BasicTypeReference@6bc62bb9
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Float -> org.hibernate.type.BasicTypeReference@6bc62bb9
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration double -> org.hibernate.type.BasicTypeReference@47f0e078
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration double -> org.hibernate.type.BasicTypeReference@47f0e078
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Double -> org.hibernate.type.BasicTypeReference@47f0e078
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration big_integer -> org.hibernate.type.BasicTypeReference@28db2afb
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.math.BigInteger -> org.hibernate.type.BasicTypeReference@28db2afb
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration big_decimal -> org.hibernate.type.BasicTypeReference@5c703860
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.math.BigDecimal -> org.hibernate.type.BasicTypeReference@5c703860
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration character -> org.hibernate.type.BasicTypeReference@6315bb4
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration char -> org.hibernate.type.BasicTypeReference@6315bb4
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Character -> org.hibernate.type.BasicTypeReference@6315bb4
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration character_nchar -> org.hibernate.type.BasicTypeReference@4682882a
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration string -> org.hibernate.type.BasicTypeReference@37fffef3
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.String -> org.hibernate.type.BasicTypeReference@37fffef3
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration nstring -> org.hibernate.type.BasicTypeReference@6a116354
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration characters -> org.hibernate.type.BasicTypeReference@66716959
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration char[] -> org.hibernate.type.BasicTypeReference@66716959
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration [C -> org.hibernate.type.BasicTypeReference@66716959
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration wrapper-characters -> org.hibernate.type.BasicTypeReference@34e07e65
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration text -> org.hibernate.type.BasicTypeReference@7ca0166c
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration ntext -> org.hibernate.type.BasicTypeReference@1dcad16f
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration clob -> org.hibernate.type.BasicTypeReference@701c482e
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.sql.Clob -> org.hibernate.type.BasicTypeReference@701c482e
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration nclob -> org.hibernate.type.BasicTypeReference@4738131e
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.sql.NClob -> org.hibernate.type.BasicTypeReference@4738131e
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_clob -> org.hibernate.type.BasicTypeReference@3b576ee3
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_clob_char_array -> org.hibernate.type.BasicTypeReference@705d914f
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_clob_character_array -> org.hibernate.type.BasicTypeReference@6212ea52
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_nclob -> org.hibernate.type.BasicTypeReference@65b5b5ed
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_nclob_character_array -> org.hibernate.type.BasicTypeReference@6595ffce
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_nclob_char_array -> org.hibernate.type.BasicTypeReference@795eddda
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration Duration -> org.hibernate.type.BasicTypeReference@c6bf8d9
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.Duration -> org.hibernate.type.BasicTypeReference@c6bf8d9
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration LocalDateTime -> org.hibernate.type.BasicTypeReference@44392e64
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.LocalDateTime -> org.hibernate.type.BasicTypeReference@44392e64
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration LocalDate -> org.hibernate.type.BasicTypeReference@e18d2a2
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.LocalDate -> org.hibernate.type.BasicTypeReference@e18d2a2
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration LocalTime -> org.hibernate.type.BasicTypeReference@1a77eb6
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.LocalTime -> org.hibernate.type.BasicTypeReference@1a77eb6
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetDateTime -> org.hibernate.type.BasicTypeReference@52d9f36b
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.OffsetDateTime -> org.hibernate.type.BasicTypeReference@52d9f36b
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetDateTimeWithTimezone -> org.hibernate.type.BasicTypeReference@5f9ebd5a
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetDateTimeWithoutTimezone -> org.hibernate.type.BasicTypeReference@175bf9c9
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetTime -> org.hibernate.type.BasicTypeReference@2db3675a
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.OffsetTime -> org.hibernate.type.BasicTypeReference@2db3675a
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetTimeUtc -> org.hibernate.type.BasicTypeReference@306c9b2c
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetTimeWithTimezone -> org.hibernate.type.BasicTypeReference@1ab28416
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetTimeWithoutTimezone -> org.hibernate.type.BasicTypeReference@52efb338
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration ZonedDateTime -> org.hibernate.type.BasicTypeReference@64508788
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.ZonedDateTime -> org.hibernate.type.BasicTypeReference@64508788
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration ZonedDateTimeWithTimezone -> org.hibernate.type.BasicTypeReference@30b1c5d5
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration ZonedDateTimeWithoutTimezone -> org.hibernate.type.BasicTypeReference@3e2d65e1
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration date -> org.hibernate.type.BasicTypeReference@1174676f
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.sql.Date -> org.hibernate.type.BasicTypeReference@1174676f
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration time -> org.hibernate.type.BasicTypeReference@71f8ce0e
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.sql.Time -> org.hibernate.type.BasicTypeReference@71f8ce0e
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration timestamp -> org.hibernate.type.BasicTypeReference@4fd92289
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.sql.Timestamp -> org.hibernate.type.BasicTypeReference@4fd92289
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.util.Date -> org.hibernate.type.BasicTypeReference@4fd92289
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration calendar -> org.hibernate.type.BasicTypeReference@1a8e44fe
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.util.Calendar -> org.hibernate.type.BasicTypeReference@1a8e44fe
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.util.GregorianCalendar -> org.hibernate.type.BasicTypeReference@1a8e44fe
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration calendar_date -> org.hibernate.type.BasicTypeReference@287317df
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration calendar_time -> org.hibernate.type.BasicTypeReference@1fcc3461
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration instant -> org.hibernate.type.BasicTypeReference@1987807b
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.Instant -> org.hibernate.type.BasicTypeReference@1987807b
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration uuid -> org.hibernate.type.BasicTypeReference@71469e01
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.util.UUID -> org.hibernate.type.BasicTypeReference@71469e01
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration pg-uuid -> org.hibernate.type.BasicTypeReference@71469e01
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration uuid-binary -> org.hibernate.type.BasicTypeReference@41bbb219
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration uuid-char -> org.hibernate.type.BasicTypeReference@3f2ae973
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration class -> org.hibernate.type.BasicTypeReference@1a8b22b5
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Class -> org.hibernate.type.BasicTypeReference@1a8b22b5
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration currency -> org.hibernate.type.BasicTypeReference@5f781173
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration Currency -> org.hibernate.type.BasicTypeReference@5f781173
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.util.Currency -> org.hibernate.type.BasicTypeReference@5f781173
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration locale -> org.hibernate.type.BasicTypeReference@43cf5bff
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.util.Locale -> org.hibernate.type.BasicTypeReference@43cf5bff
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration serializable -> org.hibernate.type.BasicTypeReference@2b464384
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.io.Serializable -> org.hibernate.type.BasicTypeReference@2b464384
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration timezone -> org.hibernate.type.BasicTypeReference@681b42d3
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.util.TimeZone -> org.hibernate.type.BasicTypeReference@681b42d3
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration ZoneOffset -> org.hibernate.type.BasicTypeReference@77f7352a
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.ZoneOffset -> org.hibernate.type.BasicTypeReference@77f7352a
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration url -> org.hibernate.type.BasicTypeReference@4ede8888
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.net.URL -> org.hibernate.type.BasicTypeReference@4ede8888
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration vector -> org.hibernate.type.BasicTypeReference@571db8b4
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration row_version -> org.hibernate.type.BasicTypeReference@65a2755e
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration object -> org.hibernate.type.JavaObjectType@61d6c8c4
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Object -> org.hibernate.type.JavaObjectType@61d6c8c4
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration null -> org.hibernate.type.NullType@4040ccae
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_date -> org.hibernate.type.BasicTypeReference@15bb8ed5
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_time -> org.hibernate.type.BasicTypeReference@7e1fb22c
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_timestamp -> org.hibernate.type.BasicTypeReference@38fc34fd
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_calendar -> org.hibernate.type.BasicTypeReference@7178d811
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_calendar_date -> org.hibernate.type.BasicTypeReference@2e013ba1
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_calendar_time -> org.hibernate.type.BasicTypeReference@2d8c729f
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_binary -> org.hibernate.type.BasicTypeReference@740ee00f
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_serializable -> org.hibernate.type.BasicTypeReference@430106cf
2025-10-24 13:19:11 [main] INFO o.s.o.j.p.SpringPersistenceUnitInfo - No LoadTimeWeaver setup: ignoring JPA class transformer
2025-10-24 13:19:11 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting...
2025-10-24 13:19:11 [main] INFO com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Added connection org.postgresql.jdbc.PgConnection@556843a5
2025-10-24 13:19:11 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed.
2025-10-24 13:19:11 [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 13:19:11 [main] DEBUG o.h.t.d.sql.spi.DdlTypeRegistry - addDescriptor(2003, org.hibernate.type.descriptor.sql.internal.ArrayDdlTypeImpl@368d51ca) replaced previous registration(org.hibernate.type.descriptor.sql.internal.ArrayDdlTypeImpl@2a349a73)
2025-10-24 13:19:11 [main] DEBUG o.h.t.d.sql.spi.DdlTypeRegistry - addDescriptor(6, org.hibernate.type.descriptor.sql.internal.CapacityDependentDdlType@2ad6895a) replaced previous registration(org.hibernate.type.descriptor.sql.internal.DdlTypeImpl@10e4cc6)
2025-10-24 13:19:11 [main] DEBUG o.h.t.d.jdbc.spi.JdbcTypeRegistry - addDescriptor(2004, BlobTypeDescriptor(BLOB_BINDING)) replaced previous registration(BlobTypeDescriptor(DEFAULT))
2025-10-24 13:19:11 [main] DEBUG o.h.t.d.jdbc.spi.JdbcTypeRegistry - addDescriptor(2005, ClobTypeDescriptor(CLOB_BINDING)) replaced previous registration(ClobTypeDescriptor(DEFAULT))
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration JAVA_OBJECT -> org.hibernate.type.JavaObjectType@7a75183d
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Object -> org.hibernate.type.JavaObjectType@7a75183d
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Type registration key [java.lang.Object] overrode previous entry : `org.hibernate.type.JavaObjectType@61d6c8c4`
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration org.hibernate.type.DurationType -> basicType@1(java.time.Duration,3015)
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration Duration -> basicType@1(java.time.Duration,3015)
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.Duration -> basicType@1(java.time.Duration,3015)
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration org.hibernate.type.OffsetDateTimeType -> basicType@2(java.time.OffsetDateTime,3003)
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetDateTime -> basicType@2(java.time.OffsetDateTime,3003)
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.OffsetDateTime -> basicType@2(java.time.OffsetDateTime,3003)
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration org.hibernate.type.ZonedDateTimeType -> basicType@3(java.time.ZonedDateTime,3003)
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration ZonedDateTime -> basicType@3(java.time.ZonedDateTime,3003)
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.ZonedDateTime -> basicType@3(java.time.ZonedDateTime,3003)
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration org.hibernate.type.OffsetTimeType -> basicType@4(java.time.OffsetTime,3007)
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetTime -> basicType@4(java.time.OffsetTime,3007)
2025-10-24 13:19:11 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.OffsetTime -> basicType@4(java.time.OffsetTime,3007)
2025-10-24 13:19:11 [main] DEBUG o.h.type.spi.TypeConfiguration$Scope - Scoping TypeConfiguration [org.hibernate.type.spi.TypeConfiguration@42a7e7e1] to MetadataBuildingContext [org.hibernate.boot.internal.MetadataBuildingContextRootImpl@e2d9923]
2025-10-24 13:19:12 [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 13:19:12 [main] DEBUG o.h.type.spi.TypeConfiguration$Scope - Scoping TypeConfiguration [org.hibernate.type.spi.TypeConfiguration@42a7e7e1] to SessionFactoryImplementor [org.hibernate.internal.SessionFactoryImpl@88fe9a8]
2025-10-24 13:19:12 [main] DEBUG org.hibernate.SQL -
alter table if exists meetings
alter column description set data type TEXT
2025-10-24 13:19:12 [main] DEBUG org.hibernate.SQL -
alter table if exists meetings
alter column participants set data type TEXT
2025-10-24 13:19:12 [main] DEBUG org.hibernate.SQL -
alter table if exists minutes_sections
alter column content set data type TEXT
2025-10-24 13:19:12 [main] DEBUG org.hibernate.SQL -
alter table if exists templates
alter column description set data type TEXT
2025-10-24 13:19:12 [main] DEBUG org.hibernate.SQL -
alter table if exists templates
alter column sections set data type TEXT
2025-10-24 13:19:12 [main] DEBUG org.hibernate.SQL -
alter table if exists todos
alter column description set data type TEXT
2025-10-24 13:19:12 [main] TRACE o.h.type.spi.TypeConfiguration$Scope - Handling #sessionFactoryCreated from [org.hibernate.internal.SessionFactoryImpl@88fe9a8] for TypeConfiguration
2025-10-24 13:19:12 [main] INFO o.s.o.j.LocalContainerEntityManagerFactoryBean - Initialized JPA EntityManagerFactory for persistence unit 'default'
2025-10-24 13:19:12 [main] INFO o.s.d.j.r.query.QueryEnhancerFactory - Hibernate is in classpath; If applicable, HQL parser will be used.
2025-10-24 13:19:13 [main] INFO c.u.h.m.infra.cache.CacheConfig - Redis 연결 설정 - host: 20.249.177.114, port: 6379, database: 1
2025-10-24 13:19:13 [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 13:19:13 [main] INFO c.u.h.m.infra.cache.CacheConfig - Redis 템플릿 설정 완료
2025-10-24 13:19:13 [main] INFO c.u.h.m.infra.cache.CacheConfig - ObjectMapper 설정 완료
2025-10-24 13:19:13 [main] INFO c.u.h.m.infra.config.EventHubConfig - Initializing Azure EventHub configuration with hub name: hgzero-eventhub-name
2025-10-24 13:19:13 [main] INFO c.u.h.m.infra.config.EventHubConfig - Creating EventHub producer for hub: hgzero-eventhub-name
2025-10-24 13:19:13 [main] INFO c.a.m.e.EventHubClientBuilder - {"az.sdk.message":"Emitting a single connection.","connectionId":"MF_868ef4_1761279553291"}
2025-10-24 13:19:13 [main] INFO c.a.m.e.i.EventHubConnectionProcessor - {"az.sdk.message":"Setting next AMQP channel.","entityPath":"hgzero-eventhub-name"}
2025-10-24 13:19:13 [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 13:19:13 [main] WARN o.s.b.a.s.s.UserDetailsServiceAutoConfiguration -
Using generated security password: 56f935c6-ace5-41ea-8980-4b503478fd58
This generated password is for development use only. Your security configuration must be updated before running your application in production.
2025-10-24 13:19:13 [main] INFO o.s.s.c.a.a.c.InitializeUserDetailsBeanManagerConfigurer$InitializeUserDetailsManagerConfigurer - Global AuthenticationManager configured with UserDetailsService bean with name inMemoryUserDetailsManager
2025-10-24 13:19:13 [main] INFO c.u.h.m.infra.config.WebSocketConfig - WebSocket 핸들러 등록 완료 - endpoint: /ws/minutes/{minutesId}
2025-10-24 13:19:13 [main] INFO o.s.b.a.e.web.EndpointLinksResolver - Exposing 3 endpoints beneath base path '/actuator'
2025-10-24 13:19:13 [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 13:19:14 [main] INFO o.s.b.w.e.tomcat.TomcatWebServer - Tomcat started on port 8082 (http) with context path '/'
2025-10-24 13:19:14 [main] INFO c.u.h.meeting.MeetingApplication - Started MeetingApplication in 4.535 seconds (process running for 4.728)
2025-10-24 13:19:29 [http-nio-8082-exec-1] INFO o.a.c.c.C.[Tomcat].[localhost].[/] - Initializing Spring DispatcherServlet 'dispatcherServlet'
2025-10-24 13:19:29 [http-nio-8082-exec-1] INFO o.s.web.servlet.DispatcherServlet - Initializing Servlet 'dispatcherServlet'
2025-10-24 13:19:29 [http-nio-8082-exec-1] INFO o.s.web.servlet.DispatcherServlet - Completed initialization in 14 ms
2025-10-24 13:19:29 [http-nio-8082-exec-1] DEBUG o.s.security.web.FilterChainProxy - Securing GET /swagger-ui/index.html
2025-10-24 13:19:29 [http-nio-8082-exec-1] DEBUG o.s.s.w.a.AnonymousAuthenticationFilter - Set SecurityContextHolder to anonymous SecurityContext
2025-10-24 13:19:29 [http-nio-8082-exec-1] DEBUG o.s.security.web.FilterChainProxy - Secured GET /swagger-ui/index.html
2025-10-24 13:19:29 [http-nio-8082-exec-4] DEBUG o.s.security.web.FilterChainProxy - Securing GET /swagger-ui/swagger-ui.css
2025-10-24 13:19:29 [http-nio-8082-exec-4] DEBUG o.s.s.w.a.AnonymousAuthenticationFilter - Set SecurityContextHolder to anonymous SecurityContext
2025-10-24 13:19:29 [http-nio-8082-exec-5] DEBUG o.s.security.web.FilterChainProxy - Securing GET /swagger-ui/index.css
2025-10-24 13:19:29 [http-nio-8082-exec-6] DEBUG o.s.security.web.FilterChainProxy - Securing GET /swagger-ui/swagger-ui-bundle.js
2025-10-24 13:19:29 [http-nio-8082-exec-5] DEBUG o.s.s.w.a.AnonymousAuthenticationFilter - Set SecurityContextHolder to anonymous SecurityContext
2025-10-24 13:19:29 [http-nio-8082-exec-6] DEBUG o.s.s.w.a.AnonymousAuthenticationFilter - Set SecurityContextHolder to anonymous SecurityContext
2025-10-24 13:19:29 [http-nio-8082-exec-6] DEBUG o.s.security.web.FilterChainProxy - Secured GET /swagger-ui/swagger-ui-bundle.js
2025-10-24 13:19:29 [http-nio-8082-exec-4] DEBUG o.s.security.web.FilterChainProxy - Secured GET /swagger-ui/swagger-ui.css
2025-10-24 13:19:29 [http-nio-8082-exec-8] DEBUG o.s.security.web.FilterChainProxy - Securing GET /swagger-ui/swagger-initializer.js
2025-10-24 13:19:29 [http-nio-8082-exec-5] DEBUG o.s.security.web.FilterChainProxy - Secured GET /swagger-ui/index.css
2025-10-24 13:19:29 [http-nio-8082-exec-7] DEBUG o.s.security.web.FilterChainProxy - Securing GET /swagger-ui/swagger-ui-standalone-preset.js
2025-10-24 13:19:29 [http-nio-8082-exec-8] DEBUG o.s.s.w.a.AnonymousAuthenticationFilter - Set SecurityContextHolder to anonymous SecurityContext
2025-10-24 13:19:29 [http-nio-8082-exec-8] DEBUG o.s.security.web.FilterChainProxy - Secured GET /swagger-ui/swagger-initializer.js
2025-10-24 13:19:29 [http-nio-8082-exec-7] DEBUG o.s.s.w.a.AnonymousAuthenticationFilter - Set SecurityContextHolder to anonymous SecurityContext
2025-10-24 13:19:29 [http-nio-8082-exec-7] DEBUG o.s.security.web.FilterChainProxy - Secured GET /swagger-ui/swagger-ui-standalone-preset.js
2025-10-24 13:19:29 [http-nio-8082-exec-10] DEBUG o.s.security.web.FilterChainProxy - Securing GET /swagger-ui/favicon-32x32.png
2025-10-24 13:19:29 [http-nio-8082-exec-10] DEBUG o.s.s.w.a.AnonymousAuthenticationFilter - Set SecurityContextHolder to anonymous SecurityContext
2025-10-24 13:19:29 [http-nio-8082-exec-10] DEBUG o.s.security.web.FilterChainProxy - Secured GET /swagger-ui/favicon-32x32.png
2025-10-24 13:19:29 [http-nio-8082-exec-9] DEBUG o.s.security.web.FilterChainProxy - Securing GET /v3/api-docs/swagger-config
2025-10-24 13:19:29 [http-nio-8082-exec-9] DEBUG o.s.s.w.a.AnonymousAuthenticationFilter - Set SecurityContextHolder to anonymous SecurityContext
2025-10-24 13:19:29 [http-nio-8082-exec-9] DEBUG o.s.security.web.FilterChainProxy - Secured GET /v3/api-docs/swagger-config
2025-10-24 13:19:29 [http-nio-8082-exec-9] INFO c.u.hgzero.common.aop.LoggingAspect - [Controller] org.springdoc.webmvc.ui.SwaggerConfigResource.openapiJson 호출 - 파라미터: [SecurityContextHolderAwareRequestWrapper[ org.springframework.security.web.header.HeaderWriterFilter$HeaderWriterRequest@61b368ce]]
2025-10-24 13:19:29 [http-nio-8082-exec-9] INFO c.u.hgzero.common.aop.LoggingAspect - [Controller] org.springdoc.webmvc.ui.SwaggerConfigResource.openapiJson 완료 - 실행시간: 0ms
2025-10-24 13:19:29 [http-nio-8082-exec-1] DEBUG o.s.security.web.FilterChainProxy - Securing GET /v3/api-docs
2025-10-24 13:19:29 [http-nio-8082-exec-1] DEBUG o.s.s.w.a.AnonymousAuthenticationFilter - Set SecurityContextHolder to anonymous SecurityContext
2025-10-24 13:19:29 [http-nio-8082-exec-1] DEBUG o.s.security.web.FilterChainProxy - Secured GET /v3/api-docs
2025-10-24 13:19:29 [http-nio-8082-exec-1] INFO c.u.hgzero.common.aop.LoggingAspect - [Controller] org.springdoc.webmvc.api.OpenApiWebMvcResource.openapiJson 호출 - 파라미터: [SecurityContextHolderAwareRequestWrapper[ org.springframework.security.web.header.HeaderWriterFilter$HeaderWriterRequest@75391c2a], /v3/api-docs, ko_KR]
2025-10-24 13:19:29 [http-nio-8082-exec-1] INFO o.s.api.AbstractOpenApiResource - Init duration for springdoc-openapi is: 416 ms
2025-10-24 13:19:29 [http-nio-8082-exec-1] INFO c.u.hgzero.common.aop.LoggingAspect - [Controller] org.springdoc.webmvc.api.OpenApiWebMvcResource.openapiJson 완료 - 실행시간: 426ms
2025-10-24 13:47:44 [SpringApplicationShutdownHook] INFO c.a.m.e.i.EventHubConnectionProcessor - {"az.sdk.message":"Upstream connection publisher was completed. Terminating processor.","entityPath":"hgzero-eventhub-name"}
2025-10-24 13:47:44 [SpringApplicationShutdownHook] INFO c.a.c.a.i.ReactorConnection - {"az.sdk.message":"Disposing of ReactorConnection.","connectionId":"MF_868ef4_1761279553291","isTransient":false,"isInitiatedByClient":true,"shutdownMessage":"Disposed by client."}
2025-10-24 13:47:44 [SpringApplicationShutdownHook] INFO c.a.m.e.i.EventHubConnectionProcessor - {"az.sdk.message":"Channel is disposed.","entityPath":"hgzero-eventhub-name"}
2025-10-24 13:47:44 [SpringApplicationShutdownHook] INFO o.s.o.j.LocalContainerEntityManagerFactoryBean - Closing JPA EntityManagerFactory for persistence unit 'default'
2025-10-24 13:47:44 [SpringApplicationShutdownHook] TRACE o.h.type.spi.TypeConfiguration$Scope - Handling #sessionFactoryClosed from [org.hibernate.internal.SessionFactoryImpl@88fe9a8] for TypeConfiguration
2025-10-24 13:47:44 [SpringApplicationShutdownHook] DEBUG o.h.type.spi.TypeConfiguration$Scope - Un-scoping TypeConfiguration [org.hibernate.type.spi.TypeConfiguration$Scope@66faa3af] from SessionFactory [org.hibernate.internal.SessionFactoryImpl@88fe9a8]
2025-10-24 13:47:44 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown initiated...
2025-10-24 13:47:44 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown completed.
2025-10-24 13:47:48 [main] INFO c.u.h.meeting.MeetingApplication - Starting MeetingApplication using Java 21.0.8 with PID 68660 (/Users/adela/home/workspace/recent/HGZero/meeting/build/classes/java/main started by adela in /Users/adela/home/workspace/recent/HGZero/meeting)
2025-10-24 13:47:48 [main] DEBUG c.u.h.meeting.MeetingApplication - Running with Spring Boot v3.3.5, Spring v6.1.14
2025-10-24 13:47:48 [main] INFO c.u.h.meeting.MeetingApplication - The following 1 profile is active: "dev"
2025-10-24 13:47:48 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Multiple Spring Data modules found, entering strict repository configuration mode
2025-10-24 13:47:48 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Bootstrapping Spring Data JPA repositories in DEFAULT mode.
2025-10-24 13:47:48 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 68 ms. Found 5 JPA repository interfaces.
2025-10-24 13:47:48 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Multiple Spring Data modules found, entering strict repository configuration mode
2025-10-24 13:47:48 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Bootstrapping Spring Data Redis repositories in DEFAULT mode.
2025-10-24 13:47:48 [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 13:47:48 [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 13:47:48 [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 13:47:48 [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 13:47:48 [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 13:47:48 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 12 ms. Found 0 Redis repository interfaces.
2025-10-24 13:47:49 [main] INFO o.s.b.w.e.tomcat.TomcatWebServer - Tomcat initialized with port 8082 (http)
2025-10-24 13:47:49 [main] INFO o.a.catalina.core.StandardService - Starting service [Tomcat]
2025-10-24 13:47:49 [main] INFO o.a.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/10.1.31]
2025-10-24 13:47:49 [main] INFO o.a.c.c.C.[Tomcat].[localhost].[/] - Initializing Spring embedded WebApplicationContext
2025-10-24 13:47:49 [main] INFO o.s.b.w.s.c.ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 1195 ms
2025-10-24 13:47:49 [main] INFO o.h.jpa.internal.util.LogHelper - HHH000204: Processing PersistenceUnitInfo [name: default]
2025-10-24 13:47:49 [main] INFO org.hibernate.Version - HHH000412: Hibernate ORM core version 6.5.3.Final
2025-10-24 13:47:49 [main] INFO o.h.c.i.RegionFactoryInitiator - HHH000026: Second-level cache disabled
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration boolean -> org.hibernate.type.BasicTypeReference@5d2e65bd
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration boolean -> org.hibernate.type.BasicTypeReference@5d2e65bd
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Boolean -> org.hibernate.type.BasicTypeReference@5d2e65bd
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration numeric_boolean -> org.hibernate.type.BasicTypeReference@254513e8
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration org.hibernate.type.NumericBooleanConverter -> org.hibernate.type.BasicTypeReference@254513e8
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration true_false -> org.hibernate.type.BasicTypeReference@74450c9b
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration org.hibernate.type.TrueFalseConverter -> org.hibernate.type.BasicTypeReference@74450c9b
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration yes_no -> org.hibernate.type.BasicTypeReference@74f89bad
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration org.hibernate.type.YesNoConverter -> org.hibernate.type.BasicTypeReference@74f89bad
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration byte -> org.hibernate.type.BasicTypeReference@5ad50b02
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration byte -> org.hibernate.type.BasicTypeReference@5ad50b02
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Byte -> org.hibernate.type.BasicTypeReference@5ad50b02
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration binary -> org.hibernate.type.BasicTypeReference@570299e3
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration byte[] -> org.hibernate.type.BasicTypeReference@570299e3
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration [B -> org.hibernate.type.BasicTypeReference@570299e3
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration binary_wrapper -> org.hibernate.type.BasicTypeReference@bff764c
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration wrapper-binary -> org.hibernate.type.BasicTypeReference@bff764c
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration image -> org.hibernate.type.BasicTypeReference@3beaa16d
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration blob -> org.hibernate.type.BasicTypeReference@49153009
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.sql.Blob -> org.hibernate.type.BasicTypeReference@49153009
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_blob -> org.hibernate.type.BasicTypeReference@a1b7549
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_blob_wrapper -> org.hibernate.type.BasicTypeReference@7aa63f50
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration short -> org.hibernate.type.BasicTypeReference@142918a0
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration short -> org.hibernate.type.BasicTypeReference@142918a0
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Short -> org.hibernate.type.BasicTypeReference@142918a0
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration integer -> org.hibernate.type.BasicTypeReference@745cf754
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration int -> org.hibernate.type.BasicTypeReference@745cf754
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Integer -> org.hibernate.type.BasicTypeReference@745cf754
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration long -> org.hibernate.type.BasicTypeReference@25bc65ab
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration long -> org.hibernate.type.BasicTypeReference@25bc65ab
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Long -> org.hibernate.type.BasicTypeReference@25bc65ab
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration float -> org.hibernate.type.BasicTypeReference@6eab92f3
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration float -> org.hibernate.type.BasicTypeReference@6eab92f3
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Float -> org.hibernate.type.BasicTypeReference@6eab92f3
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration double -> org.hibernate.type.BasicTypeReference@321b7b9e
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration double -> org.hibernate.type.BasicTypeReference@321b7b9e
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Double -> org.hibernate.type.BasicTypeReference@321b7b9e
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration big_integer -> org.hibernate.type.BasicTypeReference@21eedcde
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.math.BigInteger -> org.hibernate.type.BasicTypeReference@21eedcde
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration big_decimal -> org.hibernate.type.BasicTypeReference@67396475
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.math.BigDecimal -> org.hibernate.type.BasicTypeReference@67396475
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration character -> org.hibernate.type.BasicTypeReference@55b74e6b
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration char -> org.hibernate.type.BasicTypeReference@55b74e6b
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Character -> org.hibernate.type.BasicTypeReference@55b74e6b
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration character_nchar -> org.hibernate.type.BasicTypeReference@3c1908c8
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration string -> org.hibernate.type.BasicTypeReference@6bc62bb9
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.String -> org.hibernate.type.BasicTypeReference@6bc62bb9
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration nstring -> org.hibernate.type.BasicTypeReference@47f0e078
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration characters -> org.hibernate.type.BasicTypeReference@28db2afb
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration char[] -> org.hibernate.type.BasicTypeReference@28db2afb
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration [C -> org.hibernate.type.BasicTypeReference@28db2afb
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration wrapper-characters -> org.hibernate.type.BasicTypeReference@5c703860
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration text -> org.hibernate.type.BasicTypeReference@6315bb4
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration ntext -> org.hibernate.type.BasicTypeReference@4682882a
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration clob -> org.hibernate.type.BasicTypeReference@37fffef3
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.sql.Clob -> org.hibernate.type.BasicTypeReference@37fffef3
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration nclob -> org.hibernate.type.BasicTypeReference@6a116354
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.sql.NClob -> org.hibernate.type.BasicTypeReference@6a116354
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_clob -> org.hibernate.type.BasicTypeReference@66716959
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_clob_char_array -> org.hibernate.type.BasicTypeReference@34e07e65
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_clob_character_array -> org.hibernate.type.BasicTypeReference@7ca0166c
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_nclob -> org.hibernate.type.BasicTypeReference@1dcad16f
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_nclob_character_array -> org.hibernate.type.BasicTypeReference@701c482e
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_nclob_char_array -> org.hibernate.type.BasicTypeReference@4738131e
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration Duration -> org.hibernate.type.BasicTypeReference@3b576ee3
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.Duration -> org.hibernate.type.BasicTypeReference@3b576ee3
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration LocalDateTime -> org.hibernate.type.BasicTypeReference@705d914f
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.LocalDateTime -> org.hibernate.type.BasicTypeReference@705d914f
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration LocalDate -> org.hibernate.type.BasicTypeReference@6212ea52
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.LocalDate -> org.hibernate.type.BasicTypeReference@6212ea52
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration LocalTime -> org.hibernate.type.BasicTypeReference@65b5b5ed
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.LocalTime -> org.hibernate.type.BasicTypeReference@65b5b5ed
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetDateTime -> org.hibernate.type.BasicTypeReference@6595ffce
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.OffsetDateTime -> org.hibernate.type.BasicTypeReference@6595ffce
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetDateTimeWithTimezone -> org.hibernate.type.BasicTypeReference@795eddda
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetDateTimeWithoutTimezone -> org.hibernate.type.BasicTypeReference@c6bf8d9
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetTime -> org.hibernate.type.BasicTypeReference@44392e64
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.OffsetTime -> org.hibernate.type.BasicTypeReference@44392e64
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetTimeUtc -> org.hibernate.type.BasicTypeReference@e18d2a2
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetTimeWithTimezone -> org.hibernate.type.BasicTypeReference@1a77eb6
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetTimeWithoutTimezone -> org.hibernate.type.BasicTypeReference@52d9f36b
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration ZonedDateTime -> org.hibernate.type.BasicTypeReference@5f9ebd5a
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.ZonedDateTime -> org.hibernate.type.BasicTypeReference@5f9ebd5a
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration ZonedDateTimeWithTimezone -> org.hibernate.type.BasicTypeReference@175bf9c9
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration ZonedDateTimeWithoutTimezone -> org.hibernate.type.BasicTypeReference@2db3675a
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration date -> org.hibernate.type.BasicTypeReference@306c9b2c
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.sql.Date -> org.hibernate.type.BasicTypeReference@306c9b2c
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration time -> org.hibernate.type.BasicTypeReference@1ab28416
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.sql.Time -> org.hibernate.type.BasicTypeReference@1ab28416
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration timestamp -> org.hibernate.type.BasicTypeReference@52efb338
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.sql.Timestamp -> org.hibernate.type.BasicTypeReference@52efb338
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.util.Date -> org.hibernate.type.BasicTypeReference@52efb338
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration calendar -> org.hibernate.type.BasicTypeReference@64508788
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.util.Calendar -> org.hibernate.type.BasicTypeReference@64508788
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.util.GregorianCalendar -> org.hibernate.type.BasicTypeReference@64508788
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration calendar_date -> org.hibernate.type.BasicTypeReference@30b1c5d5
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration calendar_time -> org.hibernate.type.BasicTypeReference@3e2d65e1
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration instant -> org.hibernate.type.BasicTypeReference@1174676f
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.Instant -> org.hibernate.type.BasicTypeReference@1174676f
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration uuid -> org.hibernate.type.BasicTypeReference@71f8ce0e
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.util.UUID -> org.hibernate.type.BasicTypeReference@71f8ce0e
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration pg-uuid -> org.hibernate.type.BasicTypeReference@71f8ce0e
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration uuid-binary -> org.hibernate.type.BasicTypeReference@4fd92289
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration uuid-char -> org.hibernate.type.BasicTypeReference@1a8e44fe
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration class -> org.hibernate.type.BasicTypeReference@287317df
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Class -> org.hibernate.type.BasicTypeReference@287317df
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration currency -> org.hibernate.type.BasicTypeReference@1fcc3461
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration Currency -> org.hibernate.type.BasicTypeReference@1fcc3461
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.util.Currency -> org.hibernate.type.BasicTypeReference@1fcc3461
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration locale -> org.hibernate.type.BasicTypeReference@1987807b
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.util.Locale -> org.hibernate.type.BasicTypeReference@1987807b
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration serializable -> org.hibernate.type.BasicTypeReference@71469e01
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.io.Serializable -> org.hibernate.type.BasicTypeReference@71469e01
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration timezone -> org.hibernate.type.BasicTypeReference@41bbb219
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.util.TimeZone -> org.hibernate.type.BasicTypeReference@41bbb219
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration ZoneOffset -> org.hibernate.type.BasicTypeReference@3f2ae973
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.ZoneOffset -> org.hibernate.type.BasicTypeReference@3f2ae973
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration url -> org.hibernate.type.BasicTypeReference@1a8b22b5
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.net.URL -> org.hibernate.type.BasicTypeReference@1a8b22b5
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration vector -> org.hibernate.type.BasicTypeReference@5f781173
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration row_version -> org.hibernate.type.BasicTypeReference@43cf5bff
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration object -> org.hibernate.type.JavaObjectType@6c13019c
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Object -> org.hibernate.type.JavaObjectType@6c13019c
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration null -> org.hibernate.type.NullType@4f7ef948
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_date -> org.hibernate.type.BasicTypeReference@6fdaef04
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_time -> org.hibernate.type.BasicTypeReference@3cacc87
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_timestamp -> org.hibernate.type.BasicTypeReference@3bc6c10f
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_calendar -> org.hibernate.type.BasicTypeReference@3dcbbbc
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_calendar_date -> org.hibernate.type.BasicTypeReference@4040ccae
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_calendar_time -> org.hibernate.type.BasicTypeReference@15bb8ed5
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_binary -> org.hibernate.type.BasicTypeReference@18f8ebd4
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_serializable -> org.hibernate.type.BasicTypeReference@7e1fb22c
2025-10-24 13:47:49 [main] INFO o.s.o.j.p.SpringPersistenceUnitInfo - No LoadTimeWeaver setup: ignoring JPA class transformer
2025-10-24 13:47:49 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting...
2025-10-24 13:47:49 [main] INFO com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Added connection org.postgresql.jdbc.PgConnection@17ea3bc0
2025-10-24 13:47:49 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed.
2025-10-24 13:47:49 [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 13:47:49 [main] DEBUG o.h.t.d.sql.spi.DdlTypeRegistry - addDescriptor(2003, org.hibernate.type.descriptor.sql.internal.ArrayDdlTypeImpl@52fe87e0) replaced previous registration(org.hibernate.type.descriptor.sql.internal.ArrayDdlTypeImpl@37393dab)
2025-10-24 13:47:49 [main] DEBUG o.h.t.d.sql.spi.DdlTypeRegistry - addDescriptor(6, org.hibernate.type.descriptor.sql.internal.CapacityDependentDdlType@4866a755) replaced previous registration(org.hibernate.type.descriptor.sql.internal.DdlTypeImpl@1361e880)
2025-10-24 13:47:49 [main] DEBUG o.h.t.d.jdbc.spi.JdbcTypeRegistry - addDescriptor(2004, BlobTypeDescriptor(BLOB_BINDING)) replaced previous registration(BlobTypeDescriptor(DEFAULT))
2025-10-24 13:47:49 [main] DEBUG o.h.t.d.jdbc.spi.JdbcTypeRegistry - addDescriptor(2005, ClobTypeDescriptor(CLOB_BINDING)) replaced previous registration(ClobTypeDescriptor(DEFAULT))
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration JAVA_OBJECT -> org.hibernate.type.JavaObjectType@e0d9e3f
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Object -> org.hibernate.type.JavaObjectType@e0d9e3f
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Type registration key [java.lang.Object] overrode previous entry : `org.hibernate.type.JavaObjectType@6c13019c`
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration org.hibernate.type.DurationType -> basicType@1(java.time.Duration,3015)
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration Duration -> basicType@1(java.time.Duration,3015)
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.Duration -> basicType@1(java.time.Duration,3015)
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration org.hibernate.type.OffsetDateTimeType -> basicType@2(java.time.OffsetDateTime,3003)
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetDateTime -> basicType@2(java.time.OffsetDateTime,3003)
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.OffsetDateTime -> basicType@2(java.time.OffsetDateTime,3003)
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration org.hibernate.type.ZonedDateTimeType -> basicType@3(java.time.ZonedDateTime,3003)
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration ZonedDateTime -> basicType@3(java.time.ZonedDateTime,3003)
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.ZonedDateTime -> basicType@3(java.time.ZonedDateTime,3003)
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration org.hibernate.type.OffsetTimeType -> basicType@4(java.time.OffsetTime,3007)
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetTime -> basicType@4(java.time.OffsetTime,3007)
2025-10-24 13:47:49 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.OffsetTime -> basicType@4(java.time.OffsetTime,3007)
2025-10-24 13:47:49 [main] DEBUG o.h.type.spi.TypeConfiguration$Scope - Scoping TypeConfiguration [org.hibernate.type.spi.TypeConfiguration@417b3642] to MetadataBuildingContext [org.hibernate.boot.internal.MetadataBuildingContextRootImpl@6bd28e4a]
2025-10-24 13:47:50 [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 13:47:50 [main] DEBUG o.h.type.spi.TypeConfiguration$Scope - Scoping TypeConfiguration [org.hibernate.type.spi.TypeConfiguration@417b3642] to SessionFactoryImplementor [org.hibernate.internal.SessionFactoryImpl@2b592f17]
2025-10-24 13:47:50 [main] DEBUG org.hibernate.SQL -
alter table if exists meetings
alter column description set data type TEXT
2025-10-24 13:47:50 [main] DEBUG org.hibernate.SQL -
alter table if exists meetings
alter column participants set data type TEXT
2025-10-24 13:47:50 [main] DEBUG org.hibernate.SQL -
alter table if exists minutes_sections
alter column content set data type TEXT
2025-10-24 13:47:50 [main] DEBUG org.hibernate.SQL -
alter table if exists templates
alter column description set data type TEXT
2025-10-24 13:47:50 [main] DEBUG org.hibernate.SQL -
alter table if exists templates
alter column sections set data type TEXT
2025-10-24 13:47:50 [main] DEBUG org.hibernate.SQL -
alter table if exists todos
alter column description set data type TEXT
2025-10-24 13:47:50 [main] TRACE o.h.type.spi.TypeConfiguration$Scope - Handling #sessionFactoryCreated from [org.hibernate.internal.SessionFactoryImpl@2b592f17] for TypeConfiguration
2025-10-24 13:47:50 [main] INFO o.s.o.j.LocalContainerEntityManagerFactoryBean - Initialized JPA EntityManagerFactory for persistence unit 'default'
2025-10-24 13:47:50 [main] INFO o.s.d.j.r.query.QueryEnhancerFactory - Hibernate is in classpath; If applicable, HQL parser will be used.
2025-10-24 13:47:51 [main] INFO c.u.h.m.infra.cache.CacheConfig - Redis 연결 설정 - host: 20.249.177.114, port: 6379, database: 1
2025-10-24 13:47:51 [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 13:47:51 [main] INFO c.u.h.m.infra.cache.CacheConfig - Redis 템플릿 설정 완료
2025-10-24 13:47:51 [main] INFO c.u.h.m.infra.cache.CacheConfig - ObjectMapper 설정 완료
2025-10-24 13:47:51 [main] INFO c.u.h.m.infra.config.EventHubConfig - Initializing Azure EventHub configuration with hub name: hgzero-eventhub-name
2025-10-24 13:47:51 [main] INFO c.u.h.m.infra.config.EventHubConfig - Creating EventHub producer for hub: hgzero-eventhub-name
2025-10-24 13:47:51 [main] INFO c.a.m.e.EventHubClientBuilder - {"az.sdk.message":"Emitting a single connection.","connectionId":"MF_a59cb7_1761281271496"}
2025-10-24 13:47:51 [main] INFO c.a.m.e.i.EventHubConnectionProcessor - {"az.sdk.message":"Setting next AMQP channel.","entityPath":"hgzero-eventhub-name"}
2025-10-24 13:47:51 [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 13:47:51 [main] WARN o.s.b.a.s.s.UserDetailsServiceAutoConfiguration -
Using generated security password: 961311b1-6145-43f6-953c-04e70e3447ad
This generated password is for development use only. Your security configuration must be updated before running your application in production.
2025-10-24 13:47:51 [main] INFO o.s.s.c.a.a.c.InitializeUserDetailsBeanManagerConfigurer$InitializeUserDetailsManagerConfigurer - Global AuthenticationManager configured with UserDetailsService bean with name inMemoryUserDetailsManager
2025-10-24 13:47:51 [main] INFO c.u.h.m.infra.config.WebSocketConfig - WebSocket 핸들러 등록 완료 - endpoint: /ws/minutes/{minutesId}
2025-10-24 13:47:51 [main] INFO o.s.b.a.e.web.EndpointLinksResolver - Exposing 3 endpoints beneath base path '/actuator'
2025-10-24 13:47:52 [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 13:47:52 [main] INFO o.s.b.w.e.tomcat.TomcatWebServer - Tomcat started on port 8082 (http) with context path '/'
2025-10-24 13:47:52 [main] INFO c.u.h.meeting.MeetingApplication - Started MeetingApplication in 4.575 seconds (process running for 4.775)
2025-10-24 13:47:55 [http-nio-8082-exec-1] INFO o.a.c.c.C.[Tomcat].[localhost].[/] - Initializing Spring DispatcherServlet 'dispatcherServlet'
2025-10-24 13:47:55 [http-nio-8082-exec-1] INFO o.s.web.servlet.DispatcherServlet - Initializing Servlet 'dispatcherServlet'
2025-10-24 13:47:55 [http-nio-8082-exec-1] INFO o.s.web.servlet.DispatcherServlet - Completed initialization in 2 ms
2025-10-24 13:47:55 [http-nio-8082-exec-1] DEBUG o.s.security.web.FilterChainProxy - Securing GET /swagger-ui/index.html
2025-10-24 13:47:55 [http-nio-8082-exec-1] DEBUG o.s.s.w.a.AnonymousAuthenticationFilter - Set SecurityContextHolder to anonymous SecurityContext
2025-10-24 13:47:55 [http-nio-8082-exec-1] DEBUG o.s.security.web.FilterChainProxy - Secured GET /swagger-ui/index.html
2025-10-24 13:47:56 [http-nio-8082-exec-2] DEBUG o.s.security.web.FilterChainProxy - Securing GET /swagger-ui/swagger-ui.css
2025-10-24 13:47:56 [http-nio-8082-exec-2] DEBUG o.s.s.w.a.AnonymousAuthenticationFilter - Set SecurityContextHolder to anonymous SecurityContext
2025-10-24 13:47:56 [http-nio-8082-exec-3] DEBUG o.s.security.web.FilterChainProxy - Securing GET /swagger-ui/index.css
2025-10-24 13:47:56 [http-nio-8082-exec-2] DEBUG o.s.security.web.FilterChainProxy - Secured GET /swagger-ui/swagger-ui.css
2025-10-24 13:47:56 [http-nio-8082-exec-3] DEBUG o.s.s.w.a.AnonymousAuthenticationFilter - Set SecurityContextHolder to anonymous SecurityContext
2025-10-24 13:47:56 [http-nio-8082-exec-3] DEBUG o.s.security.web.FilterChainProxy - Secured GET /swagger-ui/index.css
2025-10-24 13:47:56 [http-nio-8082-exec-5] DEBUG o.s.security.web.FilterChainProxy - Securing GET /swagger-ui/swagger-ui-standalone-preset.js
2025-10-24 13:47:56 [http-nio-8082-exec-5] DEBUG o.s.s.w.a.AnonymousAuthenticationFilter - Set SecurityContextHolder to anonymous SecurityContext
2025-10-24 13:47:56 [http-nio-8082-exec-4] DEBUG o.s.security.web.FilterChainProxy - Securing GET /swagger-ui/swagger-ui-bundle.js
2025-10-24 13:47:56 [http-nio-8082-exec-5] DEBUG o.s.security.web.FilterChainProxy - Secured GET /swagger-ui/swagger-ui-standalone-preset.js
2025-10-24 13:47:56 [http-nio-8082-exec-6] DEBUG o.s.security.web.FilterChainProxy - Securing GET /swagger-ui/swagger-initializer.js
2025-10-24 13:47:56 [http-nio-8082-exec-4] DEBUG o.s.s.w.a.AnonymousAuthenticationFilter - Set SecurityContextHolder to anonymous SecurityContext
2025-10-24 13:47:56 [http-nio-8082-exec-6] DEBUG o.s.s.w.a.AnonymousAuthenticationFilter - Set SecurityContextHolder to anonymous SecurityContext
2025-10-24 13:47:56 [http-nio-8082-exec-6] DEBUG o.s.security.web.FilterChainProxy - Secured GET /swagger-ui/swagger-initializer.js
2025-10-24 13:47:56 [http-nio-8082-exec-4] DEBUG o.s.security.web.FilterChainProxy - Secured GET /swagger-ui/swagger-ui-bundle.js
2025-10-24 13:47:56 [http-nio-8082-exec-8] DEBUG o.s.security.web.FilterChainProxy - Securing GET /swagger-ui/favicon-32x32.png
2025-10-24 13:47:56 [http-nio-8082-exec-7] DEBUG o.s.security.web.FilterChainProxy - Securing GET /v3/api-docs/swagger-config
2025-10-24 13:47:56 [http-nio-8082-exec-8] DEBUG o.s.s.w.a.AnonymousAuthenticationFilter - Set SecurityContextHolder to anonymous SecurityContext
2025-10-24 13:47:56 [http-nio-8082-exec-7] DEBUG o.s.s.w.a.AnonymousAuthenticationFilter - Set SecurityContextHolder to anonymous SecurityContext
2025-10-24 13:47:56 [http-nio-8082-exec-8] DEBUG o.s.security.web.FilterChainProxy - Secured GET /swagger-ui/favicon-32x32.png
2025-10-24 13:47:56 [http-nio-8082-exec-7] DEBUG o.s.security.web.FilterChainProxy - Secured GET /v3/api-docs/swagger-config
2025-10-24 13:47: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@7231de39]]
2025-10-24 13:47:56 [http-nio-8082-exec-7] INFO c.u.hgzero.common.aop.LoggingAspect - [Controller] org.springdoc.webmvc.ui.SwaggerConfigResource.openapiJson 완료 - 실행시간: 0ms
2025-10-24 13:47:56 [http-nio-8082-exec-9] DEBUG o.s.security.web.FilterChainProxy - Securing GET /v3/api-docs
2025-10-24 13:47:56 [http-nio-8082-exec-9] DEBUG o.s.s.w.a.AnonymousAuthenticationFilter - Set SecurityContextHolder to anonymous SecurityContext
2025-10-24 13:47:56 [http-nio-8082-exec-9] DEBUG o.s.security.web.FilterChainProxy - Secured GET /v3/api-docs
2025-10-24 13:47:56 [http-nio-8082-exec-9] INFO c.u.hgzero.common.aop.LoggingAspect - [Controller] org.springdoc.webmvc.api.OpenApiWebMvcResource.openapiJson 호출 - 파라미터: [SecurityContextHolderAwareRequestWrapper[ org.springframework.security.web.header.HeaderWriterFilter$HeaderWriterRequest@7472d8df], /v3/api-docs, ko_KR]
2025-10-24 13:47:56 [http-nio-8082-exec-9] INFO o.s.api.AbstractOpenApiResource - Init duration for springdoc-openapi is: 384 ms
2025-10-24 13:47:56 [http-nio-8082-exec-9] INFO c.u.hgzero.common.aop.LoggingAspect - [Controller] org.springdoc.webmvc.api.OpenApiWebMvcResource.openapiJson 완료 - 실행시간: 394ms
2025-10-24 14:18:38 [main] INFO c.u.h.meeting.MeetingApplication - Starting MeetingApplication using Java 21.0.8 with PID 74804 (/Users/adela/home/workspace/recent/HGZero/meeting/build/classes/java/main started by adela in /Users/adela/home/workspace/recent/HGZero/meeting)
2025-10-24 14:18:38 [main] DEBUG c.u.h.meeting.MeetingApplication - Running with Spring Boot v3.3.5, Spring v6.1.14
2025-10-24 14:18:38 [main] INFO c.u.h.meeting.MeetingApplication - The following 1 profile is active: "dev"
2025-10-24 14:18:38 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Multiple Spring Data modules found, entering strict repository configuration mode
2025-10-24 14:18:38 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Bootstrapping Spring Data JPA repositories in DEFAULT mode.
2025-10-24 14:18:39 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 70 ms. Found 5 JPA repository interfaces.
2025-10-24 14:18:39 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Multiple Spring Data modules found, entering strict repository configuration mode
2025-10-24 14:18:39 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Bootstrapping Spring Data Redis repositories in DEFAULT mode.
2025-10-24 14:18:39 [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 14:18:39 [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 14:18:39 [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 14:18:39 [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 14:18:39 [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 14:18:39 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 12 ms. Found 0 Redis repository interfaces.
2025-10-24 14:18:39 [main] INFO o.s.b.w.e.tomcat.TomcatWebServer - Tomcat initialized with port 8082 (http)
2025-10-24 14:18:39 [main] INFO o.a.catalina.core.StandardService - Starting service [Tomcat]
2025-10-24 14:18:39 [main] INFO o.a.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/10.1.31]
2025-10-24 14:18:39 [main] INFO o.a.c.c.C.[Tomcat].[localhost].[/] - Initializing Spring embedded WebApplicationContext
2025-10-24 14:18:39 [main] INFO o.s.b.w.s.c.ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 1182 ms
2025-10-24 14:18:39 [main] INFO o.h.jpa.internal.util.LogHelper - HHH000204: Processing PersistenceUnitInfo [name: default]
2025-10-24 14:18:40 [main] INFO org.hibernate.Version - HHH000412: Hibernate ORM core version 6.5.3.Final
2025-10-24 14:18:40 [main] INFO o.h.c.i.RegionFactoryInitiator - HHH000026: Second-level cache disabled
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration boolean -> org.hibernate.type.BasicTypeReference@41bbb219
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration boolean -> org.hibernate.type.BasicTypeReference@41bbb219
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Boolean -> org.hibernate.type.BasicTypeReference@41bbb219
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration numeric_boolean -> org.hibernate.type.BasicTypeReference@3f2ae973
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration org.hibernate.type.NumericBooleanConverter -> org.hibernate.type.BasicTypeReference@3f2ae973
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration true_false -> org.hibernate.type.BasicTypeReference@1a8b22b5
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration org.hibernate.type.TrueFalseConverter -> org.hibernate.type.BasicTypeReference@1a8b22b5
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration yes_no -> org.hibernate.type.BasicTypeReference@5f781173
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration org.hibernate.type.YesNoConverter -> org.hibernate.type.BasicTypeReference@5f781173
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration byte -> org.hibernate.type.BasicTypeReference@43cf5bff
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration byte -> org.hibernate.type.BasicTypeReference@43cf5bff
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Byte -> org.hibernate.type.BasicTypeReference@43cf5bff
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration binary -> org.hibernate.type.BasicTypeReference@2b464384
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration byte[] -> org.hibernate.type.BasicTypeReference@2b464384
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration [B -> org.hibernate.type.BasicTypeReference@2b464384
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration binary_wrapper -> org.hibernate.type.BasicTypeReference@681b42d3
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration wrapper-binary -> org.hibernate.type.BasicTypeReference@681b42d3
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration image -> org.hibernate.type.BasicTypeReference@77f7352a
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration blob -> org.hibernate.type.BasicTypeReference@4ede8888
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.sql.Blob -> org.hibernate.type.BasicTypeReference@4ede8888
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_blob -> org.hibernate.type.BasicTypeReference@571db8b4
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_blob_wrapper -> org.hibernate.type.BasicTypeReference@65a2755e
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration short -> org.hibernate.type.BasicTypeReference@2b3242a5
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration short -> org.hibernate.type.BasicTypeReference@2b3242a5
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Short -> org.hibernate.type.BasicTypeReference@2b3242a5
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration integer -> org.hibernate.type.BasicTypeReference@11120583
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration int -> org.hibernate.type.BasicTypeReference@11120583
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Integer -> org.hibernate.type.BasicTypeReference@11120583
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration long -> org.hibernate.type.BasicTypeReference@2bf0c70d
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration long -> org.hibernate.type.BasicTypeReference@2bf0c70d
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Long -> org.hibernate.type.BasicTypeReference@2bf0c70d
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration float -> org.hibernate.type.BasicTypeReference@5d8e4fa8
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration float -> org.hibernate.type.BasicTypeReference@5d8e4fa8
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Float -> org.hibernate.type.BasicTypeReference@5d8e4fa8
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration double -> org.hibernate.type.BasicTypeReference@649009d6
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration double -> org.hibernate.type.BasicTypeReference@649009d6
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Double -> org.hibernate.type.BasicTypeReference@649009d6
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration big_integer -> org.hibernate.type.BasicTypeReference@652f26da
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.math.BigInteger -> org.hibernate.type.BasicTypeReference@652f26da
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration big_decimal -> org.hibernate.type.BasicTypeReference@484a5ddd
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.math.BigDecimal -> org.hibernate.type.BasicTypeReference@484a5ddd
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration character -> org.hibernate.type.BasicTypeReference@6796a873
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration char -> org.hibernate.type.BasicTypeReference@6796a873
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Character -> org.hibernate.type.BasicTypeReference@6796a873
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration character_nchar -> org.hibernate.type.BasicTypeReference@3acc3ee
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration string -> org.hibernate.type.BasicTypeReference@1f293cb7
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.String -> org.hibernate.type.BasicTypeReference@1f293cb7
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration nstring -> org.hibernate.type.BasicTypeReference@5972e3a
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration characters -> org.hibernate.type.BasicTypeReference@5790cbcb
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration char[] -> org.hibernate.type.BasicTypeReference@5790cbcb
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration [C -> org.hibernate.type.BasicTypeReference@5790cbcb
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration wrapper-characters -> org.hibernate.type.BasicTypeReference@32c6d164
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration text -> org.hibernate.type.BasicTypeReference@645c9f0f
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration ntext -> org.hibernate.type.BasicTypeReference@58068b40
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration clob -> org.hibernate.type.BasicTypeReference@999cd18
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.sql.Clob -> org.hibernate.type.BasicTypeReference@999cd18
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration nclob -> org.hibernate.type.BasicTypeReference@dd060be
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.sql.NClob -> org.hibernate.type.BasicTypeReference@dd060be
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_clob -> org.hibernate.type.BasicTypeReference@df432ec
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_clob_char_array -> org.hibernate.type.BasicTypeReference@6144e499
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_clob_character_array -> org.hibernate.type.BasicTypeReference@26f204a4
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_nclob -> org.hibernate.type.BasicTypeReference@28295554
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_nclob_character_array -> org.hibernate.type.BasicTypeReference@4e671ef
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_nclob_char_array -> org.hibernate.type.BasicTypeReference@42403dc6
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration Duration -> org.hibernate.type.BasicTypeReference@74a1d60e
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.Duration -> org.hibernate.type.BasicTypeReference@74a1d60e
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration LocalDateTime -> org.hibernate.type.BasicTypeReference@16c0be3b
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.LocalDateTime -> org.hibernate.type.BasicTypeReference@16c0be3b
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration LocalDate -> org.hibernate.type.BasicTypeReference@219edc05
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.LocalDate -> org.hibernate.type.BasicTypeReference@219edc05
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration LocalTime -> org.hibernate.type.BasicTypeReference@62f37bfd
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.LocalTime -> org.hibernate.type.BasicTypeReference@62f37bfd
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetDateTime -> org.hibernate.type.BasicTypeReference@1818d00b
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.OffsetDateTime -> org.hibernate.type.BasicTypeReference@1818d00b
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetDateTimeWithTimezone -> org.hibernate.type.BasicTypeReference@b3a8455
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetDateTimeWithoutTimezone -> org.hibernate.type.BasicTypeReference@5c930fc3
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetTime -> org.hibernate.type.BasicTypeReference@25c6ab3f
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.OffsetTime -> org.hibernate.type.BasicTypeReference@25c6ab3f
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetTimeUtc -> org.hibernate.type.BasicTypeReference@7b80af04
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetTimeWithTimezone -> org.hibernate.type.BasicTypeReference@2447940d
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetTimeWithoutTimezone -> org.hibernate.type.BasicTypeReference@60ee7a51
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration ZonedDateTime -> org.hibernate.type.BasicTypeReference@70e1aa20
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.ZonedDateTime -> org.hibernate.type.BasicTypeReference@70e1aa20
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration ZonedDateTimeWithTimezone -> org.hibernate.type.BasicTypeReference@e67d3b7
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration ZonedDateTimeWithoutTimezone -> org.hibernate.type.BasicTypeReference@1618c98a
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration date -> org.hibernate.type.BasicTypeReference@5b715ea
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.sql.Date -> org.hibernate.type.BasicTypeReference@5b715ea
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration time -> org.hibernate.type.BasicTypeReference@787a0fd6
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.sql.Time -> org.hibernate.type.BasicTypeReference@787a0fd6
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration timestamp -> org.hibernate.type.BasicTypeReference@48b09105
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.sql.Timestamp -> org.hibernate.type.BasicTypeReference@48b09105
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.util.Date -> org.hibernate.type.BasicTypeReference@48b09105
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration calendar -> org.hibernate.type.BasicTypeReference@18b45500
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.util.Calendar -> org.hibernate.type.BasicTypeReference@18b45500
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.util.GregorianCalendar -> org.hibernate.type.BasicTypeReference@18b45500
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration calendar_date -> org.hibernate.type.BasicTypeReference@25110bb9
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration calendar_time -> org.hibernate.type.BasicTypeReference@dbda472
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration instant -> org.hibernate.type.BasicTypeReference@41492479
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.Instant -> org.hibernate.type.BasicTypeReference@41492479
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration uuid -> org.hibernate.type.BasicTypeReference@7bef7505
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.util.UUID -> org.hibernate.type.BasicTypeReference@7bef7505
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration pg-uuid -> org.hibernate.type.BasicTypeReference@7bef7505
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration uuid-binary -> org.hibernate.type.BasicTypeReference@568ef502
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration uuid-char -> org.hibernate.type.BasicTypeReference@36f05595
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration class -> org.hibernate.type.BasicTypeReference@3e12c5de
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Class -> org.hibernate.type.BasicTypeReference@3e12c5de
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration currency -> org.hibernate.type.BasicTypeReference@3e55d844
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration Currency -> org.hibernate.type.BasicTypeReference@3e55d844
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.util.Currency -> org.hibernate.type.BasicTypeReference@3e55d844
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration locale -> org.hibernate.type.BasicTypeReference@1f521c69
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.util.Locale -> org.hibernate.type.BasicTypeReference@1f521c69
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration serializable -> org.hibernate.type.BasicTypeReference@2b3abeeb
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.io.Serializable -> org.hibernate.type.BasicTypeReference@2b3abeeb
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration timezone -> org.hibernate.type.BasicTypeReference@3aeb267
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.util.TimeZone -> org.hibernate.type.BasicTypeReference@3aeb267
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration ZoneOffset -> org.hibernate.type.BasicTypeReference@13a9cdae
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.ZoneOffset -> org.hibernate.type.BasicTypeReference@13a9cdae
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration url -> org.hibernate.type.BasicTypeReference@1c972ae6
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.net.URL -> org.hibernate.type.BasicTypeReference@1c972ae6
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration vector -> org.hibernate.type.BasicTypeReference@62a41279
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration row_version -> org.hibernate.type.BasicTypeReference@146fa9c0
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration object -> org.hibernate.type.JavaObjectType@338270ea
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Object -> org.hibernate.type.JavaObjectType@338270ea
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration null -> org.hibernate.type.NullType@23954300
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_date -> org.hibernate.type.BasicTypeReference@6aae82cc
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_time -> org.hibernate.type.BasicTypeReference@622ba721
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_timestamp -> org.hibernate.type.BasicTypeReference@6b2f7527
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_calendar -> org.hibernate.type.BasicTypeReference@7509226c
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_calendar_date -> org.hibernate.type.BasicTypeReference@4c9cce17
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_calendar_time -> org.hibernate.type.BasicTypeReference@73316a0a
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_binary -> org.hibernate.type.BasicTypeReference@63a7af06
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_serializable -> org.hibernate.type.BasicTypeReference@5f01fb5c
2025-10-24 14:18:40 [main] INFO o.s.o.j.p.SpringPersistenceUnitInfo - No LoadTimeWeaver setup: ignoring JPA class transformer
2025-10-24 14:18:40 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting...
2025-10-24 14:18:40 [main] INFO com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Added connection org.postgresql.jdbc.PgConnection@6f8fb906
2025-10-24 14:18:40 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed.
2025-10-24 14:18:40 [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 14:18:40 [main] DEBUG o.h.t.d.sql.spi.DdlTypeRegistry - addDescriptor(2003, org.hibernate.type.descriptor.sql.internal.ArrayDdlTypeImpl@790d629a) replaced previous registration(org.hibernate.type.descriptor.sql.internal.ArrayDdlTypeImpl@346e5cc)
2025-10-24 14:18:40 [main] DEBUG o.h.t.d.sql.spi.DdlTypeRegistry - addDescriptor(6, org.hibernate.type.descriptor.sql.internal.CapacityDependentDdlType@2cd2c764) replaced previous registration(org.hibernate.type.descriptor.sql.internal.DdlTypeImpl@d17d554)
2025-10-24 14:18:40 [main] DEBUG o.h.t.d.jdbc.spi.JdbcTypeRegistry - addDescriptor(2004, BlobTypeDescriptor(BLOB_BINDING)) replaced previous registration(BlobTypeDescriptor(DEFAULT))
2025-10-24 14:18:40 [main] DEBUG o.h.t.d.jdbc.spi.JdbcTypeRegistry - addDescriptor(2005, ClobTypeDescriptor(CLOB_BINDING)) replaced previous registration(ClobTypeDescriptor(DEFAULT))
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration JAVA_OBJECT -> org.hibernate.type.JavaObjectType@40199d5e
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Object -> org.hibernate.type.JavaObjectType@40199d5e
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Type registration key [java.lang.Object] overrode previous entry : `org.hibernate.type.JavaObjectType@338270ea`
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration org.hibernate.type.DurationType -> basicType@1(java.time.Duration,3015)
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration Duration -> basicType@1(java.time.Duration,3015)
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.Duration -> basicType@1(java.time.Duration,3015)
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration org.hibernate.type.OffsetDateTimeType -> basicType@2(java.time.OffsetDateTime,3003)
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetDateTime -> basicType@2(java.time.OffsetDateTime,3003)
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.OffsetDateTime -> basicType@2(java.time.OffsetDateTime,3003)
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration org.hibernate.type.ZonedDateTimeType -> basicType@3(java.time.ZonedDateTime,3003)
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration ZonedDateTime -> basicType@3(java.time.ZonedDateTime,3003)
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.ZonedDateTime -> basicType@3(java.time.ZonedDateTime,3003)
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration org.hibernate.type.OffsetTimeType -> basicType@4(java.time.OffsetTime,3007)
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetTime -> basicType@4(java.time.OffsetTime,3007)
2025-10-24 14:18:40 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.OffsetTime -> basicType@4(java.time.OffsetTime,3007)
2025-10-24 14:18:40 [main] DEBUG o.h.type.spi.TypeConfiguration$Scope - Scoping TypeConfiguration [org.hibernate.type.spi.TypeConfiguration@5dff108c] to MetadataBuildingContext [org.hibernate.boot.internal.MetadataBuildingContextRootImpl@22d47f09]
2025-10-24 14:18:40 [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 14:18:40 [main] DEBUG o.h.type.spi.TypeConfiguration$Scope - Scoping TypeConfiguration [org.hibernate.type.spi.TypeConfiguration@5dff108c] to SessionFactoryImplementor [org.hibernate.internal.SessionFactoryImpl@1ae69abe]
2025-10-24 14:18:40 [main] DEBUG org.hibernate.SQL -
alter table if exists meetings
alter column description set data type TEXT
2025-10-24 14:18:40 [main] DEBUG org.hibernate.SQL -
alter table if exists meetings
alter column participants set data type TEXT
2025-10-24 14:18:40 [main] DEBUG org.hibernate.SQL -
alter table if exists minutes_sections
alter column content set data type TEXT
2025-10-24 14:18:40 [main] DEBUG org.hibernate.SQL -
alter table if exists templates
alter column description set data type TEXT
2025-10-24 14:18:41 [main] DEBUG org.hibernate.SQL -
alter table if exists templates
alter column sections set data type TEXT
2025-10-24 14:18:41 [main] DEBUG org.hibernate.SQL -
alter table if exists todos
alter column description set data type TEXT
2025-10-24 14:18:41 [main] TRACE o.h.type.spi.TypeConfiguration$Scope - Handling #sessionFactoryCreated from [org.hibernate.internal.SessionFactoryImpl@1ae69abe] for TypeConfiguration
2025-10-24 14:18:41 [main] INFO o.s.o.j.LocalContainerEntityManagerFactoryBean - Initialized JPA EntityManagerFactory for persistence unit 'default'
2025-10-24 14:18:41 [main] INFO o.s.d.j.r.query.QueryEnhancerFactory - Hibernate is in classpath; If applicable, HQL parser will be used.
2025-10-24 14:18:41 [main] INFO c.u.h.m.infra.cache.CacheConfig - Redis 연결 설정 - host: 20.249.177.114, port: 6379, database: 1
2025-10-24 14:18:41 [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 14:18:41 [main] INFO c.u.h.m.infra.cache.CacheConfig - Redis 템플릿 설정 완료
2025-10-24 14:18:41 [main] INFO c.u.h.m.infra.cache.CacheConfig - ObjectMapper 설정 완료
2025-10-24 14:18:41 [main] INFO c.u.h.m.infra.config.EventHubConfig - Initializing Azure EventHub configuration with hub name: hgzero-eventhub-name
2025-10-24 14:18:41 [main] INFO c.u.h.m.infra.config.EventHubConfig - Creating EventHub producer for hub: hgzero-eventhub-name
2025-10-24 14:18:41 [main] INFO c.a.m.e.EventHubClientBuilder - {"az.sdk.message":"Emitting a single connection.","connectionId":"MF_5dcff9_1761283121917"}
2025-10-24 14:18:41 [main] INFO c.a.m.e.i.EventHubConnectionProcessor - {"az.sdk.message":"Setting next AMQP channel.","entityPath":"hgzero-eventhub-name"}
2025-10-24 14:18:42 [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 14:18:42 [main] WARN o.s.b.a.s.s.UserDetailsServiceAutoConfiguration -
Using generated security password: 6f862cd6-9b02-4031-857b-66dd1f3f8910
This generated password is for development use only. Your security configuration must be updated before running your application in production.
2025-10-24 14:18:42 [main] INFO o.s.s.c.a.a.c.InitializeUserDetailsBeanManagerConfigurer$InitializeUserDetailsManagerConfigurer - Global AuthenticationManager configured with UserDetailsService bean with name inMemoryUserDetailsManager
2025-10-24 14:18:42 [main] INFO c.u.h.m.infra.config.WebSocketConfig - WebSocket 핸들러 등록 완료 - endpoint: /ws/minutes/{minutesId}
2025-10-24 14:18:42 [main] INFO o.s.b.a.e.web.EndpointLinksResolver - Exposing 3 endpoints beneath base path '/actuator'
2025-10-24 14:18:42 [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 14:18:42 [main] INFO o.s.b.w.e.tomcat.TomcatWebServer - Tomcat started on port 8082 (http) with context path '/'
2025-10-24 14:18:43 [main] INFO c.u.h.meeting.MeetingApplication - Started MeetingApplication in 4.633 seconds (process running for 4.868)
2025-10-24 14:18:45 [http-nio-8082-exec-1] INFO o.a.c.c.C.[Tomcat].[localhost].[/] - Initializing Spring DispatcherServlet 'dispatcherServlet'
2025-10-24 14:18:45 [http-nio-8082-exec-1] INFO o.s.web.servlet.DispatcherServlet - Initializing Servlet 'dispatcherServlet'
2025-10-24 14:18:45 [http-nio-8082-exec-1] INFO o.s.web.servlet.DispatcherServlet - Completed initialization in 3 ms
2025-10-24 14:18:45 [http-nio-8082-exec-1] DEBUG o.s.security.web.FilterChainProxy - Securing GET /api/meetings/meeting-scheduled-1
2025-10-24 14:18:45 [http-nio-8082-exec-1] DEBUG o.s.s.w.a.AnonymousAuthenticationFilter - Set SecurityContextHolder to anonymous SecurityContext
2025-10-24 14:18:45 [http-nio-8082-exec-1] DEBUG o.s.security.web.FilterChainProxy - Secured GET /api/meetings/meeting-scheduled-1
2025-10-24 14:18:45 [http-nio-8082-exec-1] WARN o.s.w.s.m.s.DefaultHandlerExceptionResolver - Resolved [org.springframework.web.bind.MissingRequestHeaderException: Required request header 'X-User-Id' for method parameter type String is not present]
2025-10-24 14:18:45 [http-nio-8082-exec-1] DEBUG o.s.security.web.FilterChainProxy - Securing GET /error
2025-10-24 14:18:45 [http-nio-8082-exec-1] DEBUG o.s.s.w.a.AnonymousAuthenticationFilter - Set SecurityContextHolder to anonymous SecurityContext
2025-10-24 14:18:45 [http-nio-8082-exec-1] DEBUG o.s.s.w.a.Http403ForbiddenEntryPoint - Pre-authenticated entry point called. Rejecting access
2025-10-24 14:18:46 [http-nio-8082-exec-3] DEBUG o.s.security.web.FilterChainProxy - Securing GET /api/meetings/meeting-scheduled-1
2025-10-24 14:18:46 [http-nio-8082-exec-3] DEBUG o.s.s.w.a.AnonymousAuthenticationFilter - Set SecurityContextHolder to anonymous SecurityContext
2025-10-24 14:18:46 [http-nio-8082-exec-3] DEBUG o.s.security.web.FilterChainProxy - Secured GET /api/meetings/meeting-scheduled-1
2025-10-24 14:18:46 [http-nio-8082-exec-3] WARN o.s.w.s.m.s.DefaultHandlerExceptionResolver - Resolved [org.springframework.web.bind.MissingRequestHeaderException: Required request header 'X-User-Id' for method parameter type String is not present]
2025-10-24 14:18:46 [http-nio-8082-exec-3] DEBUG o.s.security.web.FilterChainProxy - Securing GET /error
2025-10-24 14:18:46 [http-nio-8082-exec-3] DEBUG o.s.s.w.a.AnonymousAuthenticationFilter - Set SecurityContextHolder to anonymous SecurityContext
2025-10-24 14:18:46 [http-nio-8082-exec-3] DEBUG o.s.s.w.a.Http403ForbiddenEntryPoint - Pre-authenticated entry point called. Rejecting access
2025-10-24 14:18:47 [http-nio-8082-exec-4] DEBUG o.s.security.web.FilterChainProxy - Securing GET /api/meetings/meeting-scheduled-1
2025-10-24 14:18:47 [http-nio-8082-exec-4] DEBUG o.s.s.w.a.AnonymousAuthenticationFilter - Set SecurityContextHolder to anonymous SecurityContext
2025-10-24 14:18:47 [http-nio-8082-exec-4] DEBUG o.s.security.web.FilterChainProxy - Secured GET /api/meetings/meeting-scheduled-1
2025-10-24 14:18:47 [http-nio-8082-exec-4] WARN o.s.w.s.m.s.DefaultHandlerExceptionResolver - Resolved [org.springframework.web.bind.MissingRequestHeaderException: Required request header 'X-User-Id' for method parameter type String is not present]
2025-10-24 14:18:47 [http-nio-8082-exec-4] DEBUG o.s.security.web.FilterChainProxy - Securing GET /error
2025-10-24 14:18:47 [http-nio-8082-exec-4] DEBUG o.s.s.w.a.AnonymousAuthenticationFilter - Set SecurityContextHolder to anonymous SecurityContext
2025-10-24 14:18:47 [http-nio-8082-exec-4] DEBUG o.s.s.w.a.Http403ForbiddenEntryPoint - Pre-authenticated entry point called. Rejecting access
2025-10-24 14:18:47 [http-nio-8082-exec-5] DEBUG o.s.security.web.FilterChainProxy - Securing GET /api/meetings/meeting-scheduled-1
2025-10-24 14:18:47 [http-nio-8082-exec-5] DEBUG o.s.s.w.a.AnonymousAuthenticationFilter - Set SecurityContextHolder to anonymous SecurityContext
2025-10-24 14:18:47 [http-nio-8082-exec-5] DEBUG o.s.security.web.FilterChainProxy - Secured GET /api/meetings/meeting-scheduled-1
2025-10-24 14:18:47 [http-nio-8082-exec-5] WARN o.s.w.s.m.s.DefaultHandlerExceptionResolver - Resolved [org.springframework.web.bind.MissingRequestHeaderException: Required request header 'X-User-Id' for method parameter type String is not present]
2025-10-24 14:18:47 [http-nio-8082-exec-5] DEBUG o.s.security.web.FilterChainProxy - Securing GET /error
2025-10-24 14:18:47 [http-nio-8082-exec-5] DEBUG o.s.s.w.a.AnonymousAuthenticationFilter - Set SecurityContextHolder to anonymous SecurityContext
2025-10-24 14:18:47 [http-nio-8082-exec-5] DEBUG o.s.s.w.a.Http403ForbiddenEntryPoint - Pre-authenticated entry point called. Rejecting access
2025-10-24 14:18:48 [http-nio-8082-exec-6] DEBUG o.s.security.web.FilterChainProxy - Securing GET /api/meetings/meeting-scheduled-1
2025-10-24 14:18:48 [http-nio-8082-exec-6] DEBUG o.s.s.w.a.AnonymousAuthenticationFilter - Set SecurityContextHolder to anonymous SecurityContext
2025-10-24 14:18:48 [http-nio-8082-exec-6] DEBUG o.s.security.web.FilterChainProxy - Secured GET /api/meetings/meeting-scheduled-1
2025-10-24 14:18:48 [http-nio-8082-exec-6] WARN o.s.w.s.m.s.DefaultHandlerExceptionResolver - Resolved [org.springframework.web.bind.MissingRequestHeaderException: Required request header 'X-User-Id' for method parameter type String is not present]
2025-10-24 14:18:48 [http-nio-8082-exec-6] DEBUG o.s.security.web.FilterChainProxy - Securing GET /error
2025-10-24 14:18:48 [http-nio-8082-exec-6] DEBUG o.s.s.w.a.AnonymousAuthenticationFilter - Set SecurityContextHolder to anonymous SecurityContext
2025-10-24 14:18:48 [http-nio-8082-exec-6] DEBUG o.s.s.w.a.Http403ForbiddenEntryPoint - Pre-authenticated entry point called. Rejecting access
2025-10-24 14:18:48 [http-nio-8082-exec-7] DEBUG o.s.security.web.FilterChainProxy - Securing GET /api/meetings/meeting-scheduled-1
2025-10-24 14:18:48 [http-nio-8082-exec-7] DEBUG o.s.s.w.a.AnonymousAuthenticationFilter - Set SecurityContextHolder to anonymous SecurityContext
2025-10-24 14:18:48 [http-nio-8082-exec-7] DEBUG o.s.security.web.FilterChainProxy - Secured GET /api/meetings/meeting-scheduled-1
2025-10-24 14:18:48 [http-nio-8082-exec-7] WARN o.s.w.s.m.s.DefaultHandlerExceptionResolver - Resolved [org.springframework.web.bind.MissingRequestHeaderException: Required request header 'X-User-Id' for method parameter type String is not present]
2025-10-24 14:18:48 [http-nio-8082-exec-7] DEBUG o.s.security.web.FilterChainProxy - Securing GET /error
2025-10-24 14:18:48 [http-nio-8082-exec-7] DEBUG o.s.s.w.a.AnonymousAuthenticationFilter - Set SecurityContextHolder to anonymous SecurityContext
2025-10-24 14:18:48 [http-nio-8082-exec-7] DEBUG o.s.s.w.a.Http403ForbiddenEntryPoint - Pre-authenticated entry point called. Rejecting access
2025-10-24 14:19:17 [http-nio-8082-exec-8] DEBUG o.s.security.web.FilterChainProxy - Securing GET /api/meetings/meeting-scheduled-1
2025-10-24 14:19:17 [http-nio-8082-exec-8] DEBUG o.s.s.w.a.AnonymousAuthenticationFilter - Set SecurityContextHolder to anonymous SecurityContext
2025-10-24 14:19:17 [http-nio-8082-exec-8] DEBUG o.s.security.web.FilterChainProxy - Secured GET /api/meetings/meeting-scheduled-1
2025-10-24 14:19:17 [http-nio-8082-exec-8] INFO c.u.hgzero.common.aop.LoggingAspect - [Controller] com.unicorn.hgzero.meeting.infra.controller.MeetingController.getMeeting 호출 - 파라미터: [meeting-scheduled-1, user-001]
2025-10-24 14:19:17 [http-nio-8082-exec-8] INFO c.u.h.m.i.c.MeetingController - 회의 정보 조회 요청 - meetingId: meeting-scheduled-1
2025-10-24 14:19:17 [http-nio-8082-exec-8] DEBUG c.u.h.m.biz.service.MeetingService - Getting meeting: meeting-scheduled-1
2025-10-24 14:19:17 [http-nio-8082-exec-8] DEBUG org.hibernate.SQL -
select
me1_0.meeting_id,
me1_0.created_at,
me1_0.description,
me1_0.ended_at,
me1_0.organizer_id,
me1_0.participants,
me1_0.scheduled_at,
me1_0.started_at,
me1_0.status,
me1_0.template_id,
me1_0.title,
me1_0.updated_at
from
meetings me1_0
where
me1_0.meeting_id=?
2025-10-24 14:19:17 [http-nio-8082-exec-8] INFO c.u.h.m.i.c.MeetingController - 회의 정보 조회 완료 - meetingId: meeting-scheduled-1
2025-10-24 14:19:17 [http-nio-8082-exec-8] INFO c.u.hgzero.common.aop.LoggingAspect - [Controller] com.unicorn.hgzero.meeting.infra.controller.MeetingController.getMeeting 완료 - 실행시간: 96ms
2025-10-24 14:19:22 [http-nio-8082-exec-10] DEBUG o.s.security.web.FilterChainProxy - Securing GET /api/meetings/meeting-scheduled-1
2025-10-24 14:19:22 [http-nio-8082-exec-10] DEBUG o.s.s.w.a.AnonymousAuthenticationFilter - Set SecurityContextHolder to anonymous SecurityContext
2025-10-24 14:19:22 [http-nio-8082-exec-10] DEBUG o.s.security.web.FilterChainProxy - Secured GET /api/meetings/meeting-scheduled-1
2025-10-24 14:19:22 [http-nio-8082-exec-10] INFO c.u.hgzero.common.aop.LoggingAspect - [Controller] com.unicorn.hgzero.meeting.infra.controller.MeetingController.getMeeting 호출 - 파라미터: [meeting-scheduled-1, user-001]
2025-10-24 14:19:22 [http-nio-8082-exec-10] INFO c.u.h.m.i.c.MeetingController - 회의 정보 조회 요청 - meetingId: meeting-scheduled-1
2025-10-24 14:19:22 [http-nio-8082-exec-10] DEBUG c.u.h.m.biz.service.MeetingService - Getting meeting: meeting-scheduled-1
2025-10-24 14:19:22 [http-nio-8082-exec-10] DEBUG org.hibernate.SQL -
select
me1_0.meeting_id,
me1_0.created_at,
me1_0.description,
me1_0.ended_at,
me1_0.organizer_id,
me1_0.participants,
me1_0.scheduled_at,
me1_0.started_at,
me1_0.status,
me1_0.template_id,
me1_0.title,
me1_0.updated_at
from
meetings me1_0
where
me1_0.meeting_id=?
2025-10-24 14:19:22 [http-nio-8082-exec-10] INFO c.u.h.m.i.c.MeetingController - 회의 정보 조회 완료 - meetingId: meeting-scheduled-1
2025-10-24 14:19:22 [http-nio-8082-exec-10] INFO c.u.hgzero.common.aop.LoggingAspect - [Controller] com.unicorn.hgzero.meeting.infra.controller.MeetingController.getMeeting 완료 - 실행시간: 40ms
2025-10-24 14:19:25 [http-nio-8082-exec-1] DEBUG o.s.security.web.FilterChainProxy - Securing GET /api/meetings/meeting-scheduled-1
2025-10-24 14:19:25 [http-nio-8082-exec-1] DEBUG o.s.s.w.a.AnonymousAuthenticationFilter - Set SecurityContextHolder to anonymous SecurityContext
2025-10-24 14:19:25 [http-nio-8082-exec-1] DEBUG o.s.security.web.FilterChainProxy - Secured GET /api/meetings/meeting-scheduled-1
2025-10-24 14:19:25 [http-nio-8082-exec-1] INFO c.u.hgzero.common.aop.LoggingAspect - [Controller] com.unicorn.hgzero.meeting.infra.controller.MeetingController.getMeeting 호출 - 파라미터: [meeting-scheduled-1, user-001]
2025-10-24 14:19:25 [http-nio-8082-exec-1] INFO c.u.h.m.i.c.MeetingController - 회의 정보 조회 요청 - meetingId: meeting-scheduled-1
2025-10-24 14:19:25 [http-nio-8082-exec-1] DEBUG c.u.h.m.biz.service.MeetingService - Getting meeting: meeting-scheduled-1
2025-10-24 14:19:25 [http-nio-8082-exec-1] DEBUG org.hibernate.SQL -
select
me1_0.meeting_id,
me1_0.created_at,
me1_0.description,
me1_0.ended_at,
me1_0.organizer_id,
me1_0.participants,
me1_0.scheduled_at,
me1_0.started_at,
me1_0.status,
me1_0.template_id,
me1_0.title,
me1_0.updated_at
from
meetings me1_0
where
me1_0.meeting_id=?
2025-10-24 14:19:25 [http-nio-8082-exec-1] INFO c.u.h.m.i.c.MeetingController - 회의 정보 조회 완료 - meetingId: meeting-scheduled-1
2025-10-24 14:19:25 [http-nio-8082-exec-1] INFO c.u.hgzero.common.aop.LoggingAspect - [Controller] com.unicorn.hgzero.meeting.infra.controller.MeetingController.getMeeting 완료 - 실행시간: 35ms

View File

@ -6,6 +6,7 @@ import lombok.Getter;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List; import java.util.List;
/** /**
@ -32,6 +33,16 @@ public class Meeting {
*/ */
private String description; private String description;
/**
* 회의 목적
*/
private String purpose;
/**
* 회의 장소
*/
private String location;
/** /**
* 회의 일시 * 회의 일시
*/ */
@ -96,4 +107,14 @@ public class Meeting {
public boolean isInProgress() { public boolean isInProgress() {
return "IN_PROGRESS".equals(this.status); return "IN_PROGRESS".equals(this.status);
} }
/**
* 참석자 추가
*/
public void addParticipant(String participantEmail) {
if (this.participants == null) {
this.participants = new ArrayList<>();
}
this.participants.add(participantEmail);
}
} }

View File

@ -35,6 +35,11 @@ public class MeetingDTO {
*/ */
private final LocalDateTime endTime; private final LocalDateTime endTime;
/**
* 회의 목적
*/
private final String purpose;
/** /**
* 회의 장소 * 회의 장소
*/ */
@ -79,7 +84,8 @@ public class MeetingDTO {
.title(meeting.getTitle()) .title(meeting.getTitle())
.startTime(meeting.getStartedAt() != null ? meeting.getStartedAt() : meeting.getScheduledAt()) .startTime(meeting.getStartedAt() != null ? meeting.getStartedAt() : meeting.getScheduledAt())
.endTime(meeting.getEndedAt()) .endTime(meeting.getEndedAt())
.location(null) // Meeting 도메인에 location 필드가 없어서 null로 설정 .purpose(meeting.getPurpose())
.location(meeting.getLocation())
.agenda(meeting.getDescription()) .agenda(meeting.getDescription())
.participants(meeting.getParticipants().stream() .participants(meeting.getParticipants().stream()
.map(participantId -> ParticipantDTO.builder() .map(participantId -> ParticipantDTO.builder()

View File

@ -27,7 +27,8 @@ public class MeetingService implements
StartMeetingUseCase, StartMeetingUseCase,
EndMeetingUseCase, EndMeetingUseCase,
CancelMeetingUseCase, CancelMeetingUseCase,
GetMeetingUseCase { GetMeetingUseCase,
InviteParticipantUseCase {
private final MeetingReader meetingReader; private final MeetingReader meetingReader;
private final MeetingWriter meetingWriter; private final MeetingWriter meetingWriter;
@ -47,7 +48,9 @@ public class MeetingService implements
Meeting meeting = Meeting.builder() Meeting meeting = Meeting.builder()
.meetingId(meetingId) .meetingId(meetingId)
.title(command.title()) .title(command.title())
.purpose(command.purpose())
.description(command.description()) .description(command.description())
.location(command.location())
.scheduledAt(command.scheduledAt()) .scheduledAt(command.scheduledAt())
.status("SCHEDULED") .status("SCHEDULED")
.organizerId(command.organizerId()) .organizerId(command.organizerId())
@ -198,4 +201,43 @@ public class MeetingService implements
return meetingReader.findByOrganizerIdAndStatus(organizerId, status); return meetingReader.findByOrganizerIdAndStatus(organizerId, status);
} }
/**
* 회의 참석자 초대
*/
@Override
@Transactional
public void inviteParticipant(InviteParticipantCommand command) {
log.info("Inviting participant to meeting: {}, email: {}", command.meetingId(), command.email());
// 회의 조회
Meeting meeting = meetingReader.findById(command.meetingId())
.orElseThrow(() -> new BusinessException(ErrorCode.ENTITY_NOT_FOUND));
// 회의 상태 검증 (예약됨 또는 진행중인 회의만 초대 가능)
if ("COMPLETED".equals(meeting.getStatus()) || "CANCELLED".equals(meeting.getStatus())) {
throw new BusinessException(ErrorCode.INVALID_INPUT_VALUE);
}
// 이미 참석자로 등록되었는지 확인
if (meeting.getParticipants() != null && meeting.getParticipants().contains(command.email())) {
log.warn("Email {} is already a participant of meeting {}", command.email(), command.meetingId());
throw new BusinessException(ErrorCode.DUPLICATE_RESOURCE);
}
// 참석자 목록에 추가
meeting.addParticipant(command.email());
// 저장
meetingWriter.save(meeting);
// TODO: 실제 이메일 발송 구현 필요
// 이메일 발송 서비스 호출
// emailService.sendInvitation(command.email(), meeting, command.frontendUrl());
// 현재는 로그만 남기고 성공으로 처리
log.info("Invitation email would be sent to {} for meeting {} (Frontend URL: {})",
command.email(), meeting.getTitle(), command.frontendUrl());
log.info("Participant invited successfully: {} to meeting {}", command.email(), command.meetingId());
}
} }

View File

@ -20,8 +20,10 @@ public interface CreateMeetingUseCase {
*/ */
record CreateMeetingCommand( record CreateMeetingCommand(
String title, String title,
String purpose,
String description, String description,
LocalDateTime scheduledAt, LocalDateTime scheduledAt,
String location,
String organizerId, String organizerId,
List<String> participants, List<String> participants,
String templateId String templateId

View File

@ -0,0 +1,23 @@
package com.unicorn.hgzero.meeting.biz.usecase.in.meeting;
/**
* 회의 참석자 초대 UseCase
*/
public interface InviteParticipantUseCase {
/**
* 회의 참석자 초대
* 이메일로 초대장 발송
*/
void inviteParticipant(InviteParticipantCommand command);
/**
* 참석자 초대 명령
*/
record InviteParticipantCommand(
String meetingId,
String email,
String inviterName,
String frontendUrl
) {}
}

View File

@ -47,6 +47,8 @@ public class SecurityConfig {
.requestMatchers("/health").permitAll() .requestMatchers("/health").permitAll()
// WebSocket endpoints // WebSocket endpoints
.requestMatchers("/ws/**").permitAll() .requestMatchers("/ws/**").permitAll()
// Meeting API endpoints (for testing)
.requestMatchers("/api/meetings/**").permitAll()
// All other requests require authentication // All other requests require authentication
.anyRequest().authenticated() .anyRequest().authenticated()
) )

View File

@ -22,7 +22,7 @@ public class SwaggerConfig {
return new OpenAPI() return new OpenAPI()
.info(apiInfo()) .info(apiInfo())
.addServersItem(new Server() .addServersItem(new Server()
.url("http://localhost:8081") .url("http://localhost:8082")
.description("Local Development")) .description("Local Development"))
.addServersItem(new Server() .addServersItem(new Server()
.url("{protocol}://{host}:{port}") .url("{protocol}://{host}:{port}")

View File

@ -4,7 +4,9 @@ import com.unicorn.hgzero.common.dto.ApiResponse;
import com.unicorn.hgzero.meeting.biz.dto.MeetingDTO; import com.unicorn.hgzero.meeting.biz.dto.MeetingDTO;
import com.unicorn.hgzero.meeting.biz.usecase.in.meeting.*; import com.unicorn.hgzero.meeting.biz.usecase.in.meeting.*;
import com.unicorn.hgzero.meeting.infra.dto.request.CreateMeetingRequest; import com.unicorn.hgzero.meeting.infra.dto.request.CreateMeetingRequest;
import com.unicorn.hgzero.meeting.infra.dto.request.InviteParticipantRequest;
import com.unicorn.hgzero.meeting.infra.dto.request.SelectTemplateRequest; import com.unicorn.hgzero.meeting.infra.dto.request.SelectTemplateRequest;
import com.unicorn.hgzero.meeting.infra.dto.response.InviteParticipantResponse;
import com.unicorn.hgzero.meeting.infra.dto.response.MeetingResponse; import com.unicorn.hgzero.meeting.infra.dto.response.MeetingResponse;
import com.unicorn.hgzero.meeting.infra.dto.response.SessionResponse; import com.unicorn.hgzero.meeting.infra.dto.response.SessionResponse;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
@ -35,6 +37,7 @@ public class MeetingController {
private final EndMeetingUseCase endMeetingUseCase; private final EndMeetingUseCase endMeetingUseCase;
private final GetMeetingUseCase getMeetingUseCase; private final GetMeetingUseCase getMeetingUseCase;
private final CancelMeetingUseCase cancelMeetingUseCase; private final CancelMeetingUseCase cancelMeetingUseCase;
private final InviteParticipantUseCase inviteParticipantUseCase;
/** /**
* 회의 예약 * 회의 예약
@ -63,8 +66,10 @@ public class MeetingController {
var meetingData = createMeetingUseCase.createMeeting( var meetingData = createMeetingUseCase.createMeeting(
new CreateMeetingUseCase.CreateMeetingCommand( new CreateMeetingUseCase.CreateMeetingCommand(
request.getTitle(), request.getTitle(),
request.getPurpose(),
request.getAgenda(), request.getAgenda(),
request.getStartTime(), request.getStartTime(),
request.getLocation(),
userId, userId,
request.getParticipants(), request.getParticipants(),
null // 템플릿 ID는 나중에 적용 null // 템플릿 ID는 나중에 적용
@ -239,4 +244,53 @@ public class MeetingController {
return ResponseEntity.ok(ApiResponse.success(null)); return ResponseEntity.ok(ApiResponse.success(null));
} }
/**
* 회의 참석자 초대
*
* @param meetingId 회의 ID
* @param userId 사용자 ID
* @param userName 사용자명
* @param userEmail 사용자 이메일
* @param request 참석자 초대 요청
* @return 초대 결과
*/
@Operation(
summary = "회의 참석자 초대",
description = "진행 중이거나 예약된 회의에 새로운 참석자를 초대합니다. 초대된 참석자에게는 회의록 프론트엔드 URL과 함께 이메일이 발송됩니다.",
security = @SecurityRequirement(name = "bearerAuth")
)
@PostMapping("/{meetingId}/invite")
public ResponseEntity<ApiResponse<InviteParticipantResponse>> inviteParticipant(
@Parameter(description = "회의 ID", required = true)
@PathVariable String meetingId,
@Parameter(description = "사용자 ID", required = true)
@RequestHeader("X-User-Id") String userId,
@Parameter(description = "사용자명", required = true)
@RequestHeader("X-User-Name") String userName,
@Parameter(description = "사용자 이메일", required = true)
@RequestHeader("X-User-Email") String userEmail,
@Valid @RequestBody InviteParticipantRequest request) {
log.info("참석자 초대 요청 - meetingId: {}, email: {}, inviter: {}",
meetingId, request.getEmail(), userName);
// 프론트엔드 URL 생성 (실제 환경에서는 설정에서 가져와야 )
String frontendUrl = "https://meeting.hgzero.com/meeting/" + meetingId;
inviteParticipantUseCase.inviteParticipant(
new InviteParticipantUseCase.InviteParticipantCommand(
meetingId,
request.getEmail(),
userName,
frontendUrl
)
);
var response = InviteParticipantResponse.of(meetingId, request.getEmail());
log.info("참석자 초대 완료 - meetingId: {}, email: {}", meetingId, request.getEmail());
return ResponseEntity.ok(ApiResponse.success(response));
}
} }

View File

@ -24,6 +24,10 @@ public class CreateMeetingRequest {
@Schema(description = "회의 제목", example = "Q1 전략 회의", required = true) @Schema(description = "회의 제목", example = "Q1 전략 회의", required = true)
private String title; private String title;
@NotBlank(message = "회의 목적은 필수입니다")
@Schema(description = "회의 목적", example = "2025년 1분기 신제품 개발 방향 수립", required = true)
private String purpose;
@NotNull(message = "회의 시작 시간은 필수입니다") @NotNull(message = "회의 시작 시간은 필수입니다")
@Schema(description = "회의 시작 시간", example = "2025-01-25T14:00:00", required = true) @Schema(description = "회의 시작 시간", example = "2025-01-25T14:00:00", required = true)
private LocalDateTime startTime; private LocalDateTime startTime;

View File

@ -0,0 +1,23 @@
package com.unicorn.hgzero.meeting.infra.dto.request;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
/**
* 참석자 초대 요청 DTO
*/
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Schema(description = "참석자 초대 요청")
public class InviteParticipantRequest {
@NotBlank(message = "이메일 주소는 필수입니다")
@Email(message = "올바른 이메일 형식이 아닙니다")
@Schema(description = "초대할 참석자 이메일", example = "newparticipant@example.com", required = true)
private String email;
}

View File

@ -0,0 +1,37 @@
package com.unicorn.hgzero.meeting.infra.dto.response;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
/**
* 참석자 초대 응답 DTO
*/
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Schema(description = "참석자 초대 응답")
public class InviteParticipantResponse {
@Schema(description = "회의 ID", example = "123e4567-e89b-12d3-a456-426614174000")
private String meetingId;
@Schema(description = "초대된 참석자 이메일", example = "newparticipant@example.com")
private String invitedEmail;
@Schema(description = "초대 성공 여부", example = "true")
private boolean success;
@Schema(description = "메시지", example = "참석자 초대가 완료되었습니다. 이메일을 확인해주세요.")
private String message;
public static InviteParticipantResponse of(String meetingId, String email) {
return new InviteParticipantResponse(
meetingId,
email,
true,
"참석자 초대가 완료되었습니다. 이메일을 확인해주세요."
);
}
}

View File

@ -28,6 +28,9 @@ public class MeetingResponse {
@Schema(description = "회의 종료 시간", example = "2025-01-25T16:00:00") @Schema(description = "회의 종료 시간", example = "2025-01-25T16:00:00")
private final LocalDateTime endTime; private final LocalDateTime endTime;
@Schema(description = "회의 목적", example = "2025년 1분기 신제품 개발 방향 수립")
private final String purpose;
@Schema(description = "회의 장소", example = "회의실 A") @Schema(description = "회의 장소", example = "회의실 A")
private final String location; private final String location;
@ -58,6 +61,7 @@ public class MeetingResponse {
.title(dto.getTitle()) .title(dto.getTitle())
.startTime(dto.getStartTime()) .startTime(dto.getStartTime())
.endTime(dto.getEndTime()) .endTime(dto.getEndTime())
.purpose(dto.getPurpose())
.location(dto.getLocation()) .location(dto.getLocation())
.agenda(dto.getAgenda()) .agenda(dto.getAgenda())
.participants(dto.getParticipants().stream() .participants(dto.getParticipants().stream()

View File

@ -51,7 +51,7 @@ public class SwaggerConfig {
.url("https://www.apache.org/licenses/LICENSE-2.0.html"))) .url("https://www.apache.org/licenses/LICENSE-2.0.html")))
.servers(List.of( .servers(List.of(
new Server() new Server()
.url("http://localhost:8080") .url("http://localhost:8085")
.description("Local Development Server"), .description("Local Development Server"),
new Server() new Server()
.url("https://api.hgzero.com") .url("https://api.hgzero.com")

View File

@ -3,6 +3,18 @@ bootJar {
} }
dependencies { dependencies {
// Common module
implementation project(':common')
// Spring Boot starters
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-validation'
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
// Database
runtimeOnly 'org.postgresql:postgresql'
// Azure Speech SDK // Azure Speech SDK
implementation "com.microsoft.cognitiveservices.speech:client-sdk:${azureSpeechVersion}" implementation "com.microsoft.cognitiveservices.speech:client-sdk:${azureSpeechVersion}"
@ -14,4 +26,11 @@ dependencies {
// WebSocket // WebSocket
implementation 'org.springframework.boot:spring-boot-starter-websocket' implementation 'org.springframework.boot:spring-boot-starter-websocket'
// Test dependencies
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'com.h2database:h2'
testImplementation('it.ozimov:embedded-redis:0.7.3') {
exclude group: 'org.slf4j', module: 'slf4j-simple'
}
} }

View File

@ -1,146 +0,0 @@
package com.unicorn.hgzero.stt.controller;
import com.unicorn.hgzero.common.dto.ApiResponse;
import com.unicorn.hgzero.stt.dto.SpeakerDto;
import com.unicorn.hgzero.stt.service.SpeakerService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import jakarta.validation.Valid;
/**
* 화자 관리 컨트롤러
* 화자 식별 관리 기능을 제공
*/
@Slf4j
@RestController
@RequestMapping("/api/v1/stt/speakers")
@RequiredArgsConstructor
@Validated
@Tag(name = "화자 관리", description = "화자 식별 및 관리 API")
public class SpeakerController {
private final SpeakerService speakerService;
@Operation(
summary = "화자 식별",
description = "음성 데이터로부터 화자를 식별합니다."
)
@ApiResponses(value = {
@io.swagger.v3.oas.annotations.responses.ApiResponse(
responseCode = "200",
description = "화자 식별 성공",
content = @Content(schema = @Schema(implementation = SpeakerDto.IdentificationResponse.class))
),
@io.swagger.v3.oas.annotations.responses.ApiResponse(
responseCode = "400",
description = "잘못된 요청"
),
@io.swagger.v3.oas.annotations.responses.ApiResponse(
responseCode = "404",
description = "녹음을 찾을 수 없음"
)
})
@PostMapping("/identify")
public ResponseEntity<ApiResponse<SpeakerDto.IdentificationResponse>> identifySpeaker(
@Valid @RequestBody SpeakerDto.IdentifyRequest request) {
log.info("화자 식별 요청 - recordingId: {}", request.getRecordingId());
SpeakerDto.IdentificationResponse response = speakerService.identifySpeaker(request);
return ResponseEntity.ok(ApiResponse.success(response));
}
@Operation(
summary = "화자 정보 조회",
description = "화자의 상세 정보를 조회합니다."
)
@ApiResponses(value = {
@io.swagger.v3.oas.annotations.responses.ApiResponse(
responseCode = "200",
description = "조회 성공",
content = @Content(schema = @Schema(implementation = SpeakerDto.DetailResponse.class))
),
@io.swagger.v3.oas.annotations.responses.ApiResponse(
responseCode = "404",
description = "화자를 찾을 수 없음"
)
})
@GetMapping("/{speakerId}")
public ResponseEntity<ApiResponse<SpeakerDto.DetailResponse>> getSpeaker(
@Parameter(description = "화자 ID", required = true)
@PathVariable String speakerId) {
log.debug("화자 조회 요청 - speakerId: {}", speakerId);
SpeakerDto.DetailResponse response = speakerService.getSpeaker(speakerId);
return ResponseEntity.ok(ApiResponse.success(response));
}
@Operation(
summary = "화자 정보 수정",
description = "화자의 이름 및 사용자 연결 정보를 수정합니다."
)
@ApiResponses(value = {
@io.swagger.v3.oas.annotations.responses.ApiResponse(
responseCode = "200",
description = "수정 성공",
content = @Content(schema = @Schema(implementation = SpeakerDto.DetailResponse.class))
),
@io.swagger.v3.oas.annotations.responses.ApiResponse(
responseCode = "400",
description = "잘못된 요청"
),
@io.swagger.v3.oas.annotations.responses.ApiResponse(
responseCode = "404",
description = "화자를 찾을 수 없음"
)
})
@PutMapping("/{speakerId}")
public ResponseEntity<ApiResponse<SpeakerDto.DetailResponse>> updateSpeaker(
@Parameter(description = "화자 ID", required = true)
@PathVariable String speakerId,
@Valid @RequestBody SpeakerDto.UpdateRequest request) {
log.info("화자 정보 수정 요청 - speakerId: {}, speakerName: {}",
speakerId, request.getSpeakerName());
SpeakerDto.DetailResponse response = speakerService.updateSpeaker(speakerId, request);
return ResponseEntity.ok(ApiResponse.success(response));
}
@Operation(
summary = "녹음별 화자 목록 조회",
description = "특정 녹음에 참여한 화자 목록과 통계를 조회합니다."
)
@ApiResponses(value = {
@io.swagger.v3.oas.annotations.responses.ApiResponse(
responseCode = "200",
description = "조회 성공",
content = @Content(schema = @Schema(implementation = SpeakerDto.ListResponse.class))
),
@io.swagger.v3.oas.annotations.responses.ApiResponse(
responseCode = "404",
description = "녹음을 찾을 수 없음"
)
})
@GetMapping("/recordings/{recordingId}")
public ResponseEntity<ApiResponse<SpeakerDto.ListResponse>> getRecordingSpeakers(
@Parameter(description = "녹음 ID", required = true)
@PathVariable String recordingId) {
log.debug("녹음별 화자 목록 조회 요청 - recordingId: {}", recordingId);
SpeakerDto.ListResponse response = speakerService.getRecordingSpeakers(recordingId);
return ResponseEntity.ok(ApiResponse.success(response));
}
}

View File

@ -12,11 +12,9 @@ import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import jakarta.validation.Valid; import jakarta.validation.Valid;
@ -64,64 +62,7 @@ public class TranscriptionController {
return ResponseEntity.ok(ApiResponse.success(response)); return ResponseEntity.ok(ApiResponse.success(response));
} }
@Operation(
summary = "배치 음성 변환",
description = "오디오 파일을 업로드하여 배치 변환 작업을 시작합니다."
)
@ApiResponses(value = {
@io.swagger.v3.oas.annotations.responses.ApiResponse(
responseCode = "200",
description = "배치 작업 시작 성공",
content = @Content(schema = @Schema(implementation = TranscriptionDto.BatchResponse.class))
),
@io.swagger.v3.oas.annotations.responses.ApiResponse(
responseCode = "400",
description = "잘못된 파일 형식 또는 요청"
),
@io.swagger.v3.oas.annotations.responses.ApiResponse(
responseCode = "404",
description = "녹음 세션을 찾을 수 없음"
)
})
@PostMapping(value = "/batch", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public ResponseEntity<ApiResponse<TranscriptionDto.BatchResponse>> transcribeAudioBatch(
@Parameter(description = "배치 변환 요청 정보")
@Valid @RequestPart("request") TranscriptionDto.BatchRequest request,
@Parameter(description = "변환할 오디오 파일")
@RequestPart("audioFile") MultipartFile audioFile) {
log.info("배치 음성 변환 요청 - recordingId: {}, fileSize: {}",
request.getRecordingId(), audioFile.getSize());
TranscriptionDto.BatchResponse response = transcriptionService.transcribeAudioBatch(request, audioFile);
return ResponseEntity.ok(ApiResponse.success(response));
}
@Operation(
summary = "배치 변환 완료 콜백",
description = "Azure 배치 변환 완료 시 호출되는 콜백 엔드포인트입니다."
)
@ApiResponses(value = {
@io.swagger.v3.oas.annotations.responses.ApiResponse(
responseCode = "200",
description = "콜백 처리 성공",
content = @Content(schema = @Schema(implementation = TranscriptionDto.CompleteResponse.class))
),
@io.swagger.v3.oas.annotations.responses.ApiResponse(
responseCode = "400",
description = "잘못된 콜백 데이터"
)
})
@PostMapping("/batch/callback")
public ResponseEntity<ApiResponse<TranscriptionDto.CompleteResponse>> processBatchCallback(
@Valid @RequestBody TranscriptionDto.BatchCallbackRequest request) {
log.info("배치 변환 콜백 처리 - jobId: {}, status: {}",
request.getJobId(), request.getStatus());
TranscriptionDto.CompleteResponse response = transcriptionService.processBatchCallback(request);
return ResponseEntity.ok(ApiResponse.success(response));
}
@Operation( @Operation(
summary = "변환 결과 조회", summary = "변환 결과 조회",
@ -141,15 +82,10 @@ public class TranscriptionController {
@GetMapping("/{recordingId}") @GetMapping("/{recordingId}")
public ResponseEntity<ApiResponse<TranscriptionDto.Response>> getTranscription( public ResponseEntity<ApiResponse<TranscriptionDto.Response>> getTranscription(
@Parameter(description = "녹음 ID", required = true) @Parameter(description = "녹음 ID", required = true)
@PathVariable String recordingId, @PathVariable String recordingId) {
@Parameter(description = "세그먼트 정보 포함 여부") log.debug("변환 결과 조회 요청 - recordingId: {}", recordingId);
@RequestParam(required = false, defaultValue = "false") Boolean includeSegments,
@Parameter(description = "특정 화자 필터")
@RequestParam(required = false) String speakerId) {
log.debug("변환 결과 조회 요청 - recordingId: {}, includeSegments: {}, speakerId: {}",
recordingId, includeSegments, speakerId);
TranscriptionDto.Response response = transcriptionService.getTranscription(recordingId, includeSegments, speakerId); TranscriptionDto.Response response = transcriptionService.getTranscription(recordingId);
return ResponseEntity.ok(ApiResponse.success(response)); return ResponseEntity.ok(ApiResponse.success(response));
} }

View File

@ -50,16 +50,6 @@ public class Recording {
*/ */
private final Integer duration; private final Integer duration;
/**
* 파일 크기 (bytes)
*/
private final Long fileSize;
/**
* 저장 경로
*/
private final String storagePath;
/** /**
* 언어 설정 * 언어 설정
*/ */

View File

@ -1,72 +0,0 @@
package com.unicorn.hgzero.stt.domain;
import lombok.Builder;
import lombok.Getter;
import lombok.ToString;
import java.time.LocalDateTime;
/**
* 화자 도메인 모델
* 음성 화자 정보를 나타내는 도메인 객체
*/
@Getter
@Builder
@ToString
public class Speaker {
/**
* 화자 ID
*/
private final String speakerId;
/**
* 화자 이름
*/
private final String speakerName;
/**
* Azure Speaker Profile ID
*/
private final String profileId;
/**
* 연결된 사용자 ID
*/
private final String userId;
/**
* 발언 세그먼트
*/
private final Integer totalSegments;
/**
* 발언 시간 ()
*/
private final Integer totalDuration;
/**
* 평균 식별 신뢰도
*/
private final Double averageConfidence;
/**
* 최초 등장 시간
*/
private final LocalDateTime firstAppeared;
/**
* 최근 등장 시간
*/
private final LocalDateTime lastAppeared;
/**
* 생성 시간
*/
private final LocalDateTime createdAt;
/**
* 수정 시간
*/
private final LocalDateTime updatedAt;
}

View File

@ -50,7 +50,6 @@ public class RecordingDto {
private final String sessionId; private final String sessionId;
private final String status; private final String status;
private final String streamUrl; private final String streamUrl;
private final String storagePath;
private final Integer estimatedInitTime; private final Integer estimatedInitTime;
} }
@ -95,8 +94,6 @@ public class RecordingDto {
private final LocalDateTime startTime; private final LocalDateTime startTime;
private final LocalDateTime endTime; private final LocalDateTime endTime;
private final Integer duration; private final Integer duration;
private final Long fileSize;
private final String storagePath;
} }
/** /**
@ -116,7 +113,6 @@ public class RecordingDto {
private final Integer duration; private final Integer duration;
private final Integer speakerCount; private final Integer speakerCount;
private final Integer segmentCount; private final Integer segmentCount;
private final String storagePath;
private final String language; private final String language;
} }
} }

View File

@ -1,109 +0,0 @@
package com.unicorn.hgzero.stt.dto;
import lombok.Builder;
import lombok.Getter;
import lombok.ToString;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.DecimalMax;
import jakarta.validation.constraints.DecimalMin;
import java.time.LocalDateTime;
import java.util.List;
/**
* 화자 관련 DTO 클래스들
*/
public class SpeakerDto {
/**
* 화자 식별 요청 DTO
*/
@Getter
@Builder
@ToString
public static class IdentifyRequest {
@NotBlank(message = "녹음 ID는 필수입니다")
private final String recordingId;
@NotBlank(message = "오디오 프레임은 필수입니다")
private final String audioFrame;
private final Long timestamp;
}
/**
* 화자 식별 응답 DTO
*/
@Getter
@Builder
@ToString
public static class IdentificationResponse {
private final String speakerId;
private final String speakerName;
private final Double confidence;
private final Boolean isNewSpeaker;
private final String profileId;
}
/**
* 화자 상세 응답 DTO
*/
@Getter
@Builder
@ToString
public static class DetailResponse {
private final String speakerId;
private final String speakerName;
private final String profileId;
private final String userId;
private final Integer totalSegments;
private final Integer totalDuration;
private final Double averageConfidence;
private final LocalDateTime firstAppeared;
private final LocalDateTime lastAppeared;
}
/**
* 화자 정보 업데이트 요청 DTO
*/
@Getter
@Builder
@ToString
public static class UpdateRequest {
private final String speakerName;
private final String userId;
}
/**
* 화자 목록 응답 DTO
*/
@Getter
@Builder
@ToString
public static class ListResponse {
private final String recordingId;
private final Integer speakerCount;
private final List<SpeakerSummary> speakers;
}
/**
* 화자 요약 DTO
*/
@Getter
@Builder
@ToString
public static class SpeakerSummary {
private final String speakerId;
private final String speakerName;
private final Integer segmentCount;
private final Integer totalDuration;
private final Double speakingRatio;
}
}

View File

@ -62,12 +62,10 @@ public class RecordingEvent {
private LocalDateTime startTime; private LocalDateTime startTime;
private LocalDateTime endTime; private LocalDateTime endTime;
private Integer duration; private Integer duration;
private Long fileSize;
private String storagePath;
private LocalDateTime eventTime; private LocalDateTime eventTime;
public static RecordingStopped of(String recordingId, String meetingId, String stoppedBy, public static RecordingStopped of(String recordingId, String meetingId, String stoppedBy,
LocalDateTime startTime, Integer duration, Long fileSize, String storagePath) { LocalDateTime startTime, Integer duration) {
return RecordingStopped.builder() return RecordingStopped.builder()
.eventId(java.util.UUID.randomUUID().toString()) .eventId(java.util.UUID.randomUUID().toString())
.eventType("RecordingStopped") .eventType("RecordingStopped")
@ -77,8 +75,6 @@ public class RecordingEvent {
.startTime(startTime) .startTime(startTime)
.endTime(LocalDateTime.now()) .endTime(LocalDateTime.now())
.duration(duration) .duration(duration)
.fileSize(fileSize)
.storagePath(storagePath)
.eventTime(LocalDateTime.now()) .eventTime(LocalDateTime.now())
.build(); .build();
} }

View File

@ -1,120 +0,0 @@
package com.unicorn.hgzero.stt.event;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
/**
* 화자 관련 이벤트 정의
*/
public class SpeakerEvent {
/**
* 신규 화자 식별 이벤트
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class NewSpeakerIdentified {
private String eventId;
private String eventType;
private String speakerId;
private String speakerName;
private String profileId;
private String recordingId;
private String meetingId;
private Double confidence;
private LocalDateTime firstAppeared;
private LocalDateTime eventTime;
public static NewSpeakerIdentified of(String speakerId, String speakerName, String profileId,
String recordingId, String meetingId, Double confidence) {
return NewSpeakerIdentified.builder()
.eventId(java.util.UUID.randomUUID().toString())
.eventType("NewSpeakerIdentified")
.speakerId(speakerId)
.speakerName(speakerName)
.profileId(profileId)
.recordingId(recordingId)
.meetingId(meetingId)
.confidence(confidence)
.firstAppeared(LocalDateTime.now())
.eventTime(LocalDateTime.now())
.build();
}
}
/**
* 화자 정보 업데이트 이벤트
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class SpeakerUpdated {
private String eventId;
private String eventType;
private String speakerId;
private String oldSpeakerName;
private String newSpeakerName;
private String oldUserId;
private String newUserId;
private String updatedBy;
private LocalDateTime eventTime;
public static SpeakerUpdated of(String speakerId, String oldSpeakerName, String newSpeakerName,
String oldUserId, String newUserId, String updatedBy) {
return SpeakerUpdated.builder()
.eventId(java.util.UUID.randomUUID().toString())
.eventType("SpeakerUpdated")
.speakerId(speakerId)
.oldSpeakerName(oldSpeakerName)
.newSpeakerName(newSpeakerName)
.oldUserId(oldUserId)
.newUserId(newUserId)
.updatedBy(updatedBy)
.eventTime(LocalDateTime.now())
.build();
}
}
/**
* 화자 통계 업데이트 이벤트
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class SpeakerStatisticsUpdated {
private String eventId;
private String eventType;
private String speakerId;
private String recordingId;
private String meetingId;
private Integer totalSegments;
private Integer totalDuration;
private Double averageConfidence;
private LocalDateTime lastAppeared;
private LocalDateTime eventTime;
public static SpeakerStatisticsUpdated of(String speakerId, String recordingId, String meetingId,
Integer totalSegments, Integer totalDuration, Double averageConfidence) {
return SpeakerStatisticsUpdated.builder()
.eventId(java.util.UUID.randomUUID().toString())
.eventType("SpeakerStatisticsUpdated")
.speakerId(speakerId)
.recordingId(recordingId)
.meetingId(meetingId)
.totalSegments(totalSegments)
.totalDuration(totalDuration)
.averageConfidence(averageConfidence)
.lastAppeared(LocalDateTime.now())
.eventTime(LocalDateTime.now())
.build();
}
}
}

View File

@ -43,12 +43,6 @@ public class RecordingEntity extends BaseTimeEntity {
@Column(name = "duration") @Column(name = "duration")
private Integer duration; private Integer duration;
@Column(name = "file_size")
private Long fileSize;
@Column(name = "storage_path", length = 500)
private String storagePath;
@Column(name = "language", length = 10, nullable = false) @Column(name = "language", length = 10, nullable = false)
private String language; private String language;
@ -70,8 +64,6 @@ public class RecordingEntity extends BaseTimeEntity {
.startTime(startTime) .startTime(startTime)
.endTime(endTime) .endTime(endTime)
.duration(duration) .duration(duration)
.fileSize(fileSize)
.storagePath(storagePath)
.language(language) .language(language)
.speakerCount(speakerCount) .speakerCount(speakerCount)
.segmentCount(segmentCount) .segmentCount(segmentCount)
@ -90,8 +82,6 @@ public class RecordingEntity extends BaseTimeEntity {
.startTime(recording.getStartTime()) .startTime(recording.getStartTime())
.endTime(recording.getEndTime()) .endTime(recording.getEndTime())
.duration(recording.getDuration()) .duration(recording.getDuration())
.fileSize(recording.getFileSize())
.storagePath(recording.getStoragePath())
.language(recording.getLanguage()) .language(recording.getLanguage())
.speakerCount(recording.getSpeakerCount()) .speakerCount(recording.getSpeakerCount())
.segmentCount(recording.getSegmentCount()) .segmentCount(recording.getSegmentCount())

View File

@ -1,104 +0,0 @@
package com.unicorn.hgzero.stt.repository.entity;
import com.unicorn.hgzero.common.entity.BaseTimeEntity;
import com.unicorn.hgzero.stt.domain.Speaker;
import jakarta.persistence.*;
import lombok.*;
import java.time.LocalDateTime;
/**
* 화자 엔티티
* 음성 화자 정보를 저장하는 JPA 엔티티
*/
@Entity
@Table(name = "speakers")
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@Builder
@ToString
public class SpeakerEntity extends BaseTimeEntity {
@Id
@Column(name = "speaker_id", length = 50)
private String speakerId;
@Column(name = "speaker_name", length = 100)
private String speakerName;
@Column(name = "profile_id", length = 100)
private String profileId;
@Column(name = "user_id", length = 50)
private String userId;
@Column(name = "total_segments")
private Integer totalSegments;
@Column(name = "total_duration")
private Integer totalDuration;
@Column(name = "average_confidence")
private Double averageConfidence;
@Column(name = "first_appeared")
private LocalDateTime firstAppeared;
@Column(name = "last_appeared")
private LocalDateTime lastAppeared;
/**
* 도메인 객체로 변환
*/
public Speaker toDomain() {
return Speaker.builder()
.speakerId(speakerId)
.speakerName(speakerName)
.profileId(profileId)
.userId(userId)
.totalSegments(totalSegments)
.totalDuration(totalDuration)
.averageConfidence(averageConfidence)
.firstAppeared(firstAppeared)
.lastAppeared(lastAppeared)
.createdAt(getCreatedAt())
.updatedAt(getUpdatedAt())
.build();
}
/**
* 도메인 객체에서 엔티티 생성
*/
public static SpeakerEntity fromDomain(Speaker speaker) {
return SpeakerEntity.builder()
.speakerId(speaker.getSpeakerId())
.speakerName(speaker.getSpeakerName())
.profileId(speaker.getProfileId())
.userId(speaker.getUserId())
.totalSegments(speaker.getTotalSegments())
.totalDuration(speaker.getTotalDuration())
.averageConfidence(speaker.getAverageConfidence())
.firstAppeared(speaker.getFirstAppeared())
.lastAppeared(speaker.getLastAppeared())
.build();
}
/**
* 화자 정보 업데이트
*/
public void updateSpeakerInfo(String speakerName, String userId) {
this.speakerName = speakerName;
this.userId = userId;
}
/**
* 통계 정보 업데이트
*/
public void updateStatistics(Integer totalSegments, Integer totalDuration, Double averageConfidence) {
this.totalSegments = totalSegments;
this.totalDuration = totalDuration;
this.averageConfidence = averageConfidence;
this.lastAppeared = LocalDateTime.now();
}
}

View File

@ -1,51 +0,0 @@
package com.unicorn.hgzero.stt.repository.jpa;
import com.unicorn.hgzero.stt.repository.entity.SpeakerEntity;
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 java.util.List;
import java.util.Optional;
/**
* 화자 JPA Repository
* 화자 정보에 대한 데이터베이스 접근을 담당
*/
@Repository
public interface SpeakerRepository extends JpaRepository<SpeakerEntity, String> {
/**
* 사용자 ID로 화자 조회
*/
Optional<SpeakerEntity> findByUserId(String userId);
/**
* Azure Profile ID로 화자 조회
*/
Optional<SpeakerEntity> findByProfileId(String profileId);
/**
* 화자명으로 검색
*/
List<SpeakerEntity> findBySpeakerNameContaining(String speakerName);
/**
* 발언 비중이 높은 화자 조회
*/
@Query("SELECT s FROM SpeakerEntity s WHERE s.totalDuration > :minDuration ORDER BY s.totalDuration DESC")
List<SpeakerEntity> findActiveSpeakers(@Param("minDuration") Integer minDuration);
/**
* 신뢰도가 낮은 화자 조회
*/
@Query("SELECT s FROM SpeakerEntity s WHERE s.averageConfidence < :threshold ORDER BY s.averageConfidence ASC")
List<SpeakerEntity> findLowConfidenceSpeakers(@Param("threshold") Double threshold);
/**
* 사용자 ID 미지정 화자 조회
*/
@Query("SELECT s FROM SpeakerEntity s WHERE s.userId IS NULL ORDER BY s.totalDuration DESC")
List<SpeakerEntity> findUnassignedSpeakers();
}

View File

@ -50,7 +50,6 @@ public class RecordingServiceImpl implements RecordingService {
.language(request.getLanguage() != null ? request.getLanguage() : "ko-KR") .language(request.getLanguage() != null ? request.getLanguage() : "ko-KR")
.speakerCount(0) .speakerCount(0)
.segmentCount(0) .segmentCount(0)
.storagePath(generateStoragePath(request.getMeetingId(), request.getSessionId()))
.build(); .build();
recordingRepository.save(recording); recordingRepository.save(recording);
@ -65,7 +64,6 @@ public class RecordingServiceImpl implements RecordingService {
.sessionId(request.getSessionId()) .sessionId(request.getSessionId())
.status("READY") .status("READY")
.streamUrl(streamUrl) .streamUrl(streamUrl)
.storagePath(recording.getStoragePath())
.estimatedInitTime(1100) .estimatedInitTime(1100)
.build(); .build();
} }
@ -119,14 +117,13 @@ public class RecordingServiceImpl implements RecordingService {
// 녹음 시간 계산 (임시로 30분으로 설정) // 녹음 시간 계산 (임시로 30분으로 설정)
Integer duration = 1800; // 실제로는 startTime과 endTime 차이 계산 Integer duration = 1800; // 실제로는 startTime과 endTime 차이 계산
Long fileSize = 172800000L; // 실제로는 Azure Blob에서 파일 크기 조회
RecordingEntity savedRecording = recordingRepository.save(recording); RecordingEntity savedRecording = recordingRepository.save(recording);
// 녹음 중지 이벤트 발행 // 녹음 중지 이벤트 발행 (음성 파일 저장하지 않으므로 파일 정보 제외)
RecordingEvent.RecordingStopped event = RecordingEvent.RecordingStopped.of( RecordingEvent.RecordingStopped event = RecordingEvent.RecordingStopped.of(
recordingId, recording.getMeetingId(), request.getStoppedBy(), recordingId, recording.getMeetingId(), request.getStoppedBy(),
recording.getStartTime(), duration, fileSize, recording.getStoragePath() recording.getStartTime(), duration
); );
eventPublisher.publishAsync("recording-events", event); eventPublisher.publishAsync("recording-events", event);
@ -138,8 +135,6 @@ public class RecordingServiceImpl implements RecordingService {
.startTime(recording.getStartTime()) .startTime(recording.getStartTime())
.endTime(endTime) .endTime(endTime)
.duration(duration) .duration(duration)
.fileSize(fileSize)
.storagePath(recording.getStoragePath())
.build(); .build();
} }
@ -160,7 +155,6 @@ public class RecordingServiceImpl implements RecordingService {
.duration(recording.getDuration()) .duration(recording.getDuration())
.speakerCount(recording.getSpeakerCount()) .speakerCount(recording.getSpeakerCount())
.segmentCount(recording.getSegmentCount()) .segmentCount(recording.getSegmentCount())
.storagePath(recording.getStoragePath())
.language(recording.getLanguage()) .language(recording.getLanguage())
.build(); .build();
} }
@ -181,10 +175,4 @@ public class RecordingServiceImpl implements RecordingService {
String.format("%03d", (int)(Math.random() * 1000)); String.format("%03d", (int)(Math.random() * 1000));
} }
/**
* 저장 경로 생성
*/
private String generateStoragePath(String meetingId, String sessionId) {
return String.format("recordings/%s/%s.wav", meetingId, sessionId);
}
} }

View File

@ -1,43 +0,0 @@
package com.unicorn.hgzero.stt.service;
import com.unicorn.hgzero.stt.dto.SpeakerDto;
/**
* 화자 서비스 인터페이스
* 화자 식별 관리 기능을 정의
*/
public interface SpeakerService {
/**
* 화자 식별
*
* @param request 화자 식별 요청
* @return 화자 식별 응답
*/
SpeakerDto.IdentificationResponse identifySpeaker(SpeakerDto.IdentifyRequest request);
/**
* 화자 정보 조회
*
* @param speakerId 화자 ID
* @return 화자 상세 응답
*/
SpeakerDto.DetailResponse getSpeaker(String speakerId);
/**
* 화자 정보 업데이트
*
* @param speakerId 화자 ID
* @param request 화자 업데이트 요청
* @return 화자 상세 응답
*/
SpeakerDto.DetailResponse updateSpeaker(String speakerId, SpeakerDto.UpdateRequest request);
/**
* 녹음의 화자 목록 조회
*
* @param recordingId 녹음 ID
* @return 화자 목록 응답
*/
SpeakerDto.ListResponse getRecordingSpeakers(String recordingId);
}

View File

@ -1,218 +0,0 @@
package com.unicorn.hgzero.stt.service;
import com.unicorn.hgzero.common.exception.BusinessException;
import com.unicorn.hgzero.common.exception.ErrorCode;
import com.unicorn.hgzero.stt.dto.SpeakerDto;
import com.unicorn.hgzero.stt.event.SpeakerEvent;
import com.unicorn.hgzero.stt.event.publisher.EventPublisher;
import com.unicorn.hgzero.stt.repository.entity.SpeakerEntity;
import com.unicorn.hgzero.stt.repository.jpa.SpeakerRepository;
import com.unicorn.hgzero.stt.repository.jpa.TranscriptSegmentRepository;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime;
import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;
/**
* 화자 서비스 구현체
* 화자 식별 관리 기능을 구현
*/
@Slf4j
@Service
@RequiredArgsConstructor
@Transactional
public class SpeakerServiceImpl implements SpeakerService {
private final SpeakerRepository speakerRepository;
private final TranscriptSegmentRepository segmentRepository;
private final EventPublisher eventPublisher;
@Override
public SpeakerDto.IdentificationResponse identifySpeaker(SpeakerDto.IdentifyRequest request) {
log.info("화자 식별 시작 - recordingId: {}", request.getRecordingId());
// Azure Speaker Recognition API 호출 시뮬레이션
String profileId = simulateAzureSpeakerRecognition(request.getAudioFrame());
Double confidence = simulateIdentificationConfidence();
// 기존 화자 조회
SpeakerEntity speaker = speakerRepository.findByProfileId(profileId).orElse(null);
boolean isNewSpeaker = false;
if (speaker == null) {
// 신규 화자 등록
String speakerId = generateSpeakerId();
String speakerName = "화자-" + speakerId.substring(4);
speaker = SpeakerEntity.builder()
.speakerId(speakerId)
.speakerName(speakerName)
.profileId(profileId)
.totalSegments(0)
.totalDuration(0)
.averageConfidence(confidence)
.firstAppeared(LocalDateTime.now())
.lastAppeared(LocalDateTime.now())
.build();
speakerRepository.save(speaker);
isNewSpeaker = true;
// 신규 화자 식별 이벤트 발행
SpeakerEvent.NewSpeakerIdentified event = SpeakerEvent.NewSpeakerIdentified.of(
speakerId, speakerName, profileId, request.getRecordingId(),
extractMeetingIdFromRecordingId(request.getRecordingId()), confidence
);
eventPublisher.publishAsync("speaker-events", event);
log.info("신규 화자 등록 완료 - speakerId: {}, confidence: {}", speakerId, confidence);
} else {
log.debug("기존 화자 식별 - speakerId: {}, confidence: {}", speaker.getSpeakerId(), confidence);
}
return SpeakerDto.IdentificationResponse.builder()
.speakerId(speaker.getSpeakerId())
.speakerName(speaker.getSpeakerName())
.confidence(confidence)
.isNewSpeaker(isNewSpeaker)
.profileId(profileId)
.build();
}
@Override
@Transactional(readOnly = true)
public SpeakerDto.DetailResponse getSpeaker(String speakerId) {
log.debug("화자 정보 조회 - speakerId: {}", speakerId);
SpeakerEntity speaker = findSpeakerById(speakerId);
return SpeakerDto.DetailResponse.builder()
.speakerId(speaker.getSpeakerId())
.speakerName(speaker.getSpeakerName())
.profileId(speaker.getProfileId())
.userId(speaker.getUserId())
.totalSegments(speaker.getTotalSegments())
.totalDuration(speaker.getTotalDuration())
.averageConfidence(speaker.getAverageConfidence())
.firstAppeared(speaker.getFirstAppeared())
.lastAppeared(speaker.getLastAppeared())
.build();
}
@Override
public SpeakerDto.DetailResponse updateSpeaker(String speakerId, SpeakerDto.UpdateRequest request) {
log.info("화자 정보 업데이트 - speakerId: {}", speakerId);
SpeakerEntity speaker = findSpeakerById(speakerId);
// 화자 정보 업데이트
String oldSpeakerName = speaker.getSpeakerName();
String oldUserId = speaker.getUserId();
speaker.updateSpeakerInfo(request.getSpeakerName(), request.getUserId());
SpeakerEntity savedSpeaker = speakerRepository.save(speaker);
// 화자 정보 업데이트 이벤트 발행
SpeakerEvent.SpeakerUpdated event = SpeakerEvent.SpeakerUpdated.of(
speakerId, oldSpeakerName, request.getSpeakerName(),
oldUserId, request.getUserId(), "SYSTEM"
);
eventPublisher.publishAsync("speaker-events", event);
log.info("화자 정보 업데이트 완료 - speakerId: {}, speakerName: {}",
speakerId, request.getSpeakerName());
return getSpeaker(speakerId);
}
@Override
@Transactional(readOnly = true)
public SpeakerDto.ListResponse getRecordingSpeakers(String recordingId) {
log.debug("녹음 화자 목록 조회 - recordingId: {}", recordingId);
// 녹음별 화자 통계 조회
List<Object[]> speakerStats = segmentRepository.getSpeakerStatisticsByRecording(recordingId);
List<SpeakerDto.SpeakerSummary> speakers = speakerStats.stream()
.map(stat -> {
String speakerId = (String) stat[0];
Long segmentCount = (Long) stat[1];
Double totalDuration = (Double) stat[2];
Double averageConfidence = (Double) stat[3];
// 화자 정보 조회
SpeakerEntity speaker = speakerRepository.findById(speakerId).orElse(null);
String speakerName = speaker != null ? speaker.getSpeakerName() : "알 수 없는 화자";
// 발언 비율 계산 (전체 시간 대비)
Double speakingRatio = calculateSpeakingRatio(recordingId, totalDuration);
return SpeakerDto.SpeakerSummary.builder()
.speakerId(speakerId)
.speakerName(speakerName)
.segmentCount(segmentCount.intValue())
.totalDuration(totalDuration.intValue())
.speakingRatio(speakingRatio)
.build();
})
.collect(Collectors.toList());
return SpeakerDto.ListResponse.builder()
.recordingId(recordingId)
.speakerCount(speakers.size())
.speakers(speakers)
.build();
}
/**
* 화자 ID로 엔티티 조회
*/
private SpeakerEntity findSpeakerById(String speakerId) {
return speakerRepository.findById(speakerId)
.orElseThrow(() -> new BusinessException(ErrorCode.ENTITY_NOT_FOUND, "화자를 찾을 수 없습니다"));
}
/**
* 화자 ID 생성
*/
private String generateSpeakerId() {
return "SPK-" + String.format("%03d", (int)(Math.random() * 999) + 1);
}
/**
* Azure Speaker Recognition 시뮬레이션
*/
private String simulateAzureSpeakerRecognition(String audioFrame) {
// 실제로는 Azure Cognitive Services Speaker Recognition API 호출
return "PROFILE-" + UUID.randomUUID().toString().substring(0, 8).toUpperCase();
}
/**
* 화자 식별 신뢰도 시뮬레이션
*/
private Double simulateIdentificationConfidence() {
// 실제로는 Azure Speaker Recognition API에서 반환
return 0.90 + (Math.random() * 0.10); // 0.90 ~ 1.0
}
/**
* 발언 비율 계산
*/
private Double calculateSpeakingRatio(String recordingId, Double speakerDuration) {
// 전체 녹음 시간 조회 (임시로 1800초로 설정)
Double totalDuration = 1800.0;
return speakerDuration / totalDuration;
}
/**
* 녹음 ID에서 회의 ID 추출
*/
private String extractMeetingIdFromRecordingId(String recordingId) {
// 실제로는 Recording 엔티티에서 조회
return "MEETING-" + recordingId.substring(4, 12);
}
}

View File

@ -2,7 +2,6 @@ package com.unicorn.hgzero.stt.service;
import com.unicorn.hgzero.stt.dto.TranscriptionDto; import com.unicorn.hgzero.stt.dto.TranscriptionDto;
import com.unicorn.hgzero.stt.dto.TranscriptSegmentDto; import com.unicorn.hgzero.stt.dto.TranscriptSegmentDto;
import org.springframework.web.multipart.MultipartFile;
/** /**
* 음성 변환 서비스 인터페이스 * 음성 변환 서비스 인터페이스
@ -18,30 +17,13 @@ public interface TranscriptionService {
*/ */
TranscriptSegmentDto.Response processAudioStream(TranscriptionDto.StreamRequest request); TranscriptSegmentDto.Response processAudioStream(TranscriptionDto.StreamRequest request);
/**
* 배치 음성-텍스트 변환
*
* @param request 배치 변환 요청
* @param audioFile 오디오 파일
* @return 배치 변환 응답
*/
TranscriptionDto.BatchResponse transcribeAudioBatch(TranscriptionDto.BatchRequest request, MultipartFile audioFile);
/**
* 배치 변환 완료 콜백 처리
*
* @param request 배치 콜백 요청
* @return 변환 완료 응답
*/
TranscriptionDto.CompleteResponse processBatchCallback(TranscriptionDto.BatchCallbackRequest request);
/** /**
* 변환 텍스트 전체 조회 * 변환 텍스트 전체 조회
* *
* @param recordingId 녹음 ID * @param recordingId 녹음 ID
* @param includeSegments 세그먼트 포함 여부
* @param speakerId 화자 ID 필터
* @return 변환 결과 응답 * @return 변환 결과 응답
*/ */
TranscriptionDto.Response getTranscription(String recordingId, Boolean includeSegments, String speakerId); TranscriptionDto.Response getTranscription(String recordingId);
} }

View File

@ -16,9 +16,10 @@ import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.Instant;
import java.time.ZoneId;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -78,12 +79,14 @@ public class TranscriptionServiceImpl implements TranscriptionService {
updateRecordingStatistics(request.getRecordingId()); updateRecordingStatistics(request.getRecordingId());
// 세그먼트 생성 이벤트 발행 // 세그먼트 생성 이벤트 발행
LocalDateTime timestampAsLocalDateTime = java.time.Instant.ofEpochMilli(request.getTimestamp()) LocalDateTime timestampAsDateTime = LocalDateTime.ofInstant(
.atZone(java.time.ZoneId.systemDefault()).toLocalDateTime(); Instant.ofEpochMilli(request.getTimestamp()),
ZoneId.systemDefault()
);
TranscriptionEvent.SegmentCreated event = TranscriptionEvent.SegmentCreated.of( TranscriptionEvent.SegmentCreated event = TranscriptionEvent.SegmentCreated.of(
segmentId, request.getRecordingId(), recording.getMeetingId(), segmentId, request.getRecordingId(), recording.getMeetingId(),
recognizedText, speakerId, "화자-" + speakerId.substring(4), recognizedText, speakerId, "화자-" + speakerId.substring(4),
timestampAsLocalDateTime, 3.5, confidence, warningFlag timestampAsDateTime, 3.5, confidence, warningFlag
); );
eventPublisher.publishAsync("transcription-events", event); eventPublisher.publishAsync("transcription-events", event);
@ -111,93 +114,21 @@ public class TranscriptionServiceImpl implements TranscriptionService {
.build(); .build();
} }
@Override
public TranscriptionDto.BatchResponse transcribeAudioBatch(TranscriptionDto.BatchRequest request, MultipartFile audioFile) {
log.info("배치 음성 변환 시작 - recordingId: {}, fileSize: {}",
request.getRecordingId(), audioFile.getSize());
// 녹음 존재 확인
RecordingEntity recording = findRecordingById(request.getRecordingId());
// 배치 작업 ID 생성
String jobId = generateJobId();
// Azure Batch Transcription Job 생성 (실제로는 Azure Speech SDK 사용)
// 여기서는 시뮬레이션
log.info("배치 음성 변환 작업 생성 완료 - jobId: {}", jobId);
return TranscriptionDto.BatchResponse.builder()
.jobId(jobId)
.recordingId(request.getRecordingId())
.status("PROCESSING")
.estimatedCompletionTime(LocalDateTime.now().plusSeconds(30))
.callbackUrl(request.getCallbackUrl())
.build();
}
@Override
public TranscriptionDto.CompleteResponse processBatchCallback(TranscriptionDto.BatchCallbackRequest request) {
log.info("배치 변환 콜백 처리 - jobId: {}, status: {}", request.getJobId(), request.getStatus());
if ("COMPLETED".equals(request.getStatus()) && request.getSegments() != null) {
// 세그먼트 저장
for (TranscriptSegmentDto.Detail segmentDto : request.getSegments()) {
String segmentId = generateSegmentId();
TranscriptSegmentEntity segment = TranscriptSegmentEntity.builder()
.segmentId(segmentId)
.transcriptId(segmentDto.getTranscriptId())
.text(segmentDto.getText())
.speakerId(segmentDto.getSpeakerId())
.speakerName(segmentDto.getSpeakerName())
.timestamp(segmentDto.getTimestamp())
.duration(segmentDto.getDuration())
.confidence(segmentDto.getConfidence())
.warningFlag(segmentDto.getConfidence() < 0.6)
.build();
segmentRepository.save(segment);
}
// 전체 텍스트 통합 변환 결과 저장
String recordingId = extractRecordingIdFromJobId(request.getJobId());
aggregateAndSaveTranscription(recordingId, request.getSegments());
}
return TranscriptionDto.CompleteResponse.builder()
.jobId(request.getJobId())
.status(request.getStatus())
.segmentCount(request.getSegments() != null ? request.getSegments().size() : 0)
.totalDuration(calculateTotalDuration(request.getSegments()))
.averageConfidence(calculateAverageConfidence(request.getSegments()))
.build();
}
@Override @Override
@Transactional(readOnly = true) @Transactional(readOnly = true)
public TranscriptionDto.Response getTranscription(String recordingId, Boolean includeSegments, String speakerId) { public TranscriptionDto.Response getTranscription(String recordingId) {
log.debug("변환 텍스트 조회 - recordingId: {}, includeSegments: {}", recordingId, includeSegments); log.debug("변환 텍스트 조회 - recordingId: {}", recordingId);
// 변환 결과 조회 // 변환 결과 조회
TranscriptionEntity transcription = transcriptionRepository.findByRecordingId(recordingId) TranscriptionEntity transcription = transcriptionRepository.findByRecordingId(recordingId)
.orElseThrow(() -> new BusinessException(ErrorCode.ENTITY_NOT_FOUND, "변환 결과를 찾을 수 없습니다")); .orElseThrow(() -> new BusinessException(ErrorCode.ENTITY_NOT_FOUND, "변환 결과를 찾을 수 없습니다"));
List<TranscriptSegmentDto.Detail> segments = null; // 세그먼트 정보 포함
List<TranscriptSegmentEntity> segmentEntities = segmentRepository.findByRecordingIdOrderByTimestamp(recordingId);
if (Boolean.TRUE.equals(includeSegments)) { List<TranscriptSegmentDto.Detail> segments = segmentEntities.stream()
List<TranscriptSegmentEntity> segmentEntities; .map(this::convertToSegmentDetail)
.collect(Collectors.toList());
if (speakerId != null) {
segmentEntities = segmentRepository.findByRecordingIdAndSpeakerIdOrderByTimestamp(recordingId, speakerId);
} else {
segmentEntities = segmentRepository.findByRecordingIdOrderByTimestamp(recordingId);
}
segments = segmentEntities.stream()
.map(this::convertToSegmentDetail)
.collect(Collectors.toList());
}
return TranscriptionDto.Response.builder() return TranscriptionDto.Response.builder()
.recordingId(recordingId) .recordingId(recordingId)

View File

@ -4,8 +4,8 @@ spring:
# Database Configuration # Database Configuration
datasource: datasource:
url: jdbc:${DB_KIND:postgresql}://${DB_HOST:4.230.65.89}:${DB_PORT:5432}/${DB_NAME:sttdb} url: jdbc:${DB_KIND:postgresql}://${DB_HOST:localhost}:${DB_PORT:5432}/${DB_NAME:sttdb}
username: ${DB_USERNAME:hgzerouser} username: ${DB_USERNAME:stt_user}
password: ${DB_PASSWORD:} password: ${DB_PASSWORD:}
driver-class-name: org.postgresql.Driver driver-class-name: org.postgresql.Driver
hikari: hikari:
@ -21,6 +21,7 @@ spring:
show-sql: ${SHOW_SQL:true} show-sql: ${SHOW_SQL:true}
properties: properties:
hibernate: hibernate:
dialect: org.hibernate.dialect.PostgreSQLDialect
format_sql: true format_sql: true
use_sql_comments: true use_sql_comments: true
hibernate: hibernate:
@ -29,7 +30,7 @@ spring:
# 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
@ -39,7 +40,7 @@ spring:
max-idle: 8 max-idle: 8
min-idle: 0 min-idle: 0
max-wait: -1ms max-wait: -1ms
database: ${REDIS_DATABASE:2} database: ${REDIS_DATABASE:3}
# Server Configuration # Server Configuration
server: server:
@ -47,9 +48,9 @@ server:
# JWT Configuration # JWT Configuration
jwt: jwt:
secret: ${JWT_SECRET:} secret: ${JWT_SECRET:HGZero_Secret_Key_For_Development_Only}
access-token-validity: ${JWT_ACCESS_TOKEN_VALIDITY:3600} access-token-validity: ${JWT_ACCESS_TOKEN_VALIDITY:1800}
refresh-token-validity: ${JWT_REFRESH_TOKEN_VALIDITY:604800} refresh-token-validity: ${JWT_REFRESH_TOKEN_VALIDITY:86400}
# CORS Configuration # CORS Configuration
cors: cors:

View File

@ -1,16 +1,19 @@
package com.unicorn.hgzero.stt; package com.unicorn.hgzero.stt;
import com.unicorn.hgzero.stt.config.TestConfig;
import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.annotation.Import;
import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.ActiveProfiles;
/** /**
* STT 애플리케이션 통합 테스트 * STT 애플리케이션 통합 테스트
* 전체 애플리케이션 컨텍스트 로딩 기본 설정 검증 * 전체 애플리케이션 컨텍스트 로딩 기본 설정 검증
*/ */
@SpringBootTest @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE)
@ActiveProfiles("test") @ActiveProfiles("test")
@Import(TestConfig.class)
@DisplayName("STT 애플리케이션 테스트") @DisplayName("STT 애플리케이션 테스트")
class SttApplicationTest { class SttApplicationTest {

View File

@ -0,0 +1,82 @@
package com.unicorn.hgzero.stt.config;
import com.unicorn.hgzero.stt.event.publisher.EventPublisher;
import com.unicorn.hgzero.stt.repository.jpa.RecordingRepository;
import com.unicorn.hgzero.stt.repository.jpa.SpeakerRepository;
import com.unicorn.hgzero.stt.repository.jpa.TranscriptionRepository;
import com.unicorn.hgzero.stt.repository.jpa.TranscriptSegmentRepository;
import com.unicorn.hgzero.stt.service.RecordingService;
import com.unicorn.hgzero.stt.service.SpeakerService;
import com.unicorn.hgzero.stt.service.TranscriptionService;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.boot.test.context.TestConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Primary;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import redis.embedded.RedisServer;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.PreDestroy;
import static org.mockito.Mockito.mock;
/**
* 테스트용 설정 클래스
* Embedded Redis 서버와 Mock Bean들을 제공
*/
@TestConfiguration
@EnableJpaRepositories(basePackages = "com.unicorn.hgzero.stt.repository.jpa")
@EntityScan(basePackages = "com.unicorn.hgzero.stt.repository.entity")
@ComponentScan(basePackages = {"com.unicorn.hgzero.stt.service", "com.unicorn.hgzero.stt.config"})
public class TestConfig {
private RedisServer redisServer;
@PostConstruct
public void startRedis() {
try {
redisServer = new RedisServer(6370);
redisServer.start();
} catch (Exception e) {
// Redis 서버 시작 실패 로그만 남기고 계속 진행
System.err.println("Failed to start embedded Redis server: " + e.getMessage());
}
}
@PreDestroy
public void stopRedis() {
if (redisServer != null && redisServer.isActive()) {
redisServer.stop();
}
}
@Bean
@Primary
public EventPublisher eventPublisher() {
return mock(EventPublisher.class);
}
@Bean
@Primary
@ConditionalOnMissingBean
public RedisConnectionFactory redisConnectionFactory() {
// Embedded Redis에 연결하는 실제 ConnectionFactory
return new LettuceConnectionFactory("localhost", 6370);
}
@Bean
@Primary
@ConditionalOnMissingBean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(connectionFactory);
return template;
}
}

View File

@ -0,0 +1,55 @@
package com.unicorn.hgzero.stt.config;
import org.springframework.boot.test.context.TestConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Primary;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import redis.embedded.RedisServer;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.PreDestroy;
/**
* WebMvcTest용 최소한의 설정 클래스
* Repository는 MockBean으로 별도 처리
*/
@TestConfiguration
@ComponentScan(basePackages = "com.unicorn.hgzero.stt.config")
public class WebMvcTestConfig {
private RedisServer redisServer;
@PostConstruct
public void startRedis() {
try {
redisServer = new RedisServer(6371); // 다른 포트 사용
redisServer.start();
} catch (Exception e) {
System.err.println("Failed to start embedded Redis server: " + e.getMessage());
}
}
@PreDestroy
public void stopRedis() {
if (redisServer != null && redisServer.isActive()) {
redisServer.stop();
}
}
@Bean
@Primary
public RedisConnectionFactory redisConnectionFactory() {
return new LettuceConnectionFactory("localhost", 6371);
}
@Bean
@Primary
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(connectionFactory);
return template;
}
}

View File

@ -1,6 +1,7 @@
package com.unicorn.hgzero.stt.controller; package com.unicorn.hgzero.stt.controller;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import com.unicorn.hgzero.stt.config.WebMvcTestConfig;
import com.unicorn.hgzero.stt.dto.RecordingDto; import com.unicorn.hgzero.stt.dto.RecordingDto;
import com.unicorn.hgzero.stt.service.RecordingService; import com.unicorn.hgzero.stt.service.RecordingService;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
@ -9,6 +10,7 @@ import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.context.annotation.Import;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.MockMvc;

View File

@ -0,0 +1,109 @@
package com.unicorn.hgzero.stt.controller;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.unicorn.hgzero.stt.dto.RecordingDto;
import com.unicorn.hgzero.stt.service.RecordingService;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.MockMvc;
import java.time.LocalDateTime;
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
/**
* 간단한 녹음 컨트롤러 테스트
*/
@WebMvcTest(RecordingController.class)
@DisplayName("간단한 녹음 컨트롤러 테스트")
class SimpleRecordingControllerTest {
@Autowired
private MockMvc mockMvc;
@Autowired
private ObjectMapper objectMapper;
@MockBean
private RecordingService recordingService;
private RecordingDto.PrepareRequest prepareRequest;
private RecordingDto.PrepareResponse prepareResponse;
@BeforeEach
void setUp() {
prepareRequest = RecordingDto.PrepareRequest.builder()
.meetingId("MEETING-001")
.sessionId("SESSION-001")
.language("ko-KR")
.build();
prepareResponse = RecordingDto.PrepareResponse.builder()
.recordingId("REC-20250123-001")
.sessionId("SESSION-001")
.status("READY")
.streamUrl("wss://api.example.com/stt/v1/ws/stt/SESSION-001")
.storagePath("recordings/MEETING-001/SESSION-001.wav")
.estimatedInitTime(1100)
.build();
}
@Test
@DisplayName("녹음 준비 API 성공")
void prepareRecording_Success() throws Exception {
// Given
when(recordingService.prepareRecording(any(RecordingDto.PrepareRequest.class)))
.thenReturn(prepareResponse);
// When & Then
mockMvc.perform(post("/api/v1/stt/recordings/prepare")
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(prepareRequest)))
.andExpect(status().isOk())
.andExpect(jsonPath("$.success").value(true))
.andExpect(jsonPath("$.data.recordingId").value("REC-20250123-001"))
.andExpect(jsonPath("$.data.sessionId").value("SESSION-001"))
.andExpect(jsonPath("$.data.status").value("READY"));
verify(recordingService).prepareRecording(any(RecordingDto.PrepareRequest.class));
}
@Test
@DisplayName("녹음 시작 API 성공")
void startRecording_Success() throws Exception {
// Given
String recordingId = "REC-20250123-001";
RecordingDto.StartRequest startRequest = RecordingDto.StartRequest.builder()
.startedBy("user001")
.build();
RecordingDto.StatusResponse statusResponse = RecordingDto.StatusResponse.builder()
.recordingId(recordingId)
.status("RECORDING")
.startTime(LocalDateTime.now())
.duration(0)
.build();
when(recordingService.startRecording(eq(recordingId), any(RecordingDto.StartRequest.class)))
.thenReturn(statusResponse);
// When & Then
mockMvc.perform(post("/api/v1/stt/recordings/{recordingId}/start", recordingId)
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(startRequest)))
.andExpect(status().isOk())
.andExpect(jsonPath("$.success").value(true))
.andExpect(jsonPath("$.data.recordingId").value(recordingId))
.andExpect(jsonPath("$.data.status").value("RECORDING"));
verify(recordingService).startRecording(eq(recordingId), any(RecordingDto.StartRequest.class));
}
}

View File

@ -1,14 +1,21 @@
package com.unicorn.hgzero.stt.integration; package com.unicorn.hgzero.stt.integration;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import com.unicorn.hgzero.stt.config.TestConfig;
import com.unicorn.hgzero.stt.dto.RecordingDto; import com.unicorn.hgzero.stt.dto.RecordingDto;
import com.unicorn.hgzero.stt.dto.TranscriptionDto; import com.unicorn.hgzero.stt.dto.TranscriptionDto;
import com.unicorn.hgzero.stt.dto.SpeakerDto; import com.unicorn.hgzero.stt.dto.SpeakerDto;
import com.unicorn.hgzero.stt.service.RecordingService;
import com.unicorn.hgzero.stt.service.SpeakerService;
import com.unicorn.hgzero.stt.service.TranscriptionService;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureWebMvc; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureWebMvc;
import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.context.annotation.Import;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.MockMvc;
@ -16,6 +23,8 @@ import org.springframework.test.web.servlet.MvcResult;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
@ -23,10 +32,9 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
* STT API 통합 테스트 * STT API 통합 테스트
* 전체 워크플로우 시나리오 테스트 * 전체 워크플로우 시나리오 테스트
*/ */
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK)
@AutoConfigureWebMvc @AutoConfigureWebMvc
@ActiveProfiles("test") @ActiveProfiles("test")
@Transactional
@DisplayName("STT API 통합 테스트") @DisplayName("STT API 통합 테스트")
class SttApiIntegrationTest { class SttApiIntegrationTest {
@ -36,6 +44,99 @@ class SttApiIntegrationTest {
@Autowired @Autowired
private ObjectMapper objectMapper; private ObjectMapper objectMapper;
@MockBean
private RecordingService recordingService;
@MockBean
private SpeakerService speakerService;
@MockBean
private TranscriptionService transcriptionService;
@BeforeEach
void setUp() {
// RecordingService Mock 설정
when(recordingService.prepareRecording(any(RecordingDto.PrepareRequest.class)))
.thenReturn(RecordingDto.PrepareResponse.builder()
.recordingId("REC-20250123-001")
.sessionId("SESSION-INTEGRATION-001")
.status("READY")
.streamUrl("wss://api.example.com/stt/v1/ws/stt/SESSION-INTEGRATION-001")
.storagePath("recordings/MEETING-INTEGRATION-001/SESSION-INTEGRATION-001.wav")
.estimatedInitTime(1100)
.build());
when(recordingService.startRecording(anyString(), any(RecordingDto.StartRequest.class)))
.thenReturn(RecordingDto.StatusResponse.builder()
.recordingId("REC-20250123-001")
.status("RECORDING")
.startTime(java.time.LocalDateTime.now())
.duration(0)
.build());
when(recordingService.stopRecording(anyString(), any(RecordingDto.StopRequest.class)))
.thenReturn(RecordingDto.StatusResponse.builder()
.recordingId("REC-20250123-001")
.status("STOPPED")
.startTime(java.time.LocalDateTime.now().minusMinutes(30))
.endTime(java.time.LocalDateTime.now())
.duration(1800)
.fileSize(172800000L)
.storagePath("recordings/MEETING-INTEGRATION-001/SESSION-INTEGRATION-001.wav")
.build());
when(recordingService.getRecording(anyString()))
.thenReturn(RecordingDto.DetailResponse.builder()
.recordingId("REC-20250123-001")
.meetingId("MEETING-INTEGRATION-001")
.sessionId("SESSION-INTEGRATION-001")
.status("STOPPED")
.startTime(java.time.LocalDateTime.now().minusMinutes(30))
.endTime(java.time.LocalDateTime.now())
.duration(1800)
.speakerCount(3)
.segmentCount(45)
.storagePath("recordings/MEETING-INTEGRATION-001/SESSION-INTEGRATION-001.wav")
.language("ko-KR")
.build());
// TranscriptionService Mock 설정
when(transcriptionService.processAudioStream(any(TranscriptionDto.StreamRequest.class)))
.thenReturn(com.unicorn.hgzero.stt.dto.TranscriptSegmentDto.Response.builder()
.recordingId("REC-20250123-001")
.transcriptId("TRANS-001")
.text("안녕하세요")
.confidence(0.95)
.timestamp(System.currentTimeMillis())
.speakerId("SPK-001")
.duration(2.5)
.build());
when(transcriptionService.getTranscription(anyString(), any(), any()))
.thenReturn(TranscriptionDto.Response.builder()
.recordingId("REC-20250123-001")
.fullText("안녕하세요. 오늘 회의를 시작하겠습니다.")
.segmentCount(45)
.speakerCount(3)
.totalDuration(1800)
.averageConfidence(0.92)
.build());
// SpeakerService Mock 설정
when(speakerService.identifySpeaker(any(SpeakerDto.IdentifyRequest.class)))
.thenReturn(SpeakerDto.IdentificationResponse.builder()
.speakerId("SPK-001")
.confidence(0.95)
.isNewSpeaker(false)
.build());
when(speakerService.getRecordingSpeakers(anyString()))
.thenReturn(SpeakerDto.ListResponse.builder()
.recordingId("REC-20250123-001")
.speakerCount(3)
.build());
}
@Test @Test
@DisplayName("전체 STT 워크플로우 통합 테스트") @DisplayName("전체 STT 워크플로우 통합 테스트")
void fullSttWorkflowIntegrationTest() throws Exception { void fullSttWorkflowIntegrationTest() throws Exception {
@ -141,6 +242,17 @@ class SttApiIntegrationTest {
@Test @Test
@DisplayName("에러 케이스 통합 테스트") @DisplayName("에러 케이스 통합 테스트")
void errorCasesIntegrationTest() throws Exception { void errorCasesIntegrationTest() throws Exception {
// 존재하지 않는 녹음에 대한 Mock 설정
when(recordingService.startRecording(eq("NONEXISTENT-001"), any(RecordingDto.StartRequest.class)))
.thenThrow(new com.unicorn.hgzero.common.exception.BusinessException(
com.unicorn.hgzero.common.exception.ErrorCode.ENTITY_NOT_FOUND,
"녹음을 찾을 수 없습니다"));
when(transcriptionService.getTranscription(eq("NONEXISTENT-001"), any(), any()))
.thenThrow(new com.unicorn.hgzero.common.exception.BusinessException(
com.unicorn.hgzero.common.exception.ErrorCode.ENTITY_NOT_FOUND,
"변환 결과를 찾을 수 없습니다"));
// 존재하지 않는 녹음 시작 시도 // 존재하지 않는 녹음 시작 시도
RecordingDto.StartRequest startRequest = RecordingDto.StartRequest.builder() RecordingDto.StartRequest startRequest = RecordingDto.StartRequest.builder()
.startedBy("test-user") .startedBy("test-user")

View File

@ -50,6 +50,8 @@ class TranscriptionServiceTest {
private TranscriptionServiceImpl transcriptionService; private TranscriptionServiceImpl transcriptionService;
private RecordingEntity recordingEntity; private RecordingEntity recordingEntity;
private TranscriptSegmentEntity segmentEntity;
private TranscriptionEntity transcriptionEntity;
private TranscriptionDto.StreamRequest streamRequest; private TranscriptionDto.StreamRequest streamRequest;
@BeforeEach @BeforeEach
@ -60,6 +62,22 @@ class TranscriptionServiceTest {
.sessionId("SESSION-001") .sessionId("SESSION-001")
.build(); .build();
segmentEntity = TranscriptSegmentEntity.builder()
.segmentId("SEG-001")
.recordingId("REC-20250123-001")
.text("테스트 음성 변환 결과")
.timestamp(System.currentTimeMillis())
.confidence(0.95)
.build();
transcriptionEntity = TranscriptionEntity.builder()
.transcriptId("TRANS-001")
.recordingId("REC-20250123-001")
.fullText("전체 음성 변환 결과")
.segmentCount(1)
.averageConfidence(0.95)
.build();
streamRequest = TranscriptionDto.StreamRequest.builder() streamRequest = TranscriptionDto.StreamRequest.builder()
.recordingId("REC-20250123-001") .recordingId("REC-20250123-001")
.audioData("base64-encoded-audio-data") .audioData("base64-encoded-audio-data")
@ -73,7 +91,7 @@ class TranscriptionServiceTest {
void processAudioStream_Success() { void processAudioStream_Success() {
// Given // Given
when(recordingRepository.findById(anyString())).thenReturn(Optional.of(recordingEntity)); when(recordingRepository.findById(anyString())).thenReturn(Optional.of(recordingEntity));
when(segmentRepository.save(any(TranscriptSegmentEntity.class))).thenReturn(any()); when(segmentRepository.save(any(TranscriptSegmentEntity.class))).thenReturn(segmentEntity);
when(segmentRepository.getSpeakerStatisticsByRecording(anyString())).thenReturn(List.of()); when(segmentRepository.getSpeakerStatisticsByRecording(anyString())).thenReturn(List.of());
when(segmentRepository.countByRecordingId(anyString())).thenReturn(1L); when(segmentRepository.countByRecordingId(anyString())).thenReturn(1L);
when(recordingRepository.save(any(RecordingEntity.class))).thenReturn(recordingEntity); when(recordingRepository.save(any(RecordingEntity.class))).thenReturn(recordingEntity);
@ -88,9 +106,9 @@ class TranscriptionServiceTest {
assertThat(response.getConfidence()).isGreaterThan(0.8); assertThat(response.getConfidence()).isGreaterThan(0.8);
assertThat(response.getSpeakerId()).isNotEmpty(); assertThat(response.getSpeakerId()).isNotEmpty();
verify(recordingRepository).findById("REC-20250123-001"); verify(recordingRepository, atLeastOnce()).findById("REC-20250123-001");
verify(segmentRepository).save(any(TranscriptSegmentEntity.class)); verify(segmentRepository).save(any(TranscriptSegmentEntity.class));
verify(eventPublisher).publishAsync(eq("transcription-events"), any()); verify(eventPublisher, atLeastOnce()).publishAsync(eq("transcription-events"), any());
} }
@Test @Test
@ -114,7 +132,7 @@ class TranscriptionServiceTest {
void processAudioStream_LowConfidenceWarning() { void processAudioStream_LowConfidenceWarning() {
// Given // Given
when(recordingRepository.findById(anyString())).thenReturn(Optional.of(recordingEntity)); when(recordingRepository.findById(anyString())).thenReturn(Optional.of(recordingEntity));
when(segmentRepository.save(any(TranscriptSegmentEntity.class))).thenReturn(any()); when(segmentRepository.save(any(TranscriptSegmentEntity.class))).thenReturn(segmentEntity);
when(segmentRepository.getSpeakerStatisticsByRecording(anyString())).thenReturn(List.of()); when(segmentRepository.getSpeakerStatisticsByRecording(anyString())).thenReturn(List.of());
when(segmentRepository.countByRecordingId(anyString())).thenReturn(1L); when(segmentRepository.countByRecordingId(anyString())).thenReturn(1L);
when(recordingRepository.save(any(RecordingEntity.class))).thenReturn(recordingEntity); when(recordingRepository.save(any(RecordingEntity.class))).thenReturn(recordingEntity);
@ -191,8 +209,8 @@ class TranscriptionServiceTest {
.segments(segments) .segments(segments)
.build(); .build();
when(segmentRepository.save(any(TranscriptSegmentEntity.class))).thenReturn(any()); when(segmentRepository.save(any(TranscriptSegmentEntity.class))).thenReturn(segmentEntity);
when(transcriptionRepository.save(any(TranscriptionEntity.class))).thenReturn(any()); when(transcriptionRepository.save(any(TranscriptionEntity.class))).thenReturn(transcriptionEntity);
// When // When
TranscriptionDto.CompleteResponse response = transcriptionService.processBatchCallback(callbackRequest); TranscriptionDto.CompleteResponse response = transcriptionService.processBatchCallback(callbackRequest);

View File

@ -1,55 +1,131 @@
# STT 서비스 테스트 설정 # 테스트 환경별 설정 선택
spring: # 1. 단위 테스트용 (기본)
profiles: # 2. Docker 통합 테스트용 (integration-test profile 활성화 시)
active: test
# 데이터베이스 설정 (H2 인메모리) spring:
application:
name: stt-test
# Bean Override 허용
main:
allow-bean-definition-overriding: true
# In-Memory Database (기본값)
datasource: datasource:
url: jdbc:h2:mem:testdb url: jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
driver-class-name: org.h2.Driver
username: sa username: sa
password: password:
driver-class-name: org.h2.Driver
# JPA 설정
jpa: jpa:
show-sql: false
hibernate: hibernate:
ddl-auto: create-drop ddl-auto: create-drop
show-sql: true
properties: properties:
hibernate: hibernate:
dialect: org.hibernate.dialect.H2Dialect dialect: org.hibernate.dialect.H2Dialect
format_sql: true
# Redis 설정 (임베디드) # Mock Redis (handled by TestConfig)
redis: data:
host: localhost redis:
port: 6370 host: localhost
timeout: 2000ms port: 6370
password:
database: 0
# JWT 설정 # Test Server
security: server:
jwt: port: 0
secret: test-secret-key-for-jwt-token-generation-test
expiration: 86400
# Azure 서비스 설정 (테스트용 더미) # Mock Azure Services
azure: azure:
speech: speech:
subscription-key: test-key subscription-key: test-key
region: koreacentral region: eastus
endpoint: https://test.cognitiveservices.azure.com/ language: ko-KR
blob:
storage: connection-string: DefaultEndpointsProtocol=https;AccountName=test;AccountKey=test;EndpointSuffix=core.windows.net
connection-string: DefaultEndpointsProtocol=https;AccountName=testaccount;AccountKey=testkey;EndpointSuffix=core.windows.net
container-name: test-recordings container-name: test-recordings
eventhub:
event-hubs: connection-string: Endpoint=sb://test.servicebus.windows.net/;SharedAccessKeyName=test;SharedAccessKey=test
connection-string: Endpoint=sb://test-eventhub.servicebus.windows.net/;SharedAccessKeyName=test;SharedAccessKey=test name: test-events
consumer-group: test-group consumer-group: test-group
# 로깅 설정 ---
# Docker 통합 테스트용 설정
spring:
config:
activate:
on-profile: integration-test
# Real PostgreSQL (via Docker)
datasource:
url: jdbc:postgresql://localhost:5433/sttdb_test
username: testuser
password: testpass
driver-class-name: org.postgresql.Driver
jpa:
show-sql: true
hibernate:
ddl-auto: update
properties:
hibernate:
dialect: org.hibernate.dialect.PostgreSQLDialect
# Real Redis (via Docker)
data:
redis:
host: localhost
port: 6380
password: testpass
database: 0
# Real Server
server:
port: 8083
# Azure Emulator (Azurite)
azure:
speech:
subscription-key: test-key
region: eastus
language: ko-KR
blob:
connection-string: DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1;
container-name: test-recordings
eventhub:
connection-string: Endpoint=sb://test.servicebus.windows.net/;SharedAccessKeyName=test;SharedAccessKey=test
name: test-events
consumer-group: test-group
---
# 공통 설정
jwt:
secret: test-secret-key-for-testing-purposes-only-not-for-production-use
access-token-validity: 3600
refresh-token-validity: 604800
cors:
allowed-origins: "*"
management:
endpoints:
enabled-by-default: false
endpoint:
health:
enabled: true
springdoc:
api-docs:
enabled: false
swagger-ui:
enabled: false
logging: logging:
level: level:
com.unicorn.hgzero.stt: DEBUG com.unicorn.hgzero.stt: INFO
org.springframework.web: DEBUG org.springframework: WARN
org.hibernate.SQL: DEBUG org.hibernate: WARN
pattern:
console: "%d{HH:mm:ss} %-5level %logger{36} - %msg%n"

View File

@ -0,0 +1,50 @@
#!/bin/bash
# STT 서비스 통합 테스트 실행 스크립트
set -e
echo "🚀 STT 서비스 통합 테스트 시작"
# 1. Docker 테스트 환경 시작
echo "📦 Docker 테스트 환경 시작..."
docker-compose -f docker-compose.test.yml up -d
# 2. 서비스 준비 대기
echo "⏳ 서비스 준비 대기 중..."
sleep 15
# 3. 데이터베이스 준비 확인
echo "🔍 PostgreSQL 연결 확인..."
until docker-compose -f docker-compose.test.yml exec -T postgres-test pg_isready -U testuser -d sttdb_test; do
echo "PostgreSQL 준비 중..."
sleep 2
done
# 4. Redis 연결 확인
echo "🔍 Redis 연결 확인..."
until docker-compose -f docker-compose.test.yml exec -T redis-test redis-cli -a testpass ping | grep PONG; do
echo "Redis 준비 중..."
sleep 2
done
# 5. 통합 테스트 실행
echo "🧪 통합 테스트 실행..."
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-23.0.2.jdk/Contents/Home
./gradlew :stt:test -Dspring.profiles.active=integration-test
# 6. 결과 출력
if [ $? -eq 0 ]; then
echo "✅ 통합 테스트 성공!"
else
echo "❌ 통합 테스트 실패!"
fi
# 7. Docker 환경 정리 (선택)
read -p "Docker 테스트 환경을 정리하시겠습니까? (y/N): " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
echo "🧹 Docker 테스트 환경 정리 중..."
docker-compose -f docker-compose.test.yml down -v
echo "✅ 정리 완료"
fi

View File

@ -22,7 +22,7 @@ public class SwaggerConfig {
return new OpenAPI() return new OpenAPI()
.info(apiInfo()) .info(apiInfo())
.addServersItem(new Server() .addServersItem(new Server()
.url("http://localhost:8080") .url("http://localhost:8081")
.description("Local Development")) .description("Local Development"))
.addServersItem(new Server() .addServersItem(new Server()
.url("{protocol}://{host}:{port}") .url("{protocol}://{host}:{port}")