docs: 템플릿 규칙 정비 및 환경변수 예제·README 추가

- CLAUDE.md: 모노레포 개요·표준 응답 포맷·에러 코드 맵(구현 일치)·환경변수 위임 구조(SSOT) 정리
- nestjs/vue3/flutter 규칙을 실제 구현(클래스명, env키, 디렉터리)과 정합화
- 루트 .env 단일 진실 공급원 구조에 맞춰 docker-compose 변수명 정정(BACKEND_API_URL, DB/REDIS_DATA_DIR)
- backend/frontend/flutter 예제 env 추가(루트 위임 반영, 서비스 고유 값만 작성)
- README.md 신규 작성, command.md 범용화, .gitignore에 *.example 재포함 규칙 추가

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-15 11:14:42 +09:00
parent 543d7b85fa
commit f5a18a52f4
15 changed files with 423 additions and 51 deletions
+10 -8
View File
@@ -24,8 +24,8 @@ lib/
├── core/
│ ├── constants/ ← 상수 (색상, 크기, 텍스트 등)
│ ├── theme/ ← 앱 테마 정의
│ ├── network/ ← Dio 인스턴스, 인터셉터
│ ├── storage/ ← flutter_secure_storage 래퍼
│ ├── api/ ← Dio 인스턴스(dio_client), 에러 사전(error_lexicon), 인터셉터
│ ├── storage/ ← flutter_secure_storage 래퍼 (선택)
│ └── utils/ ← 순수 유틸 함수
├── features/
│ └── user/
@@ -136,14 +136,16 @@ class UserWidget extends ConsumerWidget {
## API 통신 (Dio + 인터셉터)
```dart
// core/network/dio_client.dart
// core/api/dio_client.dart
class DioClient {
late final Dio _dio;
DioClient() {
_dio = Dio(BaseOptions(baseUrl: Env.apiUrl));
// flutter_dotenv 로 .env 로드, 미설정 시 로컬 기본값
final baseUrl = dotenv.maybeGet('API_URL') ?? 'http://localhost:3000/api';
_dio = Dio(BaseOptions(baseUrl: baseUrl));
_dio.interceptors.add(AuthInterceptor()); // 토큰 자동 첨부
_dio.interceptors.add(ErrorInterceptor()); // 에러 코드 처리
_dio.interceptors.add(ErrorInterceptor()); // 에러 코드 처리 (error_lexicon 참조)
}
}
@@ -164,11 +166,11 @@ class ErrorInterceptor extends Interceptor {
// flutter_secure_storage 사용
const storage = FlutterSecureStorage();
// 저장
await storage.write(key: 'access_token', value: token);
// 저장 (키 이름은 dio_client 인터셉터와 통일: jwt_token)
await storage.write(key: 'jwt_token', value: token);
// 읽기
final token = await storage.read(key: 'access_token');
final token = await storage.read(key: 'jwt_token');
// 삭제 (로그아웃)
await storage.deleteAll();