4.5 KiB
4.5 KiB
TODO 기록
- 업데이트 시각 (KST): 2025-12-09 19:28:55 KST
완료된 항목
- [x] Go Fiber 기반 GeoIP API 구조 결정 및 엔트리포인트 구현
(
cmd/server) - [x] GeoLite2 조회 로직 작성
(
internal/geo/resolver.go) - [x] Dockerfile, docker-compose로 컨테이너 실행 경로 구성 (GeoLite2 DB 볼륨 마운트)
- [x] 기여 가이드 문서 작성 (
AGENTS.md) - [x] Dockerfile 빌더/런타임 이미지 1.25.5-trixie로 전환하고 불필요 패키지 제거
- [x] README 작성 및 응답 샘플 추가
- [x] resolver 단위 테스트 추가
(
internal/geo/resolver_test.go) - [x]
user_program_info_replicaDDL/CSV 임포터 추가 (id bigint, 텍스트 컬럼, timestamp KST 파싱, bool 플래그) 완료: 2025-12-09 18:32 KST - [x] 초기/일간 CSV 디렉토리 기반 임포트 + 로그 파일
기록(
log/), upsert 로직 업데이트 완료: 2025-12-09 19:06 KST - [x] Fiber 프로세스 내 cron 스케줄러 추가(전일 덤프 스크립트 실행 + update_data 적용, KST cron 지원) 완료: 2025-12-09 19:28 KST
진행 예정
- [x] PostgreSQL 전용 Docker 이미지(또는 build 단계)에서
maxminddb_fdw설치 후GeoLite2-City.mmdb볼륨을/data로 마운트하는postgres서비스 추가 및 5432 외부 노출 - [x] 초기화 SQL을
/docker-entrypoint-initdb.d/로 넣어CREATE EXTENSION maxminddb_fdw; SERVER maxminddb ...정의, 필요한FOREIGN TABLE/VIEW설계 (country/region/city/lat/lon/time_zone 등) - [x] FDW 기반 조회 최적화를 위한
inet인자 함수/VIEW 설계(예:SELECT * FROM city_location WHERE network >>= inet($1) ORDER BY masklen(network) DESC LIMIT 1) - [x] 앱 구성 확장:
GEOIP_BACKEND=mmdb|postgres,DATABASE_URL등 env 추가,internal/geo에 Postgres resolver 구현 및 DI로 선택 연결, 시작 시 backend/DB 헬스 체크 로그 - [ ] Postgres 컨테이너에 GeoLite mmdb 및 init SQL 디렉터리 마운트 추가 반영 후 compose.infra.yml/dev 실행 경로 검증
- [x] docker-compose 단일 스택에서 db healthcheck 추가 후 api가 service_healthy 상태를 기다리도록 depends_on 조건 설정
- [ ] Fiber 라우트에서 DB resolver와 파일 resolver가 동일한 응답 스키마를 반환하도록 리스폰스 변환/에러 핸들링 정리
- [ ] 테스트: 파일 기반은 그대로 유지, DB resolver용 통합 테스트(테스트 컨테이너/compose) 및 테이블 기반 케이스 추가; 라이선스 문제 없이 쓸 수 있는 mmdb 픽스처 고려
- [ ] 문서화: README에 Postgres/FDW 실행 방법, 샘플 쿼리, 보안/포트 노출 주의사항, mmdb 교체 절차 추가
- [x]
go mod tidy재실행으로 의존성 정리 및 필요한 DB 드라이버 추가 - [ ]
maxminddb_fdw제거 후 mmdb -> Postgres 적재 파이프라인 설계: mmdb SHA256을 테이블에 기록해 변경 시에만 스테이징 로드+인덱스 생성 후 트랜잭션 rename으로 교체, 변경 없으면 스킵 - [ ]
maxminddb_fdw제거 후 mmdb -> Postgres 적재 파이프라인 설계: Go 기반 변환기로 스테이징 테이블에 로드하고 트랜잭션 rename으로 다운타임 없이 교체, 업데이트 주기/운영 방법 정의 - [ ] 시행착오 기록: maxminddb-golang v1.11.0은
reader.Networks()가 에러를 반환하지 않는 단일 반환 함수임.reader.Networks(0)/다중 반환 처리 금지 (재시도하지 말 것) - [ ] compose에서 loader 단독 서비스 제거, api entrypoint에서 loader 실행 → post-start 훅으로 문서화 및 대기 전략 검토
- [ ] Postgres 초기 설정 튜닝:
max_wal_size를 4GB로 확대해 초기 bulk load 시 checkpoint 난발 방지 (deploy/postgres/init/01_tuning.sql 반영) - [ ] compose에서 api가 loader 완료 대기 때문에 기동 지연됨 → loader
service_started조건으로 완화, 향후 API 기동/데이터 적재 병행 여부 문서화 필요 - [ ] MySQL
user_program_info증분 백업 설계: Postgres 백업 테이블 DDL(동일 컬럼, PK=id,created_at인덱스),login_public_ip varchar(45), UTC 기준 - [ ]
sync_meta(last_synced_at)테이블 작성 및 워터마크 쿼리 정의:created_at > last_synced_at - interval '5 minutes'+max(created_at)로 메타 갱신 - [ ] 증분 적재 파이프라인 구현: MySQL pull → Postgres upsert(ON CONFLICT id) 배치 처리, 빈 배치 처리/타임존 변환/정합성 로그
- [ ] 운영 트리거 설계: 15분 cron 기본, API 수동 트리거(health 포함) 여부 결정, 실패 재시도 및 알림 연동