인프라
백엔드는 여러 플랫폼 서비스를 의존하지만, 여전히 하나의 Spring Boot 애플리케이션으로 실행됩니다. 이 페이지는 코드 동작을 형성하는 백엔드 관점의 런타임 계약을 다룹니다. 클러스터 운영이나 day-2 runbook은 의도적으로 다루지 않습니다.
이 페이지는 reference 문서입니다.
소스 경로
| Path | 역할 |
|---|---|
app/src/main/resources/application.yaml | 데이터 소스, Flyway, Redis, RabbitMQ, MinIO, worker URL, CORS, rate limit, OpenAPI, actuator를 포함한 주 런타임 설정 |
app/src/main/resources/application-dev.yml | cookie SameSite 같은 dev 전용 override |
app/src/main/java/com/lumie/app/config/RoutingDataSourceConfig.java | primary/readonly Hikari pool과 Flyway migrator data source |
app/src/main/java/com/lumie/app/config/RuntimeDbRoleGuard.java | RLS를 우회할 수 있는 DB role을 막는 startup guard |
app/src/main/java/com/lumie/app/config/ShedLockConfig.java | 분산 scheduler locking |
app/src/main/java/com/lumie/app/config/CorsConfig.java | CORS 계약 |
app/src/main/java/com/lumie/app/config/ratelimit/RateLimitFilter.java | 프로세스 내부 rate limiting |
modules/exam/src/main/java/com/lumie/exam/adapter/out/config/* | exam 모듈이 소유하는 RabbitMQ, RestClient, MinIO 인프라 |
modules/auth/src/main/java/com/lumie/auth/adapter/out/persistence/RedisTokenRepository.java | auth의 Redis persistence 계약 |
modules/file/src/main/java/com/lumie/file/adapter/out/storage/MinioStorageAdapter.java | file-service object storage 계약 |
modules/billing/src/main/java/com/lumie/billing/adapter/out/external/* | billing의 외부 provider adapter |
런타임 토폴로지
의존성 계약
| Dependency | Config surface | 주요 백엔드 소유자 | 계약 메모 |
|---|---|---|---|
| PostgreSQL | app.datasource.*, spring.flyway.* | 모든 모듈 | shared-schema RLS, Modulith outbox, ShedLock, primary/readonly pool |
| RabbitMQ | spring.rabbitmq.* | 주로 exam | queue 기반 grading 및 report workflow |
| Redis | spring.data.redis.* | 주로 auth | refresh token, blacklist, session index, OAuth2 nonce 저장 |
| MinIO | minio.* | exam, file, tenant | OMR object, presigned upload, 파일 메타데이터, tenant logo |
grading-svc | lumie.services.grading.url | exam | 직접 HTTP grading과 queue callback 생태계 |
report-svc | lumie.services.report.url | exam | 직접 HTTP report 생성과 queue callback 생태계 |
chatbot-svc | lumie.services.chatbot.url | ai | 외부로는 HTTP streaming proxy, 내부로는 HMAC callback surface |
| OAuth provider | oauth2.* | auth | Google, Kakao, Naver 로그인 흐름 |
| Toss Payments | billing config와 provider secret | billing | 실제 구현된 HTTP integration |
| Popbill tax invoice path | billing config와 provider secret | billing | 현재 코드는 완전한 실서비스 연동이 아니라 stub adapter |
데이터베이스 및 마이그레이션 인프라
읽기/쓰기 분리
RoutingDataSourceConfig는 다음을 선언합니다.
app.datasource.primary.*app.datasource.readonly.*LazyConnectionDataSourceProxy로 감싼RoutingDataSource
라우팅 규칙:
@Transactional(readOnly = true)-> readonly pool- write transaction 또는 비트랜잭션 접근 -> primary pool
Flyway는 별도 자격 증명으로 실행됨
Flyway는 런타임 애플리케이션 pool credential을 사용하지 않습니다.
백엔드는 primary URL과 spring.flyway.user/password로 전용
@FlywayDataSource를 만들기 때문에, DDL은 table 소유 권한으로 실행하고
런타임 트래픽은 제한된 lumie_app role에 머무를 수 있습니다.