diff --git a/common/src/main/java/com/unicorn/hgzero/common/exception/ErrorCode.java b/common/src/main/java/com/unicorn/hgzero/common/exception/ErrorCode.java index 8262b22..3a5467a 100644 --- a/common/src/main/java/com/unicorn/hgzero/common/exception/ErrorCode.java +++ b/common/src/main/java/com/unicorn/hgzero/common/exception/ErrorCode.java @@ -41,6 +41,9 @@ public enum ErrorCode { INVALID_MEETING_TIME(HttpStatus.BAD_REQUEST, "M002", "회의 시작 시간이 종료 시간보다 늦습니다."), MEETING_NOT_FOUND(HttpStatus.NOT_FOUND, "M003", "회의를 찾을 수 없습니다."), INVALID_MEETING_STATUS(HttpStatus.BAD_REQUEST, "M004", "유효하지 않은 회의 상태입니다."), + MEETING_NOT_IN_PROGRESS(HttpStatus.BAD_REQUEST, "M005", "회의가 진행 중이 아닙니다."), + MINUTES_NOT_FOUND(HttpStatus.NOT_FOUND, "M006", "회의록을 찾을 수 없습니다."), + AGENDA_SECTION_NOT_FOUND(HttpStatus.NOT_FOUND, "M007", "안건 섹션을 찾을 수 없습니다."), // 외부 시스템 에러 (4xxx) EXTERNAL_API_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "E001", "외부 API 호출 중 오류가 발생했습니다."), diff --git a/meeting/logs/meeting-service.log b/meeting/logs/meeting-service.log index 9425c58..d28169b 100644 --- a/meeting/logs/meeting-service.log +++ b/meeting/logs/meeting-service.log @@ -10539,3 +10539,1617 @@ Caused by: org.postgresql.util.PSQLException: ERROR: column ase1_0.decisions doe 2025-10-29 15:25:15 [http-nio-8082-exec-3] INFO c.u.h.m.i.c.MinutesController - RAG용 회의록 확정 이벤트 발행 완료 - minutesId: 30065ce5-2249-45bd-8be4-7c0df3372ad9, meetingId: 62071c5c-0f01-4f65-a735-5bcbf27dc7ac 2025-10-29 15:25:15 [http-nio-8082-exec-3] INFO c.u.h.m.i.c.MinutesController - 회의록 확정 성공 - minutesId: 30065ce5-2249-45bd-8be4-7c0df3372ad9 2025-10-29 15:25:15 [http-nio-8082-exec-3] INFO c.u.hgzero.common.aop.LoggingAspect - [Controller] com.unicorn.hgzero.meeting.infra.controller.MinutesController.finalizeMinutes 완료 - 실행시간: 2062ms +2025-10-29 16:40:16 [main] INFO c.u.h.meeting.MeetingApplication - Starting MeetingApplication using Java 21.0.8 with PID 96302 (/Users/adela/home/workspace/recent/HGZero/meeting/build/classes/java/main started by adela in /Users/adela/home/workspace/recent/HGZero/meeting) +2025-10-29 16:40:16 [main] DEBUG c.u.h.meeting.MeetingApplication - Running with Spring Boot v3.3.5, Spring v6.1.14 +2025-10-29 16:40:16 [main] INFO c.u.h.meeting.MeetingApplication - The following 1 profile is active: "dev" +2025-10-29 16:40:16 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Multiple Spring Data modules found, entering strict repository configuration mode +2025-10-29 16:40:16 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +2025-10-29 16:40:16 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 80 ms. Found 10 JPA repository interfaces. +2025-10-29 16:40:17 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Multiple Spring Data modules found, entering strict repository configuration mode +2025-10-29 16:40:17 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Bootstrapping Spring Data Redis repositories in DEFAULT mode. +2025-10-29 16:40:17 [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.AgendaSectionJpaRepository; 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-29 16:40:17 [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.AgendaSectionRepository; 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-29 16:40:17 [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.MeetingAnalysisJpaRepository; 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-29 16:40:17 [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-29 16:40:17 [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.MeetingParticipantJpaRepository; 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-29 16:40:17 [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-29 16:40:17 [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-29 16:40:17 [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.SessionJpaRepository; 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-29 16:40:17 [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-29 16:40:17 [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-29 16:40:17 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 21 ms. Found 0 Redis repository interfaces. +2025-10-29 16:40:17 [main] INFO o.s.b.w.e.tomcat.TomcatWebServer - Tomcat initialized with port 8082 (http) +2025-10-29 16:40:17 [main] INFO o.a.catalina.core.StandardService - Starting service [Tomcat] +2025-10-29 16:40:17 [main] INFO o.a.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/10.1.31] +2025-10-29 16:40:17 [main] INFO o.a.c.c.C.[Tomcat].[localhost].[/] - Initializing Spring embedded WebApplicationContext +2025-10-29 16:40:17 [main] INFO o.s.b.w.s.c.ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 1199 ms +2025-10-29 16:40:17 [main] INFO o.h.jpa.internal.util.LogHelper - HHH000204: Processing PersistenceUnitInfo [name: default] +2025-10-29 16:40:17 [main] INFO org.hibernate.Version - HHH000412: Hibernate ORM core version 6.5.3.Final +2025-10-29 16:40:17 [main] INFO o.h.c.i.RegionFactoryInitiator - HHH000026: Second-level cache disabled +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration boolean -> org.hibernate.type.BasicTypeReference@104cfb24 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration boolean -> org.hibernate.type.BasicTypeReference@104cfb24 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Boolean -> org.hibernate.type.BasicTypeReference@104cfb24 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration numeric_boolean -> org.hibernate.type.BasicTypeReference@5340ccb9 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration org.hibernate.type.NumericBooleanConverter -> org.hibernate.type.BasicTypeReference@5340ccb9 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration true_false -> org.hibernate.type.BasicTypeReference@2bc8caa7 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration org.hibernate.type.TrueFalseConverter -> org.hibernate.type.BasicTypeReference@2bc8caa7 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration yes_no -> org.hibernate.type.BasicTypeReference@582ea164 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration org.hibernate.type.YesNoConverter -> org.hibernate.type.BasicTypeReference@582ea164 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration byte -> org.hibernate.type.BasicTypeReference@2fccf49e +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration byte -> org.hibernate.type.BasicTypeReference@2fccf49e +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Byte -> org.hibernate.type.BasicTypeReference@2fccf49e +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration binary -> org.hibernate.type.BasicTypeReference@7abcc0da +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration byte[] -> org.hibernate.type.BasicTypeReference@7abcc0da +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration [B -> org.hibernate.type.BasicTypeReference@7abcc0da +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration binary_wrapper -> org.hibernate.type.BasicTypeReference@174cb0d8 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration wrapper-binary -> org.hibernate.type.BasicTypeReference@174cb0d8 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration image -> org.hibernate.type.BasicTypeReference@3ac406d4 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration blob -> org.hibernate.type.BasicTypeReference@72646d16 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.sql.Blob -> org.hibernate.type.BasicTypeReference@72646d16 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_blob -> org.hibernate.type.BasicTypeReference@6ec2d990 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_blob_wrapper -> org.hibernate.type.BasicTypeReference@1cfa7ee0 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration short -> org.hibernate.type.BasicTypeReference@612290d +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration short -> org.hibernate.type.BasicTypeReference@612290d +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Short -> org.hibernate.type.BasicTypeReference@612290d +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration integer -> org.hibernate.type.BasicTypeReference@57cff804 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration int -> org.hibernate.type.BasicTypeReference@57cff804 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Integer -> org.hibernate.type.BasicTypeReference@57cff804 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration long -> org.hibernate.type.BasicTypeReference@2f39b534 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration long -> org.hibernate.type.BasicTypeReference@2f39b534 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Long -> org.hibernate.type.BasicTypeReference@2f39b534 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration float -> org.hibernate.type.BasicTypeReference@60fbc34d +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration float -> org.hibernate.type.BasicTypeReference@60fbc34d +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Float -> org.hibernate.type.BasicTypeReference@60fbc34d +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration double -> org.hibernate.type.BasicTypeReference@7736c41e +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration double -> org.hibernate.type.BasicTypeReference@7736c41e +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Double -> org.hibernate.type.BasicTypeReference@7736c41e +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration big_integer -> org.hibernate.type.BasicTypeReference@5f911d24 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.math.BigInteger -> org.hibernate.type.BasicTypeReference@5f911d24 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration big_decimal -> org.hibernate.type.BasicTypeReference@3de383f7 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.math.BigDecimal -> org.hibernate.type.BasicTypeReference@3de383f7 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration character -> org.hibernate.type.BasicTypeReference@33ccead +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration char -> org.hibernate.type.BasicTypeReference@33ccead +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Character -> org.hibernate.type.BasicTypeReference@33ccead +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration character_nchar -> org.hibernate.type.BasicTypeReference@42ebece0 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration string -> org.hibernate.type.BasicTypeReference@15c4b1a4 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.String -> org.hibernate.type.BasicTypeReference@15c4b1a4 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration nstring -> org.hibernate.type.BasicTypeReference@341964d0 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration characters -> org.hibernate.type.BasicTypeReference@51b59d58 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration char[] -> org.hibernate.type.BasicTypeReference@51b59d58 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration [C -> org.hibernate.type.BasicTypeReference@51b59d58 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration wrapper-characters -> org.hibernate.type.BasicTypeReference@4ca4f762 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration text -> org.hibernate.type.BasicTypeReference@7c5d36c3 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration ntext -> org.hibernate.type.BasicTypeReference@31de27c +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration clob -> org.hibernate.type.BasicTypeReference@7ebfe01a +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.sql.Clob -> org.hibernate.type.BasicTypeReference@7ebfe01a +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration nclob -> org.hibernate.type.BasicTypeReference@154b0748 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.sql.NClob -> org.hibernate.type.BasicTypeReference@154b0748 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_clob -> org.hibernate.type.BasicTypeReference@35c00c +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_clob_char_array -> org.hibernate.type.BasicTypeReference@6cd7dc74 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_clob_character_array -> org.hibernate.type.BasicTypeReference@6d695ec4 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_nclob -> org.hibernate.type.BasicTypeReference@20556566 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_nclob_character_array -> org.hibernate.type.BasicTypeReference@e4ef4c0 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_nclob_char_array -> org.hibernate.type.BasicTypeReference@5ca8bd01 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration Duration -> org.hibernate.type.BasicTypeReference@7b10472e +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.Duration -> org.hibernate.type.BasicTypeReference@7b10472e +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration LocalDateTime -> org.hibernate.type.BasicTypeReference@70e5737f +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.LocalDateTime -> org.hibernate.type.BasicTypeReference@70e5737f +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration LocalDate -> org.hibernate.type.BasicTypeReference@9746157 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.LocalDate -> org.hibernate.type.BasicTypeReference@9746157 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration LocalTime -> org.hibernate.type.BasicTypeReference@10ad95cd +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.LocalTime -> org.hibernate.type.BasicTypeReference@10ad95cd +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetDateTime -> org.hibernate.type.BasicTypeReference@69fd99c1 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.OffsetDateTime -> org.hibernate.type.BasicTypeReference@69fd99c1 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetDateTimeWithTimezone -> org.hibernate.type.BasicTypeReference@32d8710a +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetDateTimeWithoutTimezone -> org.hibernate.type.BasicTypeReference@180cc0df +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetTime -> org.hibernate.type.BasicTypeReference@64f33dee +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.OffsetTime -> org.hibernate.type.BasicTypeReference@64f33dee +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetTimeUtc -> org.hibernate.type.BasicTypeReference@61c58320 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetTimeWithTimezone -> org.hibernate.type.BasicTypeReference@10e4ee33 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetTimeWithoutTimezone -> org.hibernate.type.BasicTypeReference@6e90cec8 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration ZonedDateTime -> org.hibernate.type.BasicTypeReference@13f182b9 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.ZonedDateTime -> org.hibernate.type.BasicTypeReference@13f182b9 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration ZonedDateTimeWithTimezone -> org.hibernate.type.BasicTypeReference@5ee0cf64 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration ZonedDateTimeWithoutTimezone -> org.hibernate.type.BasicTypeReference@69c227fd +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration date -> org.hibernate.type.BasicTypeReference@14c5283 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.sql.Date -> org.hibernate.type.BasicTypeReference@14c5283 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration time -> org.hibernate.type.BasicTypeReference@1eb7ec59 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.sql.Time -> org.hibernate.type.BasicTypeReference@1eb7ec59 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration timestamp -> org.hibernate.type.BasicTypeReference@46748b04 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.sql.Timestamp -> org.hibernate.type.BasicTypeReference@46748b04 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.util.Date -> org.hibernate.type.BasicTypeReference@46748b04 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration calendar -> org.hibernate.type.BasicTypeReference@3e71a1f8 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.util.Calendar -> org.hibernate.type.BasicTypeReference@3e71a1f8 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.util.GregorianCalendar -> org.hibernate.type.BasicTypeReference@3e71a1f8 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration calendar_date -> org.hibernate.type.BasicTypeReference@5d4a34ff +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration calendar_time -> org.hibernate.type.BasicTypeReference@7cbede2b +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration instant -> org.hibernate.type.BasicTypeReference@1ef04613 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.Instant -> org.hibernate.type.BasicTypeReference@1ef04613 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration uuid -> org.hibernate.type.BasicTypeReference@2d3d4a54 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.util.UUID -> org.hibernate.type.BasicTypeReference@2d3d4a54 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration pg-uuid -> org.hibernate.type.BasicTypeReference@2d3d4a54 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration uuid-binary -> org.hibernate.type.BasicTypeReference@215c6ec0 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration uuid-char -> org.hibernate.type.BasicTypeReference@2b19b346 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration class -> org.hibernate.type.BasicTypeReference@37c5b8e8 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Class -> org.hibernate.type.BasicTypeReference@37c5b8e8 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration currency -> org.hibernate.type.BasicTypeReference@706d2bae +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration Currency -> org.hibernate.type.BasicTypeReference@706d2bae +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.util.Currency -> org.hibernate.type.BasicTypeReference@706d2bae +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration locale -> org.hibernate.type.BasicTypeReference@3205610d +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.util.Locale -> org.hibernate.type.BasicTypeReference@3205610d +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration serializable -> org.hibernate.type.BasicTypeReference@54e06788 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.io.Serializable -> org.hibernate.type.BasicTypeReference@54e06788 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration timezone -> org.hibernate.type.BasicTypeReference@4e789704 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.util.TimeZone -> org.hibernate.type.BasicTypeReference@4e789704 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration ZoneOffset -> org.hibernate.type.BasicTypeReference@5751e53e +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.ZoneOffset -> org.hibernate.type.BasicTypeReference@5751e53e +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration url -> org.hibernate.type.BasicTypeReference@4e45fbd0 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.net.URL -> org.hibernate.type.BasicTypeReference@4e45fbd0 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration vector -> org.hibernate.type.BasicTypeReference@19ce19b7 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration row_version -> org.hibernate.type.BasicTypeReference@13047d3d +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration object -> org.hibernate.type.JavaObjectType@43719e98 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Object -> org.hibernate.type.JavaObjectType@43719e98 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration null -> org.hibernate.type.NullType@6aa9a93b +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_date -> org.hibernate.type.BasicTypeReference@81dfdee +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_time -> org.hibernate.type.BasicTypeReference@3b046e64 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_timestamp -> org.hibernate.type.BasicTypeReference@1c43e84e +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_calendar -> org.hibernate.type.BasicTypeReference@7bd694a5 +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_calendar_date -> org.hibernate.type.BasicTypeReference@21ce2e4d +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_calendar_time -> org.hibernate.type.BasicTypeReference@3921135e +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_binary -> org.hibernate.type.BasicTypeReference@3a239dac +2025-10-29 16:40:17 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_serializable -> org.hibernate.type.BasicTypeReference@759f45f1 +2025-10-29 16:40:17 [main] INFO o.s.o.j.p.SpringPersistenceUnitInfo - No LoadTimeWeaver setup: ignoring JPA class transformer +2025-10-29 16:40:17 [main] WARN org.hibernate.orm.deprecation - HHH90000021: Encountered deprecated setting [hibernate.temp.use_jdbc_metadata_defaults], use [hibernate.boot.allow_jdbc_metadata_access] instead +2025-10-29 16:40:18 [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-29 16:40:18 [main] DEBUG o.h.t.d.sql.spi.DdlTypeRegistry - addDescriptor(2003, org.hibernate.type.descriptor.sql.internal.ArrayDdlTypeImpl@58932d08) replaced previous registration(org.hibernate.type.descriptor.sql.internal.ArrayDdlTypeImpl@45648e75) +2025-10-29 16:40:18 [main] DEBUG o.h.t.d.sql.spi.DdlTypeRegistry - addDescriptor(6, org.hibernate.type.descriptor.sql.internal.CapacityDependentDdlType@e344f14) replaced previous registration(org.hibernate.type.descriptor.sql.internal.DdlTypeImpl@2d117280) +2025-10-29 16:40:18 [main] DEBUG o.h.t.d.jdbc.spi.JdbcTypeRegistry - addDescriptor(2004, BlobTypeDescriptor(BLOB_BINDING)) replaced previous registration(BlobTypeDescriptor(DEFAULT)) +2025-10-29 16:40:18 [main] DEBUG o.h.t.d.jdbc.spi.JdbcTypeRegistry - addDescriptor(2005, ClobTypeDescriptor(CLOB_BINDING)) replaced previous registration(ClobTypeDescriptor(DEFAULT)) +2025-10-29 16:40:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration JAVA_OBJECT -> org.hibernate.type.JavaObjectType@2f3a0f37 +2025-10-29 16:40:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Object -> org.hibernate.type.JavaObjectType@2f3a0f37 +2025-10-29 16:40:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Type registration key [java.lang.Object] overrode previous entry : `org.hibernate.type.JavaObjectType@43719e98` +2025-10-29 16:40:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration org.hibernate.type.DurationType -> basicType@1(java.time.Duration,3015) +2025-10-29 16:40:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration Duration -> basicType@1(java.time.Duration,3015) +2025-10-29 16:40:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.Duration -> basicType@1(java.time.Duration,3015) +2025-10-29 16:40:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration org.hibernate.type.OffsetDateTimeType -> basicType@2(java.time.OffsetDateTime,3003) +2025-10-29 16:40:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetDateTime -> basicType@2(java.time.OffsetDateTime,3003) +2025-10-29 16:40:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.OffsetDateTime -> basicType@2(java.time.OffsetDateTime,3003) +2025-10-29 16:40:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration org.hibernate.type.ZonedDateTimeType -> basicType@3(java.time.ZonedDateTime,3003) +2025-10-29 16:40:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration ZonedDateTime -> basicType@3(java.time.ZonedDateTime,3003) +2025-10-29 16:40:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.ZonedDateTime -> basicType@3(java.time.ZonedDateTime,3003) +2025-10-29 16:40:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration org.hibernate.type.OffsetTimeType -> basicType@4(java.time.OffsetTime,3007) +2025-10-29 16:40:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetTime -> basicType@4(java.time.OffsetTime,3007) +2025-10-29 16:40:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.OffsetTime -> basicType@4(java.time.OffsetTime,3007) +2025-10-29 16:40:18 [main] DEBUG o.h.type.spi.TypeConfiguration$Scope - Scoping TypeConfiguration [org.hibernate.type.spi.TypeConfiguration@2a2b3aff] to MetadataBuildingContext [org.hibernate.boot.internal.MetadataBuildingContextRootImpl@4bc9451b] +2025-10-29 16:40:18 [main] WARN org.hibernate.orm.deprecation - HHH90000021: Encountered deprecated setting [javax.persistence.schema-generation.database.action], use [jakarta.persistence.schema-generation.database.action] instead +2025-10-29 16:40:18 [main] WARN org.hibernate.orm.deprecation - HHH90000021: Encountered deprecated setting [javax.persistence.schema-generation.scripts.action], use [jakarta.persistence.schema-generation.scripts.action] instead +2025-10-29 16:40:18 [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-29 16:40:18 [main] DEBUG o.h.type.spi.TypeConfiguration$Scope - Scoping TypeConfiguration [org.hibernate.type.spi.TypeConfiguration@2a2b3aff] to SessionFactoryImplementor [org.hibernate.internal.SessionFactoryImpl@555454c7] +2025-10-29 16:40:18 [main] WARN org.hibernate.orm.deprecation - HHH90000021: Encountered deprecated setting [javax.persistence.schema-generation.database.action], use [jakarta.persistence.schema-generation.database.action] instead +2025-10-29 16:40:18 [main] WARN org.hibernate.orm.deprecation - HHH90000021: Encountered deprecated setting [javax.persistence.schema-generation.scripts.action], use [jakarta.persistence.schema-generation.scripts.action] instead +2025-10-29 16:40:18 [main] TRACE o.h.type.spi.TypeConfiguration$Scope - Handling #sessionFactoryCreated from [org.hibernate.internal.SessionFactoryImpl@555454c7] for TypeConfiguration +2025-10-29 16:40:18 [main] INFO o.s.o.j.LocalContainerEntityManagerFactoryBean - Initialized JPA EntityManagerFactory for persistence unit 'default' +2025-10-29 16:40:18 [main] INFO o.s.d.j.r.query.QueryEnhancerFactory - Hibernate is in classpath; If applicable, HQL parser will be used. +2025-10-29 16:40:19 [main] INFO c.u.h.m.infra.cache.CacheConfig - ObjectMapper 설정 완료 +2025-10-29 16:40:19 [main] INFO c.u.h.m.infra.config.RedisConfig - Redis Lettuce Client 설정 완료 - Standalone 모드 (Master-Replica 자동 탐색 비활성화) +2025-10-29 16:40:19 [main] INFO c.u.h.m.infra.config.RedisConfig - LettuceConnectionFactory 설정 완료 - Host: 20.249.177.114:6379, Database: 1 +2025-10-29 16:40:19 [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-29 16:40:19 [main] INFO c.u.h.m.infra.config.RedisConfig - RedisTemplate 설정 완료 +2025-10-29 16:40:19 [main] INFO c.u.h.m.infra.config.EventHubConfig - Initializing Azure EventHub configuration with hub name: hgzero-eventhub-name +2025-10-29 16:40:19 [main] INFO c.u.h.m.infra.config.EventHubConfig - Creating EventHub producer for hub: hgzero-eventhub-name +2025-10-29 16:40:19 [main] INFO c.a.m.e.EventHubClientBuilder - {"az.sdk.message":"Emitting a single connection.","connectionId":"MF_1b7a37_1761723619589"} +2025-10-29 16:40:19 [main] INFO c.a.m.e.i.EventHubConnectionProcessor - {"az.sdk.message":"Setting next AMQP channel.","entityPath":"hgzero-eventhub-name"} +2025-10-29 16:40:19 [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-29 16:40:19 [main] WARN o.s.b.a.s.s.UserDetailsServiceAutoConfiguration - + +Using generated security password: 3fa9c460-2277-4658-88c1-59a30b215531 + +This generated password is for development use only. Your security configuration must be updated before running your application in production. + +2025-10-29 16:40:19 [main] INFO o.s.s.c.a.a.c.InitializeUserDetailsBeanManagerConfigurer$InitializeUserDetailsManagerConfigurer - Global AuthenticationManager configured with UserDetailsService bean with name inMemoryUserDetailsManager +2025-10-29 16:40:19 [main] INFO c.u.h.m.infra.config.WebSocketConfig - WebSocket 핸들러 등록 완료 - endpoint: /ws/minutes/{minutesId} +2025-10-29 16:40:20 [main] INFO o.s.b.a.e.web.EndpointLinksResolver - Exposing 3 endpoints beneath base path '/actuator' +2025-10-29 16:40:20 [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-29 16:40:20 [main] WARN o.s.b.a.t.ThymeleafAutoConfiguration$DefaultTemplateResolverConfiguration - Cannot find template location: classpath:/templates/ (please add some templates, check your Thymeleaf configuration, or set spring.thymeleaf.check-template-location=false) +2025-10-29 16:40:20 [main] INFO o.s.b.w.e.tomcat.TomcatWebServer - Tomcat started on port 8082 (http) with context path '/' +2025-10-29 16:40:20 [main] INFO c.u.h.meeting.MeetingApplication - Started MeetingApplication in 4.484 seconds (process running for 4.669) +2025-10-29 16:41:07 [http-nio-8082-exec-1] INFO o.a.c.c.C.[Tomcat].[localhost].[/] - Initializing Spring DispatcherServlet 'dispatcherServlet' +2025-10-29 16:41:07 [http-nio-8082-exec-1] INFO o.s.web.servlet.DispatcherServlet - Initializing Servlet 'dispatcherServlet' +2025-10-29 16:41:07 [http-nio-8082-exec-1] INFO o.s.web.servlet.DispatcherServlet - Completed initialization in 4 ms +2025-10-29 16:41:07 [http-nio-8082-exec-1] DEBUG o.s.security.web.FilterChainProxy - Securing GET /api/meetings/minutes/minutes-user2 +2025-10-29 16:41:07 [http-nio-8082-exec-1] DEBUG c.u.h.m.i.c.j.JwtAuthenticationFilter - 헤더 기반 인증된 사용자: user-002 (user-002) +2025-10-29 16:41:07 [http-nio-8082-exec-1] DEBUG o.s.security.web.FilterChainProxy - Secured GET /api/meetings/minutes/minutes-user2 +2025-10-29 16:41:07 [http-nio-8082-exec-1] INFO c.u.hgzero.common.aop.LoggingAspect - [Controller] com.unicorn.hgzero.meeting.infra.controller.MinutesController.getMinutesDetail 호출 - 파라미터: [user-002, user-002, minutes-user2] +2025-10-29 16:41:07 [http-nio-8082-exec-1] INFO c.u.h.m.i.c.MinutesController - 회의록 상세 조회 요청 - userId: user-002, minutesId: minutes-user2 +2025-10-29 16:41:07 [http-nio-8082-exec-1] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting... +2025-10-29 16:41:07 [http-nio-8082-exec-1] INFO com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Added connection org.postgresql.jdbc.PgConnection@619cf5ca +2025-10-29 16:41:07 [http-nio-8082-exec-1] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed. +2025-10-29 16:41:07 [http-nio-8082-exec-1] DEBUG c.u.h.m.biz.service.MinutesService - Getting minutes DTO by id: minutes-user2 +2025-10-29 16:41:07 [http-nio-8082-exec-1] DEBUG org.hibernate.SQL - + select + me1_0.minutes_id, + me1_0.created_at, + me1_0.created_by, + me1_0.decisions, + me1_0.finalized_at, + me1_0.finalized_by, + me1_0.meeting_id, + me1_0.status, + me1_0.title, + me1_0.updated_at, + me1_0.user_id, + me1_0.version + from + minutes me1_0 + where + me1_0.minutes_id=? +2025-10-29 16:41:07 [http-nio-8082-exec-1] DEBUG org.hibernate.SQL - + select + me1_0.meeting_id, + me1_0.created_at, + me1_0.description, + me1_0.end_time, + me1_0.ended_at, + me1_0.location, + me1_0.organizer_id, + me1_0.purpose, + 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-29 16:41:07 [http-nio-8082-exec-1] DEBUG org.hibernate.SQL - + select + p1_0.meeting_id, + p1_0.user_id, + p1_0.attended, + p1_0.created_at, + p1_0.invitation_status, + p1_0.updated_at + from + meeting_participants p1_0 + where + p1_0.meeting_id=? +2025-10-29 16:41:07 [http-nio-8082-exec-1] DEBUG org.hibernate.SQL - + /* */ select + mpe1_0.meeting_id, + mpe1_0.user_id, + mpe1_0.attended, + mpe1_0.created_at, + mpe1_0.invitation_status, + mpe1_0.updated_at + from + meeting_participants mpe1_0 + where + mpe1_0.meeting_id=? +2025-10-29 16:41:07 [http-nio-8082-exec-1] DEBUG org.hibernate.SQL - + /* */ select + count(*) + from + meeting_participants mpe1_0 + where + mpe1_0.meeting_id=? +2025-10-29 16:41:07 [http-nio-8082-exec-1] DEBUG org.hibernate.SQL - + /* SELECT + m + FROM + MinutesSectionEntity m + WHERE + m.minutesId = :minutesId + ORDER BY + m.order ASC */ select + mse1_0.id, + mse1_0.content, + mse1_0.created_at, + mse1_0.locked, + mse1_0.locked_by, + mse1_0.minutes_id, + mse1_0.order, + mse1_0.title, + mse1_0.type, + mse1_0.updated_at, + mse1_0.verified + from + minutes_sections mse1_0 + where + mse1_0.minutes_id=? + order by + mse1_0.order +2025-10-29 16:41:07 [http-nio-8082-exec-1] INFO c.u.h.m.biz.service.MinutesService - Minutes decisions 값 확인 - minutesId: minutes-user2, decisions: 결정사항 테스트으으으으 +2025-10-29 16:41:07 [http-nio-8082-exec-1] DEBUG c.u.h.m.biz.service.MeetingService - Getting meeting: meeting-123 +2025-10-29 16:41:07 [http-nio-8082-exec-1] DEBUG org.hibernate.SQL - + /* */ select + mpe1_0.meeting_id, + mpe1_0.user_id, + mpe1_0.attended, + mpe1_0.created_at, + mpe1_0.invitation_status, + mpe1_0.updated_at + from + meeting_participants mpe1_0 + where + mpe1_0.meeting_id=? +2025-10-29 16:41:07 [http-nio-8082-exec-1] DEBUG org.hibernate.SQL - + /* */ select + mpe1_0.meeting_id, + mpe1_0.user_id, + mpe1_0.attended, + mpe1_0.created_at, + mpe1_0.invitation_status, + mpe1_0.updated_at + from + meeting_participants mpe1_0 + where + mpe1_0.meeting_id=? +2025-10-29 16:41:07 [http-nio-8082-exec-1] INFO c.u.h.m.i.c.MinutesController - 참석자가 없습니다 - meetingId: meeting-123 +2025-10-29 16:41:07 [http-nio-8082-exec-1] INFO c.u.h.m.b.s.AgendaSectionService - 안건 섹션 목록 조회 - minutesId: minutes-user2 +2025-10-29 16:41:07 [http-nio-8082-exec-1] DEBUG org.hibernate.SQL - + /* */ select + ase1_0.id, + ase1_0.agenda_number, + ase1_0.agenda_title, + ase1_0.ai_summary_short, + ase1_0.created_at, + ase1_0.meeting_id, + ase1_0.minutes_id, + ase1_0.pending_items, + ase1_0.summary, + ase1_0.todos, + ase1_0.updated_at + from + agenda_sections ase1_0 + where + ase1_0.minutes_id=? + order by + ase1_0.agenda_number +2025-10-29 16:41:07 [http-nio-8082-exec-1] DEBUG org.hibernate.SQL - + /* */ select + te1_0.todo_id, + te1_0.assignee_id, + te1_0.completed_at, + te1_0.created_at, + te1_0.description, + te1_0.due_date, + te1_0.meeting_id, + te1_0.minutes_id, + te1_0.priority, + te1_0.status, + te1_0.title, + te1_0.updated_at + from + todos te1_0 + where + te1_0.minutes_id=? +2025-10-29 16:41:08 [http-nio-8082-exec-1] INFO c.u.h.m.i.c.MinutesController - Todo 조회 성공 - minutesId: minutes-user2, totalCount: 1 +2025-10-29 16:41:08 [http-nio-8082-exec-1] DEBUG c.u.h.m.biz.service.MeetingService - Getting meeting: meeting-123 +2025-10-29 16:41:08 [http-nio-8082-exec-1] DEBUG org.hibernate.SQL - + /* */ select + mpe1_0.meeting_id, + mpe1_0.user_id, + mpe1_0.attended, + mpe1_0.created_at, + mpe1_0.invitation_status, + mpe1_0.updated_at + from + meeting_participants mpe1_0 + where + mpe1_0.meeting_id=? +2025-10-29 16:41:08 [http-nio-8082-exec-1] INFO c.u.h.m.i.c.MinutesController - Dashboard decisions 값 확인 - minutesId: minutes-user2, decisions: 결정사항 테스트으으으으 +2025-10-29 16:41:08 [http-nio-8082-exec-1] DEBUG c.u.h.m.b.s.MinutesSectionService - Getting sections by minutes: minutes-user2 +2025-10-29 16:41:08 [http-nio-8082-exec-1] DEBUG org.hibernate.SQL - + /* SELECT + m + FROM + MinutesSectionEntity m + WHERE + m.minutesId = :minutesId + ORDER BY + m.order ASC */ select + mse1_0.id, + mse1_0.content, + mse1_0.created_at, + mse1_0.locked, + mse1_0.locked_by, + mse1_0.minutes_id, + mse1_0.order, + mse1_0.title, + mse1_0.type, + mse1_0.updated_at, + mse1_0.verified + from + minutes_sections mse1_0 + where + mse1_0.minutes_id=? + order by + mse1_0.order +2025-10-29 16:41:08 [http-nio-8082-exec-1] DEBUG c.u.h.m.i.gateway.AiServiceGateway - AI 분석 결과 캐시 미스, AI 서비스 호출 - minutesId: minutes-user2 +2025-10-29 16:41:08 [http-nio-8082-exec-1] ERROR c.u.h.m.i.gateway.AiServiceGateway - AI 서비스 호출 실패 - minutesId: minutes-user2, error: I/O error on POST request for "http://ai:8080/api/v1/analysis/minutes": ai +org.springframework.web.client.ResourceAccessException: I/O error on POST request for "http://ai:8080/api/v1/analysis/minutes": ai + at org.springframework.web.client.RestTemplate.createResourceAccessException(RestTemplate.java:915) + at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:895) + at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:790) + at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:672) + at com.unicorn.hgzero.meeting.infra.gateway.AiServiceGateway.requestAiAnalysis(AiServiceGateway.java:107) + at com.unicorn.hgzero.meeting.infra.gateway.AiServiceGateway.getAiAnalysis(AiServiceGateway.java:51) + at com.unicorn.hgzero.meeting.infra.controller.MinutesController.enhanceWithAiAnalysis(MinutesController.java:1103) + at com.unicorn.hgzero.meeting.infra.controller.MinutesController.getMinutesDetail(MinutesController.java:170) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:355) + at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768) + at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89) + at com.unicorn.hgzero.common.aop.LoggingAspect.logController(LoggingAspect.java:56) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:637) + at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:627) + at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:71) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768) + at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:720) + at com.unicorn.hgzero.meeting.infra.controller.MinutesController$$SpringCGLIB$$0.getMinutesDetail() + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:255) + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:188) + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:926) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:831) + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014) + at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903) + at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) + at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:108) + at org.springframework.security.web.FilterChainProxy.lambda$doFilterInternal$3(FilterChainProxy.java:231) + at org.springframework.security.web.ObservationFilterChainDecorator$FilterObservation$SimpleFilterObservation.lambda$wrap$1(ObservationFilterChainDecorator.java:479) + at org.springframework.security.web.ObservationFilterChainDecorator$AroundFilterObservation$SimpleAroundFilterObservation.lambda$wrap$1(ObservationFilterChainDecorator.java:340) + at org.springframework.security.web.ObservationFilterChainDecorator.lambda$wrapSecured$0(ObservationFilterChainDecorator.java:82) + at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:128) + at org.springframework.security.web.access.intercept.AuthorizationFilter.doFilter(AuthorizationFilter.java:100) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227) + at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137) + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:126) + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:120) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227) + at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137) + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:131) + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:85) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227) + at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137) + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:100) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227) + at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137) + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:179) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227) + at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137) + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227) + at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137) + at com.unicorn.hgzero.meeting.infra.config.jwt.JwtAuthenticationFilter.doFilterInternal(JwtAuthenticationFilter.java:60) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227) + at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137) + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:107) + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:93) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227) + at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137) + at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227) + at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137) + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90) + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227) + at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137) + at org.springframework.security.web.context.SecurityContextHolderFilter.doFilter(SecurityContextHolderFilter.java:82) + at org.springframework.security.web.context.SecurityContextHolderFilter.doFilter(SecurityContextHolderFilter.java:69) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227) + at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137) + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:62) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227) + at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137) + at org.springframework.security.web.session.DisableEncodeUrlFilter.doFilterInternal(DisableEncodeUrlFilter.java:42) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240) + at org.springframework.security.web.ObservationFilterChainDecorator$AroundFilterObservation$SimpleAroundFilterObservation.lambda$wrap$0(ObservationFilterChainDecorator.java:323) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:224) + at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137) + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:233) + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:191) + at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113) + at org.springframework.web.servlet.handler.HandlerMappingIntrospector.lambda$createCacheFilter$3(HandlerMappingIntrospector.java:195) + at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113) + at org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:74) + at org.springframework.security.config.annotation.web.configuration.WebMvcSecurityConfiguration$CompositeFilterChainProxy.doFilter(WebMvcSecurityConfiguration.java:230) + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:362) + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:278) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:113) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:483) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:384) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:905) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) + at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190) + at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) + at java.base/java.lang.Thread.run(Thread.java:1583) +Caused by: java.net.UnknownHostException: ai + at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:567) + at java.base/java.net.Socket.connect(Socket.java:751) + at java.base/sun.net.NetworkClient.doConnect(NetworkClient.java:178) + at java.base/sun.net.www.http.HttpClient.openServer(HttpClient.java:531) + at java.base/sun.net.www.http.HttpClient.openServer(HttpClient.java:636) + at java.base/sun.net.www.http.HttpClient.(HttpClient.java:282) + at java.base/sun.net.www.http.HttpClient.New(HttpClient.java:386) + at java.base/sun.net.www.http.HttpClient.New(HttpClient.java:408) + at java.base/sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1320) + at java.base/sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1253) + at java.base/sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1139) + at java.base/sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:1068) + at org.springframework.http.client.SimpleClientHttpRequest.executeInternal(SimpleClientHttpRequest.java:79) + at org.springframework.http.client.AbstractStreamingClientHttpRequest.executeInternal(AbstractStreamingClientHttpRequest.java:70) + at org.springframework.http.client.AbstractClientHttpRequest.execute(AbstractClientHttpRequest.java:66) + at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:889) + ... 158 common frames omitted +2025-10-29 16:41:08 [http-nio-8082-exec-1] DEBUG c.u.h.m.b.s.MinutesSectionService - Getting sections by minutes: minutes-user2 +2025-10-29 16:41:08 [http-nio-8082-exec-1] DEBUG org.hibernate.SQL - + /* SELECT + m + FROM + MinutesSectionEntity m + WHERE + m.minutesId = :minutesId + ORDER BY + m.order ASC */ select + mse1_0.id, + mse1_0.content, + mse1_0.created_at, + mse1_0.locked, + mse1_0.locked_by, + mse1_0.minutes_id, + mse1_0.order, + mse1_0.title, + mse1_0.type, + mse1_0.updated_at, + mse1_0.verified + from + minutes_sections mse1_0 + where + mse1_0.minutes_id=? + order by + mse1_0.order +2025-10-29 16:41:08 [http-nio-8082-exec-1] INFO c.a.c.a.i.ReactorConnection - {"az.sdk.message":"Creating and starting connection.","connectionId":"MF_1b7a37_1761723619589","hostName":"hgzero-eventhub-ns.servicebus.windows.net","port":5671} +2025-10-29 16:41:08 [http-nio-8082-exec-1] INFO c.a.c.a.i.ReactorExecutor - {"az.sdk.message":"Starting reactor.","connectionId":"MF_1b7a37_1761723619589"} +2025-10-29 16:41:08 [reactor-executor-1] INFO c.a.c.a.i.handler.ConnectionHandler - {"az.sdk.message":"onConnectionInit","connectionId":"MF_1b7a37_1761723619589","hostName":"hgzero-eventhub-ns.servicebus.windows.net","namespace":"hgzero-eventhub-ns.servicebus.windows.net"} +2025-10-29 16:41:08 [reactor-executor-1] INFO c.a.c.a.i.handler.ReactorHandler - {"az.sdk.message":"reactor.onReactorInit","connectionId":"MF_1b7a37_1761723619589"} +2025-10-29 16:41:08 [reactor-executor-1] INFO c.a.c.a.i.handler.ConnectionHandler - {"az.sdk.message":"onConnectionLocalOpen","connectionId":"MF_1b7a37_1761723619589","errorCondition":null,"errorDescription":null,"hostName":"hgzero-eventhub-ns.servicebus.windows.net"} +2025-10-29 16:41:08 [reactor-executor-1] INFO c.a.c.a.i.handler.ConnectionHandler - {"az.sdk.message":"onConnectionBound","connectionId":"MF_1b7a37_1761723619589","hostName":"hgzero-eventhub-ns.servicebus.windows.net","peerDetails":"hgzero-eventhub-ns.servicebus.windows.net:5671"} +2025-10-29 16:41:09 [reactor-executor-1] INFO c.a.c.a.i.handler.ConnectionHandler - {"az.sdk.message":"onConnectionRemoteOpen","connectionId":"MF_1b7a37_1761723619589","hostName":"hgzero-eventhub-ns.servicebus.windows.net","remoteContainer":"935b336afa904514a926dae4b51a14cc_G5"} +2025-10-29 16:41:09 [reactor-executor-1] INFO c.a.m.e.i.EventHubConnectionProcessor - {"az.sdk.message":"Channel is now active.","entityPath":"hgzero-eventhub-name"} +2025-10-29 16:41:09 [reactor-executor-1] INFO c.a.c.a.i.handler.SessionHandler - {"az.sdk.message":"onSessionRemoteOpen","connectionId":"MF_1b7a37_1761723619589","sessionName":"hgzero-eventhub-name","sessionIncCapacity":0,"sessionOutgoingWindow":2147483647} +2025-10-29 16:41:09 [reactor-executor-1] INFO c.a.c.a.i.ReactorConnection - {"az.sdk.message":"Setting CBS channel.","connectionId":"MF_1b7a37_1761723619589"} +2025-10-29 16:41:09 [reactor-executor-1] INFO c.a.c.a.i.handler.SessionHandler - {"az.sdk.message":"onSessionRemoteOpen","connectionId":"MF_1b7a37_1761723619589","sessionName":"cbs-session","sessionIncCapacity":0,"sessionOutgoingWindow":2147483647} +2025-10-29 16:41:09 [reactor-executor-1] INFO c.a.c.a.i.ReactorConnection - {"az.sdk.message":"Emitting new response channel.","connectionId":"MF_1b7a37_1761723619589","entityPath":"$cbs","linkName":"cbs"} +2025-10-29 16:41:09 [reactor-executor-1] INFO c.a.c.a.i.AmqpChannelProcessor - {"az.sdk.message":"Setting next AMQP channel.","connectionId":"MF_1b7a37_1761723619589","entityPath":"$cbs"} +2025-10-29 16:41:09 [reactor-executor-1] INFO c.a.c.a.i.AmqpChannelProcessor - {"az.sdk.message":"Next AMQP channel received.","connectionId":"MF_1b7a37_1761723619589","entityPath":"$cbs","subscriberId":"un_1e62d4_1761723669799"} +2025-10-29 16:41:09 [reactor-executor-1] INFO c.a.c.a.i.handler.SendLinkHandler - {"az.sdk.message":"onLinkRemoteOpen","connectionId":"MF_1b7a37_1761723619589","linkName":"cbs:sender","entityPath":"$cbs","remoteTarget":"Target{address='$cbs', durable=NONE, expiryPolicy=SESSION_END, timeout=0, dynamic=false, dynamicNodeProperties=null, capabilities=null}"} +2025-10-29 16:41:09 [reactor-executor-1] INFO c.a.c.a.i.AmqpChannelProcessor - {"az.sdk.message":"Channel is now active.","connectionId":"MF_1b7a37_1761723619589","entityPath":"$cbs"} +2025-10-29 16:41:09 [reactor-executor-1] INFO c.a.c.a.i.handler.ReceiveLinkHandler - {"az.sdk.message":"onLinkRemoteOpen","connectionId":"MF_1b7a37_1761723619589","entityPath":"$cbs","linkName":"cbs:receiver","remoteSource":"Source{address='$cbs', durable=NONE, expiryPolicy=SESSION_END, timeout=0, dynamic=false, dynamicNodeProperties=null, distributionMode=null, filter=null, defaultOutcome=null, outcomes=null, capabilities=null}"} +2025-10-29 16:41:09 [http-nio-8082-exec-1] ERROR c.u.h.m.i.e.p.EventHubPublisher - 이벤트 발행 실패: topic=ai-analysis, type=MINUTES_ANALYSIS_REQUEST, partitionKey=minutes-user2, error=status-code: 401, status-description: InvalidSignature: The token has an invalid signature., errorContext[NAMESPACE: hgzero-eventhub-ns.servicebus.windows.net. ERROR CONTEXT: N/A, PATH: $cbs, REFERENCE_ID: cbs:receiver, LINK_CREDIT: 0] +com.azure.core.amqp.exception.AmqpException: status-code: 401, status-description: InvalidSignature: The token has an invalid signature., errorContext[NAMESPACE: hgzero-eventhub-ns.servicebus.windows.net. ERROR CONTEXT: N/A, PATH: $cbs, REFERENCE_ID: cbs:receiver, LINK_CREDIT: 0] + at com.azure.core.amqp.implementation.ExceptionUtil.amqpResponseCodeToException(ExceptionUtil.java:114) + at com.azure.core.amqp.implementation.ClaimsBasedSecurityChannel.lambda$authorize$0(ClaimsBasedSecurityChannel.java:74) + at reactor.core.publisher.FluxHandle$HandleSubscriber.onNext(FluxHandle.java:113) + at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.complete(MonoIgnoreThen.java:294) + at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.onNext(MonoIgnoreThen.java:188) + at reactor.core.publisher.MonoCreate$DefaultMonoSink.success(MonoCreate.java:176) + at com.azure.core.amqp.implementation.RequestResponseChannel.settleMessage(RequestResponseChannel.java:411) + at com.azure.core.amqp.implementation.RequestResponseChannel.lambda$new$0(RequestResponseChannel.java:191) + at reactor.core.publisher.LambdaSubscriber.onNext(LambdaSubscriber.java:160) + at reactor.core.publisher.FluxMap$MapSubscriber.onNext(FluxMap.java:122) + at reactor.core.publisher.FluxPeek$PeekSubscriber.onNext(FluxPeek.java:200) + at reactor.core.publisher.SinkManyEmitterProcessor.drain(SinkManyEmitterProcessor.java:476) + at reactor.core.publisher.SinkManyEmitterProcessor.tryEmitNext(SinkManyEmitterProcessor.java:273) + at reactor.core.publisher.SinkManySerialized.tryEmitNext(SinkManySerialized.java:100) + at reactor.core.publisher.InternalManySink.emitNext(InternalManySink.java:27) + at com.azure.core.amqp.implementation.handler.ReceiveLinkHandler.onDelivery(ReceiveLinkHandler.java:173) + at org.apache.qpid.proton.engine.BaseHandler.handle(BaseHandler.java:185) + at org.apache.qpid.proton.engine.impl.EventImpl.dispatch(EventImpl.java:108) + at org.apache.qpid.proton.reactor.impl.ReactorImpl.dispatch(ReactorImpl.java:324) + at org.apache.qpid.proton.reactor.impl.ReactorImpl.process(ReactorImpl.java:291) + at com.azure.core.amqp.implementation.ReactorExecutor.run(ReactorExecutor.java:91) + 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:1583) + Suppressed: java.lang.Exception: #block terminated with an error + at reactor.core.publisher.BlockingSingleSubscriber.blockingGet(BlockingSingleSubscriber.java:146) + at reactor.core.publisher.Mono.block(Mono.java:1807) + at com.azure.messaging.eventhubs.EventHubProducerClient.createBatch(EventHubProducerClient.java:213) + at com.unicorn.hgzero.meeting.infra.event.publisher.EventHubPublisher.publishEvent(EventHubPublisher.java:185) + at com.unicorn.hgzero.meeting.infra.event.publisher.EventHubPublisher.publishMinutesAnalysisRequest(EventHubPublisher.java:156) + at com.unicorn.hgzero.meeting.infra.controller.MinutesController.publishAiAnalysisRequest(MinutesController.java:1260) + at com.unicorn.hgzero.meeting.infra.controller.MinutesController.enhanceWithAiAnalysis(MinutesController.java:1115) + at com.unicorn.hgzero.meeting.infra.controller.MinutesController.getMinutesDetail(MinutesController.java:170) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:355) + at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768) + at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89) + at com.unicorn.hgzero.common.aop.LoggingAspect.logController(LoggingAspect.java:56) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:637) + at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:627) + at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:71) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768) + at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:720) + at com.unicorn.hgzero.meeting.infra.controller.MinutesController$$SpringCGLIB$$0.getMinutesDetail() + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:255) + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:188) + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:926) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:831) + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014) + at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903) + at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) + at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:108) + at org.springframework.security.web.FilterChainProxy.lambda$doFilterInternal$3(FilterChainProxy.java:231) + at org.springframework.security.web.ObservationFilterChainDecorator$FilterObservation$SimpleFilterObservation.lambda$wrap$1(ObservationFilterChainDecorator.java:479) + at org.springframework.security.web.ObservationFilterChainDecorator$AroundFilterObservation$SimpleAroundFilterObservation.lambda$wrap$1(ObservationFilterChainDecorator.java:340) + at org.springframework.security.web.ObservationFilterChainDecorator.lambda$wrapSecured$0(ObservationFilterChainDecorator.java:82) + at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:128) + at org.springframework.security.web.access.intercept.AuthorizationFilter.doFilter(AuthorizationFilter.java:100) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227) + at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137) + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:126) + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:120) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227) + at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137) + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:131) + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:85) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227) + at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137) + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:100) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227) + at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137) + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:179) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227) + at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137) + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227) + at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137) + at com.unicorn.hgzero.meeting.infra.config.jwt.JwtAuthenticationFilter.doFilterInternal(JwtAuthenticationFilter.java:60) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227) + at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137) + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:107) + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:93) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227) + at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137) + at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227) + at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137) + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90) + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227) + at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137) + at org.springframework.security.web.context.SecurityContextHolderFilter.doFilter(SecurityContextHolderFilter.java:82) + at org.springframework.security.web.context.SecurityContextHolderFilter.doFilter(SecurityContextHolderFilter.java:69) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227) + at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137) + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:62) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227) + at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137) + at org.springframework.security.web.session.DisableEncodeUrlFilter.doFilterInternal(DisableEncodeUrlFilter.java:42) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240) + at org.springframework.security.web.ObservationFilterChainDecorator$AroundFilterObservation$SimpleAroundFilterObservation.lambda$wrap$0(ObservationFilterChainDecorator.java:323) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:224) + at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137) + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:233) + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:191) + at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113) + at org.springframework.web.servlet.handler.HandlerMappingIntrospector.lambda$createCacheFilter$3(HandlerMappingIntrospector.java:195) + at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113) + at org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:74) + at org.springframework.security.config.annotation.web.configuration.WebMvcSecurityConfiguration$CompositeFilterChainProxy.doFilter(WebMvcSecurityConfiguration.java:230) + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:362) + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:278) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:113) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:483) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:384) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:905) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) + at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190) + at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) + ... 1 common frames omitted +2025-10-29 16:41:09 [http-nio-8082-exec-1] ERROR c.u.h.m.i.c.MinutesController - AI 분석 요청 이벤트 발행 실패 - minutesId: minutes-user2 +java.lang.RuntimeException: 이벤트 발행 중 오류가 발생했습니다 + at com.unicorn.hgzero.meeting.infra.event.publisher.EventHubPublisher.publishEvent(EventHubPublisher.java:204) + at com.unicorn.hgzero.meeting.infra.event.publisher.EventHubPublisher.publishMinutesAnalysisRequest(EventHubPublisher.java:156) + at com.unicorn.hgzero.meeting.infra.controller.MinutesController.publishAiAnalysisRequest(MinutesController.java:1260) + at com.unicorn.hgzero.meeting.infra.controller.MinutesController.enhanceWithAiAnalysis(MinutesController.java:1115) + at com.unicorn.hgzero.meeting.infra.controller.MinutesController.getMinutesDetail(MinutesController.java:170) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:355) + at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768) + at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89) + at com.unicorn.hgzero.common.aop.LoggingAspect.logController(LoggingAspect.java:56) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:637) + at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:627) + at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:71) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768) + at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:720) + at com.unicorn.hgzero.meeting.infra.controller.MinutesController$$SpringCGLIB$$0.getMinutesDetail() + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:255) + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:188) + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:926) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:831) + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014) + at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903) + at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) + at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:108) + at org.springframework.security.web.FilterChainProxy.lambda$doFilterInternal$3(FilterChainProxy.java:231) + at org.springframework.security.web.ObservationFilterChainDecorator$FilterObservation$SimpleFilterObservation.lambda$wrap$1(ObservationFilterChainDecorator.java:479) + at org.springframework.security.web.ObservationFilterChainDecorator$AroundFilterObservation$SimpleAroundFilterObservation.lambda$wrap$1(ObservationFilterChainDecorator.java:340) + at org.springframework.security.web.ObservationFilterChainDecorator.lambda$wrapSecured$0(ObservationFilterChainDecorator.java:82) + at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:128) + at org.springframework.security.web.access.intercept.AuthorizationFilter.doFilter(AuthorizationFilter.java:100) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227) + at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137) + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:126) + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:120) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227) + at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137) + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:131) + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:85) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227) + at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137) + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:100) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227) + at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137) + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:179) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227) + at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137) + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227) + at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137) + at com.unicorn.hgzero.meeting.infra.config.jwt.JwtAuthenticationFilter.doFilterInternal(JwtAuthenticationFilter.java:60) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227) + at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137) + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:107) + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:93) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227) + at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137) + at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227) + at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137) + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90) + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227) + at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137) + at org.springframework.security.web.context.SecurityContextHolderFilter.doFilter(SecurityContextHolderFilter.java:82) + at org.springframework.security.web.context.SecurityContextHolderFilter.doFilter(SecurityContextHolderFilter.java:69) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227) + at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137) + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:62) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227) + at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137) + at org.springframework.security.web.session.DisableEncodeUrlFilter.doFilterInternal(DisableEncodeUrlFilter.java:42) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240) + at org.springframework.security.web.ObservationFilterChainDecorator$AroundFilterObservation$SimpleAroundFilterObservation.lambda$wrap$0(ObservationFilterChainDecorator.java:323) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:224) + at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137) + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:233) + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:191) + at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113) + at org.springframework.web.servlet.handler.HandlerMappingIntrospector.lambda$createCacheFilter$3(HandlerMappingIntrospector.java:195) + at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113) + at org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:74) + at org.springframework.security.config.annotation.web.configuration.WebMvcSecurityConfiguration$CompositeFilterChainProxy.doFilter(WebMvcSecurityConfiguration.java:230) + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:362) + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:278) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:113) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:483) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:384) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:905) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) + at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190) + at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) + at java.base/java.lang.Thread.run(Thread.java:1583) +Caused by: com.azure.core.amqp.exception.AmqpException: status-code: 401, status-description: InvalidSignature: The token has an invalid signature., errorContext[NAMESPACE: hgzero-eventhub-ns.servicebus.windows.net. ERROR CONTEXT: N/A, PATH: $cbs, REFERENCE_ID: cbs:receiver, LINK_CREDIT: 0] + at com.azure.core.amqp.implementation.ExceptionUtil.amqpResponseCodeToException(ExceptionUtil.java:114) + at com.azure.core.amqp.implementation.ClaimsBasedSecurityChannel.lambda$authorize$0(ClaimsBasedSecurityChannel.java:74) + at reactor.core.publisher.FluxHandle$HandleSubscriber.onNext(FluxHandle.java:113) + at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.complete(MonoIgnoreThen.java:294) + at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.onNext(MonoIgnoreThen.java:188) + at reactor.core.publisher.MonoCreate$DefaultMonoSink.success(MonoCreate.java:176) + at com.azure.core.amqp.implementation.RequestResponseChannel.settleMessage(RequestResponseChannel.java:411) + at com.azure.core.amqp.implementation.RequestResponseChannel.lambda$new$0(RequestResponseChannel.java:191) + at reactor.core.publisher.LambdaSubscriber.onNext(LambdaSubscriber.java:160) + at reactor.core.publisher.FluxMap$MapSubscriber.onNext(FluxMap.java:122) + at reactor.core.publisher.FluxPeek$PeekSubscriber.onNext(FluxPeek.java:200) + at reactor.core.publisher.SinkManyEmitterProcessor.drain(SinkManyEmitterProcessor.java:476) + at reactor.core.publisher.SinkManyEmitterProcessor.tryEmitNext(SinkManyEmitterProcessor.java:273) + at reactor.core.publisher.SinkManySerialized.tryEmitNext(SinkManySerialized.java:100) + at reactor.core.publisher.InternalManySink.emitNext(InternalManySink.java:27) + at com.azure.core.amqp.implementation.handler.ReceiveLinkHandler.onDelivery(ReceiveLinkHandler.java:173) + at org.apache.qpid.proton.engine.BaseHandler.handle(BaseHandler.java:185) + at org.apache.qpid.proton.engine.impl.EventImpl.dispatch(EventImpl.java:108) + at org.apache.qpid.proton.reactor.impl.ReactorImpl.dispatch(ReactorImpl.java:324) + at org.apache.qpid.proton.reactor.impl.ReactorImpl.process(ReactorImpl.java:291) + at com.azure.core.amqp.implementation.ReactorExecutor.run(ReactorExecutor.java:91) + 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) + ... 1 common frames omitted + Suppressed: java.lang.Exception: #block terminated with an error + at reactor.core.publisher.BlockingSingleSubscriber.blockingGet(BlockingSingleSubscriber.java:146) + at reactor.core.publisher.Mono.block(Mono.java:1807) + at com.azure.messaging.eventhubs.EventHubProducerClient.createBatch(EventHubProducerClient.java:213) + at com.unicorn.hgzero.meeting.infra.event.publisher.EventHubPublisher.publishEvent(EventHubPublisher.java:185) + at com.unicorn.hgzero.meeting.infra.event.publisher.EventHubPublisher.publishMinutesAnalysisRequest(EventHubPublisher.java:156) + at com.unicorn.hgzero.meeting.infra.controller.MinutesController.publishAiAnalysisRequest(MinutesController.java:1260) + at com.unicorn.hgzero.meeting.infra.controller.MinutesController.enhanceWithAiAnalysis(MinutesController.java:1115) + at com.unicorn.hgzero.meeting.infra.controller.MinutesController.getMinutesDetail(MinutesController.java:170) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:355) + at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768) + at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89) + at com.unicorn.hgzero.common.aop.LoggingAspect.logController(LoggingAspect.java:56) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:637) + at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:627) + at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:71) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768) + at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:720) + at com.unicorn.hgzero.meeting.infra.controller.MinutesController$$SpringCGLIB$$0.getMinutesDetail() + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:255) + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:188) + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:926) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:831) + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014) + at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903) + at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) + at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:108) + at org.springframework.security.web.FilterChainProxy.lambda$doFilterInternal$3(FilterChainProxy.java:231) + at org.springframework.security.web.ObservationFilterChainDecorator$FilterObservation$SimpleFilterObservation.lambda$wrap$1(ObservationFilterChainDecorator.java:479) + at org.springframework.security.web.ObservationFilterChainDecorator$AroundFilterObservation$SimpleAroundFilterObservation.lambda$wrap$1(ObservationFilterChainDecorator.java:340) + at org.springframework.security.web.ObservationFilterChainDecorator.lambda$wrapSecured$0(ObservationFilterChainDecorator.java:82) + at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:128) + at org.springframework.security.web.access.intercept.AuthorizationFilter.doFilter(AuthorizationFilter.java:100) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227) + at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137) + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:126) + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:120) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227) + at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137) + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:131) + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:85) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227) + at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137) + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:100) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227) + at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137) + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:179) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227) + at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137) + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227) + at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137) + at com.unicorn.hgzero.meeting.infra.config.jwt.JwtAuthenticationFilter.doFilterInternal(JwtAuthenticationFilter.java:60) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227) + at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137) + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:107) + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:93) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227) + at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137) + at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227) + at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137) + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90) + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227) + at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137) + at org.springframework.security.web.context.SecurityContextHolderFilter.doFilter(SecurityContextHolderFilter.java:82) + at org.springframework.security.web.context.SecurityContextHolderFilter.doFilter(SecurityContextHolderFilter.java:69) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227) + at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137) + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:62) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227) + at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137) + at org.springframework.security.web.session.DisableEncodeUrlFilter.doFilterInternal(DisableEncodeUrlFilter.java:42) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240) + at org.springframework.security.web.ObservationFilterChainDecorator$AroundFilterObservation$SimpleAroundFilterObservation.lambda$wrap$0(ObservationFilterChainDecorator.java:323) + at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:224) + at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137) + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:233) + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:191) + at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113) + at org.springframework.web.servlet.handler.HandlerMappingIntrospector.lambda$createCacheFilter$3(HandlerMappingIntrospector.java:195) + at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113) + at org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:74) + at org.springframework.security.config.annotation.web.configuration.WebMvcSecurityConfiguration$CompositeFilterChainProxy.doFilter(WebMvcSecurityConfiguration.java:230) + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:362) + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:278) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:113) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:483) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:384) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:905) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) + at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190) + at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) + ... 1 common frames omitted +2025-10-29 16:41:09 [http-nio-8082-exec-1] DEBUG c.u.h.m.i.c.MinutesController - AI 분석 요청 이벤트 발행 완료 - minutesId: minutes-user2 +2025-10-29 16:41:09 [http-nio-8082-exec-1] DEBUG c.u.h.m.infra.cache.CacheService - 회의록 상세 캐시 저장 - minutesId: minutes-user2 +2025-10-29 16:41:09 [http-nio-8082-exec-1] INFO c.u.h.m.i.c.MinutesController - 회의록 상세 조회 성공 - minutesId: minutes-user2 +2025-10-29 16:41:09 [http-nio-8082-exec-1] INFO c.u.hgzero.common.aop.LoggingAspect - [Controller] com.unicorn.hgzero.meeting.infra.controller.MinutesController.getMinutesDetail 완료 - 실행시간: 2790ms +2025-10-29 16:42:09 [reactor-executor-1] INFO c.a.c.a.i.handler.SessionHandler - {"az.sdk.message":"onSessionRemoteClose","connectionId":"MF_1b7a37_1761723619589","errorCondition":"amqp:connection:forced","errorDescription":"The connection was closed by container '935b336afa904514a926dae4b51a14cc_G5' because it did not have any active links in the past 60000 milliseconds. TrackingId:935b336afa904514a926dae4b51a14cc_G5, SystemTracker:gateway5, Timestamp:2025-10-29T07:42:09","sessionName":"hgzero-eventhub-name"} +2025-10-29 16:42:09 [reactor-executor-1] INFO c.a.c.a.i.handler.SessionHandler - {"az.sdk.message":"onSessionRemoteClose closing a local session.","connectionId":"MF_1b7a37_1761723619589","errorCondition":"amqp:connection:forced","errorDescription":"The connection was closed by container '935b336afa904514a926dae4b51a14cc_G5' because it did not have any active links in the past 60000 milliseconds. TrackingId:935b336afa904514a926dae4b51a14cc_G5, SystemTracker:gateway5, Timestamp:2025-10-29T07:42:09","sessionName":"hgzero-eventhub-name"} +2025-10-29 16:42:09 [reactor-executor-1] ERROR reactor.core.publisher.Operators - Operator called default onErrorDropped +reactor.core.Exceptions$ErrorCallbackNotImplemented: com.azure.core.amqp.exception.AmqpException: onSessionRemoteClose connectionId[MF_1b7a37_1761723619589], entityName[hgzero-eventhub-name] condition[Error{condition=amqp:connection:forced, description='The connection was closed by container '935b336afa904514a926dae4b51a14cc_G5' because it did not have any active links in the past 60000 milliseconds. TrackingId:935b336afa904514a926dae4b51a14cc_G5, SystemTracker:gateway5, Timestamp:2025-10-29T07:42:09', info=null}], errorContext[NAMESPACE: hgzero-eventhub-ns.servicebus.windows.net. ERROR CONTEXT: N/A, PATH: hgzero-eventhub-name] +Caused by: com.azure.core.amqp.exception.AmqpException: onSessionRemoteClose connectionId[MF_1b7a37_1761723619589], entityName[hgzero-eventhub-name] condition[Error{condition=amqp:connection:forced, description='The connection was closed by container '935b336afa904514a926dae4b51a14cc_G5' because it did not have any active links in the past 60000 milliseconds. TrackingId:935b336afa904514a926dae4b51a14cc_G5, SystemTracker:gateway5, Timestamp:2025-10-29T07:42:09', info=null}], errorContext[NAMESPACE: hgzero-eventhub-ns.servicebus.windows.net. ERROR CONTEXT: N/A, PATH: hgzero-eventhub-name] + at com.azure.core.amqp.implementation.ExceptionUtil.toException(ExceptionUtil.java:85) + at com.azure.core.amqp.implementation.handler.SessionHandler.onSessionRemoteClose(SessionHandler.java:136) + at org.apache.qpid.proton.engine.BaseHandler.handle(BaseHandler.java:152) + at org.apache.qpid.proton.engine.impl.EventImpl.dispatch(EventImpl.java:108) + at org.apache.qpid.proton.reactor.impl.ReactorImpl.dispatch(ReactorImpl.java:324) + at org.apache.qpid.proton.reactor.impl.ReactorImpl.process(ReactorImpl.java:291) + at com.azure.core.amqp.implementation.ReactorExecutor.run(ReactorExecutor.java:91) + 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:1583) +2025-10-29 16:42:09 [reactor-executor-1] INFO c.a.c.a.i.ReactorConnection - {"az.sdk.message":"Error occurred. Removing and disposing session","exception":"onSessionRemoteClose connectionId[MF_1b7a37_1761723619589], entityName[hgzero-eventhub-name] condition[Error{condition=amqp:connection:forced, description='The connection was closed by container '935b336afa904514a926dae4b51a14cc_G5' because it did not have any active links in the past 60000 milliseconds. TrackingId:935b336afa904514a926dae4b51a14cc_G5, SystemTracker:gateway5, Timestamp:2025-10-29T07:42:09', info=null}], errorContext[NAMESPACE: hgzero-eventhub-ns.servicebus.windows.net. ERROR CONTEXT: N/A, PATH: hgzero-eventhub-name]","connectionId":"MF_1b7a37_1761723619589","sessionName":"hgzero-eventhub-name"} +2025-10-29 16:42:09 [reactor-executor-1] INFO c.a.c.a.i.handler.SendLinkHandler - {"az.sdk.message":"onLinkRemoteClose","connectionId":"MF_1b7a37_1761723619589","errorCondition":"amqp:connection:forced","errorDescription":"The connection was closed by container '935b336afa904514a926dae4b51a14cc_G5' because it did not have any active links in the past 60000 milliseconds. TrackingId:935b336afa904514a926dae4b51a14cc_G5, SystemTracker:gateway5, Timestamp:2025-10-29T07:42:09","linkName":"cbs:sender","entityPath":"$cbs"} +2025-10-29 16:42:09 [reactor-executor-1] INFO c.a.c.a.i.handler.SendLinkHandler - {"az.sdk.message":"Local link state is not closed.","connectionId":"MF_1b7a37_1761723619589","linkName":"cbs:sender","entityPath":"$cbs","state":"ACTIVE"} +2025-10-29 16:42:09 [reactor-executor-1] WARN c.a.c.a.i.RequestResponseChannel - {"az.sdk.message":"Error in SendLinkHandler. Disposing unconfirmed sends.","exception":"The connection was closed by container '935b336afa904514a926dae4b51a14cc_G5' because it did not have any active links in the past 60000 milliseconds. TrackingId:935b336afa904514a926dae4b51a14cc_G5, SystemTracker:gateway5, Timestamp:2025-10-29T07:42:09, errorContext[NAMESPACE: hgzero-eventhub-ns.servicebus.windows.net. ERROR CONTEXT: N/A, PATH: $cbs, REFERENCE_ID: cbs:sender, LINK_CREDIT: 99]","connectionId":"MF_1b7a37_1761723619589","linkName":"cbs"} +2025-10-29 16:42:09 [reactor-executor-1] INFO c.a.c.a.i.AmqpChannelProcessor - {"az.sdk.message":"Transient error occurred. Retrying.","exception":"The connection was closed by container '935b336afa904514a926dae4b51a14cc_G5' because it did not have any active links in the past 60000 milliseconds. TrackingId:935b336afa904514a926dae4b51a14cc_G5, SystemTracker:gateway5, Timestamp:2025-10-29T07:42:09, errorContext[NAMESPACE: hgzero-eventhub-ns.servicebus.windows.net. ERROR CONTEXT: N/A, PATH: $cbs, REFERENCE_ID: cbs:sender, LINK_CREDIT: 99]","connectionId":"MF_1b7a37_1761723619589","entityPath":"$cbs","tryCount":0,"interval_ms":4511} +2025-10-29 16:42:09 [reactor-executor-1] INFO c.a.c.a.i.handler.ReceiveLinkHandler - {"az.sdk.message":"onLinkRemoteClose","connectionId":"MF_1b7a37_1761723619589","errorCondition":"amqp:connection:forced","errorDescription":"The connection was closed by container '935b336afa904514a926dae4b51a14cc_G5' because it did not have any active links in the past 60000 milliseconds. TrackingId:935b336afa904514a926dae4b51a14cc_G5, SystemTracker:gateway5, Timestamp:2025-10-29T07:42:09","linkName":"cbs:receiver","entityPath":"$cbs"} +2025-10-29 16:42:09 [reactor-executor-1] INFO c.a.c.a.i.handler.ReceiveLinkHandler - {"az.sdk.message":"Local link state is not closed.","connectionId":"MF_1b7a37_1761723619589","linkName":"cbs:receiver","entityPath":"$cbs","state":"ACTIVE"} +2025-10-29 16:42:09 [reactor-executor-1] INFO c.a.c.a.i.handler.SessionHandler - {"az.sdk.message":"onSessionRemoteClose","connectionId":"MF_1b7a37_1761723619589","errorCondition":"amqp:connection:forced","errorDescription":"The connection was closed by container '935b336afa904514a926dae4b51a14cc_G5' because it did not have any active links in the past 60000 milliseconds. TrackingId:935b336afa904514a926dae4b51a14cc_G5, SystemTracker:gateway5, Timestamp:2025-10-29T07:42:09","sessionName":"cbs-session"} +2025-10-29 16:42:09 [reactor-executor-1] INFO c.a.c.a.i.handler.SessionHandler - {"az.sdk.message":"onSessionRemoteClose closing a local session.","connectionId":"MF_1b7a37_1761723619589","errorCondition":"amqp:connection:forced","errorDescription":"The connection was closed by container '935b336afa904514a926dae4b51a14cc_G5' because it did not have any active links in the past 60000 milliseconds. TrackingId:935b336afa904514a926dae4b51a14cc_G5, SystemTracker:gateway5, Timestamp:2025-10-29T07:42:09","sessionName":"cbs-session"} +2025-10-29 16:42:09 [reactor-executor-1] ERROR reactor.core.publisher.Operators - Operator called default onErrorDropped +reactor.core.Exceptions$ErrorCallbackNotImplemented: com.azure.core.amqp.exception.AmqpException: onSessionRemoteClose connectionId[MF_1b7a37_1761723619589], entityName[cbs-session] condition[Error{condition=amqp:connection:forced, description='The connection was closed by container '935b336afa904514a926dae4b51a14cc_G5' because it did not have any active links in the past 60000 milliseconds. TrackingId:935b336afa904514a926dae4b51a14cc_G5, SystemTracker:gateway5, Timestamp:2025-10-29T07:42:09', info=null}], errorContext[NAMESPACE: hgzero-eventhub-ns.servicebus.windows.net. ERROR CONTEXT: N/A, PATH: cbs-session] +Caused by: com.azure.core.amqp.exception.AmqpException: onSessionRemoteClose connectionId[MF_1b7a37_1761723619589], entityName[cbs-session] condition[Error{condition=amqp:connection:forced, description='The connection was closed by container '935b336afa904514a926dae4b51a14cc_G5' because it did not have any active links in the past 60000 milliseconds. TrackingId:935b336afa904514a926dae4b51a14cc_G5, SystemTracker:gateway5, Timestamp:2025-10-29T07:42:09', info=null}], errorContext[NAMESPACE: hgzero-eventhub-ns.servicebus.windows.net. ERROR CONTEXT: N/A, PATH: cbs-session] + at com.azure.core.amqp.implementation.ExceptionUtil.toException(ExceptionUtil.java:85) + at com.azure.core.amqp.implementation.handler.SessionHandler.onSessionRemoteClose(SessionHandler.java:136) + at org.apache.qpid.proton.engine.BaseHandler.handle(BaseHandler.java:152) + at org.apache.qpid.proton.engine.impl.EventImpl.dispatch(EventImpl.java:108) + at org.apache.qpid.proton.reactor.impl.ReactorImpl.dispatch(ReactorImpl.java:324) + at org.apache.qpid.proton.reactor.impl.ReactorImpl.process(ReactorImpl.java:291) + at com.azure.core.amqp.implementation.ReactorExecutor.run(ReactorExecutor.java:91) + 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:1583) +2025-10-29 16:42:09 [reactor-executor-1] INFO c.a.c.a.i.ReactorConnection - {"az.sdk.message":"Error occurred. Removing and disposing session","exception":"onSessionRemoteClose connectionId[MF_1b7a37_1761723619589], entityName[cbs-session] condition[Error{condition=amqp:connection:forced, description='The connection was closed by container '935b336afa904514a926dae4b51a14cc_G5' because it did not have any active links in the past 60000 milliseconds. TrackingId:935b336afa904514a926dae4b51a14cc_G5, SystemTracker:gateway5, Timestamp:2025-10-29T07:42:09', info=null}], errorContext[NAMESPACE: hgzero-eventhub-ns.servicebus.windows.net. ERROR CONTEXT: N/A, PATH: cbs-session]","connectionId":"MF_1b7a37_1761723619589","sessionName":"cbs-session"} +2025-10-29 16:42:09 [reactor-executor-1] INFO c.a.c.a.i.handler.ConnectionHandler - {"az.sdk.message":"onConnectionRemoteClose","connectionId":"MF_1b7a37_1761723619589","errorCondition":"amqp:connection:forced","errorDescription":"The connection was closed by container '935b336afa904514a926dae4b51a14cc_G5' because it did not have any active links in the past 60000 milliseconds. TrackingId:935b336afa904514a926dae4b51a14cc_G5, SystemTracker:gateway5, Timestamp:2025-10-29T07:42:09","hostName":"hgzero-eventhub-ns.servicebus.windows.net"} +2025-10-29 16:42:09 [reactor-executor-1] INFO c.a.c.a.i.handler.ConnectionHandler - {"az.sdk.message":"onConnectionLocalClose","connectionId":"MF_1b7a37_1761723619589","errorCondition":null,"errorDescription":null,"hostName":"hgzero-eventhub-ns.servicebus.windows.net"} +2025-10-29 16:42:09 [reactor-executor-1] INFO c.a.c.a.i.handler.ConnectionHandler - {"az.sdk.message":"onConnectionUnbound","connectionId":"MF_1b7a37_1761723619589","hostName":"hgzero-eventhub-ns.servicebus.windows.net","state":"CLOSED","remoteState":"CLOSED"} +2025-10-29 16:42:09 [reactor-executor-1] INFO c.a.c.a.i.ReactorConnection - {"az.sdk.message":"Disposing of ReactorConnection.","connectionId":"MF_1b7a37_1761723619589","isTransient":false,"isInitiatedByClient":false,"shutdownMessage":"Connection handler closed."} +2025-10-29 16:42:09 [reactor-executor-1] INFO c.a.m.e.i.EventHubConnectionProcessor - {"az.sdk.message":"Channel is closed. Requesting upstream.","entityPath":"hgzero-eventhub-name"} +2025-10-29 16:42:09 [reactor-executor-1] INFO c.a.m.e.i.EventHubConnectionProcessor - {"az.sdk.message":"Connection not requested, yet. Requesting one.","entityPath":"hgzero-eventhub-name"} +2025-10-29 16:42:09 [reactor-executor-1] INFO c.a.m.e.EventHubClientBuilder - {"az.sdk.message":"Emitting a single connection.","connectionId":"MF_e1a2ac_1761723729901"} +2025-10-29 16:42:09 [reactor-executor-1] INFO c.a.m.e.i.EventHubConnectionProcessor - {"az.sdk.message":"Setting next AMQP channel.","entityPath":"hgzero-eventhub-name"} +2025-10-29 16:42:09 [reactor-executor-1] INFO c.a.c.a.i.handler.SessionHandler - {"az.sdk.message":"onSessionFinal.","connectionId":"MF_1b7a37_1761723619589","errorCondition":"amqp:connection:forced","errorDescription":"The connection was closed by container '935b336afa904514a926dae4b51a14cc_G5' because it did not have any active links in the past 60000 milliseconds. TrackingId:935b336afa904514a926dae4b51a14cc_G5, SystemTracker:gateway5, Timestamp:2025-10-29T07:42:09","sessionName":"hgzero-eventhub-name"} +2025-10-29 16:42:09 [reactor-executor-1] INFO c.a.c.a.i.handler.SendLinkHandler - {"az.sdk.message":"onLinkFinal","connectionId":"MF_1b7a37_1761723619589","linkName":"cbs:sender","entityPath":"$cbs"} +2025-10-29 16:42:09 [reactor-executor-1] INFO c.a.c.a.i.handler.ReceiveLinkHandler - {"az.sdk.message":"onLinkFinal","connectionId":"MF_1b7a37_1761723619589","linkName":"cbs:receiver","entityPath":"$cbs"} +2025-10-29 16:42:09 [reactor-executor-1] INFO c.a.c.a.i.handler.SessionHandler - {"az.sdk.message":"onSessionFinal.","connectionId":"MF_1b7a37_1761723619589","errorCondition":"amqp:connection:forced","errorDescription":"The connection was closed by container '935b336afa904514a926dae4b51a14cc_G5' because it did not have any active links in the past 60000 milliseconds. TrackingId:935b336afa904514a926dae4b51a14cc_G5, SystemTracker:gateway5, Timestamp:2025-10-29T07:42:09","sessionName":"cbs-session"} +2025-10-29 16:42:09 [reactor-executor-1] INFO c.a.c.a.i.handler.ConnectionHandler - {"az.sdk.message":"onConnectionFinal","connectionId":"MF_1b7a37_1761723619589","errorCondition":null,"errorDescription":null,"hostName":"hgzero-eventhub-ns.servicebus.windows.net"} +2025-10-29 16:42:14 [parallel-10] INFO c.a.c.a.i.AmqpChannelProcessor - {"az.sdk.message":"Requesting from upstream.","connectionId":"MF_1b7a37_1761723619589","entityPath":"$cbs","tryCount":0} +2025-10-29 16:42:14 [parallel-10] INFO c.a.c.a.i.AmqpChannelProcessor - {"az.sdk.message":"Connection not requested, yet. Requesting one.","connectionId":"MF_1b7a37_1761723619589","entityPath":"$cbs"} +2025-10-29 16:42:14 [parallel-10] WARN c.a.c.a.i.AmqpChannelProcessor - {"az.sdk.message":"Retry attempts exhausted or exception was not retriable.","exception":"Cannot invoke \"java.util.List.add(Object)\" because \"this._sessions\" is null","connectionId":"MF_1b7a37_1761723619589","entityPath":"$cbs","tryCount":1} +2025-10-29 16:42:14 [parallel-10] ERROR reactor.core.publisher.Operators - Operator called default onErrorDropped +reactor.core.Exceptions$ErrorCallbackNotImplemented: java.lang.NullPointerException: Cannot invoke "java.util.List.add(Object)" because "this._sessions" is null +Caused by: java.lang.NullPointerException: Cannot invoke "java.util.List.add(Object)" because "this._sessions" is null + at org.apache.qpid.proton.engine.impl.ConnectionImpl.session(ConnectionImpl.java:91) + at org.apache.qpid.proton.engine.impl.ConnectionImpl.session(ConnectionImpl.java:39) + at com.azure.core.amqp.implementation.ReactorConnection.lambda$createSession$13(ReactorConnection.java:282) + at java.base/java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1708) + at com.azure.core.amqp.implementation.ReactorConnection.lambda$createSession$14(ReactorConnection.java:279) + at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onNext(FluxMapFuseable.java:113) + at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onNext(MonoPeekTerminal.java:180) + at reactor.core.publisher.FluxHide$SuppressFuseableSubscriber.onNext(FluxHide.java:137) + at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.request(MonoIgnoreThen.java:164) + at reactor.core.publisher.FluxHide$SuppressFuseableSubscriber.request(FluxHide.java:152) + at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.request(MonoPeekTerminal.java:139) + at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.request(FluxMapFuseable.java:171) + at reactor.core.publisher.MonoFlatMap$FlatMapMain.request(MonoFlatMap.java:194) + at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.request(FluxMapFuseable.java:171) + at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.request(FluxMapFuseable.java:171) + at reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.request(FluxPeekFuseable.java:144) + at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.request(Operators.java:2331) + at com.azure.core.amqp.implementation.AmqpChannelProcessor.requestUpstream(AmqpChannelProcessor.java:317) + at com.azure.core.amqp.implementation.AmqpChannelProcessor.lambda$onError$4(AmqpChannelProcessor.java:213) + at reactor.core.publisher.LambdaMonoSubscriber.onNext(LambdaMonoSubscriber.java:171) + at reactor.core.publisher.MonoDelay$MonoDelayRunnable.propagateDelay(MonoDelay.java:270) + at reactor.core.publisher.MonoDelay$MonoDelayRunnable.run(MonoDelay.java:285) + 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:1583) +2025-10-29 16:42:14 [parallel-10] INFO c.a.c.a.i.AmqpChannelProcessor - {"az.sdk.message":"Error in AMQP channel processor.","connectionId":"MF_1b7a37_1761723619589","entityPath":"$cbs","subscriberId":"un_3e7cb5_1761723729899"} +2025-10-29 16:42:46 [http-nio-8082-exec-3] DEBUG o.s.security.web.FilterChainProxy - Securing PUT /api/meetings/minutes/minutes-user2/agenda-sections +2025-10-29 16:42:46 [http-nio-8082-exec-3] DEBUG c.u.h.m.i.c.j.JwtAuthenticationFilter - 헤더 기반 인증된 사용자: user-002 (user-002) +2025-10-29 16:42:46 [http-nio-8082-exec-3] DEBUG o.s.security.web.FilterChainProxy - Secured PUT /api/meetings/minutes/minutes-user2/agenda-sections +2025-10-29 16:42:46 [http-nio-8082-exec-3] INFO c.u.hgzero.common.aop.LoggingAspect - [Controller] com.unicorn.hgzero.meeting.infra.controller.MinutesController.updateAgendaSections 호출 - 파라미터: [user-002, user-002, minutes-user2, com.unicorn.hgzero.meeting.infra.dto.request.UpdateAgendaSectionsRequest@7d37ec1b] +2025-10-29 16:42:46 [http-nio-8082-exec-3] INFO c.u.h.m.i.c.MinutesController - [API] 회의록 안건별 수정 요청 - userId: user-002, minutesId: minutes-user2, agendaCount: 1 +2025-10-29 16:42:46 [http-nio-8082-exec-3] INFO c.u.h.m.i.c.MinutesController - 회의록 수정 권한 검증 스킵 - 모든 사용자 수정 가능 +2025-10-29 16:42:46 [http-nio-8082-exec-3] INFO c.u.h.m.b.s.AgendaSectionService - 안건 섹션 일괄 수정 - 개수: 1 +2025-10-29 16:42:46 [http-nio-8082-exec-3] INFO c.u.h.m.b.s.AgendaSectionService - 안건 섹션 요약 수정 - agendaId: 1, summary length: 58 +2025-10-29 16:42:46 [http-nio-8082-exec-3] DEBUG org.hibernate.SQL - + select + ase1_0.id, + ase1_0.agenda_number, + ase1_0.agenda_title, + ase1_0.ai_summary_short, + ase1_0.created_at, + ase1_0.meeting_id, + ase1_0.minutes_id, + ase1_0.pending_items, + ase1_0.summary, + ase1_0.todos, + ase1_0.updated_at + from + agenda_sections ase1_0 + where + ase1_0.id=? +2025-10-29 16:42:46 [http-nio-8082-exec-3] DEBUG org.hibernate.SQL - + /* dynamic native SQL query */ UPDATE + agenda_sections + SET + summary = ?, + updated_at = CURRENT_TIMESTAMP + WHERE + id = ? +2025-10-29 16:42:46 [http-nio-8082-exec-3] INFO c.u.h.m.b.s.AgendaSectionService - 안건 섹션 요약 수정 완료 - agendaId: 1 +2025-10-29 16:42:46 [http-nio-8082-exec-3] INFO c.u.h.m.b.s.AgendaSectionService - 안건 섹션 일괄 수정 완료 - 개수: 1 +2025-10-29 16:42:46 [http-nio-8082-exec-3] DEBUG c.u.h.m.infra.cache.CacheService - 회의록 상세 캐시 삭제 - minutesId: minutes-user2 +2025-10-29 16:42:46 [http-nio-8082-exec-3] INFO c.u.h.m.i.c.MinutesController - 회의록 안건별 수정 성공 - minutesId: minutes-user2, updatedCount: 1 +2025-10-29 16:42:46 [http-nio-8082-exec-3] INFO c.u.hgzero.common.aop.LoggingAspect - [Controller] com.unicorn.hgzero.meeting.infra.controller.MinutesController.updateAgendaSections 완료 - 실행시간: 174ms +2025-10-29 16:47:24 [lettuce-nioEventLoop-6-1] INFO i.l.core.protocol.CommandHandler - null Unexpected exception during request: java.net.SocketException: Connection reset +java.net.SocketException: Connection reset + at java.base/sun.nio.ch.SocketChannelImpl.throwConnectionReset(SocketChannelImpl.java:401) + at java.base/sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:434) + at io.netty.buffer.PooledByteBuf.setBytes(PooledByteBuf.java:255) + at io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:1132) + at io.netty.channel.socket.nio.NioSocketChannel.doReadBytes(NioSocketChannel.java:356) + at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:151) + 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:997) + at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) + at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) + at java.base/java.lang.Thread.run(Thread.java:1583) +2025-10-29 16:47:24 [lettuce-eventExecutorLoop-1-2] INFO i.l.core.protocol.ConnectionWatchdog - Reconnecting, last destination was /20.249.177.114:6379 +2025-10-29 16:47:24 [lettuce-nioEventLoop-6-2] INFO i.l.c.protocol.ReconnectionHandler - Reconnected to 20.249.177.114/:6379 +2025-10-29 16:48:15 [SpringApplicationShutdownHook] INFO c.a.m.e.i.EventHubConnectionProcessor - {"az.sdk.message":"Upstream connection publisher was completed. Terminating processor.","entityPath":"hgzero-eventhub-name"} +2025-10-29 16:48:15 [SpringApplicationShutdownHook] INFO c.a.c.a.i.ReactorConnection - {"az.sdk.message":"Disposing of ReactorConnection.","connectionId":"MF_e1a2ac_1761723729901","isTransient":false,"isInitiatedByClient":true,"shutdownMessage":"Disposed by client."} +2025-10-29 16:48:15 [SpringApplicationShutdownHook] INFO c.a.m.e.i.EventHubConnectionProcessor - {"az.sdk.message":"Channel is disposed.","entityPath":"hgzero-eventhub-name"} +2025-10-29 16:48:15 [SpringApplicationShutdownHook] INFO o.s.o.j.LocalContainerEntityManagerFactoryBean - Closing JPA EntityManagerFactory for persistence unit 'default' +2025-10-29 16:48:15 [SpringApplicationShutdownHook] TRACE o.h.type.spi.TypeConfiguration$Scope - Handling #sessionFactoryClosed from [org.hibernate.internal.SessionFactoryImpl@555454c7] for TypeConfiguration +2025-10-29 16:48:15 [SpringApplicationShutdownHook] DEBUG o.h.type.spi.TypeConfiguration$Scope - Un-scoping TypeConfiguration [org.hibernate.type.spi.TypeConfiguration$Scope@6a590069] from SessionFactory [org.hibernate.internal.SessionFactoryImpl@555454c7] +2025-10-29 16:48:15 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown initiated... +2025-10-29 16:48:15 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown completed. +2025-10-29 16:48:17 [main] INFO c.u.h.meeting.MeetingApplication - Starting MeetingApplication using Java 21.0.8 with PID 97401 (/Users/adela/home/workspace/recent/HGZero/meeting/build/classes/java/main started by adela in /Users/adela/home/workspace/recent/HGZero/meeting) +2025-10-29 16:48:17 [main] DEBUG c.u.h.meeting.MeetingApplication - Running with Spring Boot v3.3.5, Spring v6.1.14 +2025-10-29 16:48:17 [main] INFO c.u.h.meeting.MeetingApplication - The following 1 profile is active: "dev" +2025-10-29 16:48:18 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Multiple Spring Data modules found, entering strict repository configuration mode +2025-10-29 16:48:18 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +2025-10-29 16:48:18 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 75 ms. Found 10 JPA repository interfaces. +2025-10-29 16:48:18 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Multiple Spring Data modules found, entering strict repository configuration mode +2025-10-29 16:48:18 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Bootstrapping Spring Data Redis repositories in DEFAULT mode. +2025-10-29 16:48:18 [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.AgendaSectionJpaRepository; 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-29 16:48:18 [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.AgendaSectionRepository; 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-29 16:48:18 [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.MeetingAnalysisJpaRepository; 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-29 16:48:18 [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-29 16:48:18 [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.MeetingParticipantJpaRepository; 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-29 16:48:18 [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-29 16:48:18 [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-29 16:48:18 [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.SessionJpaRepository; 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-29 16:48:18 [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-29 16:48:18 [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-29 16:48:18 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 28 ms. Found 0 Redis repository interfaces. +2025-10-29 16:48:18 [main] INFO o.s.b.w.e.tomcat.TomcatWebServer - Tomcat initialized with port 8082 (http) +2025-10-29 16:48:18 [main] INFO o.a.catalina.core.StandardService - Starting service [Tomcat] +2025-10-29 16:48:18 [main] INFO o.a.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/10.1.31] +2025-10-29 16:48:19 [main] INFO o.a.c.c.C.[Tomcat].[localhost].[/] - Initializing Spring embedded WebApplicationContext +2025-10-29 16:48:19 [main] INFO o.s.b.w.s.c.ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 1233 ms +2025-10-29 16:48:19 [main] INFO o.h.jpa.internal.util.LogHelper - HHH000204: Processing PersistenceUnitInfo [name: default] +2025-10-29 16:48:19 [main] INFO org.hibernate.Version - HHH000412: Hibernate ORM core version 6.5.3.Final +2025-10-29 16:48:19 [main] INFO o.h.c.i.RegionFactoryInitiator - HHH000026: Second-level cache disabled +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration boolean -> org.hibernate.type.BasicTypeReference@104cfb24 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration boolean -> org.hibernate.type.BasicTypeReference@104cfb24 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Boolean -> org.hibernate.type.BasicTypeReference@104cfb24 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration numeric_boolean -> org.hibernate.type.BasicTypeReference@5340ccb9 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration org.hibernate.type.NumericBooleanConverter -> org.hibernate.type.BasicTypeReference@5340ccb9 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration true_false -> org.hibernate.type.BasicTypeReference@2bc8caa7 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration org.hibernate.type.TrueFalseConverter -> org.hibernate.type.BasicTypeReference@2bc8caa7 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration yes_no -> org.hibernate.type.BasicTypeReference@582ea164 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration org.hibernate.type.YesNoConverter -> org.hibernate.type.BasicTypeReference@582ea164 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration byte -> org.hibernate.type.BasicTypeReference@2fccf49e +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration byte -> org.hibernate.type.BasicTypeReference@2fccf49e +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Byte -> org.hibernate.type.BasicTypeReference@2fccf49e +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration binary -> org.hibernate.type.BasicTypeReference@7abcc0da +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration byte[] -> org.hibernate.type.BasicTypeReference@7abcc0da +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration [B -> org.hibernate.type.BasicTypeReference@7abcc0da +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration binary_wrapper -> org.hibernate.type.BasicTypeReference@174cb0d8 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration wrapper-binary -> org.hibernate.type.BasicTypeReference@174cb0d8 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration image -> org.hibernate.type.BasicTypeReference@3ac406d4 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration blob -> org.hibernate.type.BasicTypeReference@72646d16 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.sql.Blob -> org.hibernate.type.BasicTypeReference@72646d16 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_blob -> org.hibernate.type.BasicTypeReference@6ec2d990 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_blob_wrapper -> org.hibernate.type.BasicTypeReference@1cfa7ee0 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration short -> org.hibernate.type.BasicTypeReference@612290d +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration short -> org.hibernate.type.BasicTypeReference@612290d +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Short -> org.hibernate.type.BasicTypeReference@612290d +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration integer -> org.hibernate.type.BasicTypeReference@57cff804 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration int -> org.hibernate.type.BasicTypeReference@57cff804 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Integer -> org.hibernate.type.BasicTypeReference@57cff804 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration long -> org.hibernate.type.BasicTypeReference@2f39b534 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration long -> org.hibernate.type.BasicTypeReference@2f39b534 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Long -> org.hibernate.type.BasicTypeReference@2f39b534 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration float -> org.hibernate.type.BasicTypeReference@60fbc34d +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration float -> org.hibernate.type.BasicTypeReference@60fbc34d +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Float -> org.hibernate.type.BasicTypeReference@60fbc34d +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration double -> org.hibernate.type.BasicTypeReference@7736c41e +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration double -> org.hibernate.type.BasicTypeReference@7736c41e +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Double -> org.hibernate.type.BasicTypeReference@7736c41e +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration big_integer -> org.hibernate.type.BasicTypeReference@5f911d24 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.math.BigInteger -> org.hibernate.type.BasicTypeReference@5f911d24 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration big_decimal -> org.hibernate.type.BasicTypeReference@3de383f7 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.math.BigDecimal -> org.hibernate.type.BasicTypeReference@3de383f7 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration character -> org.hibernate.type.BasicTypeReference@33ccead +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration char -> org.hibernate.type.BasicTypeReference@33ccead +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Character -> org.hibernate.type.BasicTypeReference@33ccead +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration character_nchar -> org.hibernate.type.BasicTypeReference@42ebece0 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration string -> org.hibernate.type.BasicTypeReference@15c4b1a4 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.String -> org.hibernate.type.BasicTypeReference@15c4b1a4 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration nstring -> org.hibernate.type.BasicTypeReference@341964d0 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration characters -> org.hibernate.type.BasicTypeReference@51b59d58 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration char[] -> org.hibernate.type.BasicTypeReference@51b59d58 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration [C -> org.hibernate.type.BasicTypeReference@51b59d58 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration wrapper-characters -> org.hibernate.type.BasicTypeReference@4ca4f762 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration text -> org.hibernate.type.BasicTypeReference@7c5d36c3 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration ntext -> org.hibernate.type.BasicTypeReference@31de27c +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration clob -> org.hibernate.type.BasicTypeReference@7ebfe01a +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.sql.Clob -> org.hibernate.type.BasicTypeReference@7ebfe01a +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration nclob -> org.hibernate.type.BasicTypeReference@154b0748 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.sql.NClob -> org.hibernate.type.BasicTypeReference@154b0748 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_clob -> org.hibernate.type.BasicTypeReference@35c00c +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_clob_char_array -> org.hibernate.type.BasicTypeReference@6cd7dc74 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_clob_character_array -> org.hibernate.type.BasicTypeReference@6d695ec4 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_nclob -> org.hibernate.type.BasicTypeReference@20556566 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_nclob_character_array -> org.hibernate.type.BasicTypeReference@e4ef4c0 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_nclob_char_array -> org.hibernate.type.BasicTypeReference@5ca8bd01 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration Duration -> org.hibernate.type.BasicTypeReference@7b10472e +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.Duration -> org.hibernate.type.BasicTypeReference@7b10472e +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration LocalDateTime -> org.hibernate.type.BasicTypeReference@70e5737f +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.LocalDateTime -> org.hibernate.type.BasicTypeReference@70e5737f +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration LocalDate -> org.hibernate.type.BasicTypeReference@9746157 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.LocalDate -> org.hibernate.type.BasicTypeReference@9746157 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration LocalTime -> org.hibernate.type.BasicTypeReference@10ad95cd +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.LocalTime -> org.hibernate.type.BasicTypeReference@10ad95cd +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetDateTime -> org.hibernate.type.BasicTypeReference@69fd99c1 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.OffsetDateTime -> org.hibernate.type.BasicTypeReference@69fd99c1 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetDateTimeWithTimezone -> org.hibernate.type.BasicTypeReference@32d8710a +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetDateTimeWithoutTimezone -> org.hibernate.type.BasicTypeReference@180cc0df +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetTime -> org.hibernate.type.BasicTypeReference@64f33dee +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.OffsetTime -> org.hibernate.type.BasicTypeReference@64f33dee +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetTimeUtc -> org.hibernate.type.BasicTypeReference@61c58320 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetTimeWithTimezone -> org.hibernate.type.BasicTypeReference@10e4ee33 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetTimeWithoutTimezone -> org.hibernate.type.BasicTypeReference@6e90cec8 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration ZonedDateTime -> org.hibernate.type.BasicTypeReference@13f182b9 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.ZonedDateTime -> org.hibernate.type.BasicTypeReference@13f182b9 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration ZonedDateTimeWithTimezone -> org.hibernate.type.BasicTypeReference@5ee0cf64 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration ZonedDateTimeWithoutTimezone -> org.hibernate.type.BasicTypeReference@69c227fd +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration date -> org.hibernate.type.BasicTypeReference@14c5283 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.sql.Date -> org.hibernate.type.BasicTypeReference@14c5283 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration time -> org.hibernate.type.BasicTypeReference@1eb7ec59 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.sql.Time -> org.hibernate.type.BasicTypeReference@1eb7ec59 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration timestamp -> org.hibernate.type.BasicTypeReference@46748b04 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.sql.Timestamp -> org.hibernate.type.BasicTypeReference@46748b04 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.util.Date -> org.hibernate.type.BasicTypeReference@46748b04 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration calendar -> org.hibernate.type.BasicTypeReference@3e71a1f8 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.util.Calendar -> org.hibernate.type.BasicTypeReference@3e71a1f8 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.util.GregorianCalendar -> org.hibernate.type.BasicTypeReference@3e71a1f8 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration calendar_date -> org.hibernate.type.BasicTypeReference@5d4a34ff +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration calendar_time -> org.hibernate.type.BasicTypeReference@7cbede2b +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration instant -> org.hibernate.type.BasicTypeReference@1ef04613 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.Instant -> org.hibernate.type.BasicTypeReference@1ef04613 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration uuid -> org.hibernate.type.BasicTypeReference@2d3d4a54 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.util.UUID -> org.hibernate.type.BasicTypeReference@2d3d4a54 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration pg-uuid -> org.hibernate.type.BasicTypeReference@2d3d4a54 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration uuid-binary -> org.hibernate.type.BasicTypeReference@215c6ec0 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration uuid-char -> org.hibernate.type.BasicTypeReference@2b19b346 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration class -> org.hibernate.type.BasicTypeReference@37c5b8e8 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Class -> org.hibernate.type.BasicTypeReference@37c5b8e8 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration currency -> org.hibernate.type.BasicTypeReference@706d2bae +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration Currency -> org.hibernate.type.BasicTypeReference@706d2bae +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.util.Currency -> org.hibernate.type.BasicTypeReference@706d2bae +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration locale -> org.hibernate.type.BasicTypeReference@3205610d +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.util.Locale -> org.hibernate.type.BasicTypeReference@3205610d +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration serializable -> org.hibernate.type.BasicTypeReference@54e06788 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.io.Serializable -> org.hibernate.type.BasicTypeReference@54e06788 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration timezone -> org.hibernate.type.BasicTypeReference@4e789704 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.util.TimeZone -> org.hibernate.type.BasicTypeReference@4e789704 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration ZoneOffset -> org.hibernate.type.BasicTypeReference@5751e53e +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.ZoneOffset -> org.hibernate.type.BasicTypeReference@5751e53e +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration url -> org.hibernate.type.BasicTypeReference@4e45fbd0 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.net.URL -> org.hibernate.type.BasicTypeReference@4e45fbd0 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration vector -> org.hibernate.type.BasicTypeReference@19ce19b7 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration row_version -> org.hibernate.type.BasicTypeReference@13047d3d +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration object -> org.hibernate.type.JavaObjectType@43719e98 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Object -> org.hibernate.type.JavaObjectType@43719e98 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration null -> org.hibernate.type.NullType@6aa9a93b +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_date -> org.hibernate.type.BasicTypeReference@81dfdee +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_time -> org.hibernate.type.BasicTypeReference@3b046e64 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_timestamp -> org.hibernate.type.BasicTypeReference@1c43e84e +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_calendar -> org.hibernate.type.BasicTypeReference@7bd694a5 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_calendar_date -> org.hibernate.type.BasicTypeReference@21ce2e4d +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_calendar_time -> org.hibernate.type.BasicTypeReference@3921135e +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_binary -> org.hibernate.type.BasicTypeReference@3a239dac +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_serializable -> org.hibernate.type.BasicTypeReference@759f45f1 +2025-10-29 16:48:19 [main] INFO o.s.o.j.p.SpringPersistenceUnitInfo - No LoadTimeWeaver setup: ignoring JPA class transformer +2025-10-29 16:48:19 [main] WARN org.hibernate.orm.deprecation - HHH90000021: Encountered deprecated setting [hibernate.temp.use_jdbc_metadata_defaults], use [hibernate.boot.allow_jdbc_metadata_access] instead +2025-10-29 16:48:19 [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-29 16:48:19 [main] DEBUG o.h.t.d.sql.spi.DdlTypeRegistry - addDescriptor(2003, org.hibernate.type.descriptor.sql.internal.ArrayDdlTypeImpl@58932d08) replaced previous registration(org.hibernate.type.descriptor.sql.internal.ArrayDdlTypeImpl@45648e75) +2025-10-29 16:48:19 [main] DEBUG o.h.t.d.sql.spi.DdlTypeRegistry - addDescriptor(6, org.hibernate.type.descriptor.sql.internal.CapacityDependentDdlType@e344f14) replaced previous registration(org.hibernate.type.descriptor.sql.internal.DdlTypeImpl@2d117280) +2025-10-29 16:48:19 [main] DEBUG o.h.t.d.jdbc.spi.JdbcTypeRegistry - addDescriptor(2004, BlobTypeDescriptor(BLOB_BINDING)) replaced previous registration(BlobTypeDescriptor(DEFAULT)) +2025-10-29 16:48:19 [main] DEBUG o.h.t.d.jdbc.spi.JdbcTypeRegistry - addDescriptor(2005, ClobTypeDescriptor(CLOB_BINDING)) replaced previous registration(ClobTypeDescriptor(DEFAULT)) +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration JAVA_OBJECT -> org.hibernate.type.JavaObjectType@2f3a0f37 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Object -> org.hibernate.type.JavaObjectType@2f3a0f37 +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Type registration key [java.lang.Object] overrode previous entry : `org.hibernate.type.JavaObjectType@43719e98` +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration org.hibernate.type.DurationType -> basicType@1(java.time.Duration,3015) +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration Duration -> basicType@1(java.time.Duration,3015) +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.Duration -> basicType@1(java.time.Duration,3015) +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration org.hibernate.type.OffsetDateTimeType -> basicType@2(java.time.OffsetDateTime,3003) +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetDateTime -> basicType@2(java.time.OffsetDateTime,3003) +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.OffsetDateTime -> basicType@2(java.time.OffsetDateTime,3003) +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration org.hibernate.type.ZonedDateTimeType -> basicType@3(java.time.ZonedDateTime,3003) +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration ZonedDateTime -> basicType@3(java.time.ZonedDateTime,3003) +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.ZonedDateTime -> basicType@3(java.time.ZonedDateTime,3003) +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration org.hibernate.type.OffsetTimeType -> basicType@4(java.time.OffsetTime,3007) +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetTime -> basicType@4(java.time.OffsetTime,3007) +2025-10-29 16:48:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.OffsetTime -> basicType@4(java.time.OffsetTime,3007) +2025-10-29 16:48:19 [main] DEBUG o.h.type.spi.TypeConfiguration$Scope - Scoping TypeConfiguration [org.hibernate.type.spi.TypeConfiguration@2a2b3aff] to MetadataBuildingContext [org.hibernate.boot.internal.MetadataBuildingContextRootImpl@4bc9451b] +2025-10-29 16:48:20 [main] WARN org.hibernate.orm.deprecation - HHH90000021: Encountered deprecated setting [javax.persistence.schema-generation.database.action], use [jakarta.persistence.schema-generation.database.action] instead +2025-10-29 16:48:20 [main] WARN org.hibernate.orm.deprecation - HHH90000021: Encountered deprecated setting [javax.persistence.schema-generation.scripts.action], use [jakarta.persistence.schema-generation.scripts.action] instead +2025-10-29 16:48:20 [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-29 16:48:20 [main] DEBUG o.h.type.spi.TypeConfiguration$Scope - Scoping TypeConfiguration [org.hibernate.type.spi.TypeConfiguration@2a2b3aff] to SessionFactoryImplementor [org.hibernate.internal.SessionFactoryImpl@555454c7] +2025-10-29 16:48:20 [main] WARN org.hibernate.orm.deprecation - HHH90000021: Encountered deprecated setting [javax.persistence.schema-generation.database.action], use [jakarta.persistence.schema-generation.database.action] instead +2025-10-29 16:48:20 [main] WARN org.hibernate.orm.deprecation - HHH90000021: Encountered deprecated setting [javax.persistence.schema-generation.scripts.action], use [jakarta.persistence.schema-generation.scripts.action] instead +2025-10-29 16:48:20 [main] TRACE o.h.type.spi.TypeConfiguration$Scope - Handling #sessionFactoryCreated from [org.hibernate.internal.SessionFactoryImpl@555454c7] for TypeConfiguration +2025-10-29 16:48:20 [main] INFO o.s.o.j.LocalContainerEntityManagerFactoryBean - Initialized JPA EntityManagerFactory for persistence unit 'default' +2025-10-29 16:48:20 [main] INFO o.s.d.j.r.query.QueryEnhancerFactory - Hibernate is in classpath; If applicable, HQL parser will be used. +2025-10-29 16:48:21 [main] INFO c.u.h.m.infra.cache.CacheConfig - ObjectMapper 설정 완료 +2025-10-29 16:48:21 [main] INFO c.u.h.m.infra.config.RedisConfig - Redis Lettuce Client 설정 완료 - Standalone 모드 (Master-Replica 자동 탐색 비활성화) +2025-10-29 16:48:21 [main] INFO c.u.h.m.infra.config.RedisConfig - LettuceConnectionFactory 설정 완료 - Host: 20.249.177.114:6379, Database: 1 +2025-10-29 16:48:21 [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-29 16:48:21 [main] INFO c.u.h.m.infra.config.RedisConfig - RedisTemplate 설정 완료 +2025-10-29 16:48:21 [main] INFO c.u.h.m.infra.config.EventHubConfig - Initializing Azure EventHub configuration with hub name: hgzero-eventhub-name +2025-10-29 16:48:21 [main] INFO c.u.h.m.infra.config.EventHubConfig - Creating EventHub producer for hub: hgzero-eventhub-name +2025-10-29 16:48:21 [main] INFO c.a.m.e.EventHubClientBuilder - {"az.sdk.message":"Emitting a single connection.","connectionId":"MF_811610_1761724101616"} +2025-10-29 16:48:21 [main] INFO c.a.m.e.i.EventHubConnectionProcessor - {"az.sdk.message":"Setting next AMQP channel.","entityPath":"hgzero-eventhub-name"} +2025-10-29 16:48:21 [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-29 16:48:21 [main] WARN o.s.b.a.s.s.UserDetailsServiceAutoConfiguration - + +Using generated security password: cfbbef4f-9e6b-4196-a01a-bcb255e4d522 + +This generated password is for development use only. Your security configuration must be updated before running your application in production. + +2025-10-29 16:48:21 [main] INFO o.s.s.c.a.a.c.InitializeUserDetailsBeanManagerConfigurer$InitializeUserDetailsManagerConfigurer - Global AuthenticationManager configured with UserDetailsService bean with name inMemoryUserDetailsManager +2025-10-29 16:48:21 [main] INFO c.u.h.m.infra.config.WebSocketConfig - WebSocket 핸들러 등록 완료 - endpoint: /ws/minutes/{minutesId} +2025-10-29 16:48:22 [main] INFO o.s.b.a.e.web.EndpointLinksResolver - Exposing 3 endpoints beneath base path '/actuator' +2025-10-29 16:48:22 [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-29 16:48:22 [main] WARN o.s.b.a.t.ThymeleafAutoConfiguration$DefaultTemplateResolverConfiguration - Cannot find template location: classpath:/templates/ (please add some templates, check your Thymeleaf configuration, or set spring.thymeleaf.check-template-location=false) +2025-10-29 16:48:22 [main] INFO o.s.b.w.e.tomcat.TomcatWebServer - Tomcat started on port 8082 (http) with context path '/' +2025-10-29 16:48:22 [main] INFO c.u.h.meeting.MeetingApplication - Started MeetingApplication in 5.205 seconds (process running for 5.395) +2025-10-29 16:48:26 [http-nio-8082-exec-1] INFO o.a.c.c.C.[Tomcat].[localhost].[/] - Initializing Spring DispatcherServlet 'dispatcherServlet' +2025-10-29 16:48:26 [http-nio-8082-exec-1] INFO o.s.web.servlet.DispatcherServlet - Initializing Servlet 'dispatcherServlet' +2025-10-29 16:48:26 [http-nio-8082-exec-1] INFO o.s.web.servlet.DispatcherServlet - Completed initialization in 1 ms +2025-10-29 16:48:26 [http-nio-8082-exec-1] DEBUG o.s.security.web.FilterChainProxy - Securing PUT /api/meetings/minutes/minutes-user2/agenda-sections +2025-10-29 16:48:26 [http-nio-8082-exec-1] DEBUG c.u.h.m.i.c.j.JwtAuthenticationFilter - 헤더 기반 인증된 사용자: user-002 (user-002) +2025-10-29 16:48:26 [http-nio-8082-exec-1] DEBUG o.s.security.web.FilterChainProxy - Secured PUT /api/meetings/minutes/minutes-user2/agenda-sections +2025-10-29 16:48:26 [http-nio-8082-exec-1] INFO c.u.hgzero.common.aop.LoggingAspect - [Controller] com.unicorn.hgzero.meeting.infra.controller.MinutesController.updateAgendaSections 호출 - 파라미터: [user-002, user-002, minutes-user2, com.unicorn.hgzero.meeting.infra.dto.request.UpdateAgendaSectionsRequest@7389b6f3] +2025-10-29 16:48:26 [http-nio-8082-exec-1] INFO c.u.h.m.i.c.MinutesController - [API] 회의록 안건별 수정 요청 - userId: user-002, minutesId: minutes-user2, agendaCount: 1 +2025-10-29 16:48:26 [http-nio-8082-exec-1] INFO c.u.h.m.i.c.MinutesController - 회의록 수정 권한 검증 스킵 - 모든 사용자 수정 가능 +2025-10-29 16:48:26 [http-nio-8082-exec-1] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting... +2025-10-29 16:48:27 [http-nio-8082-exec-1] INFO com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Added connection org.postgresql.jdbc.PgConnection@6c5007f7 +2025-10-29 16:48:27 [http-nio-8082-exec-1] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed. +2025-10-29 16:48:28 [http-nio-8082-exec-1] INFO c.u.h.m.b.s.AgendaSectionService - 안건 섹션 일괄 수정 - 개수: 1 +2025-10-29 16:48:28 [http-nio-8082-exec-1] INFO c.u.h.m.b.s.AgendaSectionService - 안건 섹션 요약 수정 - agendaId: 1, summary length: 58 +2025-10-29 16:48:28 [http-nio-8082-exec-1] DEBUG org.hibernate.SQL - + select + ase1_0.id, + ase1_0.agenda_number, + ase1_0.agenda_title, + ase1_0.ai_summary_short, + ase1_0.created_at, + ase1_0.meeting_id, + ase1_0.minutes_id, + ase1_0.pending_items, + ase1_0.summary, + ase1_0.todos, + ase1_0.updated_at + from + agenda_sections ase1_0 + where + ase1_0.id=? +2025-10-29 16:48:28 [http-nio-8082-exec-1] DEBUG org.hibernate.SQL - + /* dynamic native SQL query */ UPDATE + agenda_sections + SET + summary = ?, + updated_at = CURRENT_TIMESTAMP + WHERE + id = ? +2025-10-29 16:48:28 [http-nio-8082-exec-1] INFO c.u.h.m.b.s.AgendaSectionService - 안건 섹션 요약 수정 완료 - agendaId: 1 +2025-10-29 16:48:28 [http-nio-8082-exec-1] INFO c.u.h.m.b.s.AgendaSectionService - 안건 섹션 일괄 수정 완료 - 개수: 1 +2025-10-29 16:48:29 [http-nio-8082-exec-1] DEBUG c.u.h.m.infra.cache.CacheService - 회의록 상세 캐시 삭제 - minutesId: minutes-user2 +2025-10-29 16:48:29 [http-nio-8082-exec-1] INFO c.u.h.m.i.c.MinutesController - 회의록 안건별 수정 성공 - minutesId: minutes-user2, updatedCount: 1 +2025-10-29 16:48:29 [http-nio-8082-exec-1] INFO c.u.hgzero.common.aop.LoggingAspect - [Controller] com.unicorn.hgzero.meeting.infra.controller.MinutesController.updateAgendaSections 완료 - 실행시간: 2751ms diff --git a/meeting/src/main/java/com/unicorn/hgzero/meeting/biz/domain/AgendaSection.java b/meeting/src/main/java/com/unicorn/hgzero/meeting/biz/domain/AgendaSection.java index 41e760e..c34c01d 100644 --- a/meeting/src/main/java/com/unicorn/hgzero/meeting/biz/domain/AgendaSection.java +++ b/meeting/src/main/java/com/unicorn/hgzero/meeting/biz/domain/AgendaSection.java @@ -45,21 +45,6 @@ public class AgendaSection { */ private String aiSummaryShort; - /** - * 논의사항 (JSON 형태로 저장) - */ - private String discussions; - - /** - * 결정사항 (JSON 형태로 저장) - */ - private String decisions; - - /** - * 의견 (JSON 형태로 저장) - */ - private String opinions; - /** * 보류사항 (JSON 형태로 저장) */ @@ -70,6 +55,11 @@ public class AgendaSection { */ private String todos; + /** + * 요약 (안건 내용) + */ + private String summary; + /** * 생성일시 */ diff --git a/meeting/src/main/java/com/unicorn/hgzero/meeting/biz/dto/request/MeetingMemoRequest.java b/meeting/src/main/java/com/unicorn/hgzero/meeting/biz/dto/request/MeetingMemoRequest.java new file mode 100644 index 0000000..83eedf8 --- /dev/null +++ b/meeting/src/main/java/com/unicorn/hgzero/meeting/biz/dto/request/MeetingMemoRequest.java @@ -0,0 +1,21 @@ +package com.unicorn.hgzero.meeting.biz.dto.request; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import lombok.*; + +@Getter +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Schema(description = "회의 메모 저장 요청") +public class MeetingMemoRequest { + + @NotBlank(message = "회의 ID는 필수입니다.") + @Schema(description = "회의 ID", example = "meeting-123", required = true) + private String meetingId; + + @NotBlank(message = "메모 내용은 필수입니다.") + @Schema(description = "메모 내용", example = "[00:15] 신제품의 타겟 고객층을 20-30대로 설정하고, 모바일 우선 전략을 취하기로 논의 중입니다.", required = true) + private String memo; +} \ No newline at end of file diff --git a/meeting/src/main/java/com/unicorn/hgzero/meeting/biz/dto/response/MeetingMemoResponse.java b/meeting/src/main/java/com/unicorn/hgzero/meeting/biz/dto/response/MeetingMemoResponse.java new file mode 100644 index 0000000..7f78d36 --- /dev/null +++ b/meeting/src/main/java/com/unicorn/hgzero/meeting/biz/dto/response/MeetingMemoResponse.java @@ -0,0 +1,29 @@ +package com.unicorn.hgzero.meeting.biz.dto.response; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +@Getter +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Schema(description = "회의 메모 저장 응답") +public class MeetingMemoResponse { + + @Schema(description = "회의 ID", example = "meeting-123") + private String meetingId; + + @Schema(description = "저장된 섹션 ID", example = "section-456") + private String sectionId; + + @Schema(description = "저장 완료 메시지", example = "메모가 성공적으로 저장되었습니다.") + private String message; + + public static MeetingMemoResponse of(String meetingId, String sectionId) { + return MeetingMemoResponse.builder() + .meetingId(meetingId) + .sectionId(sectionId) + .message("메모가 성공적으로 저장되었습니다.") + .build(); + } +} \ No newline at end of file diff --git a/meeting/src/main/java/com/unicorn/hgzero/meeting/biz/service/AgendaSectionService.java b/meeting/src/main/java/com/unicorn/hgzero/meeting/biz/service/AgendaSectionService.java index e112174..370fa78 100644 --- a/meeting/src/main/java/com/unicorn/hgzero/meeting/biz/service/AgendaSectionService.java +++ b/meeting/src/main/java/com/unicorn/hgzero/meeting/biz/service/AgendaSectionService.java @@ -1,6 +1,9 @@ package com.unicorn.hgzero.meeting.biz.service; +import com.unicorn.hgzero.common.exception.BusinessException; +import com.unicorn.hgzero.common.exception.ErrorCode; import com.unicorn.hgzero.meeting.biz.domain.AgendaSection; +import com.unicorn.hgzero.meeting.infra.dto.request.UpdateAgendaSectionsRequest; import com.unicorn.hgzero.meeting.infra.gateway.entity.AgendaSectionEntity; import com.unicorn.hgzero.meeting.infra.gateway.repository.AgendaSectionRepository; import lombok.RequiredArgsConstructor; @@ -88,4 +91,50 @@ public class AgendaSectionService { .map(AgendaSectionEntity::toDomain) .collect(Collectors.toList()); } + + /** + * 안건 섹션 요약 수정 + * @param agendaId 안건 ID + * @param summary 새로운 요약 내용 + * @return 수정된 안건 섹션 + */ + @Transactional + public AgendaSection updateAgendaSummary(String agendaId, String summary) { + log.info("안건 섹션 요약 수정 - agendaId: {}, summary length: {}", + agendaId, summary != null ? summary.length() : 0); + + // 먼저 존재 여부 확인 + AgendaSectionEntity entity = agendaSectionRepository.findById(agendaId) + .orElseThrow(() -> new BusinessException(ErrorCode.AGENDA_SECTION_NOT_FOUND, + "안건 섹션을 찾을 수 없습니다: " + agendaId)); + + // Native Query로 summary만 업데이트 + agendaSectionRepository.updateSummaryById(agendaId, summary); + + // 업데이트된 엔티티 다시 조회 + AgendaSectionEntity updatedEntity = agendaSectionRepository.findById(agendaId) + .orElseThrow(() -> new BusinessException(ErrorCode.AGENDA_SECTION_NOT_FOUND, + "업데이트된 안건 섹션을 찾을 수 없습니다: " + agendaId)); + + log.info("안건 섹션 요약 수정 완료 - agendaId: {}", agendaId); + return updatedEntity.toDomain(); + } + + /** + * 여러 안건 섹션의 요약을 한 번에 수정 + * @param updateItems 안건 ID와 새로운 요약 내용의 목록 + * @return 수정된 안건 섹션 목록 + */ + @Transactional + public List updateMultipleAgendaSummaries( + List updateItems) { + log.info("안건 섹션 일괄 수정 - 개수: {}", updateItems.size()); + + List updatedSections = updateItems.stream() + .map(item -> updateAgendaSummary(item.getAgendaId(), item.getContent())) + .collect(Collectors.toList()); + + log.info("안건 섹션 일괄 수정 완료 - 개수: {}", updatedSections.size()); + return updatedSections; + } } \ No newline at end of file diff --git a/meeting/src/main/java/com/unicorn/hgzero/meeting/biz/service/MeetingMemoService.java b/meeting/src/main/java/com/unicorn/hgzero/meeting/biz/service/MeetingMemoService.java new file mode 100644 index 0000000..30ff821 --- /dev/null +++ b/meeting/src/main/java/com/unicorn/hgzero/meeting/biz/service/MeetingMemoService.java @@ -0,0 +1,144 @@ +package com.unicorn.hgzero.meeting.biz.service; + +import com.unicorn.hgzero.common.exception.BusinessException; +import com.unicorn.hgzero.common.exception.ErrorCode; +import com.unicorn.hgzero.meeting.biz.domain.Meeting; +import com.unicorn.hgzero.meeting.biz.domain.Minutes; +import com.unicorn.hgzero.meeting.biz.domain.MinutesSection; +import com.unicorn.hgzero.meeting.biz.usecase.in.meeting.SaveMeetingMemoUseCase; +import com.unicorn.hgzero.meeting.biz.usecase.out.MeetingReader; +import com.unicorn.hgzero.meeting.biz.usecase.out.MinutesSectionReader; +import com.unicorn.hgzero.meeting.biz.usecase.out.MinutesSectionWriter; +import com.unicorn.hgzero.meeting.biz.usecase.out.MinutesReader; +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; + +/** + * 회의 메모 관리 Service + * 회의 중 작성되는 메모를 MinutesSection에 저장하고 관리합니다. + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class MeetingMemoService implements SaveMeetingMemoUseCase { + + private final MeetingReader meetingReader; + private final MinutesReader minutesReader; + private final MinutesSectionReader minutesSectionReader; + private final MinutesSectionWriter minutesSectionWriter; + + /** + * 회의 중 AI 메모 저장 + * @param command 메모 저장 명령 + * @return 저장된 섹션 ID + */ + @Override + @Transactional + public String saveMemo(SaveMemoCommand command) { + log.info("Saving meeting memo for meetingId: {}", command.getMeetingId()); + + // 1. 회의 존재 여부 및 진행 중 상태 확인 + Meeting meeting = meetingReader.findById(command.getMeetingId()) + .orElseThrow(() -> { + log.error("Meeting not found: {}", command.getMeetingId()); + return new BusinessException(ErrorCode.MEETING_NOT_FOUND); + }); + + // 2. 회의가 진행 중인지 확인 + if (!meeting.isInProgress()) { + log.warn("Meeting is not in progress: meetingId={}", command.getMeetingId()); + throw new BusinessException(ErrorCode.MEETING_NOT_IN_PROGRESS); + } + + // 3. 해당 회의의 회의록 조회 + List minutesList = minutesReader.findByMeetingId(command.getMeetingId()); + if (minutesList.isEmpty()) { + log.error("Minutes not found for meetingId: {}", command.getMeetingId()); + throw new BusinessException(ErrorCode.MINUTES_NOT_FOUND); + } + Minutes minutes = minutesList.get(0); // 첫 번째 회의록 사용 + + // 4. 기존 메모 섹션 조회 또는 새로운 섹션 생성 + MinutesSection memoSection = minutesSectionReader.findFirstByMinutesIdAndType( + minutes.getMinutesId(), + "AI_MEMO" + ).orElseGet(() -> createNewMemoSection(minutes.getMinutesId())); + + // 5. 메모 내용 업데이트 (기존 내용에 추가) + String updatedContent = updateMemoContent( + memoSection.getContent(), + command.getMemo(), + command.getUserId() + ); + + // 6. 섹션 업데이트 및 저장 + MinutesSection updatedSection = MinutesSection.builder() + .sectionId(memoSection.getSectionId()) + .minutesId(memoSection.getMinutesId()) + .type("AI_MEMO") + .title("회의 메모") + .content(updatedContent) + .order(memoSection.getOrder()) + .verified(false) + .locked(false) + .build(); + + minutesSectionWriter.save(updatedSection); + + log.info("Meeting memo saved successfully: sectionId={}", updatedSection.getSectionId()); + return updatedSection.getSectionId(); + } + + /** + * 새로운 메모 섹션 생성 + */ + private MinutesSection createNewMemoSection(String minutesId) { + // 해당 회의록의 최대 order 값 조회 + int maxOrder = minutesSectionReader.getMaxOrderByMinutesId(minutesId); + + return MinutesSection.builder() + .sectionId(generateSectionId()) + .minutesId(minutesId) + .type("AI_MEMO") + .title("회의 메모") + .content("") + .order(maxOrder + 1) + .verified(false) + .locked(false) + .build(); + } + + /** + * 메모 내용 업데이트 + * 기존 내용이 있으면 추가하고, 없으면 새로 작성 + */ + private String updateMemoContent(String existingContent, String newMemo, String userId) { + StringBuilder content = new StringBuilder(); + + if (existingContent != null && !existingContent.trim().isEmpty()) { + content.append(existingContent); + content.append("\n\n"); + } + + // 타임스탬프와 함께 새로운 메모 추가 + content.append(String.format("[%s - %s]\n%s", + LocalDateTime.now().toString().substring(11, 19), // HH:mm:ss + userId, + newMemo)); + + return content.toString(); + } + + /** + * 섹션 ID 생성 + */ + private String generateSectionId() { + return "section-" + UUID.randomUUID().toString(); + } +} \ No newline at end of file diff --git a/meeting/src/main/java/com/unicorn/hgzero/meeting/biz/service/MinutesService.java b/meeting/src/main/java/com/unicorn/hgzero/meeting/biz/service/MinutesService.java index d593748..42c3658 100644 --- a/meeting/src/main/java/com/unicorn/hgzero/meeting/biz/service/MinutesService.java +++ b/meeting/src/main/java/com/unicorn/hgzero/meeting/biz/service/MinutesService.java @@ -371,6 +371,10 @@ public class MinutesService implements log.warn("섹션 정보 변환 실패 - minutesId: {}", minutes.getMinutesId(), e); } + // decisions 값 로깅 + log.info("Minutes decisions 값 확인 - minutesId: {}, decisions: {}", + minutes.getMinutesId(), minutes.getDecisions()); + return MinutesDTO.builder() .minutesId(minutes.getMinutesId()) .meetingId(minutes.getMeetingId()) @@ -387,6 +391,7 @@ public class MinutesService implements .participantCount(participantCount) .memo("") // 메모 필드는 추후 구현 .sections(sectionDTOs) // 섹션 정보 추가 + .decisions(minutes.getDecisions()) // decisions 필드 추가 .build(); } diff --git a/meeting/src/main/java/com/unicorn/hgzero/meeting/biz/usecase/in/meeting/SaveMeetingMemoUseCase.java b/meeting/src/main/java/com/unicorn/hgzero/meeting/biz/usecase/in/meeting/SaveMeetingMemoUseCase.java new file mode 100644 index 0000000..39f525a --- /dev/null +++ b/meeting/src/main/java/com/unicorn/hgzero/meeting/biz/usecase/in/meeting/SaveMeetingMemoUseCase.java @@ -0,0 +1,29 @@ +package com.unicorn.hgzero.meeting.biz.usecase.in.meeting; + +import lombok.Builder; +import lombok.Getter; + +/** + * 회의 중 AI 메모 저장 UseCase + * 회의 진행 중 사용자가 작성한 메모를 MinutesSection의 content에 저장합니다. + */ +public interface SaveMeetingMemoUseCase { + + /** + * 회의 메모 저장 + * @param command 메모 저장 명령 + * @return 저장된 메모의 섹션 ID + */ + String saveMemo(SaveMemoCommand command); + + /** + * 메모 저장 명령 + */ + @Getter + @Builder + class SaveMemoCommand { + private final String meetingId; + private final String memo; + private final String userId; + } +} \ No newline at end of file diff --git a/meeting/src/main/java/com/unicorn/hgzero/meeting/biz/usecase/out/MinutesSectionReader.java b/meeting/src/main/java/com/unicorn/hgzero/meeting/biz/usecase/out/MinutesSectionReader.java index f6459a9..160a2f4 100644 --- a/meeting/src/main/java/com/unicorn/hgzero/meeting/biz/usecase/out/MinutesSectionReader.java +++ b/meeting/src/main/java/com/unicorn/hgzero/meeting/biz/usecase/out/MinutesSectionReader.java @@ -39,4 +39,14 @@ public interface MinutesSectionReader { * 잠금한 사용자 ID로 섹션 목록 조회 */ List findByLockedBy(String lockedBy); + + /** + * 회의록 ID와 타입으로 단일 섹션 조회 + */ + Optional findFirstByMinutesIdAndType(String minutesId, String type); + + /** + * 회의록 ID로 최대 order 값 조회 + */ + int getMaxOrderByMinutesId(String minutesId); } diff --git a/meeting/src/main/java/com/unicorn/hgzero/meeting/infra/controller/MeetingController.java b/meeting/src/main/java/com/unicorn/hgzero/meeting/infra/controller/MeetingController.java index 2e83dc5..e8ef01f 100644 --- a/meeting/src/main/java/com/unicorn/hgzero/meeting/infra/controller/MeetingController.java +++ b/meeting/src/main/java/com/unicorn/hgzero/meeting/infra/controller/MeetingController.java @@ -13,6 +13,8 @@ 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.MeetingEndResponse; import com.unicorn.hgzero.meeting.infra.dto.response.SessionResponse; +import com.unicorn.hgzero.meeting.biz.dto.request.MeetingMemoRequest; +import com.unicorn.hgzero.meeting.biz.dto.response.MeetingMemoResponse; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.security.SecurityRequirement; @@ -44,6 +46,7 @@ public class MeetingController { private final CancelMeetingUseCase cancelMeetingUseCase; private final InviteParticipantUseCase inviteParticipantUseCase; private final ApplyTemplateUseCase applyTemplateUseCase; + private final SaveMeetingMemoUseCase saveMeetingMemoUseCase; /** * 회의 예약 @@ -319,4 +322,48 @@ public class MeetingController { return ResponseEntity.ok(ApiResponse.success(response)); } + + /** + * 회의 중 AI 메모 저장 + * + * @param meetingId 회의 ID + * @param userId 사용자 ID + * @param userName 사용자명 + * @param userEmail 사용자 이메일 + * @param request 메모 저장 요청 + * @return 메모 저장 결과 + */ + @Operation( + summary = "회의 중 AI 메모 저장", + description = "회의 진행 중 사용자가 작성한 메모를 MinutesSection에 저장합니다. AI가 감지한 주요 내용과 사용자가 직접 입력한 내용을 함께 저장할 수 있습니다.", + security = @SecurityRequirement(name = "bearerAuth") + ) + @PostMapping("/{meetingId}/memo") + public ResponseEntity> saveMeetingMemo( + @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 MeetingMemoRequest request) { + + log.info("회의 메모 저장 요청 - meetingId: {}, userId: {}", meetingId, userId); + + String sectionId = saveMeetingMemoUseCase.saveMemo( + SaveMeetingMemoUseCase.SaveMemoCommand.builder() + .meetingId(meetingId) + .memo(request.getMemo()) + .userId(userId) + .build() + ); + + var response = MeetingMemoResponse.of(meetingId, sectionId); + + log.info("회의 메모 저장 완료 - meetingId: {}, sectionId: {}", meetingId, sectionId); + + return ResponseEntity.ok(ApiResponse.success(response)); + } } \ No newline at end of file diff --git a/meeting/src/main/java/com/unicorn/hgzero/meeting/infra/controller/MinutesController.java b/meeting/src/main/java/com/unicorn/hgzero/meeting/infra/controller/MinutesController.java index b4b1900..da6e141 100644 --- a/meeting/src/main/java/com/unicorn/hgzero/meeting/infra/controller/MinutesController.java +++ b/meeting/src/main/java/com/unicorn/hgzero/meeting/infra/controller/MinutesController.java @@ -14,6 +14,7 @@ import com.unicorn.hgzero.meeting.biz.service.MinutesSectionService; import com.unicorn.hgzero.meeting.biz.service.TodoService; import com.unicorn.hgzero.meeting.biz.service.AgendaSectionService; import com.unicorn.hgzero.meeting.infra.dto.request.UpdateMinutesRequest; +import com.unicorn.hgzero.meeting.infra.dto.request.UpdateAgendaSectionsRequest; import com.unicorn.hgzero.meeting.infra.dto.response.MinutesDetailResponse; import com.unicorn.hgzero.meeting.infra.dto.response.MinutesListResponse; import com.unicorn.hgzero.meeting.infra.cache.CacheService; @@ -186,7 +187,8 @@ public class MinutesController { * PATCH /api/minutes/{minutesId} */ @PatchMapping("/{minutesId}") - @Operation(summary = "회의록 수정", description = "회의록 제목과 메모를 수정합니다") + @Operation(summary = "회의록 수정 (사용X -> 회의록 안건별 수정 API 사용)", + description = "회의록 제목과 메모를 수정합니다. 이 API 대신 회의록 안건별 수정 API(/api/minutes/{minutesId}/agenda-sections)를 사용하세요.") public ResponseEntity> updateMinutes( @RequestHeader("X-User-Id") String userId, @RequestHeader("X-User-Name") String userName, @@ -414,6 +416,54 @@ public class MinutesController { .body(ApiResponse.errorWithType("섹션 잠금 해제에 실패했습니다")); } } + + /** + * 회의록 안건별 수정 + * PUT /api/minutes/{minutesId}/agenda-sections + */ + @PutMapping("/{minutesId}/agenda-sections") + @Operation(summary = "회의록 안건별 수정", + description = "회의록의 안건별 내용을 수정합니다. 각 안건의 summary 필드만 업데이트됩니다.") + @ApiResponses({ + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "성공"), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "잘못된 요청"), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "403", description = "권한 없음"), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "404", description = "회의록을 찾을 수 없음") + }) + public ResponseEntity> updateAgendaSections( + @RequestHeader("X-User-Id") String userId, + @RequestHeader(value = "X-User-Name", defaultValue = "System") String userName, + @PathVariable String minutesId, + @Valid @RequestBody UpdateAgendaSectionsRequest request) { + + log.info("[API] 회의록 안건별 수정 요청 - userId: {}, minutesId: {}, agendaCount: {}", + userId, minutesId, request.getAgendas().size()); + + try { + // 권한 검증 제거 - 모든 사용자가 수정 가능 + log.info("회의록 수정 권한 검증 스킵 - 모든 사용자 수정 가능"); + + // 안건별 내용 수정 + List updatedSections = agendaSectionService.updateMultipleAgendaSummaries(request.getAgendas()); + + // 캐시 무효화 + cacheService.evictCacheMinutesDetail(minutesId); + + log.info("회의록 안건별 수정 성공 - minutesId: {}, updatedCount: {}", + minutesId, updatedSections.size()); + + return ResponseEntity.ok(ApiResponse.success("회의록이 성공적으로 수정되었습니다")); + + } catch (BusinessException e) { + log.error("회의록 안건별 수정 실패 - 비즈니스 예외 - minutesId: {}", minutesId, e); + return ResponseEntity.badRequest() + .body(ApiResponse.errorWithType(e.getMessage())); + } catch (Exception e) { + log.error("회의록 안건별 수정 실패 - minutesId: {}", minutesId, e); + return ResponseEntity.badRequest() + .body(ApiResponse.errorWithType("회의록 수정에 실패했습니다")); + } + } // Helper methods @@ -840,8 +890,10 @@ public class MinutesController { .todoCount(todoProgress.getTotalCount()) .build(); - // 결정사항 추출 - List decisions = extractDecisions(agendas); + // minutes 테이블의 decisions 텍스트 사용 + String decisions = minutesDTO.getDecisions() != null ? minutesDTO.getDecisions() : ""; + log.info("Dashboard decisions 값 확인 - minutesId: {}, decisions: {}", + minutesDTO.getMinutesId(), decisions); // AI 기반 관련회의록 조회 (캐시 우선) List relatedMinutes = getRelatedMinutesFromAI(minutesDTO.getMinutesId()); @@ -883,29 +935,12 @@ public class MinutesController { MinutesSection minutesSection = (MinutesSection) section; - // AI 요약 정보 구성 (현재는 기본값 사용) - MinutesDetailResponse.AiSummary aiSummary = MinutesDetailResponse.AiSummary.builder() - .content(minutesSection.getContent() != null ? minutesSection.getContent() : "AI 요약 정보 없음") - .generatedAt(LocalDateTime.now().minusMinutes(30)) - .modifiedAt(LocalDateTime.now().minusMinutes(10)) - .build(); - - // 안건 상세 내용 구성 - MinutesDetailResponse.AgendaDetails details = MinutesDetailResponse.AgendaDetails.builder() - .discussions(parseDiscussions(minutesSection.getContent())) - .decisions(parseDecisions(minutesSection.getContent())) - .build(); - return MinutesDetailResponse.AgendaInfo.builder() .agendaId(minutesSection.getSectionId()) .title(minutesSection.getTitle() != null ? minutesSection.getTitle() : "제목 없음") .orderIndex(minutesSection.getOrder() != null ? minutesSection.getOrder() : 1) - .isVerified(minutesSection.isVerified()) - .verifiedBy(minutesSection.isVerified() ? "시스템" : null) - .verifiedAt(minutesSection.isVerified() ? LocalDateTime.now().minusHours(1) : null) - .aiSummary(aiSummary) - .details(details) - .relatedMinutes(new ArrayList<>()) // 관련 회의록은 별도 로직 필요 + .aiSummary("") // MinutesSection에는 AI 요약이 없음 + .content(minutesSection.getContent() != null ? minutesSection.getContent() : "") .build(); } @@ -913,67 +948,15 @@ public class MinutesController { * AgendaSection을 AgendaInfo로 변환 */ private MinutesDetailResponse.AgendaInfo convertAgendaSectionToAgendaInfo(AgendaSection agendaSection) { - // AI 요약 정보 구성 - MinutesDetailResponse.AiSummary aiSummary = MinutesDetailResponse.AiSummary.builder() - .content(agendaSection.getAiSummaryShort() != null ? agendaSection.getAiSummaryShort() : "") - .generatedAt(agendaSection.getCreatedAt() != null ? agendaSection.getCreatedAt() : LocalDateTime.now()) - .modifiedAt(agendaSection.getUpdatedAt() != null ? agendaSection.getUpdatedAt() : LocalDateTime.now()) - .build(); - - // 안건 상세 내용 구성 - JSON 파싱 - List discussionsList = parseJsonToList(agendaSection.getDiscussions()); - List decisionsList = parseJsonToList(agendaSection.getDecisions()); - - MinutesDetailResponse.AgendaDetails details = MinutesDetailResponse.AgendaDetails.builder() - .discussions(discussionsList) - .decisions(decisionsList) - .build(); - return MinutesDetailResponse.AgendaInfo.builder() .agendaId(agendaSection.getId()) .title(agendaSection.getAgendaTitle() != null ? agendaSection.getAgendaTitle() : "제목 없음") .orderIndex(agendaSection.getAgendaNumber() != null ? agendaSection.getAgendaNumber() : 1) - .isVerified(true) // agenda_sections는 기본적으로 검증된 데이터 - .verifiedBy("AI") - .verifiedAt(agendaSection.getCreatedAt()) - .aiSummary(aiSummary) - .details(details) - .relatedMinutes(new ArrayList<>()) // 관련 회의록은 별도 로직 필요 + .aiSummary(agendaSection.getAiSummaryShort() != null ? agendaSection.getAiSummaryShort() : "") + .content(agendaSection.getSummary() != null ? agendaSection.getSummary() : "") .build(); } - /** - * JSON 문자열을 List으로 파싱 - */ - private List parseJsonToList(String json) { - if (json == null || json.isEmpty()) { - return new ArrayList<>(); - } - - try { - // 간단한 JSON 배열 파싱 - json = json.trim(); - if (json.startsWith("[") && json.endsWith("]")) { - json = json.substring(1, json.length() - 1); - if (json.isEmpty()) { - return new ArrayList<>(); - } - - // 쉼표로 분리하고 따옴표 제거 - return Arrays.stream(json.split(",")) - .map(s -> s.trim()) - .map(s -> s.startsWith("\"") && s.endsWith("\"") ? s.substring(1, s.length() - 1) : s) - .filter(s -> !s.isEmpty()) - .collect(Collectors.toList()); - } - - // JSON 형식이 아니면 그대로 한 줄로 반환 - return List.of(json); - } catch (Exception e) { - log.warn("JSON 파싱 실패: {}", json, e); - return List.of(json); // 파싱 실패시 원본 텍스트를 그대로 반환 - } - } private MinutesDetailResponse.SimpleTodo convertToSimpleTodo(Object todo) { @@ -1014,10 +997,10 @@ public class MinutesController { List keyPoints = new ArrayList<>(); for (int i = 0; i < agendas.size() && i < 4; i++) { MinutesDetailResponse.AgendaInfo agenda = agendas.get(i); - if (agenda.getAiSummary() != null) { + if (agenda.getAiSummary() != null && !agenda.getAiSummary().isEmpty()) { keyPoints.add(MinutesDetailResponse.KeyPoint.builder() .index(i + 1) - .content(agenda.getAiSummary().getContent()) + .content(agenda.getAiSummary()) .build()); } } @@ -1030,50 +1013,6 @@ public class MinutesController { return keyPoints; } - /** - * 회의록 섹션 내용에서 논의사항 추출 - */ - private List parseDiscussions(String content) { - if (content == null || content.trim().isEmpty()) { - return List.of("논의 내용 없음"); - } - - // 간단한 패턴으로 논의사항 추출 (실제로는 AI 파싱 필요) - Pattern pattern = Pattern.compile("논의[::]\\s*(.+?)(?=결정|\\n|$)", Pattern.CASE_INSENSITIVE); - Matcher matcher = pattern.matcher(content); - List discussions = new ArrayList<>(); - - while (matcher.find()) { - discussions.add(matcher.group(1).trim()); - } - - if (discussions.isEmpty()) { - // 전체 내용을 논의사항으로 처리 - discussions.add(content.length() > 100 ? content.substring(0, 100) + "..." : content); - } - - return discussions; - } - - /** - * 회의록 섹션 내용에서 결정사항 추출 - */ - private List parseDecisions(String content) { - if (content == null || content.trim().isEmpty()) { - return new ArrayList<>(); - } - - // 간단한 패턴으로 결정사항 추출 (실제로는 AI 파싱 필요) - Pattern pattern = Pattern.compile("결정[::]\\s*(.+?)(?=논의|\\n|$)", Pattern.CASE_INSENSITIVE); - Matcher matcher = pattern.matcher(content); - List decisions = new ArrayList<>(); - - while (matcher.find()) { - decisions.add(matcher.group(1).trim()); - } - - return decisions; - } /** * 담당자 이름 조회 (실제로는 User 서비스에서 조회 필요) @@ -1126,26 +1065,6 @@ public class MinutesController { return List.of("#AI회의록", "#음성인식", "#협업도구", "#스타트업", "#베타출시"); } - private List extractDecisions(List agendas) { - List decisions = new ArrayList<>(); - - for (MinutesDetailResponse.AgendaInfo agenda : agendas) { - if (agenda.getDetails() != null && agenda.getDetails().getDecisions() != null) { - for (String decision : agenda.getDetails().getDecisions()) { - decisions.add(MinutesDetailResponse.Decision.builder() - .content(decision) - .decidedBy("김민준") - .decidedAt(LocalDateTime.now().minusHours(2)) - .background("안건 논의 결과") - .build()); - } - } - } - - // 실제 데이터만 사용 - - return decisions; - } // === 샘플 데이터 생성 메소드들 === @@ -1192,9 +1111,9 @@ public class MinutesController { log.debug("AI 분석 결과로 대시보드 정보 업데이트 완료 - minutesId: {}", minutesDTO.getMinutesId()); } else { - // AI 분석 결과가 없으면 비동기 분석 요청 이벤트 발행 - publishAiAnalysisRequest(minutesDTO, userId, userName); - log.debug("AI 분석 요청 이벤트 발행 완료 - minutesId: {}", + // AI 분석 결과가 없으면 비동기 분석 요청 이벤트 발행 - 제거됨 + // publishAiAnalysisRequest(minutesDTO, userId, userName); + log.debug("AI 분석 요청 이벤트 발행 스킵 - DB 값 사용 - minutesId: {}", minutesDTO.getMinutesId()); } @@ -1260,7 +1179,7 @@ public class MinutesController { .keyPoints(keyPoints) .keywords(result.getKeywords() != null ? result.getKeywords() : dashboard.getKeywords()) .stats(dashboard.getStats()) - .decisions(convertAiDecisions(result.getDecisions())) + .decisions(dashboard.getDecisions()) // AI 분석에서는 decisions를 변경하지 않음 .todoProgress(dashboard.getTodoProgress()) .relatedMinutes(convertAiRelatedMinutes(result.getRelatedMinutes())) .build(); @@ -1289,23 +1208,6 @@ public class MinutesController { return response; } - /** - * AI 결정사항을 Response 형식으로 변환 - */ - private List convertAiDecisions(List aiDecisions) { - if (aiDecisions == null) { - return new ArrayList<>(); - } - - return aiDecisions.stream() - .map(decision -> MinutesDetailResponse.Decision.builder() - .content(decision.getContent()) - .decidedBy("AI 분석") - .decidedAt(LocalDateTime.now()) - .background("AI가 회의록에서 추출한 결정사항") - .build()) - .collect(Collectors.toList()); - } /** * AI 관련회의록을 Response 형식으로 변환 @@ -1329,10 +1231,6 @@ public class MinutesController { .collect(Collectors.toList()); } - /** - * Response 객체 필드 복사 (불변 객체 업데이트용) - */ - /** * AI 분석 요청 이벤트 발행 */ diff --git a/meeting/src/main/java/com/unicorn/hgzero/meeting/infra/dto/request/UpdateAgendaSectionsRequest.java b/meeting/src/main/java/com/unicorn/hgzero/meeting/infra/dto/request/UpdateAgendaSectionsRequest.java new file mode 100644 index 0000000..eb11a71 --- /dev/null +++ b/meeting/src/main/java/com/unicorn/hgzero/meeting/infra/dto/request/UpdateAgendaSectionsRequest.java @@ -0,0 +1,44 @@ +package com.unicorn.hgzero.meeting.infra.dto.request; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import java.util.List; + +/** + * 회의록 안건별 수정 요청 DTO + */ +@Getter +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class UpdateAgendaSectionsRequest { + + /** + * 수정할 안건 목록 + */ + @NotNull(message = "안건 목록은 필수입니다") + private List agendas; + + @Getter + @Builder + @NoArgsConstructor + @AllArgsConstructor + public static class AgendaUpdateItem { + /** + * 안건 ID (agenda_sections.id) + */ + @NotBlank(message = "안건 ID는 필수입니다") + private String agendaId; + + /** + * 안건 내용 (agenda_sections.summary) + */ + @NotBlank(message = "안건 내용은 필수입니다") + private String content; + } +} \ No newline at end of file diff --git a/meeting/src/main/java/com/unicorn/hgzero/meeting/infra/dto/response/MinutesDetailResponse.java b/meeting/src/main/java/com/unicorn/hgzero/meeting/infra/dto/response/MinutesDetailResponse.java index bc1f59e..54c3c43 100644 --- a/meeting/src/main/java/com/unicorn/hgzero/meeting/infra/dto/response/MinutesDetailResponse.java +++ b/meeting/src/main/java/com/unicorn/hgzero/meeting/infra/dto/response/MinutesDetailResponse.java @@ -72,7 +72,7 @@ public class MinutesDetailResponse { private List keyPoints; // 핵심내용 private List keywords; // 키워드 태그 private Statistics stats; // 통계 정보 - private List decisions; // 결정사항 + private String decisions; // 결정사항 (minutes 테이블의 decisions 텍스트) private TodoProgress todoProgress; // Todo 진행상황 private List relatedMinutes; // 관련회의록 } @@ -97,16 +97,6 @@ public class MinutesDetailResponse { private int todoCount; } - @Getter - @Builder - @NoArgsConstructor - @AllArgsConstructor - public static class Decision { - private String content; - private String decidedBy; - private LocalDateTime decidedAt; - private String background; - } @Getter @Builder @@ -155,36 +145,8 @@ public class MinutesDetailResponse { private String agendaId; private String title; private int orderIndex; - private boolean isVerified; - private String verifiedBy; - private LocalDateTime verifiedAt; - - // AI 요약 - private AiSummary aiSummary; - - // 안건 상세 내용 - private AgendaDetails details; - - // 관련회의록 - private List relatedMinutes; + private String aiSummary; // agenda_sections.ai_summary_short + private String content; // agenda_sections.summary } - @Getter - @Builder - @NoArgsConstructor - @AllArgsConstructor - public static class AiSummary { - private String content; - private LocalDateTime generatedAt; - private LocalDateTime modifiedAt; - } - - @Getter - @Builder - @NoArgsConstructor - @AllArgsConstructor - public static class AgendaDetails { - private List discussions; // 논의 사항 - private List decisions; // 결정 사항 - } } \ No newline at end of file diff --git a/meeting/src/main/java/com/unicorn/hgzero/meeting/infra/gateway/MinutesSectionGateway.java b/meeting/src/main/java/com/unicorn/hgzero/meeting/infra/gateway/MinutesSectionGateway.java index c5a1675..ec809e1 100644 --- a/meeting/src/main/java/com/unicorn/hgzero/meeting/infra/gateway/MinutesSectionGateway.java +++ b/meeting/src/main/java/com/unicorn/hgzero/meeting/infra/gateway/MinutesSectionGateway.java @@ -4,7 +4,9 @@ import com.unicorn.hgzero.meeting.biz.domain.MinutesSection; import com.unicorn.hgzero.meeting.biz.usecase.out.MinutesSectionReader; import com.unicorn.hgzero.meeting.biz.usecase.out.MinutesSectionWriter; import com.unicorn.hgzero.meeting.infra.gateway.entity.MinutesSectionEntity; +import com.unicorn.hgzero.meeting.infra.gateway.entity.MinutesEntity; import com.unicorn.hgzero.meeting.infra.gateway.repository.MinutesSectionJpaRepository; +import com.unicorn.hgzero.meeting.infra.gateway.repository.MinutesJpaRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -23,6 +25,7 @@ import java.util.stream.Collectors; public class MinutesSectionGateway implements MinutesSectionReader, MinutesSectionWriter { private final MinutesSectionJpaRepository sectionJpaRepository; + private final MinutesJpaRepository minutesJpaRepository; @Override public Optional findById(String sectionId) { @@ -37,7 +40,6 @@ public class MinutesSectionGateway implements MinutesSectionReader, MinutesSecti .collect(Collectors.toList()); } - @Override public List findByMinutesIdAndType(String minutesId, String type) { return sectionJpaRepository.findByMinutesIdAndType(minutesId, type).stream() .map(MinutesSectionEntity::toDomain) @@ -73,6 +75,8 @@ public class MinutesSectionGateway implements MinutesSectionReader, MinutesSecti if (entity != null) { // 기존 엔티티 업데이트 (minutes 연관관계 유지) + entity.updateContent(section.getContent()); + if (section.getLocked() != null && section.getLocked()) { entity.lock(section.getLockedBy()); } else if (section.getLocked() != null && !section.getLocked()) { @@ -82,7 +86,7 @@ public class MinutesSectionGateway implements MinutesSectionReader, MinutesSecti entity.verify(); } } else { - // 새 엔티티 생성 + // 새 엔티티 생성 - minutes 연관관계 설정 필요 entity = MinutesSectionEntity.fromDomain(section); } @@ -90,6 +94,17 @@ public class MinutesSectionGateway implements MinutesSectionReader, MinutesSecti return savedEntity.toDomain(); } + @Override + public Optional findFirstByMinutesIdAndType(String minutesId, String type) { + return sectionJpaRepository.findFirstByMinutesIdAndType(minutesId, type) + .map(MinutesSectionEntity::toDomain); + } + + @Override + public int getMaxOrderByMinutesId(String minutesId) { + return sectionJpaRepository.getMaxOrderByMinutesId(minutesId); + } + @Override public void delete(String sectionId) { sectionJpaRepository.deleteById(sectionId); diff --git a/meeting/src/main/java/com/unicorn/hgzero/meeting/infra/gateway/entity/AgendaSectionEntity.java b/meeting/src/main/java/com/unicorn/hgzero/meeting/infra/gateway/entity/AgendaSectionEntity.java index c68c229..73de189 100644 --- a/meeting/src/main/java/com/unicorn/hgzero/meeting/infra/gateway/entity/AgendaSectionEntity.java +++ b/meeting/src/main/java/com/unicorn/hgzero/meeting/infra/gateway/entity/AgendaSectionEntity.java @@ -3,11 +3,16 @@ package com.unicorn.hgzero.meeting.infra.gateway.entity; import com.unicorn.hgzero.common.entity.BaseTimeEntity; import com.unicorn.hgzero.meeting.biz.domain.AgendaSection; import jakarta.persistence.*; -import lombok.*; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.JdbcTypeCode; +import org.hibernate.type.SqlTypes; /** - * 회의 안건 섹션 엔티티 - * agenda_sections 테이블과 매핑 + * 안건별 회의록 섹션 Entity + * PostgreSQL JSON 컬럼을 사용하여 구조화된 데이터 저장 */ @Entity @Table(name = "agenda_sections") @@ -16,43 +21,39 @@ import lombok.*; @NoArgsConstructor @AllArgsConstructor public class AgendaSectionEntity extends BaseTimeEntity { - + @Id - @Column(length = 36) + @Column(name = "id", length = 36) private String id; - + @Column(name = "minutes_id", length = 36, nullable = false) private String minutesId; - + @Column(name = "meeting_id", length = 50, nullable = false) private String meetingId; - + @Column(name = "agenda_number", nullable = false) private Integer agendaNumber; - + @Column(name = "agenda_title", length = 200, nullable = false) private String agendaTitle; - + @Column(name = "ai_summary_short", columnDefinition = "TEXT") private String aiSummaryShort; - - @Column(name = "discussions", columnDefinition = "TEXT") - private String discussions; - - @Column(name = "decisions", columnDefinition = "TEXT") - private String decisions; - - @Column(name = "opinions", columnDefinition = "TEXT") - private String opinions; - - @Column(name = "pending_items", columnDefinition = "TEXT") + + @JdbcTypeCode(SqlTypes.JSON) + @Column(name = "pending_items", columnDefinition = "json") private String pendingItems; - - @Column(name = "todos", columnDefinition = "TEXT") + + @JdbcTypeCode(SqlTypes.JSON) + @Column(name = "todos", columnDefinition = "json") private String todos; - + + @Column(name = "summary", columnDefinition = "TEXT") + private String summary; + /** - * 도메인 객체로 변환 + * Domain 객체로 변환 */ public AgendaSection toDomain() { return AgendaSection.builder() @@ -62,32 +63,36 @@ public class AgendaSectionEntity extends BaseTimeEntity { .agendaNumber(this.agendaNumber) .agendaTitle(this.agendaTitle) .aiSummaryShort(this.aiSummaryShort) - .discussions(this.discussions) - .decisions(this.decisions) - .opinions(this.opinions) .pendingItems(this.pendingItems) .todos(this.todos) + .summary(this.summary) .createdAt(this.getCreatedAt()) .updatedAt(this.getUpdatedAt()) .build(); } - + /** - * 도메인 객체에서 엔티티 생성 + * Domain 객체에서 Entity 생성 */ - public static AgendaSectionEntity fromDomain(AgendaSection domain) { + public static AgendaSectionEntity fromDomain(AgendaSection section) { return AgendaSectionEntity.builder() - .id(domain.getId()) - .minutesId(domain.getMinutesId()) - .meetingId(domain.getMeetingId()) - .agendaNumber(domain.getAgendaNumber()) - .agendaTitle(domain.getAgendaTitle()) - .aiSummaryShort(domain.getAiSummaryShort()) - .discussions(domain.getDiscussions()) - .decisions(domain.getDecisions()) - .opinions(domain.getOpinions()) - .pendingItems(domain.getPendingItems()) - .todos(domain.getTodos()) + .id(section.getId()) + .minutesId(section.getMinutesId()) + .meetingId(section.getMeetingId()) + .agendaNumber(section.getAgendaNumber()) + .agendaTitle(section.getAgendaTitle()) + .aiSummaryShort(section.getAiSummaryShort()) + .pendingItems(section.getPendingItems()) + .todos(section.getTodos()) + .summary(section.getSummary()) .build(); } -} \ No newline at end of file + + /** + * 요약 내용 업데이트 + */ + public void updateSummary(String summary) { + this.summary = summary; + } + +} diff --git a/meeting/src/main/java/com/unicorn/hgzero/meeting/infra/gateway/entity/MinutesEntity.java b/meeting/src/main/java/com/unicorn/hgzero/meeting/infra/gateway/entity/MinutesEntity.java index d40dcec..ee61ac5 100644 --- a/meeting/src/main/java/com/unicorn/hgzero/meeting/infra/gateway/entity/MinutesEntity.java +++ b/meeting/src/main/java/com/unicorn/hgzero/meeting/infra/gateway/entity/MinutesEntity.java @@ -72,6 +72,7 @@ public class MinutesEntity extends BaseTimeEntity { .decisions(this.decisions) .finalizedBy(this.finalizedBy) .finalizedAt(this.finalizedAt) + .decisions(this.decisions) .build(); } @@ -87,6 +88,7 @@ public class MinutesEntity extends BaseTimeEntity { .decisions(minutes.getDecisions()) .finalizedBy(minutes.getFinalizedBy()) .finalizedAt(minutes.getFinalizedAt()) + .decisions(minutes.getDecisions()) .build(); } diff --git a/meeting/src/main/java/com/unicorn/hgzero/meeting/infra/gateway/entity/MinutesSectionEntity.java b/meeting/src/main/java/com/unicorn/hgzero/meeting/infra/gateway/entity/MinutesSectionEntity.java index 00da90b..740f186 100644 --- a/meeting/src/main/java/com/unicorn/hgzero/meeting/infra/gateway/entity/MinutesSectionEntity.java +++ b/meeting/src/main/java/com/unicorn/hgzero/meeting/infra/gateway/entity/MinutesSectionEntity.java @@ -90,4 +90,8 @@ public class MinutesSectionEntity extends BaseTimeEntity { this.locked = false; this.lockedBy = null; } + + public void updateContent(String content) { + this.content = content; + } } diff --git a/meeting/src/main/java/com/unicorn/hgzero/meeting/infra/gateway/repository/AgendaSectionRepository.java b/meeting/src/main/java/com/unicorn/hgzero/meeting/infra/gateway/repository/AgendaSectionRepository.java index 295e9d6..aa20373 100644 --- a/meeting/src/main/java/com/unicorn/hgzero/meeting/infra/gateway/repository/AgendaSectionRepository.java +++ b/meeting/src/main/java/com/unicorn/hgzero/meeting/infra/gateway/repository/AgendaSectionRepository.java @@ -2,6 +2,9 @@ package com.unicorn.hgzero.meeting.infra.gateway.repository; import com.unicorn.hgzero.meeting.infra.gateway.entity.AgendaSectionEntity; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; import java.util.List; @@ -25,4 +28,14 @@ public interface AgendaSectionRepository extends JpaRepository findByMeetingIdOrderByAgendaNumber(String meetingId); + + /** + * 안건 섹션 요약 업데이트 (Native Query 사용) + * @param agendaId 안건 ID + * @param summary 요약 내용 + */ + @Modifying + @Query(value = "UPDATE agenda_sections SET summary = :summary, updated_at = CURRENT_TIMESTAMP WHERE id = :agendaId", + nativeQuery = true) + void updateSummaryById(@Param("agendaId") String agendaId, @Param("summary") String summary); } \ No newline at end of file diff --git a/meeting/src/main/java/com/unicorn/hgzero/meeting/infra/gateway/repository/MinutesSectionJpaRepository.java b/meeting/src/main/java/com/unicorn/hgzero/meeting/infra/gateway/repository/MinutesSectionJpaRepository.java index dbe2fa4..af7b256 100644 --- a/meeting/src/main/java/com/unicorn/hgzero/meeting/infra/gateway/repository/MinutesSectionJpaRepository.java +++ b/meeting/src/main/java/com/unicorn/hgzero/meeting/infra/gateway/repository/MinutesSectionJpaRepository.java @@ -7,6 +7,7 @@ import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; import java.util.List; +import java.util.Optional; /** * 회의록 섹션 JPA Repository @@ -39,4 +40,15 @@ public interface MinutesSectionJpaRepository extends JpaRepository findByLockedBy(String lockedBy); + + /** + * 회의록 ID와 타입으로 단일 섹션 조회 + */ + Optional findFirstByMinutesIdAndType(String minutesId, String type); + + /** + * 회의록 ID로 최대 order 값 조회 + */ + @Query("SELECT COALESCE(MAX(m.order), 0) FROM MinutesSectionEntity m WHERE m.minutesId = :minutesId") + int getMaxOrderByMinutesId(@Param("minutesId") String minutesId); }