# CLAUDE.md — TaxBaik 운영 메모 ## 우선 기준 1. [docs/INDEX.md](./docs/INDEX.md) 2. [docs/ENGINEERING_HARNESS.md](./docs/ENGINEERING_HARNESS.md) 3. [docs/DOUZONE_UX_GUIDE.md](./docs/DOUZONE_UX_GUIDE.md) 4. [docs/COMMON_CODE_POLICY.md](./docs/COMMON_CODE_POLICY.md) 5. [docs/COMBO_POLICY.md](./docs/COMBO_POLICY.md) 이 파일은 실행 절차, 서버 메모, 과거 이력만 둔다. 아키텍처/UX/콤보 기준은 위 문서를 따른다. ## 🎯 **개발 핵심 지침 (Development Standards 2026-07)** ### 입력 검증 패턴 (Validation Pattern) **원칙: 클라이언트 + 서버 이중 검증** #### 1. 클라이언트 (프론트엔드) - ✅ 실시간 마스킹 (사용자 입력하면서 자동 포맷팅) - ✅ 실시간 피드백 (에러 메시지 즉시 표시) - ✅ 유효성 검사 후 제출 차단 - ✅ 문자 카운터 (예: "현재: 50/5000") **예시: 전화번호** ```javascript // 입력: 01012345678 → 표시: 010-1234-5678 // 정규식: ^(0(2|3[1-3]|4[1-4]|...|70|50[5-9])\d{7,8}|0\d{9,10})$ ``` #### 2. 서버 (백엔드) - ✅ DTO 어노테이션 (DataAnnotations) - ✅ 서비스 로직 검증 (명확한 에러 메시지) - ✅ 데이터베이스 제약 조건 **패턴: InquiryService.cs** ```csharp // 1. DTO 레벨 public class SubmitInquiryDto { [Required] [StringLength(100)] public string Name { get; set; } [Required] [RegularExpression(@"^(0(2|3[1-3]|...")] public string Phone { get; set; } [StringLength(5000, MinimumLength = 10)] public string Message { get; set; } } // 2. 서비스 로직 public async Task SubmitAsync(...) { if (string.IsNullOrWhiteSpace(message)) throw new ValidationException("문의 내용을 입력하세요."); var trimmedMessage = message.Trim(); if (trimmedMessage.Length < 10) throw new ValidationException("문의 내용은 최소 10자 이상이어야 합니다."); } ``` ### 한국 전화번호 처리 표준 **지원 형식:** - 고정전화: `02-123-4567`, `031-1234-5678` - 휴대폰: `010-1234-5678`, `011-1234-5678` - VoIP: `070-1234-5678`, `0505-1234-5678` **포맷팅 규칙:** - 2-3자리 국번 + 3-4자리 국번 뒤 + 4자리 번호 - 고정전화(10자): `XXXX-XXX-XXXX` (4-3-3) - 휴대폰(11자): `XXX-XXXX-XXXX` (3-4-4) **정규식:** ```csharp private static readonly Regex PhoneRegex = new( @"^(0(?:2|3[1-3]|4[1-4]|5[1-5]|6[1-4]|70|50[5-9]|[7-9](?:\d{1,2})?)\d{7,8}|0\d{9,10})$"); ``` ### 메시지 내용 길이 제한 표준 **규칙:** - 최소: 10자 (너무 짧은 내용 방지) - 최대: 5000자 (DB 및 성능) **적용:** - 프론트엔드: `