손호영
Founding Engineer2025.08 – 현재

Girls Band Tabi

Kotlin + Spring Boot 3 + Spring Modulith 기반 이벤트 드리븐 모듈 아키텍처로 밴드 성지순례·라이브 이벤트·커뮤니티를 통합 관리하는 위치 기반 서비스 플랫폼을 설계·구축했습니다. (서버 운영 중, 앱 내부 테스트)

259
REST API
5
도메인 모듈
48
컨트롤러
80%+
커버리지
L1+L2
캐시
3중
인증
Girls Band Tabi 아키텍처 다이어그램
시스템 아키텍처 — 클릭하면 원본으로 열립니다

01설계 결정 — 왜 이렇게 만들었나

Spring을 쓰는 것과 Spring을 이해하고 쓰는 것의 차이를 만들려고 했습니다.

왜 마이크로서비스가 아니라 Spring Modulith인가

도메인 경계는 원했지만, 1인 개발에서 마이크로서비스의 비용 — 네트워크 장애 모드, 분산 트랜잭션, 서비스별 배포 오케스트레이션 — 은 명백한 오버엔지니어링입니다. Modulith는 그 중간 지점입니다. 단일 배포 단위를 유지하면서 모듈 경계 위반을 아키텍처 테스트가 빌드에서 잡아내고, 도메인 간 통신을 스프링 이벤트로 강제합니다. 지금 이벤트 계약을 만들어두면, 특정 모듈에 트래픽이 몰릴 때 그 모듈만 서비스로 떼어내는 진화 경로가 열립니다. '나중에 분리할 수 있는 모놀리스'가 처음부터 분산 시스템보다 낫다고 판단했습니다.

캐시를 2계층으로 나눈 기준 — 데이터의 성격

무엇을 캐시할지가 아니라 어디에 캐시할지를 데이터 성격으로 갈랐습니다. 읽기 빈도가 높고 인스턴스 간 불일치가 잠깐 허용되는 참조 데이터(장소·이벤트 목록)는 Caffeine L1으로 네트워크 홉 자체를 제거하고, 정합성이 곧 보안인 것들(세션, 토큰 블랙리스트, 속도 제한 카운터)은 반드시 Redis L2 단일 진실로 뒀습니다. 같은 '캐시'라도 요구 속성이 다르면 다른 도구입니다.

위치 신뢰를 DB가 아니라 도메인 계층에서 검증하는 이유

GPS 좌표는 클라이언트가 보내는 입력이라 본질적으로 신뢰할 수 없습니다. 이건 무결성 제약으로 막을 수 있는 문제가 아니라 도메인 규칙의 문제입니다 — 직전 인증과의 거리·소요 시간으로 물리적으로 가능한 이동인지, 텔레포트 패턴인지, 일일 한도를 넘는지를 서비스 계층에서 판정합니다. PostGIS는 거리 계산이라는 사실을 제공하고, 그 사실로 신뢰를 판정하는 건 도메인 코드의 몫으로 나눴습니다.

02시스템 설계

위치 기반 서비스의 신뢰성과 비용을 함께 설계했습니다.

아키텍처

Spring Modulith 이벤트 드리븐 아키텍처로 identity·place·event·social·analytics 5개 도메인을 느슨한 결합으로 분리했습니다. Hibernate Spatial + JTS 기반 지리공간 처리와 프로젝트·유닛·지역 계층 구조로 멀티테넌트 시스템을 구축하고, Cloudflare R2 비용 보호로 인프라 비용을 통제합니다.

성능 최적화

Resilience4j 서킷 브레이커로 외부 서비스 장애 전파를 차단하고, Caffeine/Redis 이중 캐시와 GIST/GIN 인덱스 조합으로 공간 쿼리와 대용량 필터링 성능을 최적화했습니다. Flyway 마이그레이션과 HikariCP 커넥션 풀 최적화로 DB 운영 안정성을 확보했습니다.

