Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
5e49377
chore: Caffeine 캐시 의존성 추가
kimseongchan0914 Oct 7, 2026
efa3d96
feat: 회원 id로 학생 id만 읽는 조회 추가
kimseongchan0914 Oct 7, 2026
c5deb0f
feat: 회원 id로 찾은 학생 id를 10분 동안 기억하는 StudentIdCache 추가
kimseongchan0914 Oct 7, 2026
3ea3570
test: StudentIdCache 단위 테스트 추가
kimseongchan0914 Oct 7, 2026
1ccd8b9
feat: 본인 출석 조회가 기억한 학생 id를 쓰도록 변경
kimseongchan0914 Oct 7, 2026
b84246d
feat: 알림 조회·읽음 처리가 기억한 학생 id를 쓰도록 변경
kimseongchan0914 Oct 7, 2026
878a12c
test: 두 번째 요청부터 쿼리가 1번인지 확인하는 통합 테스트 추가
kimseongchan0914 Oct 7, 2026
31294ae
feat: 대시보드에 학생 id 캐시 적중률·조회 수 패널 추가
kimseongchan0914 Oct 7, 2026
eb48f93
feat: 얼굴 AI 서버 호출 시간의 분위수를 계산할 수 있게 지표 설정 추가
kimseongchan0914 Oct 7, 2026
aff32bd
test: AI 서버 호출 시간이 세션 id 없는 경로로 지표에 남는지 테스트 추가
kimseongchan0914 Oct 7, 2026
ef3f89e
feat: 대시보드에 얼굴 프레임 처리 시간과 AI 호출 시간 패널 추가
kimseongchan0914 Oct 7, 2026
f8c5c4b
refactor: 회원을 쓰지 않는 학생 조회에서 member 조인 제거
Fresh-Banana Oct 7, 2026
b54039a
refactor: 관리자 확인의 역할 조회를 짧게 기억
Fresh-Banana Oct 7, 2026
65dacc9
refactor: QR 스캔의 중복 학생 조회와 Redis 왕복 줄이기
Fresh-Banana Oct 7, 2026
0e2d6d3
refactor: 얼굴 인식 프레임의 중복 DB 조회 줄이기
Fresh-Banana Oct 7, 2026
2a2fb3e
refactor: 얼굴 인식 후보 상한을 설정값으로 변경
Fresh-Banana Oct 7, 2026
bc7647a
Merge pull request #224 from Start-Up-10th/refactor/face-frame-fewer-…
Fresh-Banana Oct 7, 2026
c082b5c
chore: DB 커넥션 풀 설정을 명시하고 OOM 시 JVM 종료
Fresh-Banana Oct 7, 2026
a17f9c3
Merge pull request #225 from Start-Up-10th/refactor/face-max-candidat…
Fresh-Banana Oct 7, 2026
8301213
chore: 운영 Swagger 기본을 비공개로 하고 세션 쿠키 설명 추가
Fresh-Banana Oct 7, 2026
83cafda
Merge pull request #228 from Start-Up-10th/feat/face-ai-timing
kimseongchan0914 Oct 7, 2026
49e5f5e
Merge pull request #209 from Start-Up-10th/feat/student-id-cache
kimseongchan0914 Oct 7, 2026
a3ac59f
Merge pull request #222 from Start-Up-10th/refactor/admin-role-cache
Fresh-Banana Oct 8, 2026
92a4bd2
Merge remote-tracking branch 'origin/develop' into refactor/drop-unus…
Fresh-Banana Oct 8, 2026
3b54114
Merge remote-tracking branch 'origin/develop' into refactor/qr-scan-f…
Fresh-Banana Oct 8, 2026
eae3fa7
Merge remote-tracking branch 'origin/refactor/qr-scan-fewer-reads' in…
Fresh-Banana Oct 8, 2026
124d14b
test: 커넥션 풀 설정 테스트를 DB 없이 돌고 환경변수 덮어쓰기까지 검증하도록 변경
Fresh-Banana Oct 8, 2026
79facd6
Merge pull request #229 from Start-Up-10th/chore/swagger-cookie-defaults
Fresh-Banana Oct 8, 2026
cfb3781
Merge pull request #221 from Start-Up-10th/refactor/drop-unused-membe…
Fresh-Banana Oct 8, 2026
14e5d6c
Merge pull request #223 from Start-Up-10th/refactor/qr-scan-fewer-reads
Fresh-Banana Oct 8, 2026
ec05a94
Merge pull request #226 from Start-Up-10th/chore/jvm-and-pool-settings
Fresh-Banana Oct 8, 2026
76a480e
test: 출석 시간대 요청을 서비스 계층에서 동시 호출하는 부하 측정 추가
Fresh-Banana Oct 8, 2026
27ee2da
refactor: 얼굴 세션의 후보 학생을 한 문장으로 저장
Fresh-Banana Oct 8, 2026
3feb25d
Merge pull request #230 from Start-Up-10th/test/service-load-bench
Fresh-Banana Oct 8, 2026
8fcd131
Merge pull request #231 from Start-Up-10th/perf/face-session-create
Fresh-Banana Oct 8, 2026
3cb0e1a
refactor: 학생·관리자 겸용 API의 권한 확인에 관리자 역할 기억 사용
Fresh-Banana Oct 8, 2026
82d9637
chore: 재시작·배포 때 처리 중인 요청을 마친 뒤 종료하도록 우아한 종료 설정
Fresh-Banana Oct 9, 2026
ce15e4c
Merge pull request #234 from Start-Up-10th/perf/role-cache-shared-apis
Fresh-Banana Oct 9, 2026
c2b56aa
Merge pull request #235 from Start-Up-10th/chore/graceful-shutdown
Fresh-Banana Oct 9, 2026
5424737
docs: README를 배지·목차·표·아키텍처 그림으로 다시 구성
kimseongchan0914 Oct 9, 2026
e93205f
chore: 세션 기본 유지 시간 30일로 변경
minwoo-3 Oct 10, 2026
8e752c9
fix: 앱을 닫아도 로그인이 유지되도록 세션 쿠키에 max-age 추가
minwoo-3 Oct 10, 2026
2bea8c6
chore: 운영 compose 세션 기본 유지 시간 30일로 변경
minwoo-3 Oct 10, 2026
c46cdd6
docs: env 예시에 로그인 유지 기간 설명 추가
minwoo-3 Oct 10, 2026
fa27c73
Merge pull request #239 from Start-Up-10th/fix/session-cookie-max-age
minwoo-3 Oct 10, 2026
9354f12
Merge pull request #238 from Start-Up-10th/docs/readme-polish
kimseongchan0914 Oct 10, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 20 additions & 3 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -32,11 +32,28 @@ FACE_AI_BASE_URL=
CHECKUP_ADMIN_DATAGSM_IDS=

