링크풀은 링크를 체계적으로 관리하는 오프라인 전용 Flutter 모바일 앱입니다.
| 항목 | 내용 |
|---|---|
| 플랫폼 | iOS / Android |
| Flutter | 3.38.6 (FVM) |
| 상태관리 | flutter_bloc (Cubit) |
| DI | get_it |
| 테스트 | flutter_test, bloc_test, mockito |
lib/
├── cubits/ # 상태 관리 (Cubit)
│ ├── common/ # 공통 Cubit (ButtonStateCubit 등)
│ ├── folders/ # 폴더 관련
│ ├── links/ # 링크 관련
│ └── ...
├── di/ # 의존성 주입
├── models/ # 데이터 모델
│ ├── local/ # 로컬 DB 모델
│ └── ...
├── provider/ # 데이터 제공자
│ ├── local/ # 로컬 DB (SQLite)
│ ├── kakao/ # 카카오 공유
│ └── ...
├── ui/ # UI (page, view, widget)
└── util/ # 유틸리티
test/
├── provider/local/ # 로컬 DB 테스트
├── ui/ # 위젯 테스트
└── util/ # 유틸리티 테스트
- flutter_bloc의 Cubit 패턴 사용
- State는 별도 파일로 분리 (
*_state.dart)
lib/di/set_up_get_it.dart에서 등록getIt<T>()로 주입받아 사용- 로컬 DB Repository만 등록 (API 없음)
- 로컬 DB: sqflite 테스트
- Cubit: bloc_test 사용
- TDD 방식 권장
# 의존성 설치
fvm flutter pub get
# 코드 생성
fvm dart run build_runner build --delete-conflicting-outputs
# 테스트
fvm flutter test
# 린트
fvm flutter analyze
# 포맷팅
fvm dart format .| 명령어 | 설명 |
|---|---|
/project:setup |
프로젝트 초기 설정 |
/project:gen |
코드 생성 |
/project:test |
테스트 실행 |
/project:lint |
린트 검사 |
/project:precommit |
커밋 전 검사 |
/project:dev-agent |
TDD 개발 에이전트 |
/project:test-agent |
테스트 에이전트 |
/project:review-agent |
코드 리뷰 에이전트 |
class ExampleCubit extends Cubit<ExampleState> {
ExampleCubit() : super(ExampleInitialState());
final LocalFolderRepository repo = getIt();
Future<void> fetchData() async {
emit(ExampleLoadingState());
final data = await repo.getAllFolders();
emit(ExampleLoadedState(data));
}
}Pro/Free 전환, 테스트 데이터 정리, 원격 상태 검증 같은 작업에서 Supabase DB 에 직접 SQL 을 날려야 할 때가 있다. 접속 정보는 프로젝트 루트 .env 에 있음 (gitignored). Claude 는 쉘에서 다음 순서로 접근:
# 1) .env 로드 (프로젝트 루트에서 실행)
set -a && source .env && set +a
# 2) psql 호출 — psql 은 PATH 에 없으므로 절대경로 사용
/opt/homebrew/opt/libpq/bin/psql "$LINKPOOL_SUPABASE_DB_URL" -c "SELECT 1;"원라이너 예시:
set -a && source .env && set +a && /opt/homebrew/opt/libpq/bin/psql "$LINKPOOL_SUPABASE_DB_URL" -c "SELECT id, email, plan, plan_expires_at FROM profiles WHERE email = '[email protected]';"환경변수 이름 (양 프로젝트 공통):
LINKPOOL_SUPABASE_DB_URL— psql 에 바로 넘기는 전체 connection string (pooler 경유, sslmode=require 포함)LINKPOOL_SUPABASE_DB_PASSWORD— 비밀번호만 (별도 도구가 URL 분해를 요구할 때)
프로젝트 / 주요 테이블:
- Supabase project ref:
gystdpdelnfblgyeckth - 테스트 계정:
[email protected](UUID355d0598-e5e0-4ece-bb14-1dd03ec8e344) - 핵심 테이블:
profiles(plan),folders,links,auth.users - 스키마 정의:
linkpool-chrome-extension/supabase/migrations/*.sql(앱과 공유)
운영 규칙 — 이건 프로덕션 DB 이므로 다음 순서를 반드시 지킨다:
- 먼저
SELECT로 대상 row 를 확인해 사용자에게 보여준다. UPDATE/DELETE/INSERT같은 destructive 쿼리는 사용자 명시 승인 후에만 실행.RETURNING절을 가능한 한 포함해 변경된 내용을 즉시 확인 가능하게 한다.- 여러 유저에 걸친 대규모 변경은 원칙적으로 트랜잭션(
BEGIN; ... COMMIT;)으로 감싼다.
Today's date is 2026-02-17.