보안 및 안정성

JWT + OAuth2(Google/Apple) + 이메일 인증의 다중 인증 체계와 프로젝트 수준 RBAC를 구현했습니다. Anti-tamper 위치 검증으로 위변조를 차단하고, Redis 분산 속도 제한과 커뮤니티 모더레이션 시스템으로 서비스 안정성을 확보했습니다.

03데이터베이스 아키텍처

지리공간 데이터를 다루는 방법입니다.

지리공간 데이터 설계

Hibernate Spatial + JTS Core 기반으로 PostGIS geography 타입과 EPSG:4326 좌표계를 활용한 정밀 위치 관리를 구현했습니다. Anti-tamper 위치 검증(거리 임계값, 속도 검증, 텔레포트 감지)으로 위변조를 차단합니다.

이벤트 아키텍처

5개 도메인을 Spring Modulith 이벤트 기반으로 느슨하게 결합했습니다. 프로젝트 → 유닛 → 멤버 계층과 지역 트리 구조로 멀티테넌트 아키텍처를 구현했습니다.

관측성 및 테스트

Prometheus + Actuator로 실시간 메트릭을 수집하고, Testcontainers로 PostgreSQL 통합 테스트를 자동화했습니다. Kover 커버리지 검증(서비스 계층 80% 목표)과 Detekt/Ktlint 정적 분석으로 코드 품질을 관리합니다.

풀어낸 케이스

마주친 문제 · 고민하고 적용한 접근 · 실제 결과를 한 세트로 묶어 정리했습니다.

01CASE
securitygeospatial
문제

위치 인증(성지 체크인)은 GPS 스푸핑으로 쉽게 위조할 수 있어 서비스 신뢰의 근간이 흔들립니다.

고민·접근

거리 임계값·이동 속도 검증·텔레포트 감지·일일 방문 제한을 조합한 Anti-tamper 검증 계층을 지리공간 쿼리 위에 구축했습니다.

결과

물리적으로 불가능한 체크인 패턴이 서버에서 차단됩니다.

다층 위치 검증
02CASE
costreliability
문제

Cloudflare R2 오브젝트 스토리지는 사용량 기반 과금이라, 악의적 트래픽이 비용 폭탄으로 직결될 수 있었습니다.

고민·접근

일일 대역폭·월간 요청 한도와 긴급 차단 임계값을 둔 비용 보호 시스템을 애플리케이션 레벨에 구현했습니다.

결과

예산 상한을 넘는 트래픽이 자동 차단되어 비용이 통제됩니다.

비용 상한 자동화
03CASE
architecturemodulith
문제

커뮤니티·이벤트·장소·인증 로직이 한 코드베이스에서 뒤엉켜 변경 파급이 커졌습니다.

고민·접근

Spring Modulith로 5개 도메인 경계를 모듈 테스트로 강제하고, 도메인 간 통신을 이벤트로 제한했습니다.

결과

도메인 간 직접 의존이 사라져 모듈 단위 변경이 안전해졌습니다.

5 모듈 경계 강제

프로젝트 정보

역할Founding Engineer
기간2025.08 – 현재
상태Server Live

기술 스택

KotlinSpring Boot 3Spring ModulithPostgreSQLHibernate SpatialRedisCaffeineResilience4jJWT · OAuth2FlywayHikariCPPrometheusCloudflare R2TestcontainersDockerOpenAPI 3.0

주요 성과

  • 259개 REST API 엔드포인트, 48개 컨트롤러, OpenAPI 3.0 문서 자동 생성
  • Anti-tamper 위치 검증과 성지 인증 시스템 구현
  • Spring Modulith 이벤트 드리븐 아키텍처로 5개 도메인 모듈 분리
  • Resilience4j 서킷 브레이커 + Caffeine/Redis 이중 캐시로 장애 전파 차단
  • Noraneko Platform 관제 편입 — 중앙 메트릭 수집 + 외부 상태 감시