# 코딩 스타일

## 불변성 (중요)

항상 새 객체를 생성하고, 기존 객체를 절대 변경하지 마세요:

```
// 의사 코드
잘못된 예:  modify(original, field, value) → 원본을 직접 변경
올바른 예: update(original, field, value) → 변경 사항이 반영된 새 복사본 반환
```

근거: 불변 데이터는 숨겨진 사이드 이펙트를 방지하고, 디버깅을 쉽게 하며, 안전한 동시성을 가능하게 합니다.

## 파일 구성

많은 작은 파일 > 적은 큰 파일:
- 높은 응집도, 낮은 결합도
- 200-400줄이 일반적, 최대 800줄
- 큰 모듈에서 유틸리티를 분리
- 타입이 아닌 기능/도메인별로 구성

## 에러 처리

항상 에러를 포괄적으로 처리:
- 모든 레벨에서 에러를 명시적으로 처리
- UI 코드에서는 사용자 친화적인 에러 메시지 제공
- 서버 측에서는 상세한 에러 컨텍스트 로깅
- 에러를 절대 조용히 무시하지 않기

## 입력 유효성 검증

항상 시스템 경계에서 유효성 검증:
- 처리 전에 모든 사용자 입력을 검증
- 가능한 경우 스키마 기반 유효성 검증 사용
- 명확한 에러 메시지와 함께 빠르게 실패
- 외부 데이터를 절대 신뢰하지 않기 (API 응답, 사용자 입력, 파일 내용)

## 코드 품질 체크리스트

작업 완료 전 확인:
- [ ] 코드가 읽기 쉽고 이름이 적절한가
- [ ] 함수가 작은가 (<50줄)
- [ ] 파일이 집중적인가 (<800줄)
- [ ] 깊은 중첩이 없는가 (>4단계)
- [ ] 적절한 에러 처리가 되어 있는가
- [ ] 하드코딩된 값이 없는가 (상수나 설정 사용)
- [ ] 변이가 없는가 (불변 패턴 사용)