# 세션
# https로 서비스하면 true(운영). http면 브라우저가 SESSION 쿠키를 저장하지 않아 로그인 직후부터 401이므로 false로 둔다.
SESSION_COOKIE_SECURE=true
# 로그인 유지 기간. 서버 세션과 SESSION 쿠키 max-age에 같이 쓴다. 비우면 30d(예: 14d, 30d).
SESSION_TIMEOUT=

# API 문서
SWAGGER_ENABLED=true
# API 문서(/swagger-ui/index.html). 운영 기본은 비공개(false)다. 로그인 없이 API 목록·오류 코드가 보이므로 프론트 연동 기간처럼 필요할 때만 true로 켜고 끝나면 다시 끈다.
# compose.prod.yaml 없이 로컬에서 직접 실행하면 application.yaml 기본값(true)이라 문서가 열린다.
SWAGGER_ENABLED=false

# 요청별 DB 쿼리 수·걸린 시간 로그. 느린 API를 찾을 때만 true로 둔다.
QUERY_LOG_ENABLED=false
QUERY_LOG_ENABLED=false

# DB 커넥션 풀. 비워 두면 기본값(크기 10, 가득 찼을 때 10초 대기)을 쓴다.
# 서버 대수 × 풀 크기가 Postgres max_connections보다 작아야 한다.
DB_POOL_SIZE=
DB_POOL_TIMEOUT_MS=

# 서버 JVM 옵션. 비워 두면 -XX:+ExitOnOutOfMemoryError만 적용한다. 값을 넣으면 이 값으로 바뀌므로 그 옵션도 함께 쓴다.
# 예: -XX:+ExitOnOutOfMemoryError -XX:MaxRAMPercentage=50
SERVER_JAVA_OPTS=

