회선번호 처리 개선 및 다양한 API 기능 강화

- user-service: 회원등록 API를 upsert 방식으로 변경 (기존 사용자 업데이트 지원)
- user-service: userName 필드 응답 누락 문제 해결 (DB 데이터 업데이트)
- kos-mock: Mock 데이터 생성 기간을 3개월에서 6개월로 확장
- product-service: 회선번호 대시 처리 지원 (010-1234-5678, 01012345678 모두 허용)
- bill-service: 회선번호 대시 선택적 처리 지원 (유연한 입력 형식)
- api-gateway: CORS 중복 헤더 제거 필터 추가

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
hiondal
2025-09-10 19:25:13 +09:00
parent 9bfdeda316
commit 2599d57a37
17 changed files with 323 additions and 238 deletions
@@ -30,7 +30,7 @@ import java.util.List;
public class SecurityConfig {
private final JwtTokenProvider jwtTokenProvider;
@Value("${cors.allowed-origins")
@Value("${cors.allowed-origins}")
private String allowedOrigins;
@Bean
@@ -70,14 +70,23 @@ public class ProductController {
public ResponseEntity<CustomerInfoResponse> getCustomerInfo(
@Parameter(description = "고객 회선번호", example = "01012345678")
@RequestParam("lineNumber")
@Pattern(regexp = "^010[0-9]{8}$", message = "회선번호는 010으로 시작하는 11자리 숫자여야 합니다")
String lineNumber) {
String userId = getCurrentUserId();
logger.info("고객 정보 조회 요청: lineNumber={}, userId={}", lineNumber, userId);
// 회선번호에서 대시 제거
String normalizedLineNumber = lineNumber.replaceAll("-", "");
// 정규화된 회선번호 유효성 검증
if (!normalizedLineNumber.matches("^010[0-9]{8}$")) {
throw new IllegalArgumentException("회선번호는 010으로 시작하는 11자리 숫자여야 합니다");
}
logger.info("고객 정보 조회 요청: lineNumber={} (original: {}), userId={}",
normalizedLineNumber, lineNumber, userId);
try {
CustomerInfoResponse response = productService.getCustomerInfo(lineNumber);
CustomerInfoResponse response = productService.getCustomerInfo(normalizedLineNumber);
return ResponseEntity.ok(response);
} catch (Exception e) {
logger.error("고객 정보 조회 실패: lineNumber={}, userId={}", lineNumber, userId, e);
@@ -204,7 +213,6 @@ public class ProductController {
public ResponseEntity<ProductChangeHistoryResponse> getProductChangeHistory(
@Parameter(description = "회선번호 (미입력시 로그인 고객 기준)")
@RequestParam(required = false)
@Pattern(regexp = "^010[0-9]{8}$", message = "회선번호는 010으로 시작하는 11자리 숫자여야 합니다")
String lineNumber,
@Parameter(description = "조회 시작일 (YYYY-MM-DD)")
@RequestParam(required = false) String startDate,
@@ -216,8 +224,20 @@ public class ProductController {
@RequestParam(defaultValue = "10") int size) {
String userId = getCurrentUserId();
logger.info("상품변경 이력 조회 요청: lineNumber={}, startDate={}, endDate={}, page={}, size={}, userId={}",
lineNumber, startDate, endDate, page, size, userId);
// 회선번호 정규화 (입력된 경우에만)
String normalizedLineNumber = null;
if (lineNumber != null && !lineNumber.trim().isEmpty()) {
normalizedLineNumber = lineNumber.replaceAll("-", "");
// 정규화된 회선번호 유효성 검증
if (!normalizedLineNumber.matches("^010[0-9]{8}$")) {
throw new IllegalArgumentException("회선번호는 010으로 시작하는 11자리 숫자여야 합니다");
}
}
logger.info("상품변경 이력 조회 요청: lineNumber={} (original: {}), startDate={}, endDate={}, page={}, size={}, userId={}",
normalizedLineNumber, lineNumber, startDate, endDate, page, size, userId);
try {
// 페이지 번호를 0-based로 변환
@@ -227,7 +247,7 @@ public class ProductController {
validateDateRange(startDate, endDate);
ProductChangeHistoryResponse response = productService.getProductChangeHistory(
lineNumber, startDate, endDate, pageable);
normalizedLineNumber, startDate, endDate, pageable);
return ResponseEntity.ok(response);
} catch (Exception e) {
logger.error("상품변경 이력 조회 실패: lineNumber={}, userId={}", lineNumber, userId, e);
@@ -21,7 +21,6 @@ public class ProductChangeRequest {
@JsonProperty("lineNumber")
@NotBlank(message = "회선번호는 필수입니다")
@Pattern(regexp = "^010[0-9]{8}$", message = "회선번호는 010으로 시작하는 11자리 숫자여야 합니다")
private String lineNumber;
@JsonProperty("currentProductCode")
@@ -31,4 +30,23 @@ public class ProductChangeRequest {
@JsonProperty("targetProductCode")
@NotBlank(message = "변경 대상 상품 코드는 필수입니다")
private String targetProductCode;
/**
* 회선번호 설정 시 대시 제거 및 유효성 검증
*/
public void setLineNumber(String lineNumber) {
if (lineNumber != null) {
// 대시 제거
String normalized = lineNumber.replaceAll("-", "");
// 유효성 검증
if (!normalized.matches("^010[0-9]{8}$")) {
throw new IllegalArgumentException("회선번호는 010으로 시작하는 11자리 숫자여야 합니다");
}
this.lineNumber = normalized;
} else {
this.lineNumber = null;
}
}
}
@@ -19,7 +19,6 @@ import jakarta.validation.constraints.Pattern;
public class ProductChangeValidationRequest {
@NotBlank(message = "회선번호는 필수입니다")
@Pattern(regexp = "^010[0-9]{8}$", message = "회선번호는 010으로 시작하는 11자리 숫자여야 합니다")
private String lineNumber;
@NotBlank(message = "현재 상품 코드는 필수입니다")
@@ -27,4 +26,23 @@ public class ProductChangeValidationRequest {
@NotBlank(message = "변경 대상 상품 코드는 필수입니다")
private String targetProductCode;
/**
* 회선번호 설정 시 대시 제거 및 유효성 검증
*/
public void setLineNumber(String lineNumber) {
if (lineNumber != null) {
// 대시 제거
String normalized = lineNumber.replaceAll("-", "");
// 유효성 검증
if (!normalized.matches("^010[0-9]{8}$")) {
throw new IllegalArgumentException("회선번호는 010으로 시작하는 11자리 숫자여야 합니다");
}
this.lineNumber = normalized;
} else {
this.lineNumber = null;
}
}
}