From 02bcfa5434d6702cf4df71e5aeb6cdc8e8de4bb6 Mon Sep 17 00:00:00 2001 From: hiondal Date: Wed, 10 Sep 2025 02:06:24 +0900 Subject: [PATCH] =?UTF-8?q?kos-mock=20=EC=83=81=ED=92=88=EB=B3=80=EA=B2=BD?= =?UTF-8?q?=20=EC=8B=A4=EC=A0=9C=20DB=20=EC=97=85=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=8A=B8=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - MockDataService에 updateCustomerProduct 메서드 추가 - KosMockService에 실제 고객 데이터 업데이트 로직 추가 - 상품변경 시 고객의 current_product_code를 실제로 업데이트하도록 수정 - 트랜잭션 처리로 데이터 일관성 보장 - product-service Hibernate dialect 설정 추가 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- CLAUDE.md | 18 + api-gateway/.run/api-gateway.run.xml | 17 +- .../gateway/config/GatewayConfig.java | 36 +- .../gateway/service/JwtTokenService.java | 6 +- .../src/main/resources/application-dev.yml | 132 +---- .../src/main/resources/application-prod.yml | 220 +------ .../src/main/resources/application.yml | 29 +- bill-service/.run/bill-service.run.xml | 75 +-- bill-service/build.gradle | 1 + .../bill/config/JpaAuditingConfig.java | 22 + .../com/phonebill/bill/config/JwtConfig.java | 38 ++ .../phonebill/bill/config/RedisConfig.java | 19 +- .../phonebill/bill/config/SecurityConfig.java | 170 ++---- .../phonebill/bill/config/SwaggerConfig.java | 4 +- .../bill/controller/BillController.java | 57 +- .../com/phonebill/bill/dto/ApiResponse.java | 37 +- .../bill/dto/BillInquiryRequest.java | 9 +- .../exception/GlobalExceptionHandler.java | 6 +- .../phonebill/bill/external/KosRequest.java | 23 +- .../BillInquiryHistoryRepository.java | 90 ++- .../bill/service/BillCacheService.java | 8 +- .../bill/service/BillHistoryService.java | 66 ++- .../bill/service/BillInquiryService.java | 15 +- .../bill/service/BillInquiryServiceImpl.java | 217 +++---- .../bill/service/KosClientService.java | 485 +++++++++++++++- .../src/main/resources/application-dev.yml | 167 +----- .../src/main/resources/application-prod.yml | 237 +------- .../src/main/resources/application.yml | 188 ++---- build.gradle | 9 +- .../security/JwtAuthenticationFilter.java | 16 + .../common/security/JwtTokenProvider.java | 30 +- .../common/security/UserPrincipal.java | 10 + kos-mock/.run/kos-mock.run.xml | 20 - .../phonebill/kosmock/KosMockApplication.java | 10 +- .../kosmock/config/RestTemplateConfig.java | 21 + .../kosmock/controller/KosMockController.java | 129 +++-- .../controller/MockDataController.java | 135 +++++ .../kosmock/data/MockDataService.java | 545 +++++++++++------- .../dto/KosAvailableMonthsResponse.java | 53 ++ .../kosmock/dto/KosBillInquiryRequest.java | 7 +- .../kosmock/dto/KosBillInquiryResponse.java | 3 + .../kosmock/dto/KosProductChangeRequest.java | 12 +- .../phonebill/kosmock/dto/KosProductInfo.java | 60 ++ .../kosmock/dto/KosProductInquiryRequest.java | 26 + .../dto/KosProductInquiryResponse.java | 122 ++++ .../kosmock/dto/KosProductListResponse.java | 38 ++ .../kosmock/dto/MockDataCreateRequest.java | 22 + .../kosmock/dto/MockDataCreateResponse.java | 31 + .../kosmock/dto/UserResponseDto.java | 106 ++++ .../phonebill/kosmock/entity/BillEntity.java | 83 +++ .../kosmock/entity/CustomerEntity.java | 55 ++ .../kosmock/entity/ProductEntity.java | 63 ++ .../kosmock/repository/BillRepository.java | 48 ++ .../repository/CustomerRepository.java | 53 ++ .../kosmock/repository/ProductRepository.java | 42 ++ .../service/DataInitializationService.java | 126 ++++ .../kosmock/service/KosMockService.java | 243 +++++++- .../service/MockDataCreateService.java | 324 +++++++++++ .../src/main/resources/application-dev.yml | 45 -- .../src/main/resources/application-prod.yml | 25 +- kos-mock/src/main/resources/application.yml | 32 +- .../kosmock/KosMockApplicationTest.java | 18 - .../controller/KosMockControllerTest.java | 98 ---- .../src/test/resources/application-test.yml | 20 - product-service/.run/product-service.run.xml | 61 +- .../product/config/CircuitBreakerConfig.java | 211 +++++++ .../config/JwtAuthenticationFilter.java | 182 ------ .../phonebill/product/config/JwtConfig.java | 50 ++ .../product/config/KosProperties.java | 312 ++++++++++ .../product/config/RestTemplateConfig.java | 50 ++ .../product/config/SecurityConfig.java | 184 +++--- .../product/config/SwaggerConfig.java | 4 +- .../product/controller/ProductController.java | 105 +--- .../phonebill/product/domain/Product.java | 28 + .../product/domain/ProductChangeResult.java | 168 +++++- .../product/dto/ProductChangeRequest.java | 13 +- .../product/dto/ProductMenuResponse.java | 72 --- .../product/dto/kos/KosCommonResponse.java | 84 +++ .../product/dto/kos/KosProductInfo.java | 48 ++ .../dto/kos/KosProductInquiryRequest.java | 26 + .../dto/kos/KosProductInquiryResponse.java | 122 ++++ .../dto/kos/KosProductListResponse.java | 26 + .../exception/CircuitBreakerException.java | 34 +- .../exception/KosConnectionException.java | 15 + .../ProductChangeHistoryRepositoryImpl.java | 9 +- .../repository/ProductRepositoryImpl.java | 109 +++- .../entity/ProductChangeHistoryEntity.java | 147 ++--- .../ProductChangeHistoryJpaRepository.java | 22 +- .../product/service/KosClientService.java | 400 +++++++++++++ .../product/service/ProductCacheService.java | 29 - .../product/service/ProductService.java | 19 +- .../product/service/ProductServiceImpl.java | 302 ++++------ .../service/ProductValidationService.java | 14 +- .../src/main/resources/application-dev.yml | 202 +------ .../src/main/resources/application-prod.yml | 269 +-------- .../src/main/resources/application.yml | 202 +++---- user-service/.run/user-service.run.xml | 9 +- .../user/config/DataInitializer.java | 54 ++ .../com/phonebill/user/config/JwtConfig.java | 5 +- .../phonebill/user/config/SecurityConfig.java | 20 +- .../user/controller/AuthController.java | 104 +++- .../user/controller/UserController.java | 257 ++------- .../com/phonebill/user/dto/LoginRequest.java | 5 + .../com/phonebill/user/dto/LogoutRequest.java | 22 + .../user/dto/PermissionCheckRequest.java | 29 - .../user/dto/PermissionCheckResponse.java | 36 -- .../user/dto/RefreshTokenRequest.java | 4 + .../phonebill/user/dto/UserInfoResponse.java | 2 - .../user/dto/UserRegistrationRequest.java | 65 +++ .../user/dto/UserRegistrationResponse.java | 59 ++ .../phonebill/user/entity/AuthUserEntity.java | 3 + .../user/entity/AuthUserSessionEntity.java | 3 +- .../phonebill/user/enums/PermissionCode.java | 69 +++ .../UserServiceExceptionHandler.java | 2 +- .../repository/AuthUserSessionRepository.java | 5 + .../phonebill/user/service/AuthService.java | 74 ++- .../phonebill/user/service/JwtService.java | 2 +- .../user/service/TokenBlacklistService.java | 116 ++++ .../phonebill/user/service/UserService.java | 297 ++++++---- .../src/main/resources/application-dev.yml | 79 --- .../src/main/resources/application-prod.yml | 115 +--- .../src/main/resources/application.yml | 72 ++- 122 files changed, 6116 insertions(+), 3983 deletions(-) create mode 100644 bill-service/src/main/java/com/phonebill/bill/config/JpaAuditingConfig.java create mode 100644 bill-service/src/main/java/com/phonebill/bill/config/JwtConfig.java create mode 100644 kos-mock/src/main/java/com/phonebill/kosmock/config/RestTemplateConfig.java create mode 100644 kos-mock/src/main/java/com/phonebill/kosmock/controller/MockDataController.java create mode 100644 kos-mock/src/main/java/com/phonebill/kosmock/dto/KosAvailableMonthsResponse.java create mode 100644 kos-mock/src/main/java/com/phonebill/kosmock/dto/KosProductInfo.java create mode 100644 kos-mock/src/main/java/com/phonebill/kosmock/dto/KosProductInquiryRequest.java create mode 100644 kos-mock/src/main/java/com/phonebill/kosmock/dto/KosProductInquiryResponse.java create mode 100644 kos-mock/src/main/java/com/phonebill/kosmock/dto/KosProductListResponse.java create mode 100644 kos-mock/src/main/java/com/phonebill/kosmock/dto/MockDataCreateRequest.java create mode 100644 kos-mock/src/main/java/com/phonebill/kosmock/dto/MockDataCreateResponse.java create mode 100644 kos-mock/src/main/java/com/phonebill/kosmock/dto/UserResponseDto.java create mode 100644 kos-mock/src/main/java/com/phonebill/kosmock/entity/BillEntity.java create mode 100644 kos-mock/src/main/java/com/phonebill/kosmock/entity/CustomerEntity.java create mode 100644 kos-mock/src/main/java/com/phonebill/kosmock/entity/ProductEntity.java create mode 100644 kos-mock/src/main/java/com/phonebill/kosmock/repository/BillRepository.java create mode 100644 kos-mock/src/main/java/com/phonebill/kosmock/repository/CustomerRepository.java create mode 100644 kos-mock/src/main/java/com/phonebill/kosmock/repository/ProductRepository.java create mode 100644 kos-mock/src/main/java/com/phonebill/kosmock/service/DataInitializationService.java create mode 100644 kos-mock/src/main/java/com/phonebill/kosmock/service/MockDataCreateService.java delete mode 100644 kos-mock/src/test/java/com/phonebill/kosmock/KosMockApplicationTest.java delete mode 100644 kos-mock/src/test/java/com/phonebill/kosmock/controller/KosMockControllerTest.java delete mode 100644 kos-mock/src/test/resources/application-test.yml create mode 100644 product-service/src/main/java/com/unicorn/phonebill/product/config/CircuitBreakerConfig.java delete mode 100644 product-service/src/main/java/com/unicorn/phonebill/product/config/JwtAuthenticationFilter.java create mode 100644 product-service/src/main/java/com/unicorn/phonebill/product/config/JwtConfig.java create mode 100644 product-service/src/main/java/com/unicorn/phonebill/product/config/KosProperties.java create mode 100644 product-service/src/main/java/com/unicorn/phonebill/product/config/RestTemplateConfig.java delete mode 100644 product-service/src/main/java/com/unicorn/phonebill/product/dto/ProductMenuResponse.java create mode 100644 product-service/src/main/java/com/unicorn/phonebill/product/dto/kos/KosCommonResponse.java create mode 100644 product-service/src/main/java/com/unicorn/phonebill/product/dto/kos/KosProductInfo.java create mode 100644 product-service/src/main/java/com/unicorn/phonebill/product/dto/kos/KosProductInquiryRequest.java create mode 100644 product-service/src/main/java/com/unicorn/phonebill/product/dto/kos/KosProductInquiryResponse.java create mode 100644 product-service/src/main/java/com/unicorn/phonebill/product/dto/kos/KosProductListResponse.java create mode 100644 product-service/src/main/java/com/unicorn/phonebill/product/service/KosClientService.java create mode 100644 user-service/src/main/java/com/phonebill/user/config/DataInitializer.java delete mode 100644 user-service/src/main/java/com/phonebill/user/dto/PermissionCheckRequest.java delete mode 100644 user-service/src/main/java/com/phonebill/user/dto/PermissionCheckResponse.java create mode 100644 user-service/src/main/java/com/phonebill/user/dto/UserRegistrationRequest.java create mode 100644 user-service/src/main/java/com/phonebill/user/dto/UserRegistrationResponse.java create mode 100644 user-service/src/main/java/com/phonebill/user/enums/PermissionCode.java create mode 100644 user-service/src/main/java/com/phonebill/user/service/TokenBlacklistService.java diff --git a/CLAUDE.md b/CLAUDE.md index 13c956d..2667297 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -501,13 +501,31 @@ QA Engineer - **컴파일**: 최상위 루트에서 `./gradlew {service-name}:compileJava` 명령 사용 - **서버 시작**: AI가 직접 서버를 시작하지 말고 반드시 사람에게 요청할것 +## JSON 데이터 바인딩 문제 +- **문제**: DTO에서 JSON 요청 데이터가 바인딩되지 않아 모든 필드가 "필수입니다" 검증 오류 발생 +- **원인**: Jackson JSON 직렬화/역직렬화 시 명시적 프로퍼티 매핑 누락 +- **해결책**: DTO 필드에 `@JsonProperty("fieldName")` 어노테이션 추가 필수 +- **적용**: UserRegistrationRequest, LoginRequest 등 모든 Request DTO에 적용 + ## 실행 프로파일 작성 경험 - **Gradle 실행 프로파일**: Spring Boot가 아닌 Gradle 실행 프로파일 사용 필수 - **환경변수 매핑**: `` 형태로 환경변수 설정 - **컴포넌트 스캔 이슈**: common 모듈의 @Component가 인식되지 않는 경우 발생 - **의존성 주입 오류**: JwtTokenProvider 빈을 찾을 수 없는 오류 확인됨 +## Authorization Header 문제 +- **문제**: Swagger UI에서 생성된 curl 명령에 Authorization 헤더 누락 +- **원인**: SwaggerConfig의 SecurityRequirement 이름과 Controller의 @SecurityRequirement 이름 불일치 +- **해결책**: SwaggerConfig의 "Bearer Authentication"을 "bearerAuth"로 통일 +- **적용**: bill-service, product-service 모두 수정 완료 + ## 백킹서비스 연결 정보 - **LoadBalancer External IP**: kubectl 명령으로 실제 IP 확인 후 환경변수 설정 - **DB 연결정보**: 각 서비스별 별도 DB 사용 (auth, bill_inquiry, product_change) - **Redis 공유**: 모든 서비스가 동일한 Redis 인스턴스 사용 + +## 쿠버네티스 DB 접근 방법 +- **패스워드 확인**: `kubectl get secret -n {namespace} {secret-name} -o jsonpath='{.data.postgres-password}' | base64 -d` +- **환경변수 확인**: `kubectl exec -n {namespace} {pod-name} -c postgresql -- env | grep POSTGRES` +- **SQL 실행**: `kubectl exec -n {namespace} {pod-name} -c postgresql -- bash -c 'PGPASSWORD="$POSTGRES_POSTGRES_PASSWORD" psql -U postgres -d {database} -c "{SQL}"'` +- **예시**: `kubectl exec -n phonebill-dev product-change-postgres-dev-postgresql-0 -c postgresql -- bash -c 'PGPASSWORD="$POSTGRES_POSTGRES_PASSWORD" psql -U postgres -d product_change_db -c "ALTER TABLE product_change.pc_product_change_history ALTER COLUMN customer_id TYPE VARCHAR(100);"'` diff --git a/api-gateway/.run/api-gateway.run.xml b/api-gateway/.run/api-gateway.run.xml index ba289bc..a2bad0b 100644 --- a/api-gateway/.run/api-gateway.run.xml +++ b/api-gateway/.run/api-gateway.run.xml @@ -3,18 +3,15 @@