# 종료 신호(재시작·배포) 뒤 처리 중인 요청을 기다리는 시간과 docker가 강제 종료하기까지의 유예 시간.
# 비워 두면 30s / 45s다. 유예 시간이 대기 시간보다 길어야 한다. 얼굴 AI 응답 대기(FACE_AI_RESPONSE_TIMEOUT, 기본 30s)보다 짧게 줄이지 않는다.
SHUTDOWN_TIMEOUT=
SHUTDOWN_GRACE_PERIOD=
256 changes: 195 additions & 61 deletions README.md

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ dependencies {
implementation 'com.github.themoment-team:datagsm-oauth-sdk-java:1.6.0'
implementation 'com.github.themoment-team:datagsm-openapi-sdk-java:1.7.0'
implementation 'com.squareup.okhttp3:okhttp:4.12.0'
implementation 'com.github.ben-manes.caffeine:caffeine'
implementation 'org.springframework.boot:spring-boot-starter-session-data-redis'
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:3.1.1'
compileOnly 'org.projectlombok:lombok'
Expand Down
16 changes: 13 additions & 3 deletions compose.prod.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ services:
DB_URL: jdbc:postgresql://postgres:5432/checkup
DB_USERNAME: ${DB_USERNAME}
DB_PASSWORD: ${DB_PASSWORD}
DB_POOL_SIZE: ${DB_POOL_SIZE:-10}
DB_POOL_TIMEOUT_MS: ${DB_POOL_TIMEOUT_MS:-10000}
REDIS_HOST: redis
REDIS_PORT: 6379
DATAGSM_CLIENT_ID: ${DATAGSM_CLIENT_ID}
Expand All @@ -26,13 +28,21 @@ services:
DATAGSM_WEBHOOK_SECRET: ${DATAGSM_WEBHOOK_SECRET}
PUBLIC_ORIGIN: ${PUBLIC_ORIGIN}
SESSION_COOKIE_SECURE: ${SESSION_COOKIE_SECURE}
# .env에 빈 값으로 두면 application.yaml의 기본값(7d)이 적용되지 않으므로 여기서 기본값을 준다(#156).
SESSION_TIMEOUT: ${SESSION_TIMEOUT:-7d}
SWAGGER_ENABLED: ${SWAGGER_ENABLED}
# .env에 빈 값으로 두면 application.yaml의 기본값(30d)이 적용되지 않으므로 여기서 기본값을 준다(#156).
SESSION_TIMEOUT: ${SESSION_TIMEOUT:-30d}
# 운영은 기본 비공개다. .env에 빈 값으로 두어도 false가 되도록 여기서 기본값을 준다(#100).
SWAGGER_ENABLED: ${SWAGGER_ENABLED:-false}
QUERY_LOG_ENABLED: ${QUERY_LOG_ENABLED:-false}
FACE_SERVICE_TOKEN: ${FACE_SERVICE_TOKEN}
FACE_AI_BASE_URL: ${FACE_AI_BASE_URL}
CHECKUP_ADMIN_DATAGSM_IDS: ${CHECKUP_ADMIN_DATAGSM_IDS:-}
# 메모리가 모자라 OutOfMemoryError가 나면 반쯤 죽은 채 응답하지 않고 종료해, restart 정책이 다시 띄우게 한다.
# 힙 크기는 정하지 않는다(기본: 호스트 메모리의 25%). 필요하면 SERVER_JAVA_OPTS에 -XX:MaxRAMPercentage=... 를 함께 넣는다.
JAVA_TOOL_OPTIONS: ${SERVER_JAVA_OPTS:--XX:+ExitOnOutOfMemoryError}
# 종료 신호 뒤 처리 중인 요청을 기다리는 시간(#233). 비워 두어도 기본값이 적용되도록 여기서 기본값을 준다.
SHUTDOWN_TIMEOUT: ${SHUTDOWN_TIMEOUT:-30s}
# docker가 SIGKILL로 강제 종료하기 전까지 기다리는 시간. SHUTDOWN_TIMEOUT보다 길어야 한다(기본 10초면 얼굴 요청이 끊긴다).
stop_grace_period: ${SHUTDOWN_GRACE_PERIOD:-45s}
# DB·Redis까지 닿아야 healthy다(REQ-OPS-001). 로그인 없이 열린 경로는 /actuator/health뿐이다.
healthcheck:
test: ["CMD", "curl", "-fsS", "-m", "5", "http://127.0.0.1:8080/actuator/health"]
Expand Down
Loading
Loading