아이템 등록 한도를 백오피스에서 확인·조절 - #946
Merged
Merged
Conversation
- 한도가 env 에만 있어 비용이 튀어 급히 조여야 할 때도, 한도가 낮아 정상 사용자가 막힐 때도 배포나 재시작을 기다려야 했다. 둘 다 분 단위가 아까운 상황이라 배포 없이 바꿀 경로를 만든다
- 판정에 쓰이는 값을 ItemQuotaProperties(env)에서 ItemQuotaSnapshot(env + DB 오버라이드)으로 옮겼다. 소비자는 ItemQuotaSettings.current() 로 값 한 벌을 받는다 — 값을 하나씩 꺼내 쓰면 판정 도중 백오피스 저장이 끼어들어 한 요청이 옛 계정 한도와 새 전역 상한을 섞어 보게 된다
- 저장 구조는 단일 행에 각 컬럼 nullable 이고 null 은 "그 노브만 env 기본값" 이다. 부분 오버라이드를 허용해, 전역 상한 하나만 급히 내릴 때 나머지 값까지 화면에서 다시 적어 넣지 않게 했다. 행이 없으면 전부 기본값이다("행 없음 = 기본" 규약 — extraction_models 와 같다)
- 캐시·재적재·afterCommit reload 는 DbExtractionModelSettings 를 그대로 따랐다. @volatile 통째 교체(reader 가 반쪽 상태를 안 봄), load 에 @synchronized(주기 재적재가 방금 저장한 값을 덮어쓰는 역전 방지), 화면은 캐시가 아니라 저장소를 직접 조회(캐시는 afterCommit 갱신이라 방금 저장한 값이 아직 안 보임)
- 재적재 실패 시 기존 스냅샷을 유지한다. env 로 되돌리면 방금 조인 값이 조용히 풀려 비용 방어가 사라진다
- 창 길이(window)는 조절 대상에서 뺐다. 바꾸면 이미 돌고 있는 카운터는 옛 TTL 로 만료되고 새 카운터만 새 창을 쓰는데, 사용자마다 창 시작 시점이 달라 중간 상태를 설명할 수 없다. 조절 노브는 사용 여부·계정 한도·전역 상한·경고선 넷이다
- 사용량 화면은 전역 현황과 특정 계정 조회까지만 둔다. 상위 사용자 목록은 활성 사용자 키를 전부 훑어야 하는데 같은 Redis 를 refresh 토큰 저장소가 함께 쓰고 있어, 화면 한 번이 로그인 지연으로 번진다
- 잔액은 음수를 0 으로 접지 않고 그대로 보인다. 마지막 한 번이 한도를 넘길 수 있는 구조라(잔액 방식) 운영자에게는 "얼마나 넘겼나" 가 곧 신호다
- 검증: 오버라이드를 무시하도록 임시로 되돌리니 "한도를 내리면 그 다음 등록부터 막힌다" 와 "되돌리기" 두 테스트만 정확히 실패했다. DB 저장이 아니라 실제 등록 요청의 판정까지 확인한다는 뜻이다
|
Important Review available on request
Reviews should be triggered manually for repositories with fewer than 10 stars. Select Trigger review above or comment ⚙️ Run configurationConfiguration used: Path: .coderabbit.yml Review profile: CHILL Plan: Pro Plus Run ID: Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
Discord 스레드 연동용 메타데이터입니다. discord-pr-bot 워크플로가 자동 생성하며, 수정·삭제하면 PR 과 Discord 알림 연동이 끊깁니다. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Situation
application.yml과 환경변수에만 있다. 바꾸려면 배포나 재시작이 필요하다.Task
Action
선례를 그대로 따랐다
추출 모델 지정(#884)이 같은 문제를 이미 풀어 뒀다. 그 구현의 주석에 남은 이유들을 그대로 가져왔다.
@Volatile)@Synchronized여기에 하나 더했다. 재적재가 실패하면 기존 값을 유지한다. env 로 되돌리면 방금 조인 한도가 조용히 풀려 비용 방어가 사라진다.
판정이 읽는 자리를 바꿨다
가드가 값을 하나씩 꺼내 쓰지 않고 한 벌을 한 번에 받는다(
ItemQuotaSettings.current()). 하나씩 읽으면 판정 도중 저장이 끼어들 때 한 요청이 섞인 값으로 판단한다.env 값(
ItemQuotaProperties)은 이제 기본값이고, 실효값은 그 위에 DB 오버라이드를 얹은 결과(ItemQuotaSnapshot)다.저장 구조: 단일 행, 각 컬럼 nullable
null은 "그 노브만 env 기본값" 이라는 뜻이다. 부분 오버라이드를 허용해, 전역 상한 하나만 급히 내릴 때 나머지 값까지 화면에서 다시 적어 넣지 않게 했다. 행이 없으면 전부 기본값이다(extraction_models와 같은 "행 없음 = 기본" 규약).행이 서비스에 하나뿐이라 PK 를 상수로 못박고 DDL 의
CHECK로 두 행이 생기는 것을 막는다.범위를 좁힌 둘
window) 조절조절 노브는 넷이다: 사용 여부 · 계정 한도 · 전역 상한 · 경고선(%).
화면
목록 하나로 끝난다. 설정이 한 벌뿐이라 상세로 들어갈 것이 없고, 계정 조회도 같은 화면에 둬 "현황을 보다가 바로 조인다" 는 흐름이 끊기지 않게 했다.
Result
enabled=false를 "값 없음" 으로 흘려보내는 실수(Boolean 을 Elvis 로 풀 때 흔하다)를 별도 테스트로 고정했다. 그러면 "한도를 끈다" 는 조작이 조용히 무시돼, 정상 사용자를 막고 있는 상태를 되돌릴 수 없게 된다.연관 이슈