회선번호 처리 개선 및 다양한 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
@@ -48,7 +48,7 @@ public class SecurityConfig {
private final JwtTokenProvider jwtTokenProvider;
@Value("${cors.allowed-origins")
@Value("${cors.allowed-origins}")
private String allowedOrigins;
/**
@@ -155,7 +155,6 @@ public class BillController {
public ResponseEntity<ApiResponse<BillHistoryResponse>> getBillHistory(
@Parameter(description = "회선번호 (미입력시 인증된 사용자의 모든 회선)")
@RequestParam(required = false)
@Pattern(regexp = "^010-\\d{4}-\\d{4}$", message = "회선번호 형식이 올바르지 않습니다")
String lineNumber,
@Parameter(description = "조회 시작일 (YYYY-MM-DD)")
@@ -177,11 +176,22 @@ public class BillController {
@Parameter(description = "처리 상태 필터")
@RequestParam(required = false) BillInquiryResponse.ProcessStatus status) {
log.info("요금조회 이력 조회 - 회선: {}, 기간: {} ~ {}, 페이지: {}/{}",
lineNumber, startDate, endDate, page, size);
// 회선번호 정규화 (입력된 경우에만)
String normalizedLineNumber = null;
if (lineNumber != null && !lineNumber.trim().isEmpty()) {
normalizedLineNumber = lineNumber.replaceAll("-", "");
// 유효성 검증
if (!normalizedLineNumber.matches("^010\\d{8}$")) {
throw new IllegalArgumentException("회선번호는 010으로 시작하는 11자리 숫자이거나 010-XXXX-XXXX 형식이어야 합니다");
}
}
log.info("요금조회 이력 조회 - 회선: {} (original: {}), 기간: {} ~ {}, 페이지: {}/{}",
normalizedLineNumber, lineNumber, startDate, endDate, page, size);
BillHistoryResponse historyData = billInquiryService.getBillHistory(
lineNumber, startDate, endDate, page, size, status
normalizedLineNumber, startDate, endDate, page, size, status
);
log.info("요금조회 이력 조회 완료 - 총 {}건, 페이지: {}/{}",
@@ -7,6 +7,7 @@ import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
/**
* 요금조회 요청 DTO
@@ -20,6 +21,7 @@ import lombok.NoArgsConstructor;
* @since 2025-09-08
*/
@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@@ -27,14 +29,10 @@ public class BillInquiryRequest {
/**
* 조회할 회선번호 (필수)
* 010-XXXX-XXXX 형식 허용
* 010-XXXX-XXXX 또는 01XXXXXXXXX 형식 허용
*/
@JsonProperty("lineNumber")
@NotBlank(message = "회선번호는 필수입니다")
@Pattern(
regexp = "^010-\\d{4}-\\d{4}$",
message = "회선번호는 010-XXXX-XXXX 형식이어야 합니다"
)
private String lineNumber;
/**
@@ -47,4 +45,26 @@ public class BillInquiryRequest {
message = "조회월은 YYYYMM 형식이어야 합니다"
)
private String inquiryMonth;
/**
* 회선번호 설정 시 정규화 처리
* - 대시가 있는 경우: 010-1234-5678 → 01012345678
* - 대시가 없는 경우: 01012345678 → 그대로 유지
* - 유효성 검증: 010으로 시작하는 11자리 숫자
*/
public void setLineNumber(String lineNumber) {
if (lineNumber != null) {
// 대시 제거하여 정규화
String normalized = lineNumber.replaceAll("-", "");
// 유효성 검증: 010으로 시작하는 11자리 숫자
if (!normalized.matches("^010\\d{8}$")) {
throw new IllegalArgumentException("회선번호는 010으로 시작하는 11자리 숫자이거나 010-XXXX-XXXX 형식이어야 합니다");
}
this.lineNumber = normalized;
} else {
this.lineNumber = null;
}
}
}