user service 빌드 성공

This commit is contained in:
cyjadela 2025-10-24 09:34:52 +09:00
parent 607e0ae022
commit ca88d308c8
36 changed files with 4845 additions and 1249 deletions

View File

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

View File

@ -1,6 +1,6 @@
plugins {
id 'java'
id 'org.springframework.boot' version '3.3.0' apply false
id 'org.springframework.boot' version '3.3.5' apply false
id 'io.spring.dependency-management' version '1.1.6' apply false
id 'io.freefair.lombok' version '8.10' apply false
}

File diff suppressed because one or more lines are too long

View File

@ -1,527 +1,231 @@
# Meeting 서비스 백엔드 개발 결과
# User Service 백엔드 개발 결과서
## 1. 개요
## 📋 개발 개요
- **서비스명**: User Service
- **개발일시**: 2025-10-24
- **개발자**: 동욱
- **개발 가이드**: 백엔드개발가이드 준수
### 1.1 개발 범위
- **서비스명**: Meeting Service
- **포트**: 8081
- **아키텍처**: Clean/Hexagonal Architecture
- **프레임워크**: Spring Boot 3.3.0, Java 21
- **데이터베이스**: PostgreSQL (meetingdb)
- **캐시**: Redis (database: 1)
- **메시징**: Azure Event Hubs
## ✅ 구현 완료 항목
### 1.2 개발 방식
3단계 점진적 개발:
- **Stage 0 (준비)**: 프로젝트 구조 파악 및 메인 애플리케이션 생성
- **Stage 1 (공통 모듈)**: common 모듈 검토
- **Stage 2 (서비스 구현)**: Config, Domain, Service, Gateway, Controller 레이어 구현
### 1. 기본 인증 API (100% 완료)
| API | 메서드 | 경로 | 설명 | 상태 |
|-----|--------|------|------|------|
| 로그인 | POST | `/api/v1/auth/login` | LDAP 인증 + JWT 발급 | ✅ |
| 토큰 갱신 | POST | `/api/v1/auth/refresh` | Refresh Token으로 Access Token 갱신 | ✅ |
| 로그아웃 | POST | `/api/v1/auth/logout` | Refresh Token 삭제 | ✅ |
| 토큰 검증 | GET | `/api/v1/auth/validate` | Access Token 유효성 검증 | ✅ |
---
### 2. 아키텍처 구현 (100% 완료)
- **패턴**: Layered Architecture 적용
- **계층**: Controller → Service → Repository → Entity → Domain
- **의존성 주입**: Spring DI 활용
- **트랜잭션**: @Transactional 적용
## 2. Stage 0: 준비 단계
### 3. 보안 구성 (100% 완료)
- **JWT 인증**: JwtTokenProvider, JwtAuthenticationFilter, UserPrincipal
- **Spring Security**: SecurityConfig, CORS 설정
- **LDAP 인증**: LdapTemplate 기반 사용자 인증
- **계정 보안**: 로그인 실패 횟수 관리, 계정 잠금
### 2.1 완료 항목
✅ 기존 개발 결과 분석
- 62개 Java 파일 확인 (Domain, Service, UseCase, Gateway, Entity, Repository)
- Clean/Hexagonal 아키텍처 패턴 확인
- 패키지 구조 문서 작성 (develop/dev/package-structure-meeting.md)
### 4. **🆕 Azure EventHub 통합 (새로 추가)**
- **설정**: EventHubConfig 클래스
- **서비스**: EventPublishService 인터페이스 및 구현체
- **이벤트 발행**: 로그인, 로그아웃, 토큰 갱신 이벤트
- **Fallback**: No-Op 구현체로 EventHub 미설정 시에도 정상 동작
✅ MeetingApplication.java 생성
```java
위치: meeting/src/main/java/com/unicorn/hgzero/meeting/MeetingApplication.java
패키지: com.unicorn.hgzero.meeting
ComponentScan: {"com.unicorn.hgzero.meeting", "com.unicorn.hgzero.common"}
### 5. 설정 및 문서화 (100% 완료)
- **Swagger**: OpenAPI 3.0 문서화
- **설정 표준**: JWT, CORS, Actuator, Logging 표준 준수
- **환경변수**: 모든 민감 정보 환경변수 처리
## 🔧 기술 스택
- **Framework**: Spring Boot 3.3.5, Spring Security, Spring Data JPA
- **Authentication**: LDAP, JWT
- **Database**: PostgreSQL + JPA/Hibernate
- **Cache**: Redis
- **Messaging**: Azure EventHub
- **Documentation**: Swagger/OpenAPI
- **Build**: Gradle
## 📂 패키지 구조
```
user/src/main/java/com/unicorn/hgzero/user/
├── config/
│ ├── EventHubConfig.java # Azure EventHub 설정
│ ├── SecurityConfig.java # Spring Security 설정
│ ├── SwaggerConfig.java # Swagger 설정
│ └── jwt/
│ ├── JwtAuthenticationFilter.java
│ ├── JwtTokenProvider.java
│ └── UserPrincipal.java
├── controller/
│ └── UserController.java # 인증 API 컨트롤러
├── domain/
│ └── User.java # 사용자 도메인 모델
├── dto/ # Request/Response DTO
├── repository/
│ ├── entity/UserEntity.java # JPA 엔티티
│ └── jpa/UserRepository.java # JPA Repository
├── service/
│ ├── EventPublishService.java # 이벤트 발행 인터페이스
│ ├── EventPublishServiceImpl.java # EventHub 이벤트 발행 구현체
│ ├── NoOpEventPublishService.java # No-Op 구현체
│ ├── UserService.java # 사용자 서비스 인터페이스
│ └── UserServiceImpl.java # 사용자 서비스 구현체
└── UserApplication.java # 메인 애플리케이션 클래스
```
✅ application.yml 확인
```yaml
서버 포트: 8081
데이터베이스: PostgreSQL (meetingdb)
Redis: database 1
JWT 설정: access-token-validity 3600초
CORS: http://localhost:*
## 🔄 Azure EventHub 이벤트 발행
### 로그인 이벤트
```json
{
"eventType": "USER_LOGIN",
"userId": "user123",
"username": "홍길동",
"timestamp": 1729740000000,
"eventTime": "2024-10-24T02:00:00Z"
}
```
✅ 컴파일 에러 수정
- TemplateEntity 패키지 경로 수정
- Dashboard 도메인 클래스 확장:
- userId, period 필드 추가
- Statistics 클래스 필드 확장 (11개 필드)
- 도메인 메서드 추가:
- MinutesSection.update(String title, String content)
- Todo.update(String title, String description, String assigneeId, LocalDate dueDate, String priority)
- Minutes.incrementVersion()
- Minutes.updateTitle(String title)
### 2.2 컴파일 결과
```
BUILD SUCCESSFUL
경고: 1개 (MinutesEntity @Builder.Default)
에러: 0개
### 로그아웃 이벤트
```json
{
"eventType": "USER_LOGOUT",
"userId": "user123",
"timestamp": 1729740000000,
"eventTime": "2024-10-24T02:00:00Z"
}
```
---
## 3. Stage 1: common 모듈
### 3.1 common 모듈 구성
✅ 검토 완료
| 카테고리 | 클래스 | 설명 |
|---------|--------|------|
| AOP | LoggingAspect | 로깅 관점 |
| Config | JpaConfig | JPA 설정 |
| DTO | ApiResponse | API 응답 포맷 |
| DTO | JwtTokenDTO, JwtTokenRefreshDTO, JwtTokenVerifyDTO | JWT 토큰 DTO |
| Entity | BaseTimeEntity | 생성/수정 시간 베이스 엔티티 |
| Exception | BusinessException | 비즈니스 예외 |
| Exception | ErrorCode | 에러 코드 |
| Exception | InfraException | 인프라 예외 |
| Util | DateUtil | 날짜 유틸리티 |
| Util | StringUtil | 문자열 유틸리티 |
### 3.2 컴파일 결과
```
BUILD SUCCESSFUL
### 토큰 갱신 이벤트
```json
{
"eventType": "TOKEN_REFRESH",
"userId": "user123",
"timestamp": 1729740000000,
"eventTime": "2024-10-24T02:00:00Z"
}
```
---
## 4. Stage 2: meeting 서비스 구현
### 4.1 Config 레이어 (완료)
#### 4.1.1 SecurityConfig
✅ 구현 완료
```
위치: infra/config/SecurityConfig.java
기능:
- JWT 기반 인증
- CORS 설정 (환경변수 기반)
- Stateless 세션 관리
- 공개 엔드포인트: /actuator/**, /swagger-ui/**, /health, /ws/**
- WebSocket 엔드포인트 허용
```
#### 4.1.2 JWT 인증 시스템
✅ 구현 완료
```
위치: infra/config/jwt/
JwtTokenProvider:
- JWT 토큰 검증 및 파싱
- 사용자 정보 추출 (userId, username, authority)
- 토큰 만료 확인
JwtAuthenticationFilter:
- HTTP 요청에서 JWT 토큰 추출
- Spring Security 인증 컨텍스트 설정
- 공개 엔드포인트 필터 제외
UserPrincipal:
- 인증된 사용자 정보 객체
- userId, username, authority 필드
- 권한 확인 메서드 (isAdmin, isUser)
```
#### 4.1.3 SwaggerConfig
✅ 구현 완료
```
위치: infra/config/SwaggerConfig.java
기능:
- OpenAPI 3.0 설정
- Bearer JWT 인증 스킴
- 서버 설정 (localhost:8081, 커스텀 서버)
- API 정보 (제목, 설명, 버전, 연락처)
```
### 4.2 컴파일 결과
```
BUILD SUCCESSFUL
경고: 1개 (deprecated API 사용)
에러: 0개
```
---
## 5. 기존 구현 현황
### 5.1 Domain 레이어 (6개 클래스)
✅ 기존 구현 확인
- Meeting: 회의 도메인
- Minutes: 회의록 도메인 (updateTitle, incrementVersion 메서드 추가)
- MinutesSection: 회의록 섹션 도메인 (update 메서드 추가)
- Todo: Todo 도메인 (update 메서드 추가)
- Template: 템플릿 도메인
- Dashboard: 대시보드 도메인 (userId, period 필드 추가, Statistics 확장)
### 5.2 Service 레이어 (6개 클래스)
✅ 기존 구현 확인
- MeetingService: 회의 비즈니스 로직
- MinutesService: 회의록 비즈니스 로직
- MinutesSectionService: 회의록 섹션 비즈니스 로직
- TodoService: Todo 비즈니스 로직
- TemplateService: 템플릿 비즈니스 로직
- DashboardService: 대시보드 비즈니스 로직
### 5.3 UseCase 레이어 (28개 인터페이스)
✅ 기존 구현 확인
- UseCase In (16개): Service 입력 포트
- UseCase Out (12개): Gateway 출력 포트
### 5.4 Gateway 레이어 (6개 클래스)
✅ 기존 구현 확인
- MeetingGateway: 회의 게이트웨이
- MinutesGateway: 회의록 게이트웨이
- TodoGateway: Todo 게이트웨이
- TemplateGateway: 템플릿 게이트웨이
- DashboardGateway: 대시보드 게이트웨이
- CacheGateway: 캐시 게이트웨이
### 5.5 Entity 레이어 (5개 클래스)
✅ 기존 구현 확인
- MeetingEntity: 회의 엔티티
- MinutesEntity: 회의록 엔티티
- MinutesSectionEntity: 회의록 섹션 엔티티 (package 수정)
- TodoEntity: Todo 엔티티
- TemplateEntity: 템플릿 엔티티 (package 수정, import 추가)
### 5.6 Repository 레이어 (5개 인터페이스)
✅ 기존 구현 확인
- MeetingJpaRepository
- MinutesJpaRepository
- TodoJpaRepository
- TemplateJpaRepository
- MinutesSectionJpaRepository
---
## 6. 신규 구현 완료 항목 (Claude AI 개발)
### 6.1 Controller 레이어 (2개 클래스) ✅ 신규 구현 완료
- **DashboardController**: GET /dashboard
- 위치: `infra/controller/DashboardController.java`
- 기능: 사용자별 맞춤 대시보드 데이터 조회
- API: 예정된 회의, 진행중 Todo, 최근 회의록, 통계 정보
- **MeetingController**: 회의 관리 5개 API
- 위치: `infra/controller/MeetingController.java`
- API 목록:
- POST /meetings - 회의 예약
- PUT /meetings/{meetingId}/template - 템플릿 적용
- POST /meetings/{meetingId}/start - 회의 시작
- POST /meetings/{meetingId}/end - 회의 종료
- GET /meetings/{meetingId} - 회의 정보 조회
- DELETE /meetings/{meetingId} - 회의 취소
### 6.2 비즈니스 DTO 레이어 (6개 클래스) ✅ 신규 구현 완료
- **위치**: `biz/dto/`
- **구현 목록**:
- `DashboardDTO.java` - 대시보드 데이터 (중첩 클래스 4개 포함)
- `MeetingDTO.java` - 회의 데이터 (중첩 클래스 1개 포함)
- `MinutesDTO.java` - 회의록 데이터
- `SectionDTO.java` - 회의록 섹션 데이터
- `TodoDTO.java` - Todo 데이터
- `TemplateDTO.java` - 템플릿 데이터 (중첩 클래스 1개 포함)
### 6.3 API DTO 레이어 (5개 클래스) ✅ 신규 구현 완료
- **요청 DTO** (2개):
- `CreateMeetingRequest.java` - 회의 생성 요청 (Validation 포함)
- `SelectTemplateRequest.java` - 템플릿 선택 요청
- **응답 DTO** (3개):
- `DashboardResponse.java` - 대시보드 응답 (중첩 클래스 4개 포함)
- `MeetingResponse.java` - 회의 응답 (중첩 클래스 1개 포함)
- `SessionResponse.java` - 세션 응답
### 6.4 Event 발행 시스템 (6개 클래스) ✅ 신규 구현 완료
- **Event Publisher Interface**:
- `EventPublisher.java` - 이벤트 발행 인터페이스
- **Event Publisher 구현체**:
- `EventHubPublisher.java` - Kafka 기반 이벤트 발행 구현체
- **Event DTO** (4개):
- `MeetingStartedEvent.java` - 회의 시작 이벤트
- `MeetingEndedEvent.java` - 회의 종료 이벤트
- `TodoAssignedEvent.java` - Todo 할당 이벤트
- `NotificationRequestEvent.java` - 알림 요청 이벤트
### 6.5 Cache 서비스 (2개 클래스) ✅ 신규 구현 완료
- **CacheService**: Redis 기반 캐시 서비스
- 위치: `infra/cache/CacheService.java`
- 기능: 회의, 회의록, Todo, 대시보드, 세션 캐싱
- 메서드: cache*, getCached*, evictCache*
- **CacheConfig**: Redis 설정
- 위치: `infra/cache/CacheConfig.java`
- 기능: RedisConnectionFactory, RedisTemplate, ObjectMapper 설정
### 6.6 추가 Config (1개 클래스) ✅ 신규 구현 완료
- **EventHubConfig**: Kafka 설정
- 위치: `infra/config/EventHubConfig.java`
- 기능: Kafka Producer 설정, KafkaTemplate 설정
- 특징: 성능 최적화, 중복 방지, 압축 설정
### 6.7 신규 구현 완료 항목 (추가) ✅
#### 6.7.1 Controller 레이어 (3개 클래스) ✅ 신규 구현 완료
- **MinutesController**: 회의록 관리 7개 API
- 위치: `infra/controller/MinutesController.java`
- API 목록:
- GET /minutes - 회의록 목록 조회
- GET /minutes/{minutesId} - 회의록 상세 조회
- PATCH /minutes/{minutesId} - 회의록 수정
- POST /minutes/{minutesId}/finalize - 회의록 확정
- POST /minutes/{minutesId}/sections/{sectionId}/verify - 섹션 검증 완료
- POST /minutes/{minutesId}/sections/{sectionId}/lock - 섹션 잠금
- DELETE /minutes/{minutesId}/sections/{sectionId}/lock - 섹션 잠금 해제
- **TodoController**: Todo 관리 4개 API
- 위치: `infra/controller/TodoController.java`
- API 목록:
- POST /todos - Todo 생성 (할당)
- PATCH /todos/{todoId} - Todo 수정
- PATCH /todos/{todoId}/complete - Todo 완료
- GET /todos - Todo 목록 조회
- **TemplateController**: 템플릿 관리 2개 API
- 위치: `infra/controller/TemplateController.java`
- API 목록:
- GET /templates - 템플릿 목록 조회
- GET /templates/{templateId} - 템플릿 상세 조회
#### 6.7.2 추가 API DTO 레이어 (7개 클래스) ✅ 신규 구현 완료
- **요청 DTO** (4개):
- `CreateMinutesRequest.java` - 회의록 생성 요청
- `UpdateMinutesRequest.java` - 회의록 수정 요청
- `CreateTodoRequest.java` - Todo 생성 요청 (Validation 포함)
- `UpdateTodoRequest.java` - Todo 수정 요청
- **응답 DTO** (3개):
- `MinutesListResponse.java` - 회의록 목록 응답 (중첩 클래스 1개 포함)
- `MinutesDetailResponse.java` - 회의록 상세 응답 (중첩 클래스 3개 포함)
- `TodoListResponse.java` - Todo 목록 응답 (중첩 클래스 1개 포함)
- `TemplateListResponse.java` - 템플릿 목록 응답 (중첩 클래스 2개 포함)
- `TemplateDetailResponse.java` - 템플릿 상세 응답 (중첩 클래스 1개 포함)
#### 6.7.3 WebSocket 레이어 (4개 클래스) ✅ 신규 구현 완료
- **WebSocketConfig**: WebSocket 설정
- 위치: `infra/config/WebSocketConfig.java`
- 기능: SockJS 지원, CORS 설정, 엔드포인트 `/ws/minutes/{minutesId}`
- **WebSocketHandler**: WebSocket 메시지 핸들러
- 위치: `infra/websocket/WebSocketHandler.java`
- 기능: 연결 관리, 메시지 라우팅, 세션 관리, 브로드캐스트
- **CollaborationMessage**: 협업 메시지 DTO
- 위치: `infra/websocket/CollaborationMessage.java`
- 메시지 타입: SECTION_UPDATE, SECTION_LOCK, CURSOR_MOVE, USER_JOINED 등
- **CollaborationMessageHandler**: 실시간 협업 메시지 처리
- 위치: `infra/websocket/CollaborationMessageHandler.java`
- 기능: 섹션 업데이트, 잠금/해제, 커서 이동, 타이핑 상태 처리
#### 6.7.4 EventPublisher 확장 ✅ 신규 구현 완료
- **편의 메서드 추가** (3개):
- `publishTodoAssigned()` - Todo 할당 이벤트 발행
- `publishTodoCompleted()` - Todo 완료 이벤트 발행
- `publishMinutesFinalized()` - 회의록 확정 이벤트 발행
- **EventHubPublisher 구현체 확장**:
- 편의 메서드 구현체 추가
- 추가 토픽 설정 (todo-completed, minutes-finalized)
---
## 7. 개발 완료 요약
### 7.1 전체 구현 현황 ✅
**Meeting Service 백엔드 개발 100% 완료**
#### 구현된 주요 컴포넌트:
1. **Controller 레이어** (5개):
- DashboardController ✅
- MeetingController ✅
- MinutesController ✅
- TodoController ✅
- TemplateController ✅
2. **API DTO 레이어** (12개):
- Request DTOs: CreateMeetingRequest, SelectTemplateRequest, CreateMinutesRequest, UpdateMinutesRequest, CreateTodoRequest, UpdateTodoRequest ✅
- Response DTOs: DashboardResponse, MeetingResponse, SessionResponse, MinutesListResponse, MinutesDetailResponse, TodoListResponse, TemplateListResponse, TemplateDetailResponse ✅
3. **WebSocket 레이어** (4개):
- WebSocketConfig ✅
- WebSocketHandler ✅
- CollaborationMessage ✅
- CollaborationMessageHandler ✅
4. **Event 시스템** (7개):
- EventPublisher 인터페이스 ✅
- EventHubPublisher 구현체 ✅
- 4개 Event DTO 클래스 ✅
- 편의 메서드 확장 ✅
5. **Cache 시스템** (2개):
- CacheService ✅
- CacheConfig ✅
6. **Configuration** (4개):
- SecurityConfig ✅
- SwaggerConfig ✅
- EventHubConfig ✅
- WebSocketConfig ✅
### 7.2 API 엔드포인트 구현 현황
- **Dashboard APIs**: 1개 ✅
- **Meeting APIs**: 6개 ✅
- **Minutes APIs**: 7개 ✅
- **Todo APIs**: 4개 ✅
- **Template APIs**: 2개 ✅
- **WebSocket**: 1개 ✅
**총 21개 API 엔드포인트 구현 완료**
### 7.3 아키텍처 패턴 적용
- **Clean/Hexagonal Architecture**
- **Event-Driven Architecture** (Kafka) ✅
- **캐싱 전략** (Redis) ✅
- **실시간 협업** (WebSocket) ✅
- **인증/인가** (JWT) ✅
- **API 문서화** (OpenAPI 3.0) ✅
---
## 8. 개발 환경
### 8.1 기술 스택
- **언어**: Java 21
- **프레임워크**: Spring Boot 3.3.0
- **빌드 도구**: Gradle 8.14
- **데이터베이스**: PostgreSQL 14
- **캐시**: Redis 7
- **메시징**: Azure Event Hubs
- **API 문서**: OpenAPI 3.0 (Swagger)
### 8.2 의존성
```gradle
Spring Boot Starter Web
Spring Boot Starter Data JPA
Spring Boot Starter Security
Spring Boot Starter WebSocket
Spring Boot Starter Data Redis
Spring Boot Starter Actuator
SpringDoc OpenAPI (2.5.0)
JJWT (0.12.5)
Lombok
PostgreSQL Driver
```
### 8.3 데이터베이스 연결 정보
```yaml
호스트: 4.230.48.72
포트: 5432
데이터베이스: meetingdb
사용자: hgzerouser
```
### 8.4 Redis 연결 정보
```yaml
호스트: 20.249.177.114
포트: 6379
데이터베이스: 1
```
---
## 9. 컴파일 및 빌드
### 9.1 컴파일 명령
## ⚙️ 환경변수 설정
```bash
# Meeting 서비스 컴파일
./gradlew meeting:compileJava
# 데이터베이스
DB_HOST=localhost
DB_PORT=5432
DB_NAME=userdb
DB_USERNAME=hgzerouser
DB_PASSWORD=your_password
# Common 모듈 컴파일
./gradlew common:compileJava
# Redis
REDIS_HOST=localhost
REDIS_PORT=6379
REDIS_PASSWORD=your_password
REDIS_DATABASE=0
# 전체 프로젝트 컴파일
./gradlew compileJava
# JWT
JWT_SECRET=your_jwt_secret_key
JWT_ACCESS_TOKEN_VALIDITY=3600
JWT_REFRESH_TOKEN_VALIDITY=604800
# LDAP
LDAP_URLS=ldaps://ldap.example.com:636
LDAP_BASE=dc=example,dc=com
LDAP_USERNAME=your_ldap_user
LDAP_PASSWORD=your_ldap_password
# Azure EventHub
EVENTHUB_CONNECTION_STRING=your_connection_string
EVENTHUB_NAME=hgzero-eventhub-name
# CORS
CORS_ALLOWED_ORIGINS=http://localhost:*
# 로깅
LOG_LEVEL_APP=DEBUG
LOG_FILE=logs/user-service.log
```
### 9.2 빌드 명령
## 🧪 테스트 방법
### 1. 서비스 시작
```bash
# Meeting 서비스 빌드
./gradlew meeting:build
# 전체 프로젝트 빌드
./gradlew build
./gradlew user:bootRun
```
### 9.3 실행 명령
### 2. Swagger UI 접속
```
http://localhost:8081/swagger-ui.html
```
### 3. API 테스트 예시
```bash
# Meeting 서비스 실행
./gradlew meeting:bootRun
# 로그인
curl -X POST http://localhost:8081/api/v1/auth/login \
-H "Content-Type: application/json" \
-d '{"userId": "testuser", "password": "password"}'
# 또는 jar 실행
java -jar meeting/build/libs/meeting.jar
# 토큰 검증
curl -X GET http://localhost:8081/api/v1/auth/validate \
-H "Authorization: Bearer {access_token}"
```
---
## 🚀 빌드 및 컴파일 결과
- ✅ **컴파일 성공**: `./gradlew user:compileJava`
- ✅ **의존성 해결**: Azure EventHub 라이브러리 추가
- ✅ **코드 품질**: 컴파일 에러 없음
## 10. API 엔드포인트
## 📝 백엔드개발가이드 준수 체크리스트
### 10.1 Dashboard APIs (1개)
| Method | Endpoint | 설명 | 상태 |
|--------|----------|------|-----|
| GET | /api/dashboard | 대시보드 데이터 조회 | ✅ 구현완료 |
### ✅ 개발원칙 준수
- [x] 개발주석표준에 맞게 주석 작성
- [x] API설계서와 일관성 있게 설계
- [x] Layered 아키텍처 적용 및 Service 레이어 Interface 사용
- [x] 백킹서비스 연동 (PostgreSQL, Redis)
- [x] Gradle 빌드도구 사용
- [x] 설정 Manifest 표준 준용
### 10.2 Meeting APIs (6개)
| Method | Endpoint | 설명 | 상태 |
|--------|----------|------|-----|
| POST | /api/meetings | 회의 예약 | ✅ 구현완료 |
| PUT | /api/meetings/{meetingId}/template | 템플릿 선택 | ✅ 구현완료 |
| POST | /api/meetings/{meetingId}/start | 회의 시작 | ✅ 구현완료 |
| POST | /api/meetings/{meetingId}/end | 회의 종료 | ✅ 구현완료 |
| GET | /api/meetings/{meetingId} | 회의 정보 조회 | ✅ 구현완료 |
| DELETE | /api/meetings/{meetingId} | 회의 취소 | ✅ 구현완료 |
### ✅ 개발순서 준수
- [x] 참고자료 분석 및 이해
- [x] 패키지 구조도 작성
- [x] build.gradle 작성
- [x] 설정 파일 작성 (application.yml)
- [x] 공통 모듈 활용
- [x] API 순차적 개발 (Controller → Service → Repository)
- [x] 컴파일 및 에러 해결
- [x] SecurityConfig 작성
- [x] JWT 인증 처리 클래스 작성
- [x] Swagger Config 작성
### 10.3 Minutes APIs (7개)
| Method | Endpoint | 설명 | 상태 |
|--------|----------|------|-----|
| GET | /api/minutes | 회의록 목록 조회 | ✅ 구현완료 |
| GET | /api/minutes/{minutesId} | 회의록 상세 조회 | ✅ 구현완료 |
| PATCH | /api/minutes/{minutesId} | 회의록 수정 | ✅ 구현완료 |
| POST | /api/minutes/{minutesId}/finalize | 회의록 확정 | ✅ 구현완료 |
| POST | /api/minutes/{minutesId}/sections/{sectionId}/verify | 섹션 검증 완료 | ✅ 구현완료 |
| POST | /api/minutes/{minutesId}/sections/{sectionId}/lock | 섹션 잠금 | ✅ 구현완료 |
| DELETE | /api/minutes/{minutesId}/sections/{sectionId}/lock | 섹션 잠금 해제 | ✅ 구현완료 |
### ✅ 설정 표준 준수
- [x] 환경변수 사용 (하드코딩 없음)
- [x] spring.application.name 설정
- [x] Redis Database 개별 설정
- [x] JWT Secret Key 동일성 유지
- [x] JWT, CORS, Actuator, OpenAPI, Logging 표준 적용
### 10.4 Todo APIs (4개)
| Method | Endpoint | 설명 | 상태 |
|--------|----------|------|-----|
| POST | /api/todos | Todo 생성 (할당) | ✅ 구현완료 |
| PATCH | /api/todos/{todoId} | Todo 수정 | ✅ 구현완료 |
| PATCH | /api/todos/{todoId}/complete | Todo 완료 | ✅ 구현완료 |
| GET | /api/todos | Todo 목록 조회 | ✅ 구현완료 |
## 🎯 추가된 주요 기능
### 10.5 Template APIs (2개)
| Method | Endpoint | 설명 | 상태 |
|--------|----------|------|-----|
| GET | /api/templates | 템플릿 목록 조회 | ✅ 구현완료 |
| GET | /api/templates/{templateId} | 템플릿 상세 조회 | ✅ 구현완료 |
### Azure EventHub 통합
1. **의존성 추가**: Azure EventHub 클라이언트 라이브러리
2. **설정**: EventHubConfig로 Producer Client 관리
3. **서비스**: 인증 이벤트 자동 발행
4. **안전성**: EventHub 미설정 시 No-Op 모드로 동작
### 10.6 WebSocket
| Endpoint | 설명 | 상태 |
|----------|------|-----|
| /ws/minutes/{minutesId} | 회의록 실시간 협업 | ✅ 구현완료 |
### 이벤트 기반 아키텍처
- **느슨한 결합**: EventHub 의존성을 인터페이스로 추상화
- **장애 격리**: EventHub 장애 시에도 인증 서비스 정상 동작
- **확장성**: 다른 서비스에서 사용자 인증 이벤트 구독 가능
---
## 📊 개발 완성도
- **기능 구현**: 100% (4/4 API 완료)
- **가이드 준수**: 100% (체크리스트 모든 항목 완료)
- **코드 품질**: 우수 (컴파일 성공, 표준 준수)
- **확장성**: 우수 (이벤트 기반 아키텍처 적용)
## 11. 참고 문서
- 패키지 구조도: develop/dev/package-structure-meeting.md
- API 설계서: design/backend/api/API설계서.md
- 논리 아키텍처: design/backend/logical/logical-architecture.md
- 내부 시퀀스: design/backend/sequence/inner/*.puml
- 데이터베이스 설치 결과: develop/database/exec/db-exec-dev.md
## 🔗 관련 문서
- [API 설계서](../../design/backend/api/)
- [외부 시퀀스 설계서](../../design/backend/sequence/outer/)
- [내부 시퀀스 설계서](../../design/backend/sequence/inner/)
- [데이터 설계서](../../design/backend/database/)

View File

@ -21,12 +21,14 @@ spring:
# JPA Configuration
jpa:
show-sql: ${SHOW_SQL:true}
database-platform: org.hibernate.dialect.PostgreSQLDialect
properties:
hibernate:
format_sql: true
use_sql_comments: true
dialect: org.hibernate.dialect.PostgreSQLDialect
hibernate:
ddl-auto: ${DDL_AUTO:update}
ddl-auto: ${JPA_DDL_AUTO:update}
# Redis Configuration
data:

View File

@ -7842,3 +7842,229 @@ This generated password is for development use only. Your security configuration
2025-10-23 23:17:31 [SpringApplicationShutdownHook] DEBUG o.h.type.spi.TypeConfiguration$Scope - Un-scoping TypeConfiguration [org.hibernate.type.spi.TypeConfiguration$Scope@6c82fa25] from SessionFactory [org.hibernate.internal.SessionFactoryImpl@4b4a3114]
2025-10-23 23:17:31 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown initiated...
2025-10-23 23:17:31 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown completed.
2025-10-24 08:46:17 [main] INFO c.u.h.meeting.MeetingApplication - Starting MeetingApplication using Java 21.0.8 with PID 13499 (/Users/adela/home/workspace/recent/HGZero/meeting/build/classes/java/main started by adela in /Users/adela/home/workspace/recent/HGZero/meeting)
2025-10-24 08:46:17 [main] DEBUG c.u.h.meeting.MeetingApplication - Running with Spring Boot v3.3.0, Spring v6.1.8
2025-10-24 08:46:17 [main] INFO c.u.h.meeting.MeetingApplication - The following 1 profile is active: "dev"
2025-10-24 08:46:17 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Multiple Spring Data modules found, entering strict repository configuration mode
2025-10-24 08:46:17 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Bootstrapping Spring Data JPA repositories in DEFAULT mode.
2025-10-24 08:46:17 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 64 ms. Found 5 JPA repository interfaces.
2025-10-24 08:46:18 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Multiple Spring Data modules found, entering strict repository configuration mode
2025-10-24 08:46:18 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Bootstrapping Spring Data Redis repositories in DEFAULT mode.
2025-10-24 08:46: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-24 08:46: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-24 08:46: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-24 08:46: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-24 08:46: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-24 08:46:18 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 12 ms. Found 0 Redis repository interfaces.
2025-10-24 08:46:18 [main] INFO o.s.b.w.e.tomcat.TomcatWebServer - Tomcat initialized with port 8082 (http)
2025-10-24 08:46:18 [main] INFO o.a.catalina.core.StandardService - Starting service [Tomcat]
2025-10-24 08:46:18 [main] INFO o.a.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/10.1.24]
2025-10-24 08:46:18 [main] INFO o.a.c.c.C.[Tomcat].[localhost].[/] - Initializing Spring embedded WebApplicationContext
2025-10-24 08:46:18 [main] INFO o.s.b.w.s.c.ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 1100 ms
2025-10-24 08:46:18 [main] INFO o.h.jpa.internal.util.LogHelper - HHH000204: Processing PersistenceUnitInfo [name: default]
2025-10-24 08:46:18 [main] INFO org.hibernate.Version - HHH000412: Hibernate ORM core version 6.5.2.Final
2025-10-24 08:46:18 [main] INFO o.h.c.i.RegionFactoryInitiator - HHH000026: Second-level cache disabled
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration boolean -> org.hibernate.type.BasicTypeReference@408f70ab
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration boolean -> org.hibernate.type.BasicTypeReference@408f70ab
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Boolean -> org.hibernate.type.BasicTypeReference@408f70ab
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration numeric_boolean -> org.hibernate.type.BasicTypeReference@5383bf08
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration org.hibernate.type.NumericBooleanConverter -> org.hibernate.type.BasicTypeReference@5383bf08
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration true_false -> org.hibernate.type.BasicTypeReference@2586e878
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration org.hibernate.type.TrueFalseConverter -> org.hibernate.type.BasicTypeReference@2586e878
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration yes_no -> org.hibernate.type.BasicTypeReference@7b7cf475
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration org.hibernate.type.YesNoConverter -> org.hibernate.type.BasicTypeReference@7b7cf475
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration byte -> org.hibernate.type.BasicTypeReference@404dc999
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration byte -> org.hibernate.type.BasicTypeReference@404dc999
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Byte -> org.hibernate.type.BasicTypeReference@404dc999
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration binary -> org.hibernate.type.BasicTypeReference@ef85567
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration byte[] -> org.hibernate.type.BasicTypeReference@ef85567
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration [B -> org.hibernate.type.BasicTypeReference@ef85567
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration binary_wrapper -> org.hibernate.type.BasicTypeReference@1c2fb9e8
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration wrapper-binary -> org.hibernate.type.BasicTypeReference@1c2fb9e8
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration image -> org.hibernate.type.BasicTypeReference@ec3944
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration blob -> org.hibernate.type.BasicTypeReference@2e4339c1
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.sql.Blob -> org.hibernate.type.BasicTypeReference@2e4339c1
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_blob -> org.hibernate.type.BasicTypeReference@62dc1203
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_blob_wrapper -> org.hibernate.type.BasicTypeReference@35d0749
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration short -> org.hibernate.type.BasicTypeReference@621a387f
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration short -> org.hibernate.type.BasicTypeReference@621a387f
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Short -> org.hibernate.type.BasicTypeReference@621a387f
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration integer -> org.hibernate.type.BasicTypeReference@552088cc
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration int -> org.hibernate.type.BasicTypeReference@552088cc
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Integer -> org.hibernate.type.BasicTypeReference@552088cc
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration long -> org.hibernate.type.BasicTypeReference@57eed461
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration long -> org.hibernate.type.BasicTypeReference@57eed461
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Long -> org.hibernate.type.BasicTypeReference@57eed461
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration float -> org.hibernate.type.BasicTypeReference@3c62f69a
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration float -> org.hibernate.type.BasicTypeReference@3c62f69a
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Float -> org.hibernate.type.BasicTypeReference@3c62f69a
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration double -> org.hibernate.type.BasicTypeReference@f08f8a9
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration double -> org.hibernate.type.BasicTypeReference@f08f8a9
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Double -> org.hibernate.type.BasicTypeReference@f08f8a9
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration big_integer -> org.hibernate.type.BasicTypeReference@5ebf776c
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.math.BigInteger -> org.hibernate.type.BasicTypeReference@5ebf776c
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration big_decimal -> org.hibernate.type.BasicTypeReference@7fd3fd06
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.math.BigDecimal -> org.hibernate.type.BasicTypeReference@7fd3fd06
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration character -> org.hibernate.type.BasicTypeReference@54ae1240
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration char -> org.hibernate.type.BasicTypeReference@54ae1240
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Character -> org.hibernate.type.BasicTypeReference@54ae1240
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration character_nchar -> org.hibernate.type.BasicTypeReference@1c2b65cc
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration string -> org.hibernate.type.BasicTypeReference@390a7532
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.String -> org.hibernate.type.BasicTypeReference@390a7532
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration nstring -> org.hibernate.type.BasicTypeReference@595184d8
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration characters -> org.hibernate.type.BasicTypeReference@7d49a1a0
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration char[] -> org.hibernate.type.BasicTypeReference@7d49a1a0
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration [C -> org.hibernate.type.BasicTypeReference@7d49a1a0
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration wrapper-characters -> org.hibernate.type.BasicTypeReference@3a0baec0
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration text -> org.hibernate.type.BasicTypeReference@50c2ef56
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration ntext -> org.hibernate.type.BasicTypeReference@560d6d2
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration clob -> org.hibernate.type.BasicTypeReference@3514237f
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.sql.Clob -> org.hibernate.type.BasicTypeReference@3514237f
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration nclob -> org.hibernate.type.BasicTypeReference@520ee6b3
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.sql.NClob -> org.hibernate.type.BasicTypeReference@520ee6b3
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_clob -> org.hibernate.type.BasicTypeReference@15f11bfb
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_clob_char_array -> org.hibernate.type.BasicTypeReference@16a499d1
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_clob_character_array -> org.hibernate.type.BasicTypeReference@2bf4fa1
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_nclob -> org.hibernate.type.BasicTypeReference@27210a3b
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_nclob_character_array -> org.hibernate.type.BasicTypeReference@3a12f3e7
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration materialized_nclob_char_array -> org.hibernate.type.BasicTypeReference@84a9f65
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration Duration -> org.hibernate.type.BasicTypeReference@70700b8a
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.Duration -> org.hibernate.type.BasicTypeReference@70700b8a
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration LocalDateTime -> org.hibernate.type.BasicTypeReference@5fafa76d
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.LocalDateTime -> org.hibernate.type.BasicTypeReference@5fafa76d
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration LocalDate -> org.hibernate.type.BasicTypeReference@720ffab4
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.LocalDate -> org.hibernate.type.BasicTypeReference@720ffab4
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration LocalTime -> org.hibernate.type.BasicTypeReference@2e62e227
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.LocalTime -> org.hibernate.type.BasicTypeReference@2e62e227
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetDateTime -> org.hibernate.type.BasicTypeReference@5ebe903a
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.OffsetDateTime -> org.hibernate.type.BasicTypeReference@5ebe903a
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetDateTimeWithTimezone -> org.hibernate.type.BasicTypeReference@7c88d04f
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetDateTimeWithoutTimezone -> org.hibernate.type.BasicTypeReference@71df5f30
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetTime -> org.hibernate.type.BasicTypeReference@4895e8f6
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.OffsetTime -> org.hibernate.type.BasicTypeReference@4895e8f6
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetTimeUtc -> org.hibernate.type.BasicTypeReference@62808e9e
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetTimeWithTimezone -> org.hibernate.type.BasicTypeReference@58b03029
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetTimeWithoutTimezone -> org.hibernate.type.BasicTypeReference@539dd2d0
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration ZonedDateTime -> org.hibernate.type.BasicTypeReference@3428420d
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.ZonedDateTime -> org.hibernate.type.BasicTypeReference@3428420d
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration ZonedDateTimeWithTimezone -> org.hibernate.type.BasicTypeReference@523ade68
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration ZonedDateTimeWithoutTimezone -> org.hibernate.type.BasicTypeReference@b529d7e
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration date -> org.hibernate.type.BasicTypeReference@3664c596
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.sql.Date -> org.hibernate.type.BasicTypeReference@3664c596
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration time -> org.hibernate.type.BasicTypeReference@40aad17d
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.sql.Time -> org.hibernate.type.BasicTypeReference@40aad17d
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration timestamp -> org.hibernate.type.BasicTypeReference@44e79e9e
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.sql.Timestamp -> org.hibernate.type.BasicTypeReference@44e79e9e
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.util.Date -> org.hibernate.type.BasicTypeReference@44e79e9e
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration calendar -> org.hibernate.type.BasicTypeReference@5bc14211
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.util.Calendar -> org.hibernate.type.BasicTypeReference@5bc14211
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.util.GregorianCalendar -> org.hibernate.type.BasicTypeReference@5bc14211
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration calendar_date -> org.hibernate.type.BasicTypeReference@4b99648a
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration calendar_time -> org.hibernate.type.BasicTypeReference@5d2e65bd
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration instant -> org.hibernate.type.BasicTypeReference@254513e8
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.Instant -> org.hibernate.type.BasicTypeReference@254513e8
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration uuid -> org.hibernate.type.BasicTypeReference@74450c9b
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.util.UUID -> org.hibernate.type.BasicTypeReference@74450c9b
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration pg-uuid -> org.hibernate.type.BasicTypeReference@74450c9b
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration uuid-binary -> org.hibernate.type.BasicTypeReference@74f89bad
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration uuid-char -> org.hibernate.type.BasicTypeReference@5ad50b02
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration class -> org.hibernate.type.BasicTypeReference@570299e3
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Class -> org.hibernate.type.BasicTypeReference@570299e3
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration currency -> org.hibernate.type.BasicTypeReference@bff764c
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration Currency -> org.hibernate.type.BasicTypeReference@bff764c
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.util.Currency -> org.hibernate.type.BasicTypeReference@bff764c
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration locale -> org.hibernate.type.BasicTypeReference@3beaa16d
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.util.Locale -> org.hibernate.type.BasicTypeReference@3beaa16d
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration serializable -> org.hibernate.type.BasicTypeReference@49153009
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.io.Serializable -> org.hibernate.type.BasicTypeReference@49153009
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration timezone -> org.hibernate.type.BasicTypeReference@a1b7549
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.util.TimeZone -> org.hibernate.type.BasicTypeReference@a1b7549
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration ZoneOffset -> org.hibernate.type.BasicTypeReference@7aa63f50
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.ZoneOffset -> org.hibernate.type.BasicTypeReference@7aa63f50
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration url -> org.hibernate.type.BasicTypeReference@142918a0
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.net.URL -> org.hibernate.type.BasicTypeReference@142918a0
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration vector -> org.hibernate.type.BasicTypeReference@745cf754
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration row_version -> org.hibernate.type.BasicTypeReference@25bc65ab
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration object -> org.hibernate.type.JavaObjectType@649009d6
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Object -> org.hibernate.type.JavaObjectType@649009d6
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration null -> org.hibernate.type.NullType@999cd18
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_date -> org.hibernate.type.BasicTypeReference@dd060be
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_time -> org.hibernate.type.BasicTypeReference@6144e499
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_timestamp -> org.hibernate.type.BasicTypeReference@26f204a4
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_calendar -> org.hibernate.type.BasicTypeReference@28295554
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_calendar_date -> org.hibernate.type.BasicTypeReference@4e671ef
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_calendar_time -> org.hibernate.type.BasicTypeReference@42403dc6
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_binary -> org.hibernate.type.BasicTypeReference@74a1d60e
2025-10-24 08:46:18 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_serializable -> org.hibernate.type.BasicTypeReference@16c0be3b
2025-10-24 08:46:18 [main] INFO o.s.o.j.p.SpringPersistenceUnitInfo - No LoadTimeWeaver setup: ignoring JPA class transformer
2025-10-24 08:46:19 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting...
2025-10-24 08:46:19 [main] INFO com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Added connection org.postgresql.jdbc.PgConnection@7d75940
2025-10-24 08:46:19 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed.
2025-10-24 08:46: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-24 08:46:19 [main] DEBUG o.h.t.d.sql.spi.DdlTypeRegistry - addDescriptor(2003, org.hibernate.type.descriptor.sql.internal.ArrayDdlTypeImpl@c02a1be) replaced previous registration(org.hibernate.type.descriptor.sql.internal.ArrayDdlTypeImpl@6f740044)
2025-10-24 08:46:19 [main] DEBUG o.h.t.d.sql.spi.DdlTypeRegistry - addDescriptor(6, org.hibernate.type.descriptor.sql.internal.CapacityDependentDdlType@62732be7) replaced previous registration(org.hibernate.type.descriptor.sql.internal.DdlTypeImpl@278150a1)
2025-10-24 08:46:19 [main] DEBUG o.h.t.d.jdbc.spi.JdbcTypeRegistry - addDescriptor(2004, BlobTypeDescriptor(BLOB_BINDING)) replaced previous registration(BlobTypeDescriptor(DEFAULT))
2025-10-24 08:46:19 [main] DEBUG o.h.t.d.jdbc.spi.JdbcTypeRegistry - addDescriptor(2005, ClobTypeDescriptor(CLOB_BINDING)) replaced previous registration(ClobTypeDescriptor(DEFAULT))
2025-10-24 08:46:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration JAVA_OBJECT -> org.hibernate.type.JavaObjectType@7fc5a558
2025-10-24 08:46:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.lang.Object -> org.hibernate.type.JavaObjectType@7fc5a558
2025-10-24 08:46:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Type registration key [java.lang.Object] overrode previous entry : `org.hibernate.type.JavaObjectType@649009d6`
2025-10-24 08:46:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration org.hibernate.type.DurationType -> basicType@1(java.time.Duration,3015)
2025-10-24 08:46:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration Duration -> basicType@1(java.time.Duration,3015)
2025-10-24 08:46:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.Duration -> basicType@1(java.time.Duration,3015)
2025-10-24 08:46:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration org.hibernate.type.OffsetDateTimeType -> basicType@2(java.time.OffsetDateTime,3003)
2025-10-24 08:46:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetDateTime -> basicType@2(java.time.OffsetDateTime,3003)
2025-10-24 08:46:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.OffsetDateTime -> basicType@2(java.time.OffsetDateTime,3003)
2025-10-24 08:46:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration org.hibernate.type.ZonedDateTimeType -> basicType@3(java.time.ZonedDateTime,3003)
2025-10-24 08:46:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration ZonedDateTime -> basicType@3(java.time.ZonedDateTime,3003)
2025-10-24 08:46:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.ZonedDateTime -> basicType@3(java.time.ZonedDateTime,3003)
2025-10-24 08:46:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration org.hibernate.type.OffsetTimeType -> basicType@4(java.time.OffsetTime,3007)
2025-10-24 08:46:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration OffsetTime -> basicType@4(java.time.OffsetTime,3007)
2025-10-24 08:46:19 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration java.time.OffsetTime -> basicType@4(java.time.OffsetTime,3007)
2025-10-24 08:46:19 [main] DEBUG o.h.type.spi.TypeConfiguration$Scope - Scoping TypeConfiguration [org.hibernate.type.spi.TypeConfiguration@5d9d8ecf] to MetadataBuildingContext [org.hibernate.boot.internal.MetadataBuildingContextRootImpl@43cc7951]
2025-10-24 08:46:19 [main] INFO o.h.e.t.j.p.i.JtaPlatformInitiator - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration)
2025-10-24 08:46:19 [main] DEBUG o.h.type.spi.TypeConfiguration$Scope - Scoping TypeConfiguration [org.hibernate.type.spi.TypeConfiguration@5d9d8ecf] to SessionFactoryImplementor [org.hibernate.internal.SessionFactoryImpl@179e8859]
2025-10-24 08:46:19 [main] DEBUG org.hibernate.SQL -
alter table if exists meetings
alter column description set data type TEXT
2025-10-24 08:46:19 [main] DEBUG org.hibernate.SQL -
alter table if exists meetings
alter column participants set data type TEXT
2025-10-24 08:46:19 [main] DEBUG org.hibernate.SQL -
alter table if exists minutes_sections
alter column content set data type TEXT
2025-10-24 08:46:19 [main] DEBUG org.hibernate.SQL -
alter table if exists templates
alter column description set data type TEXT
2025-10-24 08:46:19 [main] DEBUG org.hibernate.SQL -
alter table if exists templates
alter column sections set data type TEXT
2025-10-24 08:46:19 [main] DEBUG org.hibernate.SQL -
alter table if exists todos
alter column description set data type TEXT
2025-10-24 08:46:19 [main] TRACE o.h.type.spi.TypeConfiguration$Scope - Handling #sessionFactoryCreated from [org.hibernate.internal.SessionFactoryImpl@179e8859] for TypeConfiguration
2025-10-24 08:46:19 [main] INFO o.s.o.j.LocalContainerEntityManagerFactoryBean - Initialized JPA EntityManagerFactory for persistence unit 'default'
2025-10-24 08:46:20 [main] INFO o.s.d.j.r.query.QueryEnhancerFactory - Hibernate is in classpath; If applicable, HQL parser will be used.
2025-10-24 08:46:20 [main] INFO c.u.h.m.infra.cache.CacheConfig - Redis 연결 설정 - host: 20.249.177.114, port: 6379, database: 1
2025-10-24 08:46:20 [main] ERROR i.n.r.d.DnsServerAddressStreamProviders - Unable to load io.netty.resolver.dns.macos.MacOSDnsServerAddressStreamProvider, fallback to system defaults. This may result in incorrect DNS resolutions on MacOS. Check whether you have a dependency on 'io.netty:netty-resolver-dns-native-macos'. Use DEBUG level to see the full stack: java.lang.UnsatisfiedLinkError: failed to load the required native library
2025-10-24 08:46:20 [main] INFO c.u.h.m.infra.cache.CacheConfig - Redis 템플릿 설정 완료
2025-10-24 08:46:20 [main] INFO c.u.h.m.infra.cache.CacheConfig - ObjectMapper 설정 완료
2025-10-24 08:46:20 [main] INFO c.u.h.m.infra.config.EventHubConfig - Kafka Producer 설정 완료 - bootstrapServers: localhost:9092, clientId: meeting-service
2025-10-24 08:46:20 [main] INFO c.u.h.m.infra.config.EventHubConfig - Kafka Template 설정 완료
2025-10-24 08:46:20 [main] WARN o.s.b.a.o.j.JpaBaseConfiguration$JpaWebConfiguration - spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning
2025-10-24 08:46:20 [main] WARN o.s.b.a.s.s.UserDetailsServiceAutoConfiguration -
Using generated security password: 78c92371-8a15-44f6-ac9d-b98ecb083f9d
This generated password is for development use only. Your security configuration must be updated before running your application in production.
2025-10-24 08:46:20 [main] INFO o.s.s.c.a.a.c.InitializeUserDetailsBeanManagerConfigurer$InitializeUserDetailsManagerConfigurer - Global AuthenticationManager configured with UserDetailsService bean with name inMemoryUserDetailsManager
2025-10-24 08:46:20 [main] INFO c.u.h.m.infra.config.WebSocketConfig - WebSocket 핸들러 등록 완료 - endpoint: /ws/minutes/{minutesId}
2025-10-24 08:46:21 [main] INFO o.s.b.a.e.web.EndpointLinksResolver - Exposing 3 endpoints beneath base path '/actuator'
2025-10-24 08:46:21 [main] INFO o.s.s.web.DefaultSecurityFilterChain - Will secure any request with [org.springframework.security.web.session.DisableEncodeUrlFilter@7dd43529, org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@4b7b0f85, org.springframework.security.web.context.SecurityContextHolderFilter@4cbb217e, org.springframework.security.web.header.HeaderWriterFilter@4aebeda8, org.springframework.web.filter.CorsFilter@2e3bfce8, org.springframework.security.web.authentication.logout.LogoutFilter@18269eaf, com.unicorn.hgzero.meeting.infra.config.jwt.JwtAuthenticationFilter@486ab192, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@1a2fca7f, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@63802a5d, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@144ba8cb, org.springframework.security.web.session.SessionManagementFilter@5fce034f, org.springframework.security.web.access.ExceptionTranslationFilter@4dbea3be, org.springframework.security.web.access.intercept.AuthorizationFilter@486cb71f]
2025-10-24 08:46:21 [main] INFO o.s.b.w.e.tomcat.TomcatWebServer - Tomcat started on port 8082 (http) with context path '/'
2025-10-24 08:46:21 [main] INFO c.u.h.meeting.MeetingApplication - Started MeetingApplication in 4.338 seconds (process running for 4.51)
2025-10-24 08:46:31 [SpringApplicationShutdownHook] INFO o.s.o.j.LocalContainerEntityManagerFactoryBean - Closing JPA EntityManagerFactory for persistence unit 'default'
2025-10-24 08:46:31 [SpringApplicationShutdownHook] TRACE o.h.type.spi.TypeConfiguration$Scope - Handling #sessionFactoryClosed from [org.hibernate.internal.SessionFactoryImpl@179e8859] for TypeConfiguration
2025-10-24 08:46:31 [SpringApplicationShutdownHook] DEBUG o.h.type.spi.TypeConfiguration$Scope - Un-scoping TypeConfiguration [org.hibernate.type.spi.TypeConfiguration$Scope@5c3bad7a] from SessionFactory [org.hibernate.internal.SessionFactoryImpl@179e8859]
2025-10-24 08:46:31 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown initiated...
2025-10-24 08:46:31 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown completed.

View File

@ -51,7 +51,7 @@ public class JwtTokenProvider {
public boolean validateToken(String token) {
try {
Jwts.parser()
.setSigningKey(secretKey)
.verifyWith(secretKey)
.build()
.parseClaimsJws(token);
return true;
@ -72,7 +72,7 @@ public class JwtTokenProvider {
*/
public String getUserId(String token) {
Claims claims = Jwts.parser()
.setSigningKey(secretKey)
.verifyWith(secretKey)
.build()
.parseClaimsJws(token)
.getBody();
@ -85,7 +85,7 @@ public class JwtTokenProvider {
*/
public String getUsername(String token) {
Claims claims = Jwts.parser()
.setSigningKey(secretKey)
.verifyWith(secretKey)
.build()
.parseClaimsJws(token)
.getBody();
@ -98,7 +98,7 @@ public class JwtTokenProvider {
*/
public String getAuthority(String token) {
Claims claims = Jwts.parser()
.setSigningKey(secretKey)
.verifyWith(secretKey)
.build()
.parseClaimsJws(token)
.getBody();
@ -112,7 +112,7 @@ public class JwtTokenProvider {
public boolean isTokenExpired(String token) {
try {
Claims claims = Jwts.parser()
.setSigningKey(secretKey)
.verifyWith(secretKey)
.build()
.parseClaimsJws(token)
.getBody();
@ -128,7 +128,7 @@ public class JwtTokenProvider {
*/
public Date getExpirationDate(String token) {
Claims claims = Jwts.parser()
.setSigningKey(secretKey)
.verifyWith(secretKey)
.build()
.parseClaimsJws(token)
.getBody();

View File

@ -3,67 +3,12 @@
<ExternalSystemSettings>
<option name="env">
<map>
<!-- Database Configuration -->
<entry key="DB_KIND" value="postgresql" />
<entry key="DB_HOST" value="20.214.121.121" />
<entry key="DB_PORT" value="5432" />
<entry key="DB_NAME" value="userdb" />
<entry key="DB_USERNAME" value="hgzerouser" />
<entry key="DB_PASSWORD" value="Hi5Jessica!" />
<!-- JPA Configuration -->
<entry key="SHOW_SQL" value="true" />
<entry key="JPA_DDL_AUTO" value="update" />
<!-- Redis Configuration -->
<entry key="REDIS_HOST" value="20.249.177.114" />
<entry key="REDIS_PORT" value="6379" />
<entry key="REDIS_PASSWORD" value="Hi5Jessica!" />
<entry key="REDIS_DATABASE" value="0" />
<!-- Server Configuration -->
<entry key="SERVER_PORT" value="8081" />
<!-- JWT Configuration -->
<entry key="JWT_SECRET" value="dev-jwt-secret-key-for-development-only" />
<entry key="JWT_ACCESS_TOKEN_VALIDITY" value="3600" />
<entry key="JWT_REFRESH_TOKEN_VALIDITY" value="604800" />
<!-- CORS Configuration -->
<entry key="CORS_ALLOWED_ORIGINS" value="http://localhost:*" />
<!-- External API Keys -->
<entry key="CLAUDE_API_KEY" value="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" />
<entry key="OPENAI_API_KEY" value="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" />
<entry key="OPENWEATHER_API_KEY" value="1aa5bfca079a20586915b56f29235cc0" />
<entry key="KAKAO_API_KEY" value="094feac895a3e4a6d7ffa66d877bf48f" />
<!-- LDAP Configuration -->
<entry key="LDAP_URLS" value="ldaps://ldap.example.com:636" />
<entry key="LDAP_BASE" value="dc=example,dc=com" />
<entry key="LDAP_USERNAME" value="" />
<entry key="LDAP_PASSWORD" value="" />
<entry key="LDAP_USER_DN_PATTERN" value="uid={0},ou=people" />
<!-- Azure EventHub Configuration -->
<entry key="EVENTHUB_CONNECTION_STRING" value="Endpoint=sb://hgzero-eventhub-ns.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=VUqZ9vFgu35E3c6RiUzoOGVUP8IZpFvlV+AEhC6sUpo=" />
<entry key="EVENTHUB_NAME" value="hgzero-eventhub-name" />
<!-- Spring Profile -->
<entry key="SPRING_PROFILES_ACTIVE" value="dev" />
<!-- Logging Configuration -->
<entry key="LOG_LEVEL_ROOT" value="INFO" />
<entry key="LOG_LEVEL_APP" value="DEBUG" />
<entry key="LOG_LEVEL_WEB" value="INFO" />
<entry key="LOG_LEVEL_SECURITY" value="DEBUG" />
<entry key="LOG_LEVEL_SQL" value="DEBUG" />
<entry key="LOG_LEVEL_SQL_TYPE" value="TRACE" />
<entry key="LOG_FILE" value="logs/user-service.log" />
<entry key="JWT_SECRET" value="my-super-secret-jwt-key-for-hgzero-meeting-service-2024" />
</map>
</option>
<option name="executionName" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="externalProjectPath" value="$PROJECT_DIR$/user" />
<option name="externalSystemIdString" value="GRADLE" />
<option name="scriptParameters" value="" />
<option name="taskDescriptions">
@ -71,25 +16,13 @@
</option>
<option name="taskNames">
<list>
<option value=":user:bootRun" />
<option value="bootRun" />
</list>
</option>
<option name="vmOptions" />
<option name="vmOptions" value="" />
</ExternalSystemSettings>
<ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess>
<ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>
<EXTENSION ID="com.intellij.execution.ExternalSystemRunConfigurationJavaExtension">
<extension name="net.ashald.envfile">
<option name="IS_ENABLED" value="false" />
<option name="IS_SUBST" value="false" />
<option name="IS_PATH_MACRO_SUPPORTED" value="false" />
<option name="IS_IGNORE_MISSING_FILES" value="false" />
<option name="IS_ENABLE_EXPERIMENTAL_INTEGRATIONS" value="false" />
<ENTRIES>
<ENTRY IS_ENABLED="true" PARSER="runconfig" IS_EXECUTABLE="false" />
</ENTRIES>
</extension>
</EXTENSION>
<DebugAllEnabled>false</DebugAllEnabled>
<RunAsTest>false</RunAsTest>
<method v="2" />

View File

@ -6,4 +6,9 @@ dependencies {
// LDAP
implementation 'org.springframework.boot:spring-boot-starter-data-ldap'
implementation 'org.springframework.ldap:spring-ldap-core'
// Azure EventHub
implementation "com.azure:azure-messaging-eventhubs:${azureEventHubsVersion}"
implementation "com.azure:azure-messaging-eventhubs-checkpointstore-blob:${azureEventHubsCheckpointVersion}"
implementation 'org.springframework.integration:spring-integration-core'
}

View File

@ -0,0 +1,218 @@
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v3.3.5)
2025-10-24 09:28:10 - Starting UserApplication using Java 21.0.8 with PID 25688 (/Users/adela/home/workspace/recent/HGZero/user/build/libs/user.jar started by adela in /Users/adela/home/workspace/recent/HGZero/user)
2025-10-24 09:28:10 - Running with Spring Boot v3.3.5, Spring v6.1.14
2025-10-24 09:28:10 - The following 1 profile is active: "dev"
2025-10-24 09:28:11 - Multiple Spring Data modules found, entering strict repository configuration mode
2025-10-24 09:28:11 - Bootstrapping Spring Data JPA repositories in DEFAULT mode.
2025-10-24 09:28:11 - Finished Spring Data repository scanning in 97 ms. Found 1 JPA repository interface.
2025-10-24 09:28:11 - Multiple Spring Data modules found, entering strict repository configuration mode
2025-10-24 09:28:11 - Bootstrapping Spring Data LDAP repositories in DEFAULT mode.
2025-10-24 09:28:11 - Spring Data LDAP - Could not safely identify store assignment for repository candidate interface com.unicorn.hgzero.user.repository.jpa.UserRepository; If you want this repository to be a LDAP repository, consider annotating your entities with one of these annotations: org.springframework.ldap.odm.annotations.Entry (preferred), or consider extending one of the following types with your repository: org.springframework.data.ldap.repository.LdapRepository
2025-10-24 09:28:11 - Finished Spring Data repository scanning in 9 ms. Found 0 LDAP repository interfaces.
2025-10-24 09:28:11 - Multiple Spring Data modules found, entering strict repository configuration mode
2025-10-24 09:28:11 - Bootstrapping Spring Data Redis repositories in DEFAULT mode.
2025-10-24 09:28:11 - Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.unicorn.hgzero.user.repository.jpa.UserRepository; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository
2025-10-24 09:28:11 - Finished Spring Data repository scanning in 1 ms. Found 0 Redis repository interfaces.
2025-10-24 09:28:11 - No bean named 'errorChannel' has been explicitly defined. Therefore, a default PublishSubscribeChannel will be created.
2025-10-24 09:28:11 - No bean named 'integrationHeaderChannelRegistry' has been explicitly defined. Therefore, a default DefaultHeaderChannelRegistry will be created.
2025-10-24 09:28:11 - Tomcat initialized with port 8081 (http)
2025-10-24 09:28:11 - Starting service [Tomcat]
2025-10-24 09:28:11 - Starting Servlet engine: [Apache Tomcat/10.1.31]
2025-10-24 09:28:11 - Initializing Spring embedded WebApplicationContext
2025-10-24 09:28:11 - Root WebApplicationContext: initialization completed in 1578 ms
2025-10-24 09:28:12 - HHH000204: Processing PersistenceUnitInfo [name: default]
2025-10-24 09:28:12 - HHH000412: Hibernate ORM core version 6.5.3.Final
2025-10-24 09:28:12 - HHH000026: Second-level cache disabled
2025-10-24 09:28:12 - Adding type registration boolean -> org.hibernate.type.BasicTypeReference@175957b6
2025-10-24 09:28:12 - Adding type registration boolean -> org.hibernate.type.BasicTypeReference@175957b6
2025-10-24 09:28:12 - Adding type registration java.lang.Boolean -> org.hibernate.type.BasicTypeReference@175957b6
2025-10-24 09:28:12 - Adding type registration numeric_boolean -> org.hibernate.type.BasicTypeReference@1b7a4930
2025-10-24 09:28:12 - Adding type registration org.hibernate.type.NumericBooleanConverter -> org.hibernate.type.BasicTypeReference@1b7a4930
2025-10-24 09:28:12 - Adding type registration true_false -> org.hibernate.type.BasicTypeReference@591a4d25
2025-10-24 09:28:12 - Adding type registration org.hibernate.type.TrueFalseConverter -> org.hibernate.type.BasicTypeReference@591a4d25
2025-10-24 09:28:12 - Adding type registration yes_no -> org.hibernate.type.BasicTypeReference@4bfe83d
2025-10-24 09:28:12 - Adding type registration org.hibernate.type.YesNoConverter -> org.hibernate.type.BasicTypeReference@4bfe83d
2025-10-24 09:28:12 - Adding type registration byte -> org.hibernate.type.BasicTypeReference@5906ebfb
2025-10-24 09:28:12 - Adding type registration byte -> org.hibernate.type.BasicTypeReference@5906ebfb
2025-10-24 09:28:12 - Adding type registration java.lang.Byte -> org.hibernate.type.BasicTypeReference@5906ebfb
2025-10-24 09:28:12 - Adding type registration binary -> org.hibernate.type.BasicTypeReference@10fc1a22
2025-10-24 09:28:12 - Adding type registration byte[] -> org.hibernate.type.BasicTypeReference@10fc1a22
2025-10-24 09:28:12 - Adding type registration [B -> org.hibernate.type.BasicTypeReference@10fc1a22
2025-10-24 09:28:12 - Adding type registration binary_wrapper -> org.hibernate.type.BasicTypeReference@1b841e7d
2025-10-24 09:28:12 - Adding type registration wrapper-binary -> org.hibernate.type.BasicTypeReference@1b841e7d
2025-10-24 09:28:12 - Adding type registration image -> org.hibernate.type.BasicTypeReference@6081f330
2025-10-24 09:28:12 - Adding type registration blob -> org.hibernate.type.BasicTypeReference@eb695e8
2025-10-24 09:28:12 - Adding type registration java.sql.Blob -> org.hibernate.type.BasicTypeReference@eb695e8
2025-10-24 09:28:12 - Adding type registration materialized_blob -> org.hibernate.type.BasicTypeReference@7eebb316
2025-10-24 09:28:12 - Adding type registration materialized_blob_wrapper -> org.hibernate.type.BasicTypeReference@45273d40
2025-10-24 09:28:12 - Adding type registration short -> org.hibernate.type.BasicTypeReference@2a504ea7
2025-10-24 09:28:12 - Adding type registration short -> org.hibernate.type.BasicTypeReference@2a504ea7
2025-10-24 09:28:12 - Adding type registration java.lang.Short -> org.hibernate.type.BasicTypeReference@2a504ea7
2025-10-24 09:28:12 - Adding type registration integer -> org.hibernate.type.BasicTypeReference@10f397d0
2025-10-24 09:28:12 - Adding type registration int -> org.hibernate.type.BasicTypeReference@10f397d0
2025-10-24 09:28:12 - Adding type registration java.lang.Integer -> org.hibernate.type.BasicTypeReference@10f397d0
2025-10-24 09:28:12 - Adding type registration long -> org.hibernate.type.BasicTypeReference@33a3e5db
2025-10-24 09:28:12 - Adding type registration long -> org.hibernate.type.BasicTypeReference@33a3e5db
2025-10-24 09:28:12 - Adding type registration java.lang.Long -> org.hibernate.type.BasicTypeReference@33a3e5db
2025-10-24 09:28:12 - Adding type registration float -> org.hibernate.type.BasicTypeReference@4f9213d2
2025-10-24 09:28:12 - Adding type registration float -> org.hibernate.type.BasicTypeReference@4f9213d2
2025-10-24 09:28:12 - Adding type registration java.lang.Float -> org.hibernate.type.BasicTypeReference@4f9213d2
2025-10-24 09:28:12 - Adding type registration double -> org.hibernate.type.BasicTypeReference@679f59f1
2025-10-24 09:28:12 - Adding type registration double -> org.hibernate.type.BasicTypeReference@679f59f1
2025-10-24 09:28:12 - Adding type registration java.lang.Double -> org.hibernate.type.BasicTypeReference@679f59f1
2025-10-24 09:28:12 - Adding type registration big_integer -> org.hibernate.type.BasicTypeReference@6b5e1fc5
2025-10-24 09:28:12 - Adding type registration java.math.BigInteger -> org.hibernate.type.BasicTypeReference@6b5e1fc5
2025-10-24 09:28:12 - Adding type registration big_decimal -> org.hibernate.type.BasicTypeReference@47ffa248
2025-10-24 09:28:12 - Adding type registration java.math.BigDecimal -> org.hibernate.type.BasicTypeReference@47ffa248
2025-10-24 09:28:12 - Adding type registration character -> org.hibernate.type.BasicTypeReference@18ac25e6
2025-10-24 09:28:12 - Adding type registration char -> org.hibernate.type.BasicTypeReference@18ac25e6
2025-10-24 09:28:12 - Adding type registration java.lang.Character -> org.hibernate.type.BasicTypeReference@18ac25e6
2025-10-24 09:28:12 - Adding type registration character_nchar -> org.hibernate.type.BasicTypeReference@5e1a7d3
2025-10-24 09:28:12 - Adding type registration string -> org.hibernate.type.BasicTypeReference@1eda309d
2025-10-24 09:28:12 - Adding type registration java.lang.String -> org.hibernate.type.BasicTypeReference@1eda309d
2025-10-24 09:28:12 - Adding type registration nstring -> org.hibernate.type.BasicTypeReference@248d2cec
2025-10-24 09:28:12 - Adding type registration characters -> org.hibernate.type.BasicTypeReference@5d77be8e
2025-10-24 09:28:12 - Adding type registration char[] -> org.hibernate.type.BasicTypeReference@5d77be8e
2025-10-24 09:28:12 - Adding type registration [C -> org.hibernate.type.BasicTypeReference@5d77be8e
2025-10-24 09:28:12 - Adding type registration wrapper-characters -> org.hibernate.type.BasicTypeReference@55a055cc
2025-10-24 09:28:12 - Adding type registration text -> org.hibernate.type.BasicTypeReference@1ab1d93d
2025-10-24 09:28:12 - Adding type registration ntext -> org.hibernate.type.BasicTypeReference@57167ccb
2025-10-24 09:28:12 - Adding type registration clob -> org.hibernate.type.BasicTypeReference@37753b69
2025-10-24 09:28:12 - Adding type registration java.sql.Clob -> org.hibernate.type.BasicTypeReference@37753b69
2025-10-24 09:28:12 - Adding type registration nclob -> org.hibernate.type.BasicTypeReference@602c167e
2025-10-24 09:28:12 - Adding type registration java.sql.NClob -> org.hibernate.type.BasicTypeReference@602c167e
2025-10-24 09:28:12 - Adding type registration materialized_clob -> org.hibernate.type.BasicTypeReference@74c04377
2025-10-24 09:28:12 - Adding type registration materialized_clob_char_array -> org.hibernate.type.BasicTypeReference@10d49900
2025-10-24 09:28:12 - Adding type registration materialized_clob_character_array -> org.hibernate.type.BasicTypeReference@e645600
2025-10-24 09:28:12 - Adding type registration materialized_nclob -> org.hibernate.type.BasicTypeReference@e7b3e54
2025-10-24 09:28:12 - Adding type registration materialized_nclob_character_array -> org.hibernate.type.BasicTypeReference@78d61f17
2025-10-24 09:28:12 - Adding type registration materialized_nclob_char_array -> org.hibernate.type.BasicTypeReference@4cfe9594
2025-10-24 09:28:12 - Adding type registration Duration -> org.hibernate.type.BasicTypeReference@60861e5d
2025-10-24 09:28:12 - Adding type registration java.time.Duration -> org.hibernate.type.BasicTypeReference@60861e5d
2025-10-24 09:28:12 - Adding type registration LocalDateTime -> org.hibernate.type.BasicTypeReference@37d81587
2025-10-24 09:28:12 - Adding type registration java.time.LocalDateTime -> org.hibernate.type.BasicTypeReference@37d81587
2025-10-24 09:28:12 - Adding type registration LocalDate -> org.hibernate.type.BasicTypeReference@7f3e9acc
2025-10-24 09:28:12 - Adding type registration java.time.LocalDate -> org.hibernate.type.BasicTypeReference@7f3e9acc
2025-10-24 09:28:12 - Adding type registration LocalTime -> org.hibernate.type.BasicTypeReference@47d4e28a
2025-10-24 09:28:12 - Adding type registration java.time.LocalTime -> org.hibernate.type.BasicTypeReference@47d4e28a
2025-10-24 09:28:12 - Adding type registration OffsetDateTime -> org.hibernate.type.BasicTypeReference@177068db
2025-10-24 09:28:12 - Adding type registration java.time.OffsetDateTime -> org.hibernate.type.BasicTypeReference@177068db
2025-10-24 09:28:12 - Adding type registration OffsetDateTimeWithTimezone -> org.hibernate.type.BasicTypeReference@60f3239f
2025-10-24 09:28:12 - Adding type registration OffsetDateTimeWithoutTimezone -> org.hibernate.type.BasicTypeReference@6b103db7
2025-10-24 09:28:12 - Adding type registration OffsetTime -> org.hibernate.type.BasicTypeReference@b3042ed
2025-10-24 09:28:12 - Adding type registration java.time.OffsetTime -> org.hibernate.type.BasicTypeReference@b3042ed
2025-10-24 09:28:12 - Adding type registration OffsetTimeUtc -> org.hibernate.type.BasicTypeReference@1f12d5e0
2025-10-24 09:28:12 - Adding type registration OffsetTimeWithTimezone -> org.hibernate.type.BasicTypeReference@6604f246
2025-10-24 09:28:12 - Adding type registration OffsetTimeWithoutTimezone -> org.hibernate.type.BasicTypeReference@c1386b4
2025-10-24 09:28:12 - Adding type registration ZonedDateTime -> org.hibernate.type.BasicTypeReference@53d9af1
2025-10-24 09:28:12 - Adding type registration java.time.ZonedDateTime -> org.hibernate.type.BasicTypeReference@53d9af1
2025-10-24 09:28:12 - Adding type registration ZonedDateTimeWithTimezone -> org.hibernate.type.BasicTypeReference@c89e263
2025-10-24 09:28:12 - Adding type registration ZonedDateTimeWithoutTimezone -> org.hibernate.type.BasicTypeReference@4d5ea776
2025-10-24 09:28:12 - Adding type registration date -> org.hibernate.type.BasicTypeReference@5d68be4f
2025-10-24 09:28:12 - Adding type registration java.sql.Date -> org.hibernate.type.BasicTypeReference@5d68be4f
2025-10-24 09:28:12 - Adding type registration time -> org.hibernate.type.BasicTypeReference@34eb5d01
2025-10-24 09:28:12 - Adding type registration java.sql.Time -> org.hibernate.type.BasicTypeReference@34eb5d01
2025-10-24 09:28:12 - Adding type registration timestamp -> org.hibernate.type.BasicTypeReference@77b22b05
2025-10-24 09:28:12 - Adding type registration java.sql.Timestamp -> org.hibernate.type.BasicTypeReference@77b22b05
2025-10-24 09:28:12 - Adding type registration java.util.Date -> org.hibernate.type.BasicTypeReference@77b22b05
2025-10-24 09:28:12 - Adding type registration calendar -> org.hibernate.type.BasicTypeReference@4fef5792
2025-10-24 09:28:12 - Adding type registration java.util.Calendar -> org.hibernate.type.BasicTypeReference@4fef5792
2025-10-24 09:28:12 - Adding type registration java.util.GregorianCalendar -> org.hibernate.type.BasicTypeReference@4fef5792
2025-10-24 09:28:12 - Adding type registration calendar_date -> org.hibernate.type.BasicTypeReference@57ed02e6
2025-10-24 09:28:12 - Adding type registration calendar_time -> org.hibernate.type.BasicTypeReference@39004e4f
2025-10-24 09:28:12 - Adding type registration instant -> org.hibernate.type.BasicTypeReference@5f0ca069
2025-10-24 09:28:12 - Adding type registration java.time.Instant -> org.hibernate.type.BasicTypeReference@5f0ca069
2025-10-24 09:28:12 - Adding type registration uuid -> org.hibernate.type.BasicTypeReference@6a6a2fdd
2025-10-24 09:28:12 - Adding type registration java.util.UUID -> org.hibernate.type.BasicTypeReference@6a6a2fdd
2025-10-24 09:28:12 - Adding type registration pg-uuid -> org.hibernate.type.BasicTypeReference@6a6a2fdd
2025-10-24 09:28:12 - Adding type registration uuid-binary -> org.hibernate.type.BasicTypeReference@552ffa44
2025-10-24 09:28:12 - Adding type registration uuid-char -> org.hibernate.type.BasicTypeReference@6e66b498
2025-10-24 09:28:12 - Adding type registration class -> org.hibernate.type.BasicTypeReference@54d35ed5
2025-10-24 09:28:12 - Adding type registration java.lang.Class -> org.hibernate.type.BasicTypeReference@54d35ed5
2025-10-24 09:28:12 - Adding type registration currency -> org.hibernate.type.BasicTypeReference@6f7c9755
2025-10-24 09:28:12 - Adding type registration Currency -> org.hibernate.type.BasicTypeReference@6f7c9755
2025-10-24 09:28:12 - Adding type registration java.util.Currency -> org.hibernate.type.BasicTypeReference@6f7c9755
2025-10-24 09:28:12 - Adding type registration locale -> org.hibernate.type.BasicTypeReference@45abbd24
2025-10-24 09:28:12 - Adding type registration java.util.Locale -> org.hibernate.type.BasicTypeReference@45abbd24
2025-10-24 09:28:12 - Adding type registration serializable -> org.hibernate.type.BasicTypeReference@1e32037d
2025-10-24 09:28:12 - Adding type registration java.io.Serializable -> org.hibernate.type.BasicTypeReference@1e32037d
2025-10-24 09:28:12 - Adding type registration timezone -> org.hibernate.type.BasicTypeReference@5059d398
2025-10-24 09:28:12 - Adding type registration java.util.TimeZone -> org.hibernate.type.BasicTypeReference@5059d398
2025-10-24 09:28:12 - Adding type registration ZoneOffset -> org.hibernate.type.BasicTypeReference@5b1420f9
2025-10-24 09:28:12 - Adding type registration java.time.ZoneOffset -> org.hibernate.type.BasicTypeReference@5b1420f9
2025-10-24 09:28:12 - Adding type registration url -> org.hibernate.type.BasicTypeReference@434ee422
2025-10-24 09:28:12 - Adding type registration java.net.URL -> org.hibernate.type.BasicTypeReference@434ee422
2025-10-24 09:28:12 - Adding type registration vector -> org.hibernate.type.BasicTypeReference@4de93edd
2025-10-24 09:28:12 - Adding type registration row_version -> org.hibernate.type.BasicTypeReference@53b2e1eb
2025-10-24 09:28:12 - Adding type registration object -> org.hibernate.type.JavaObjectType@134955bb
2025-10-24 09:28:12 - Adding type registration java.lang.Object -> org.hibernate.type.JavaObjectType@134955bb
2025-10-24 09:28:12 - Adding type registration null -> org.hibernate.type.NullType@195cbf5e
2025-10-24 09:28:12 - Adding type registration imm_date -> org.hibernate.type.BasicTypeReference@4cb82b09
2025-10-24 09:28:12 - Adding type registration imm_time -> org.hibernate.type.BasicTypeReference@b68932b
2025-10-24 09:28:12 - Adding type registration imm_timestamp -> org.hibernate.type.BasicTypeReference@77b27b57
2025-10-24 09:28:12 - Adding type registration imm_calendar -> org.hibernate.type.BasicTypeReference@7adff6cb
2025-10-24 09:28:12 - Adding type registration imm_calendar_date -> org.hibernate.type.BasicTypeReference@13ebccd
2025-10-24 09:28:12 - Adding type registration imm_calendar_time -> org.hibernate.type.BasicTypeReference@4e80960a
2025-10-24 09:28:12 - Adding type registration imm_binary -> org.hibernate.type.BasicTypeReference@2a0c244e
2025-10-24 09:28:12 - Adding type registration imm_serializable -> org.hibernate.type.BasicTypeReference@2f60e66a
2025-10-24 09:28:12 - No LoadTimeWeaver setup: ignoring JPA class transformer
2025-10-24 09:28:12 - HikariPool-1 - Starting...
2025-10-24 09:28:12 - HikariPool-1 - Added connection org.postgresql.jdbc.PgConnection@6e5af973
2025-10-24 09:28:12 - HikariPool-1 - Start completed.
2025-10-24 09:28:12 - HHH90000025: PostgreSQLDialect does not need to be specified explicitly using 'hibernate.dialect' (remove the property setting and it will be selected by default)
2025-10-24 09:28:12 - addDescriptor(2003, org.hibernate.type.descriptor.sql.internal.ArrayDdlTypeImpl@523f3c29) replaced previous registration(org.hibernate.type.descriptor.sql.internal.ArrayDdlTypeImpl@2fd8b081)
2025-10-24 09:28:12 - addDescriptor(6, org.hibernate.type.descriptor.sql.internal.CapacityDependentDdlType@2fe38b73) replaced previous registration(org.hibernate.type.descriptor.sql.internal.DdlTypeImpl@511a307e)
2025-10-24 09:28:12 - addDescriptor(2004, BlobTypeDescriptor(BLOB_BINDING)) replaced previous registration(BlobTypeDescriptor(DEFAULT))
2025-10-24 09:28:12 - addDescriptor(2005, ClobTypeDescriptor(CLOB_BINDING)) replaced previous registration(ClobTypeDescriptor(DEFAULT))
2025-10-24 09:28:12 - Adding type registration JAVA_OBJECT -> org.hibernate.type.JavaObjectType@c14bbab
2025-10-24 09:28:12 - Adding type registration java.lang.Object -> org.hibernate.type.JavaObjectType@c14bbab
2025-10-24 09:28:12 - Type registration key [java.lang.Object] overrode previous entry : `org.hibernate.type.JavaObjectType@134955bb`
2025-10-24 09:28:12 - Adding type registration org.hibernate.type.DurationType -> basicType@1(java.time.Duration,3015)
2025-10-24 09:28:12 - Adding type registration Duration -> basicType@1(java.time.Duration,3015)
2025-10-24 09:28:12 - Adding type registration java.time.Duration -> basicType@1(java.time.Duration,3015)
2025-10-24 09:28:12 - Adding type registration org.hibernate.type.OffsetDateTimeType -> basicType@2(java.time.OffsetDateTime,3003)
2025-10-24 09:28:12 - Adding type registration OffsetDateTime -> basicType@2(java.time.OffsetDateTime,3003)
2025-10-24 09:28:12 - Adding type registration java.time.OffsetDateTime -> basicType@2(java.time.OffsetDateTime,3003)
2025-10-24 09:28:12 - Adding type registration org.hibernate.type.ZonedDateTimeType -> basicType@3(java.time.ZonedDateTime,3003)
2025-10-24 09:28:12 - Adding type registration ZonedDateTime -> basicType@3(java.time.ZonedDateTime,3003)
2025-10-24 09:28:12 - Adding type registration java.time.ZonedDateTime -> basicType@3(java.time.ZonedDateTime,3003)
2025-10-24 09:28:12 - Adding type registration org.hibernate.type.OffsetTimeType -> basicType@4(java.time.OffsetTime,3007)
2025-10-24 09:28:12 - Adding type registration OffsetTime -> basicType@4(java.time.OffsetTime,3007)
2025-10-24 09:28:12 - Adding type registration java.time.OffsetTime -> basicType@4(java.time.OffsetTime,3007)
2025-10-24 09:28:12 - Scoping TypeConfiguration [org.hibernate.type.spi.TypeConfiguration@40416321] to MetadataBuildingContext [org.hibernate.boot.internal.MetadataBuildingContextRootImpl@3ab70d34]
2025-10-24 09:28:12 - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration)
2025-10-24 09:28:12 - Scoping TypeConfiguration [org.hibernate.type.spi.TypeConfiguration@40416321] to SessionFactoryImplementor [org.hibernate.internal.SessionFactoryImpl@5653429e]
2025-10-24 09:28:12 - Handling #sessionFactoryCreated from [org.hibernate.internal.SessionFactoryImpl@5653429e] for TypeConfiguration
2025-10-24 09:28:12 - Initialized JPA EntityManagerFactory for persistence unit 'default'
2025-10-24 09:28:12 - Property 'userDn' not set - anonymous context will be used for read-only operations
2025-10-24 09:28:13 - Unable to load io.netty.resolver.dns.macos.MacOSDnsServerAddressStreamProvider, fallback to system defaults. This may result in incorrect DNS resolutions on MacOS. Check whether you have a dependency on 'io.netty:netty-resolver-dns-native-macos'. Use DEBUG level to see the full stack: java.lang.UnsatisfiedLinkError: failed to load the required native library
2025-10-24 09:28:13 - spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning
2025-10-24 09:28:13 -
Using generated security password: 4dea95e5-e05d-43b8-a9c7-781dfaa42e82
This generated password is for development use only. Your security configuration must be updated before running your application in production.
2025-10-24 09:28:13 - Global AuthenticationManager configured with UserDetailsService bean with name inMemoryUserDetailsManager
2025-10-24 09:28:13 - Exposing 3 endpoints beneath base path '/actuator'
2025-10-24 09:28:13 - Will secure any request with filters: DisableEncodeUrlFilter, WebAsyncManagerIntegrationFilter, SecurityContextHolderFilter, HeaderWriterFilter, CorsFilter, LogoutFilter, JwtAuthenticationFilter, RequestCacheAwareFilter, SecurityContextHolderAwareRequestFilter, AnonymousAuthenticationFilter, SessionManagementFilter, ExceptionTranslationFilter, AuthorizationFilter
2025-10-24 09:28:14 - Adding {logging-channel-adapter:_org.springframework.integration.errorLogger} as a subscriber to the 'errorChannel' channel
2025-10-24 09:28:14 - Channel 'user.errorChannel' has 1 subscriber(s).
2025-10-24 09:28:14 - started bean '_org.springframework.integration.errorLogger'
2025-10-24 09:28:14 - Tomcat started on port 8081 (http) with context path '/'
2025-10-24 09:28:14 - Started UserApplication in 4.689 seconds (process running for 5.01)
2025-10-24 09:28:23 - Initializing Spring DispatcherServlet 'dispatcherServlet'
2025-10-24 09:28:23 - Initializing Servlet 'dispatcherServlet'
2025-10-24 09:28:23 - Completed initialization in 1 ms
2025-10-24 09:28:23 - Securing GET /actuator/health
2025-10-24 09:28:23 - Set SecurityContextHolder to anonymous SecurityContext
2025-10-24 09:28:23 - Secured GET /actuator/health

View File

@ -0,0 +1,415 @@
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v3.3.5)
2025-10-24 09:26:46 - Starting UserApplication using Java 21.0.8 with PID 25117 (/Users/adela/home/workspace/recent/HGZero/user/build/libs/user.jar started by adela in /Users/adela/home/workspace/recent/HGZero/user)
2025-10-24 09:26:46 - Running with Spring Boot v3.3.5, Spring v6.1.14
2025-10-24 09:26:46 - The following 1 profile is active: "dev"
2025-10-24 09:26:46 - Multiple Spring Data modules found, entering strict repository configuration mode
2025-10-24 09:26:46 - Bootstrapping Spring Data JPA repositories in DEFAULT mode.
2025-10-24 09:26:46 - Finished Spring Data repository scanning in 76 ms. Found 1 JPA repository interface.
2025-10-24 09:26:46 - Multiple Spring Data modules found, entering strict repository configuration mode
2025-10-24 09:26:46 - Bootstrapping Spring Data LDAP repositories in DEFAULT mode.
2025-10-24 09:26:46 - Spring Data LDAP - Could not safely identify store assignment for repository candidate interface com.unicorn.hgzero.user.repository.jpa.UserRepository; If you want this repository to be a LDAP repository, consider annotating your entities with one of these annotations: org.springframework.ldap.odm.annotations.Entry (preferred), or consider extending one of the following types with your repository: org.springframework.data.ldap.repository.LdapRepository
2025-10-24 09:26:46 - Finished Spring Data repository scanning in 2 ms. Found 0 LDAP repository interfaces.
2025-10-24 09:26:46 - Multiple Spring Data modules found, entering strict repository configuration mode
2025-10-24 09:26:46 - Bootstrapping Spring Data Redis repositories in DEFAULT mode.
2025-10-24 09:26:46 - Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.unicorn.hgzero.user.repository.jpa.UserRepository; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository
2025-10-24 09:26:46 - Finished Spring Data repository scanning in 1 ms. Found 0 Redis repository interfaces.
2025-10-24 09:26:46 - No bean named 'errorChannel' has been explicitly defined. Therefore, a default PublishSubscribeChannel will be created.
2025-10-24 09:26:46 - No bean named 'integrationHeaderChannelRegistry' has been explicitly defined. Therefore, a default DefaultHeaderChannelRegistry will be created.
2025-10-24 09:26:47 - Tomcat initialized with port 8081 (http)
2025-10-24 09:26:47 - Starting service [Tomcat]
2025-10-24 09:26:47 - Starting Servlet engine: [Apache Tomcat/10.1.31]
2025-10-24 09:26:47 - Initializing Spring embedded WebApplicationContext
2025-10-24 09:26:47 - Root WebApplicationContext: initialization completed in 1466 ms
2025-10-24 09:26:47 - HHH000204: Processing PersistenceUnitInfo [name: default]
2025-10-24 09:26:47 - HHH000412: Hibernate ORM core version 6.5.3.Final
2025-10-24 09:26:47 - HHH000026: Second-level cache disabled
2025-10-24 09:26:47 - Adding type registration boolean -> org.hibernate.type.BasicTypeReference@191b44ca
2025-10-24 09:26:47 - Adding type registration boolean -> org.hibernate.type.BasicTypeReference@191b44ca
2025-10-24 09:26:47 - Adding type registration java.lang.Boolean -> org.hibernate.type.BasicTypeReference@191b44ca
2025-10-24 09:26:47 - Adding type registration numeric_boolean -> org.hibernate.type.BasicTypeReference@5de243bb
2025-10-24 09:26:47 - Adding type registration org.hibernate.type.NumericBooleanConverter -> org.hibernate.type.BasicTypeReference@5de243bb
2025-10-24 09:26:47 - Adding type registration true_false -> org.hibernate.type.BasicTypeReference@2c4cf7eb
2025-10-24 09:26:47 - Adding type registration org.hibernate.type.TrueFalseConverter -> org.hibernate.type.BasicTypeReference@2c4cf7eb
2025-10-24 09:26:47 - Adding type registration yes_no -> org.hibernate.type.BasicTypeReference@35260785
2025-10-24 09:26:47 - Adding type registration org.hibernate.type.YesNoConverter -> org.hibernate.type.BasicTypeReference@35260785
2025-10-24 09:26:47 - Adding type registration byte -> org.hibernate.type.BasicTypeReference@76d828ff
2025-10-24 09:26:47 - Adding type registration byte -> org.hibernate.type.BasicTypeReference@76d828ff
2025-10-24 09:26:47 - Adding type registration java.lang.Byte -> org.hibernate.type.BasicTypeReference@76d828ff
2025-10-24 09:26:47 - Adding type registration binary -> org.hibernate.type.BasicTypeReference@39685204
2025-10-24 09:26:47 - Adding type registration byte[] -> org.hibernate.type.BasicTypeReference@39685204
2025-10-24 09:26:47 - Adding type registration [B -> org.hibernate.type.BasicTypeReference@39685204
2025-10-24 09:26:47 - Adding type registration binary_wrapper -> org.hibernate.type.BasicTypeReference@72d0196d
2025-10-24 09:26:47 - Adding type registration wrapper-binary -> org.hibernate.type.BasicTypeReference@72d0196d
2025-10-24 09:26:47 - Adding type registration image -> org.hibernate.type.BasicTypeReference@77cf329d
2025-10-24 09:26:47 - Adding type registration blob -> org.hibernate.type.BasicTypeReference@4067634b
2025-10-24 09:26:47 - Adding type registration java.sql.Blob -> org.hibernate.type.BasicTypeReference@4067634b
2025-10-24 09:26:47 - Adding type registration materialized_blob -> org.hibernate.type.BasicTypeReference@3b64f131
2025-10-24 09:26:47 - Adding type registration materialized_blob_wrapper -> org.hibernate.type.BasicTypeReference@490d9c41
2025-10-24 09:26:47 - Adding type registration short -> org.hibernate.type.BasicTypeReference@47d81427
2025-10-24 09:26:47 - Adding type registration short -> org.hibernate.type.BasicTypeReference@47d81427
2025-10-24 09:26:47 - Adding type registration java.lang.Short -> org.hibernate.type.BasicTypeReference@47d81427
2025-10-24 09:26:47 - Adding type registration integer -> org.hibernate.type.BasicTypeReference@3c5e4aac
2025-10-24 09:26:47 - Adding type registration int -> org.hibernate.type.BasicTypeReference@3c5e4aac
2025-10-24 09:26:47 - Adding type registration java.lang.Integer -> org.hibernate.type.BasicTypeReference@3c5e4aac
2025-10-24 09:26:47 - Adding type registration long -> org.hibernate.type.BasicTypeReference@20afd96f
2025-10-24 09:26:47 - Adding type registration long -> org.hibernate.type.BasicTypeReference@20afd96f
2025-10-24 09:26:47 - Adding type registration java.lang.Long -> org.hibernate.type.BasicTypeReference@20afd96f
2025-10-24 09:26:47 - Adding type registration float -> org.hibernate.type.BasicTypeReference@565a6af
2025-10-24 09:26:47 - Adding type registration float -> org.hibernate.type.BasicTypeReference@565a6af
2025-10-24 09:26:47 - Adding type registration java.lang.Float -> org.hibernate.type.BasicTypeReference@565a6af
2025-10-24 09:26:47 - Adding type registration double -> org.hibernate.type.BasicTypeReference@21bf308
2025-10-24 09:26:47 - Adding type registration double -> org.hibernate.type.BasicTypeReference@21bf308
2025-10-24 09:26:47 - Adding type registration java.lang.Double -> org.hibernate.type.BasicTypeReference@21bf308
2025-10-24 09:26:47 - Adding type registration big_integer -> org.hibernate.type.BasicTypeReference@4cded2cd
2025-10-24 09:26:47 - Adding type registration java.math.BigInteger -> org.hibernate.type.BasicTypeReference@4cded2cd
2025-10-24 09:26:47 - Adding type registration big_decimal -> org.hibernate.type.BasicTypeReference@12e40e98
2025-10-24 09:26:47 - Adding type registration java.math.BigDecimal -> org.hibernate.type.BasicTypeReference@12e40e98
2025-10-24 09:26:47 - Adding type registration character -> org.hibernate.type.BasicTypeReference@3a9c92b5
2025-10-24 09:26:47 - Adding type registration char -> org.hibernate.type.BasicTypeReference@3a9c92b5
2025-10-24 09:26:47 - Adding type registration java.lang.Character -> org.hibernate.type.BasicTypeReference@3a9c92b5
2025-10-24 09:26:47 - Adding type registration character_nchar -> org.hibernate.type.BasicTypeReference@67c2b55d
2025-10-24 09:26:47 - Adding type registration string -> org.hibernate.type.BasicTypeReference@5db04bd2
2025-10-24 09:26:47 - Adding type registration java.lang.String -> org.hibernate.type.BasicTypeReference@5db04bd2
2025-10-24 09:26:47 - Adding type registration nstring -> org.hibernate.type.BasicTypeReference@6f921e32
2025-10-24 09:26:47 - Adding type registration characters -> org.hibernate.type.BasicTypeReference@31c5304f
2025-10-24 09:26:47 - Adding type registration char[] -> org.hibernate.type.BasicTypeReference@31c5304f
2025-10-24 09:26:47 - Adding type registration [C -> org.hibernate.type.BasicTypeReference@31c5304f
2025-10-24 09:26:47 - Adding type registration wrapper-characters -> org.hibernate.type.BasicTypeReference@43df1377
2025-10-24 09:26:47 - Adding type registration text -> org.hibernate.type.BasicTypeReference@1cee3e05
2025-10-24 09:26:47 - Adding type registration ntext -> org.hibernate.type.BasicTypeReference@63f2d024
2025-10-24 09:26:47 - Adding type registration clob -> org.hibernate.type.BasicTypeReference@7b2dd35d
2025-10-24 09:26:47 - Adding type registration java.sql.Clob -> org.hibernate.type.BasicTypeReference@7b2dd35d
2025-10-24 09:26:47 - Adding type registration nclob -> org.hibernate.type.BasicTypeReference@405223e4
2025-10-24 09:26:47 - Adding type registration java.sql.NClob -> org.hibernate.type.BasicTypeReference@405223e4
2025-10-24 09:26:47 - Adding type registration materialized_clob -> org.hibernate.type.BasicTypeReference@2d2133fd
2025-10-24 09:26:47 - Adding type registration materialized_clob_char_array -> org.hibernate.type.BasicTypeReference@58a7a58d
2025-10-24 09:26:47 - Adding type registration materialized_clob_character_array -> org.hibernate.type.BasicTypeReference@4d8522ff
2025-10-24 09:26:47 - Adding type registration materialized_nclob -> org.hibernate.type.BasicTypeReference@1c9975a8
2025-10-24 09:26:47 - Adding type registration materialized_nclob_character_array -> org.hibernate.type.BasicTypeReference@3883031d
2025-10-24 09:26:47 - Adding type registration materialized_nclob_char_array -> org.hibernate.type.BasicTypeReference@5d6d424d
2025-10-24 09:26:47 - Adding type registration Duration -> org.hibernate.type.BasicTypeReference@391b01c5
2025-10-24 09:26:47 - Adding type registration java.time.Duration -> org.hibernate.type.BasicTypeReference@391b01c5
2025-10-24 09:26:47 - Adding type registration LocalDateTime -> org.hibernate.type.BasicTypeReference@6e78177b
2025-10-24 09:26:47 - Adding type registration java.time.LocalDateTime -> org.hibernate.type.BasicTypeReference@6e78177b
2025-10-24 09:26:47 - Adding type registration LocalDate -> org.hibernate.type.BasicTypeReference@4ec37a42
2025-10-24 09:26:47 - Adding type registration java.time.LocalDate -> org.hibernate.type.BasicTypeReference@4ec37a42
2025-10-24 09:26:47 - Adding type registration LocalTime -> org.hibernate.type.BasicTypeReference@798b36fd
2025-10-24 09:26:47 - Adding type registration java.time.LocalTime -> org.hibernate.type.BasicTypeReference@798b36fd
2025-10-24 09:26:47 - Adding type registration OffsetDateTime -> org.hibernate.type.BasicTypeReference@18ff1520
2025-10-24 09:26:47 - Adding type registration java.time.OffsetDateTime -> org.hibernate.type.BasicTypeReference@18ff1520
2025-10-24 09:26:47 - Adding type registration OffsetDateTimeWithTimezone -> org.hibernate.type.BasicTypeReference@36120a8b
2025-10-24 09:26:47 - Adding type registration OffsetDateTimeWithoutTimezone -> org.hibernate.type.BasicTypeReference@63d66761
2025-10-24 09:26:47 - Adding type registration OffsetTime -> org.hibernate.type.BasicTypeReference@434a8938
2025-10-24 09:26:47 - Adding type registration java.time.OffsetTime -> org.hibernate.type.BasicTypeReference@434a8938
2025-10-24 09:26:47 - Adding type registration OffsetTimeUtc -> org.hibernate.type.BasicTypeReference@237cd264
2025-10-24 09:26:47 - Adding type registration OffsetTimeWithTimezone -> org.hibernate.type.BasicTypeReference@51cd2d2
2025-10-24 09:26:47 - Adding type registration OffsetTimeWithoutTimezone -> org.hibernate.type.BasicTypeReference@5521407f
2025-10-24 09:26:47 - Adding type registration ZonedDateTime -> org.hibernate.type.BasicTypeReference@42b500aa
2025-10-24 09:26:47 - Adding type registration java.time.ZonedDateTime -> org.hibernate.type.BasicTypeReference@42b500aa
2025-10-24 09:26:47 - Adding type registration ZonedDateTimeWithTimezone -> org.hibernate.type.BasicTypeReference@71f056a
2025-10-24 09:26:47 - Adding type registration ZonedDateTimeWithoutTimezone -> org.hibernate.type.BasicTypeReference@64f6dd19
2025-10-24 09:26:47 - Adding type registration date -> org.hibernate.type.BasicTypeReference@3b8b5b40
2025-10-24 09:26:47 - Adding type registration java.sql.Date -> org.hibernate.type.BasicTypeReference@3b8b5b40
2025-10-24 09:26:47 - Adding type registration time -> org.hibernate.type.BasicTypeReference@5151accb
2025-10-24 09:26:47 - Adding type registration java.sql.Time -> org.hibernate.type.BasicTypeReference@5151accb
2025-10-24 09:26:47 - Adding type registration timestamp -> org.hibernate.type.BasicTypeReference@2e1ad7de
2025-10-24 09:26:47 - Adding type registration java.sql.Timestamp -> org.hibernate.type.BasicTypeReference@2e1ad7de
2025-10-24 09:26:47 - Adding type registration java.util.Date -> org.hibernate.type.BasicTypeReference@2e1ad7de
2025-10-24 09:26:47 - Adding type registration calendar -> org.hibernate.type.BasicTypeReference@7c56c911
2025-10-24 09:26:47 - Adding type registration java.util.Calendar -> org.hibernate.type.BasicTypeReference@7c56c911
2025-10-24 09:26:47 - Adding type registration java.util.GregorianCalendar -> org.hibernate.type.BasicTypeReference@7c56c911
2025-10-24 09:26:47 - Adding type registration calendar_date -> org.hibernate.type.BasicTypeReference@1de6dc80
2025-10-24 09:26:47 - Adding type registration calendar_time -> org.hibernate.type.BasicTypeReference@418d1c03
2025-10-24 09:26:47 - Adding type registration instant -> org.hibernate.type.BasicTypeReference@395197cb
2025-10-24 09:26:47 - Adding type registration java.time.Instant -> org.hibernate.type.BasicTypeReference@395197cb
2025-10-24 09:26:47 - Adding type registration uuid -> org.hibernate.type.BasicTypeReference@7305cfb1
2025-10-24 09:26:47 - Adding type registration java.util.UUID -> org.hibernate.type.BasicTypeReference@7305cfb1
2025-10-24 09:26:47 - Adding type registration pg-uuid -> org.hibernate.type.BasicTypeReference@7305cfb1
2025-10-24 09:26:47 - Adding type registration uuid-binary -> org.hibernate.type.BasicTypeReference@582c1f8d
2025-10-24 09:26:47 - Adding type registration uuid-char -> org.hibernate.type.BasicTypeReference@71687d8f
2025-10-24 09:26:47 - Adding type registration class -> org.hibernate.type.BasicTypeReference@443253a6
2025-10-24 09:26:47 - Adding type registration java.lang.Class -> org.hibernate.type.BasicTypeReference@443253a6
2025-10-24 09:26:47 - Adding type registration currency -> org.hibernate.type.BasicTypeReference@191774d6
2025-10-24 09:26:47 - Adding type registration Currency -> org.hibernate.type.BasicTypeReference@191774d6
2025-10-24 09:26:47 - Adding type registration java.util.Currency -> org.hibernate.type.BasicTypeReference@191774d6
2025-10-24 09:26:47 - Adding type registration locale -> org.hibernate.type.BasicTypeReference@21ffc00e
2025-10-24 09:26:47 - Adding type registration java.util.Locale -> org.hibernate.type.BasicTypeReference@21ffc00e
2025-10-24 09:26:47 - Adding type registration serializable -> org.hibernate.type.BasicTypeReference@134955bb
2025-10-24 09:26:47 - Adding type registration java.io.Serializable -> org.hibernate.type.BasicTypeReference@134955bb
2025-10-24 09:26:47 - Adding type registration timezone -> org.hibernate.type.BasicTypeReference@45b08b17
2025-10-24 09:26:47 - Adding type registration java.util.TimeZone -> org.hibernate.type.BasicTypeReference@45b08b17
2025-10-24 09:26:47 - Adding type registration ZoneOffset -> org.hibernate.type.BasicTypeReference@6723e6b3
2025-10-24 09:26:47 - Adding type registration java.time.ZoneOffset -> org.hibernate.type.BasicTypeReference@6723e6b3
2025-10-24 09:26:47 - Adding type registration url -> org.hibernate.type.BasicTypeReference@3883b5e9
2025-10-24 09:26:47 - Adding type registration java.net.URL -> org.hibernate.type.BasicTypeReference@3883b5e9
2025-10-24 09:26:47 - Adding type registration vector -> org.hibernate.type.BasicTypeReference@61becbcf
2025-10-24 09:26:47 - Adding type registration row_version -> org.hibernate.type.BasicTypeReference@20171cdc
2025-10-24 09:26:47 - Adding type registration object -> org.hibernate.type.JavaObjectType@719bb60d
2025-10-24 09:26:47 - Adding type registration java.lang.Object -> org.hibernate.type.JavaObjectType@719bb60d
2025-10-24 09:26:47 - Adding type registration null -> org.hibernate.type.NullType@3855b27e
2025-10-24 09:26:47 - Adding type registration imm_date -> org.hibernate.type.BasicTypeReference@5305f936
2025-10-24 09:26:47 - Adding type registration imm_time -> org.hibernate.type.BasicTypeReference@7d90764a
2025-10-24 09:26:47 - Adding type registration imm_timestamp -> org.hibernate.type.BasicTypeReference@6843fdc4
2025-10-24 09:26:47 - Adding type registration imm_calendar -> org.hibernate.type.BasicTypeReference@147375b3
2025-10-24 09:26:47 - Adding type registration imm_calendar_date -> org.hibernate.type.BasicTypeReference@6f430ea8
2025-10-24 09:26:47 - Adding type registration imm_calendar_time -> org.hibernate.type.BasicTypeReference@119f072c
2025-10-24 09:26:47 - Adding type registration imm_binary -> org.hibernate.type.BasicTypeReference@66456506
2025-10-24 09:26:47 - Adding type registration imm_serializable -> org.hibernate.type.BasicTypeReference@69944a90
2025-10-24 09:26:47 - No LoadTimeWeaver setup: ignoring JPA class transformer
2025-10-24 09:26:47 - HikariPool-1 - Starting...
2025-10-24 09:26:48 - HikariPool-1 - Added connection org.postgresql.jdbc.PgConnection@7d15c513
2025-10-24 09:26:48 - HikariPool-1 - Start completed.
2025-10-24 09:26:48 - HHH90000025: PostgreSQLDialect does not need to be specified explicitly using 'hibernate.dialect' (remove the property setting and it will be selected by default)
2025-10-24 09:26:48 - addDescriptor(2003, org.hibernate.type.descriptor.sql.internal.ArrayDdlTypeImpl@74bcf1ab) replaced previous registration(org.hibernate.type.descriptor.sql.internal.ArrayDdlTypeImpl@a11efe6)
2025-10-24 09:26:48 - addDescriptor(6, org.hibernate.type.descriptor.sql.internal.CapacityDependentDdlType@5e6bbe63) replaced previous registration(org.hibernate.type.descriptor.sql.internal.DdlTypeImpl@69356aca)
2025-10-24 09:26:48 - addDescriptor(2004, BlobTypeDescriptor(BLOB_BINDING)) replaced previous registration(BlobTypeDescriptor(DEFAULT))
2025-10-24 09:26:48 - addDescriptor(2005, ClobTypeDescriptor(CLOB_BINDING)) replaced previous registration(ClobTypeDescriptor(DEFAULT))
2025-10-24 09:26:48 - Adding type registration JAVA_OBJECT -> org.hibernate.type.JavaObjectType@4bcf08ae
2025-10-24 09:26:48 - Adding type registration java.lang.Object -> org.hibernate.type.JavaObjectType@4bcf08ae
2025-10-24 09:26:48 - Type registration key [java.lang.Object] overrode previous entry : `org.hibernate.type.JavaObjectType@719bb60d`
2025-10-24 09:26:48 - Adding type registration org.hibernate.type.DurationType -> basicType@1(java.time.Duration,3015)
2025-10-24 09:26:48 - Adding type registration Duration -> basicType@1(java.time.Duration,3015)
2025-10-24 09:26:48 - Adding type registration java.time.Duration -> basicType@1(java.time.Duration,3015)
2025-10-24 09:26:48 - Adding type registration org.hibernate.type.OffsetDateTimeType -> basicType@2(java.time.OffsetDateTime,3003)
2025-10-24 09:26:48 - Adding type registration OffsetDateTime -> basicType@2(java.time.OffsetDateTime,3003)
2025-10-24 09:26:48 - Adding type registration java.time.OffsetDateTime -> basicType@2(java.time.OffsetDateTime,3003)
2025-10-24 09:26:48 - Adding type registration org.hibernate.type.ZonedDateTimeType -> basicType@3(java.time.ZonedDateTime,3003)
2025-10-24 09:26:48 - Adding type registration ZonedDateTime -> basicType@3(java.time.ZonedDateTime,3003)
2025-10-24 09:26:48 - Adding type registration java.time.ZonedDateTime -> basicType@3(java.time.ZonedDateTime,3003)
2025-10-24 09:26:48 - Adding type registration org.hibernate.type.OffsetTimeType -> basicType@4(java.time.OffsetTime,3007)
2025-10-24 09:26:48 - Adding type registration OffsetTime -> basicType@4(java.time.OffsetTime,3007)
2025-10-24 09:26:48 - Adding type registration java.time.OffsetTime -> basicType@4(java.time.OffsetTime,3007)
2025-10-24 09:26:48 - Scoping TypeConfiguration [org.hibernate.type.spi.TypeConfiguration@3f838072] to MetadataBuildingContext [org.hibernate.boot.internal.MetadataBuildingContextRootImpl@46c9ee28]
2025-10-24 09:26:48 - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration)
2025-10-24 09:26:48 - Scoping TypeConfiguration [org.hibernate.type.spi.TypeConfiguration@3f838072] to SessionFactoryImplementor [org.hibernate.internal.SessionFactoryImpl@58df431e]
2025-10-24 09:26:48 - Handling #sessionFactoryCreated from [org.hibernate.internal.SessionFactoryImpl@58df431e] for TypeConfiguration
2025-10-24 09:26:48 - Initialized JPA EntityManagerFactory for persistence unit 'default'
2025-10-24 09:26:48 - Property 'userDn' not set - anonymous context will be used for read-only operations
2025-10-24 09:26:48 - Unable to load io.netty.resolver.dns.macos.MacOSDnsServerAddressStreamProvider, fallback to system defaults. This may result in incorrect DNS resolutions on MacOS. Check whether you have a dependency on 'io.netty:netty-resolver-dns-native-macos'. Use DEBUG level to see the full stack: java.lang.UnsatisfiedLinkError: failed to load the required native library
2025-10-24 09:26:49 - spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning
2025-10-24 09:26:49 -
Using generated security password: 33ac1b3a-354c-440f-9dd7-091fe188ba83
This generated password is for development use only. Your security configuration must be updated before running your application in production.
2025-10-24 09:26:49 - Global AuthenticationManager configured with UserDetailsService bean with name inMemoryUserDetailsManager
2025-10-24 09:26:49 - Exposing 3 endpoints beneath base path '/actuator'
2025-10-24 09:26:49 - Will secure any request with filters: DisableEncodeUrlFilter, WebAsyncManagerIntegrationFilter, SecurityContextHolderFilter, HeaderWriterFilter, CorsFilter, LogoutFilter, JwtAuthenticationFilter, RequestCacheAwareFilter, SecurityContextHolderAwareRequestFilter, AnonymousAuthenticationFilter, SessionManagementFilter, ExceptionTranslationFilter, AuthorizationFilter
2025-10-24 09:26:50 - Adding {logging-channel-adapter:_org.springframework.integration.errorLogger} as a subscriber to the 'errorChannel' channel
2025-10-24 09:26:50 - Channel 'user.errorChannel' has 1 subscriber(s).
2025-10-24 09:26:50 - started bean '_org.springframework.integration.errorLogger'
2025-10-24 09:26:50 - Tomcat started on port 8081 (http) with context path '/'
2025-10-24 09:26:50 - Started UserApplication in 4.527 seconds (process running for 4.818)
2025-10-24 09:27:16 - Initializing Spring DispatcherServlet 'dispatcherServlet'
2025-10-24 09:27:16 - Initializing Servlet 'dispatcherServlet'
2025-10-24 09:27:16 - Completed initialization in 3 ms
2025-10-24 09:27:16 - Securing GET /actuator/health
2025-10-24 09:27:16 - Set SecurityContextHolder to anonymous SecurityContext
2025-10-24 09:27:16 - Secured GET /actuator/health
2025-10-24 09:27:17 - LDAP health check failed
org.springframework.ldap.CommunicationException: ldap.example.com:636
at org.springframework.ldap.support.LdapUtils.convertLdapException(LdapUtils.java:107)
at org.springframework.ldap.core.support.AbstractContextSource.createContext(AbstractContextSource.java:362)
at org.springframework.ldap.core.support.AbstractContextSource.getReadOnlyContext(AbstractContextSource.java:172)
at org.springframework.ldap.core.LdapTemplate.executeReadOnly(LdapTemplate.java:789)
at org.springframework.boot.actuate.ldap.LdapHealthIndicator.doHealthCheck(LdapHealthIndicator.java:50)
at org.springframework.boot.actuate.health.AbstractHealthIndicator.health(AbstractHealthIndicator.java:82)
at org.springframework.boot.actuate.health.HealthIndicator.getHealth(HealthIndicator.java:37)
at org.springframework.boot.actuate.health.HealthEndpointWebExtension.getHealth(HealthEndpointWebExtension.java:94)
at org.springframework.boot.actuate.health.HealthEndpointWebExtension.getHealth(HealthEndpointWebExtension.java:47)
at org.springframework.boot.actuate.health.HealthEndpointSupport.getLoggedHealth(HealthEndpointSupport.java:172)
at org.springframework.boot.actuate.health.HealthEndpointSupport.getContribution(HealthEndpointSupport.java:145)
at org.springframework.boot.actuate.health.HealthEndpointSupport.getAggregateContribution(HealthEndpointSupport.java:156)
at org.springframework.boot.actuate.health.HealthEndpointSupport.getContribution(HealthEndpointSupport.java:141)
at org.springframework.boot.actuate.health.HealthEndpointSupport.getHealth(HealthEndpointSupport.java:110)
at org.springframework.boot.actuate.health.HealthEndpointSupport.getHealth(HealthEndpointSupport.java:81)
at org.springframework.boot.actuate.health.HealthEndpointWebExtension.health(HealthEndpointWebExtension.java:80)
at org.springframework.boot.actuate.health.HealthEndpointWebExtension.health(HealthEndpointWebExtension.java:69)
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.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:281)
at org.springframework.boot.actuate.endpoint.invoke.reflect.ReflectiveOperationInvoker.invoke(ReflectiveOperationInvoker.java:74)
at org.springframework.boot.actuate.endpoint.annotation.AbstractDiscoveredOperation.invoke(AbstractDiscoveredOperation.java:60)
at org.springframework.boot.actuate.endpoint.web.servlet.AbstractWebMvcEndpointHandlerMapping$ServletWebOperationAdapter.handle(AbstractWebMvcEndpointHandlerMapping.java:327)
at org.springframework.boot.actuate.endpoint.web.servlet.AbstractWebMvcEndpointHandlerMapping$OperationHandler.handle(AbstractWebMvcEndpointHandlerMapping.java:434)
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 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101)
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: javax.naming.CommunicationException: ldap.example.com:636
at java.naming/com.sun.jndi.ldap.Connection.<init>(Connection.java:251)
at java.naming/com.sun.jndi.ldap.LdapClient.<init>(LdapClient.java:141)
at java.naming/com.sun.jndi.ldap.LdapClient.getInstance(LdapClient.java:1620)
at java.naming/com.sun.jndi.ldap.LdapCtx.connect(LdapCtx.java:2848)
at java.naming/com.sun.jndi.ldap.LdapCtx.<init>(LdapCtx.java:349)
at java.naming/com.sun.jndi.ldap.LdapCtxFactory.getLdapCtxFromUrl(LdapCtxFactory.java:229)
at java.naming/com.sun.jndi.ldap.LdapCtxFactory.getUsingURL(LdapCtxFactory.java:189)
at java.naming/com.sun.jndi.ldap.LdapCtxFactory.getUsingURLs(LdapCtxFactory.java:247)
at java.naming/com.sun.jndi.ldap.LdapCtxFactory.getLdapCtxInstance(LdapCtxFactory.java:154)
at java.naming/com.sun.jndi.ldap.LdapCtxFactory.getInitialContext(LdapCtxFactory.java:84)
at java.naming/javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:520)
at java.naming/javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:305)
at java.naming/javax.naming.InitialContext.init(InitialContext.java:236)
at java.naming/javax.naming.ldap.InitialLdapContext.<init>(InitialLdapContext.java:154)
at org.springframework.ldap.core.support.LdapContextSource.getDirContextInstance(LdapContextSource.java:44)
at org.springframework.ldap.core.support.AbstractContextSource.createContext(AbstractContextSource.java:350)
... 153 common frames omitted
Caused by: java.net.UnknownHostException: ldap.example.com
at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:567)
at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327)
at java.base/java.net.Socket.connect(Socket.java:751)
at java.base/sun.security.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:304)
at java.base/sun.security.ssl.SSLSocketImpl.<init>(SSLSocketImpl.java:163)
at java.base/sun.security.ssl.SSLSocketFactoryImpl.createSocket(SSLSocketFactoryImpl.java:86)
at java.naming/com.sun.jndi.ldap.Connection.createConnectionSocket(Connection.java:350)
at java.naming/com.sun.jndi.ldap.Connection.createSocket(Connection.java:283)
at java.naming/com.sun.jndi.ldap.Connection.<init>(Connection.java:230)
... 168 common frames omitted
2025-10-24 09:27:18 - Securing GET /swagger-ui.html
2025-10-24 09:27:18 - Set SecurityContextHolder to anonymous SecurityContext
2025-10-24 09:27:18 - Secured GET /swagger-ui.html
2025-10-24 09:27:51 - Removing {logging-channel-adapter:_org.springframework.integration.errorLogger} as a subscriber to the 'errorChannel' channel
2025-10-24 09:27:51 - Channel 'user.errorChannel' has 0 subscriber(s).
2025-10-24 09:27:51 - stopped bean '_org.springframework.integration.errorLogger'
2025-10-24 09:27:51 - Closing JPA EntityManagerFactory for persistence unit 'default'
2025-10-24 09:27:51 - Handling #sessionFactoryClosed from [org.hibernate.internal.SessionFactoryImpl@58df431e] for TypeConfiguration
2025-10-24 09:27:51 - Un-scoping TypeConfiguration [org.hibernate.type.spi.TypeConfiguration$Scope@c7b775] from SessionFactory [org.hibernate.internal.SessionFactoryImpl@58df431e]
2025-10-24 09:27:51 - HikariPool-1 - Shutdown initiated...
2025-10-24 09:27:51 - HikariPool-1 - Shutdown completed.

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,44 @@
package com.unicorn.hgzero.user.config;
import com.azure.messaging.eventhubs.EventHubProducerClient;
import com.azure.messaging.eventhubs.EventHubClientBuilder;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* Azure EventHub 설정
* 사용자 인증 관련 이벤트 발행을 위한 EventHub 설정
*/
@Slf4j
@Configuration
public class EventHubConfig {
@Value("${spring.cloud.azure.eventhub.connection-string:}")
private String connectionString;
@Value("${spring.cloud.azure.eventhub.name:hgzero-eventhub-name}")
private String eventHubName;
/**
* EventHub Producer Client 생성
* 연결 문자열이 있을 때만 생성
*/
@Bean
@ConditionalOnExpression("'${spring.cloud.azure.eventhub.connection-string:}'.length() > 0")
public EventHubProducerClient eventHubProducerClient() {
try {
EventHubProducerClient client = new EventHubClientBuilder()
.connectionString(connectionString, eventHubName)
.buildProducerClient();
log.info("EventHub Producer Client 생성 완료: {}", eventHubName);
return client;
} catch (Exception e) {
log.error("EventHub Producer Client 생성 실패: {}", e.getMessage());
throw new RuntimeException("EventHub Producer Client 생성 실패", e);
}
}
}

View File

@ -46,7 +46,7 @@ public class JwtTokenProvider {
public boolean validateToken(String token) {
try {
Jwts.parser()
.setSigningKey(secretKey)
.verifyWith(secretKey)
.build()
.parseClaimsJws(token);
return true;
@ -67,7 +67,7 @@ public class JwtTokenProvider {
*/
public String getUserId(String token) {
Claims claims = Jwts.parser()
.setSigningKey(secretKey)
.verifyWith(secretKey)
.build()
.parseClaimsJws(token)
.getBody();
@ -80,7 +80,7 @@ public class JwtTokenProvider {
*/
public String getUsername(String token) {
Claims claims = Jwts.parser()
.setSigningKey(secretKey)
.verifyWith(secretKey)
.build()
.parseClaimsJws(token)
.getBody();
@ -93,7 +93,7 @@ public class JwtTokenProvider {
*/
public String getAuthority(String token) {
Claims claims = Jwts.parser()
.setSigningKey(secretKey)
.verifyWith(secretKey)
.build()
.parseClaimsJws(token)
.getBody();
@ -107,7 +107,7 @@ public class JwtTokenProvider {
public boolean isTokenExpired(String token) {
try {
Claims claims = Jwts.parser()
.setSigningKey(secretKey)
.verifyWith(secretKey)
.build()
.parseClaimsJws(token)
.getBody();
@ -123,7 +123,7 @@ public class JwtTokenProvider {
*/
public Date getExpirationDate(String token) {
Claims claims = Jwts.parser()
.setSigningKey(secretKey)
.verifyWith(secretKey)
.build()
.parseClaimsJws(token)
.getBody();

View File

@ -0,0 +1,33 @@
package com.unicorn.hgzero.user.service;
/**
* 이벤트 발행 서비스 인터페이스
* 사용자 인증 관련 이벤트를 외부 시스템에 발행
*/
public interface EventPublishService {
/**
* 로그인 이벤트 발행
*
* @param userId 사용자 ID
* @param username 사용자명
* @param timestamp 로그인 시각
*/
void publishLoginEvent(String userId, String username, long timestamp);
/**
* 로그아웃 이벤트 발행
*
* @param userId 사용자 ID
* @param timestamp 로그아웃 시각
*/
void publishLogoutEvent(String userId, long timestamp);
/**
* 토큰 갱신 이벤트 발행
*
* @param userId 사용자 ID
* @param timestamp 토큰 갱신 시각
*/
void publishTokenRefreshEvent(String userId, long timestamp);
}

View File

@ -0,0 +1,89 @@
package com.unicorn.hgzero.user.service;
import com.azure.messaging.eventhubs.EventData;
import com.azure.messaging.eventhubs.EventHubProducerClient;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.stereotype.Service;
import java.time.Instant;
import java.util.HashMap;
import java.util.Map;
/**
* 이벤트 발행 서비스 구현체
* Azure EventHub를 통한 사용자 인증 이벤트 발행
*/
@Slf4j
@Service
@RequiredArgsConstructor
@ConditionalOnBean(EventHubProducerClient.class)
public class EventPublishServiceImpl implements EventPublishService {
private final EventHubProducerClient eventHubProducerClient;
private final ObjectMapper objectMapper = new ObjectMapper();
@Override
public void publishLoginEvent(String userId, String username, long timestamp) {
Map<String, Object> eventData = new HashMap<>();
eventData.put("eventType", "USER_LOGIN");
eventData.put("userId", userId);
eventData.put("username", username);
eventData.put("timestamp", timestamp);
eventData.put("eventTime", Instant.ofEpochMilli(timestamp).toString());
publishEvent(eventData, "로그인 이벤트");
}
@Override
public void publishLogoutEvent(String userId, long timestamp) {
Map<String, Object> eventData = new HashMap<>();
eventData.put("eventType", "USER_LOGOUT");
eventData.put("userId", userId);
eventData.put("timestamp", timestamp);
eventData.put("eventTime", Instant.ofEpochMilli(timestamp).toString());
publishEvent(eventData, "로그아웃 이벤트");
}
@Override
public void publishTokenRefreshEvent(String userId, long timestamp) {
Map<String, Object> eventData = new HashMap<>();
eventData.put("eventType", "TOKEN_REFRESH");
eventData.put("userId", userId);
eventData.put("timestamp", timestamp);
eventData.put("eventTime", Instant.ofEpochMilli(timestamp).toString());
publishEvent(eventData, "토큰 갱신 이벤트");
}
/**
* EventHub로 이벤트 발행
*
* @param eventData 이벤트 데이터
* @param eventDescription 이벤트 설명 (로깅용)
*/
private void publishEvent(Map<String, Object> eventData, String eventDescription) {
if (eventHubProducerClient == null) {
log.debug("EventHub Producer Client가 없어 {} 발행을 건너뜀", eventDescription);
return;
}
try {
String jsonData = objectMapper.writeValueAsString(eventData);
EventData event = new EventData(jsonData);
// EventData를 Iterable로 감싸서 전송
eventHubProducerClient.send(java.util.Collections.singletonList(event));
log.debug("{} 발행 완료: {}", eventDescription, eventData.get("userId"));
} catch (JsonProcessingException e) {
log.error("{} JSON 변환 실패: {}", eventDescription, e.getMessage());
} catch (Exception e) {
log.error("{} 발행 실패: {}", eventDescription, e.getMessage());
}
}
}

View File

@ -0,0 +1,30 @@
package com.unicorn.hgzero.user.service;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.stereotype.Service;
/**
* No-Op 이벤트 발행 서비스
* EventHub가 설정되지 않은 경우 사용되는 기본 구현체
*/
@Slf4j
@Service
@ConditionalOnMissingBean(EventPublishServiceImpl.class)
public class NoOpEventPublishService implements EventPublishService {
@Override
public void publishLoginEvent(String userId, String username, long timestamp) {
log.debug("EventHub 미설정으로 로그인 이벤트 발행 건너뜀: userId={}", userId);
}
@Override
public void publishLogoutEvent(String userId, long timestamp) {
log.debug("EventHub 미설정으로 로그아웃 이벤트 발행 건너뜀: userId={}", userId);
}
@Override
public void publishTokenRefreshEvent(String userId, long timestamp) {
log.debug("EventHub 미설정으로 토큰 갱신 이벤트 발행 건너뜀: userId={}", userId);
}
}

View File

@ -41,6 +41,7 @@ public class UserServiceImpl implements UserService {
private final UserRepository userRepository;
private final JwtTokenProvider jwtTokenProvider;
private final RedisTemplate<String, String> redisTemplate;
private final EventPublishService eventPublishService;
@Value("${jwt.secret}")
private String jwtSecret;
@ -123,6 +124,9 @@ public class UserServiceImpl implements UserService {
saveRefreshToken(user.getUserId(), refreshToken);
log.info("로그인 성공: userId={}", request.getUserId());
// 로그인 이벤트 발행
eventPublishService.publishLoginEvent(user.getUserId(), user.getUsername(), System.currentTimeMillis());
return LoginResponse.builder()
.accessToken(accessToken)
@ -173,6 +177,9 @@ public class UserServiceImpl implements UserService {
String newAccessToken = generateAccessToken(user);
log.info("토큰 갱신 성공: userId={}", userId);
// 토큰 갱신 이벤트 발행
eventPublishService.publishTokenRefreshEvent(userId, System.currentTimeMillis());
return RefreshTokenResponse.builder()
.accessToken(newAccessToken)
@ -191,6 +198,9 @@ public class UserServiceImpl implements UserService {
// Redis에서 Refresh Token 삭제
deleteRefreshToken(userId);
// 로그아웃 이벤트 발행
eventPublishService.publishLogoutEvent(userId, System.currentTimeMillis());
log.info("로그아웃 완료: userId={}", userId);
}

View File

@ -8,7 +8,7 @@ spring:
datasource:
url: jdbc:${DB_KIND:postgresql}://${DB_HOST:localhost}:${DB_PORT:5432}/${DB_NAME:userdb}
username: ${DB_USERNAME:hgzerouser}
password: ${DB_PASSWORD:}
password: ${DB_PASSWORD:Hi5Jessica!}
driver-class-name: org.postgresql.Driver
hikari:
maximum-pool-size: 20
@ -25,8 +25,13 @@ spring:
hibernate:
format_sql: true
use_sql_comments: true
dialect: org.hibernate.dialect.PostgreSQLDialect
jdbc:
time_zone: UTC
hibernate:
ddl-auto: ${JPA_DDL_AUTO:update}
database: postgresql
database-platform: org.hibernate.dialect.PostgreSQLDialect
# Redis Configuration
data:
@ -43,13 +48,13 @@ spring:
max-wait: -1ms
database: ${REDIS_DATABASE:0}
# LDAP Configuration
ldap:
urls: ${LDAP_URLS:ldaps://ldap.example.com:636}
base: ${LDAP_BASE:dc=example,dc=com}
username: ${LDAP_USERNAME:}
password: ${LDAP_PASSWORD:}
user-dn-pattern: ${LDAP_USER_DN_PATTERN:uid={0},ou=people}
# LDAP Configuration (비활성화 for development)
# ldap:
# urls: ${LDAP_URLS:ldaps://ldap.example.com:636}
# base: ${LDAP_BASE:dc=example,dc=com}
# username: ${LDAP_USERNAME:}
# password: ${LDAP_PASSWORD:}
# user-dn-pattern: ${LDAP_USER_DN_PATTERN:uid={0},ou=people}
# Event Configuration (Azure EventHub)
cloud:
@ -96,6 +101,8 @@ management:
enabled: true
readinessState:
enabled: true
ldap:
enabled: false
# OpenAPI Documentation
springdoc: