개인 공간 기억 기록
기록된 추억이 지도 위에서 다시 펼쳐지는 개인용 공간 로그 도구, Personal Spatial Memory Log
Personal Spatial Memory Log (Laravel 13)
개인적으로 방문한 곳을 기록하고, 위치 기반으로 다시 찾아볼 수 있도록 만든 간단한 웹 애플리케이션입니다 공개 리뷰 플랫폼이 아니라, "내가 갔던 곳을 나중에 다시 꺼내보기 위한 기록 도구"에 가깝습니다.
What it solves
- 어디를 갔는지 기억은 나는데, 이름이나 위치가 애매할 때
- 특정 지역에서 내가 예전에 갔던 곳을 다시 찾고 싶을 때
- 단순 리스트가 아니라 "지도 기반"으로 회상하고 싶을 때
Core Features
- 장소 기록 CRUD (이름, 주소, 카테고리, 평점, 방문일, 메모, 재방문 여부)
- 리스트 + 검색 + 필터 + 정렬
- 지도 기반 조회 (Leaflet)
- 현재 위치 기준 "내가 기록한 식당 등 가까운 곳" 조회
- 간단한 통계 (평균 평점, 카테고리 분포 등)
- 주소 → 좌표 자동 변환 (비동기 geocoding)
- 이미지 업로드
- 매직 링크 로그인 + Google OAuth
Tech Stack
- Backend: PHP 8.3, Laravel 13
- Frontend: Blade + Alpine.js + Axios (ES Modules)
- UI: Tailwind CSS v4
- Map: Leaflet
- Build: Vite
- Auth: Magic Link (Signed URL), Google OAuth, Google Identity Services
- Realtime: Laravel Reverb (WebSocket)
- Cache: Redis
wscat -c "wss://map.glitter.kr/app/24d3a763529639ea0d97487ba87db886"
- Queue: Database (Redis queue 전환 가능)
- Geocoding: OpenStreetMap Nominatim
Architecture
- 전형적인 Laravel server-rendered 구조
- SPA 없이 Blade 기반 + 필요한 부분만 JS로 보강
- Map / Nearby 기능은 별도 JSON API로 분리
특징적인 흐름
- Restaurant 모델 중심 구조
- Observer에서 side-effect 처리
- 지도 캐시 무효화
- 좌표 없는 경우 geocoding job dispatch
- create/update/delete 이벤트 broadcast
- 지도 데이터는 viewport 기준으로 lazy load
Design Decisions
- SPA를 쓰지 않고 Blade + Alpine 조합 선택
- 지도 데이터는 전체 preload 대신 bounds 기반 fetch
- 외부 API 의존(geocoding)은 요청 흐름에서 분리 (queue 처리)
- 동일 주소에 대한 좌표는 재사용
Security Notes
- Laravel 기본 CSRF / auth middleware 사용
- 세션 쿠키 secure / httpOnly / sameSite 설정
- API rate limit 적용
Limitations
- 단일 사용자 기준 설계 (multi-tenant 아님)
- Restaurant 모델에 로직이 집중되어 있음
- broadcast 채널은 인증 없이 open 상태
- CSP는 적용되어 있으나 일부 완화된 설정('unsafe-inline', 'unsafe-eval') 포함
Why this structure
이 프로젝트는 확장형 서비스보다는
"개인이 계속 쓰는 도구"에 맞춰 설계했습니다.
- 상태 복잡도 낮음 → SPA 불필요
- 빠른 개발 + 유지보수 용이성
- 기능보다 사용 흐름 중심
Summary
지도 + 개인 기록을 결합한 단순한 Laravel 애플리케이션입니다.
과하게 확장하지 않고, 필요한 기능만 최소한으로 구현하는 방향을 선택했습니다.
이 개발자의 다른 프로젝트
그누보드7 예약 모듈 - glitter-reservation
코어 수정 없이 붙여 사용하는 그누보드7 예약 모듈로, 신청·인증·조회·취소·관리까지 예약 흐름 전체를 모듈 단위로 제공합니다.
그누보드7 상담예약 템플릿 - Glitter Academy Core
GnuBoard7 Template 엔진 기반으로 상담예약 사이트 구성을 위한 초기 템플릿 예제로 설계되었습니다.
그누보드7 커뮤니티 템플릿 - SIRsoft Community
쇼핑몰(이커머스 의존)을 제거하고 커뮤니티 기능에 집중한 경량 사용자 템플릿, ID : sirsoft-comm
수정 이력 (1)
# v0.2.0 - 동기화 위치 스키마 및 지도 경로 수정 ## 핵심 변경 - 지도 기반 장소 표시 기능 추가 - 주변 장소 조회 기능 추가 - places 테이블에 위치/지오코딩 관련 컬럼 추가 ## 수정 - DB 스키마 누락으로 인한 500 오류 해결 - 지도 API 401 인증 문제 해결 (api → web 라우트 이동) - 프론트 JS 오류 수정 (mapLoading 등) - 장소 저장 실패 문제 해결 ## 주의 - DB 스키마 변경 포함 (migration 또는 수동 반영 필요)