#609 작업 중 --tests 로 보안 테스트만 돌리다 나온 것입니다. 제 변경과 무관하게 빨갰습니다.
실측
main a9f1357 · 작업 트리 clean
./gradlew test BUILD SUCCESSFUL (822건)
./gradlew test --tests '…security.SecurityConfigTest' FAILED ❗
깨지는 자리 하나입니다.
SecurityConfigTest.java:60
SecurityConfig 프로파일 분리 > 로컬 개발(기본 프로파일) > 전면 허용
java.lang.AssertionError: Status expected:<200> but was:<404>
왜 404 인가
그 테스트가 치는 경로가 DB 에 저장된 추출을 읽습니다.
// SecurityConfigTest.java:60
mvc.perform(get("/products/doc-els-kiwoom-4181/risk-items")).andExpect(status().isOk());
// ProductRiskItems.java:195-200
List<ExtractedRiskItem> stored = repository.findByProductIdOrderByItemIndexAsc(productId);
if (stored.isEmpty()) {
throw new NoSuchElementException("이해항목을 알 수 없다(저장된 추출이 없다 …)"); // → 404
}
PRELOADED 는 경로·유형·표시명만 들고 있고 위험항목 자체는 안 들었습니다(#478 · #403). 그래서 그 상품의 추출이 DB 에 누군가 넣어 준 뒤라야 200 입니다.
전체 실행에서는 앞선 테스트가 넣어 둔 것이 H2 인메모리에 남아 통과하고, 단독 실행에서는 없어서 404 입니다. 어느 테스트가 남기는지까지는 안 좁혔습니다 — SecurityConfigTest + RealExtractionWiringTest 조합으로는 아직 빨갛습니다.
❗왜 이게 문제인가 — 둘입니다
하나, CLAUDE.md 가 그 명령을 공식으로 적어 뒀습니다.
cd server && ./gradlew test --tests 'com.sphinxfin.sphinx.core.gate.GateEngineTest' # 단일 테스트
보안 쪽을 고치는 사람이 그 형태로 돌리면 자기 변경과 무관한 빨강을 봅니다. 저는 rbac_policy.yaml 을 고치던 중이라 잠깐 제가 깬 줄 알았습니다. 정책 파일을 만지는 사람은 --tests '…security.*' 를 가장 먼저 칠 사람이라, 이 자리에서 유독 자주 밟힙니다.
둘, 그 테스트가 재려는 것과 실제로 재는 것이 다릅니다.
재려는 것 기본 프로파일에서 인증 없이 닿는다 (전면 허용)
재는 것 인증 없이 닿는다 AND 그 상품의 추출이 DB 에 있다
지금은 전체 실행에서 초록이라 결과적으로는 맞게 돌지만, 단정이 두 가지에 걸려 있습니다. 「인증」을 재는 테스트가 「데이터」 때문에 빨개지면, 다음에 진짜로 인증이 깨졌을 때도 같은 자리가 빨개져서 원인을 한 번 더 가려야 합니다.
고칠 방향 (제안 — 소유자 판단입니다)
ⓐ 인증만 재는 경로로 바꾼다 데이터가 없어도 답이 정해진 엔드포인트를 친다.
「전면 허용」의 반대말은 401·403 이지 404 가 아니므로
isNotUnauthorized() 쪽으로 단정을 좁혀도 된다
ⓑ 그 테스트가 추출을 직접 넣는다 @BeforeEach 로 심는다. 의존이 사라지지만 이 테스트가
보안과 무관한 픽스처를 들게 된다
ⓒ 공용 시드를 둔다 넓게 고치는 대신 넓게 깨질 수 있다
저는 ⓐ 를 봅니다 — 재려는 것이 「인증이 안 막는다」이므로 404 든 200 이든 인증 때문이 아니면 통과가 그 테스트의 뜻에 맞습니다. 다만 SecurityConfig 는 @hd0rable 님 파일이라 제가 고치지 않고 올립니다.
곁 — 이 갈래가 CI 에서는 안 보입니다
ci.yml 이 전체를 돌리므로 CI 는 언제나 초록입니다. 단독 실행은 사람 손에서만 일어나고, 그래서 각자 한 번씩 밟고 각자 넘어갑니다. 지금 그것을 한 번 적어 두는 것이 이 이슈의 값입니다.
cc @hd0rable (SecurityConfig·SecurityConfigTest) @junseo2323 (ci.yml)
#609작업 중--tests로 보안 테스트만 돌리다 나온 것입니다. 제 변경과 무관하게 빨갰습니다.실측
깨지는 자리 하나입니다.
왜 404 인가
그 테스트가 치는 경로가 DB 에 저장된 추출을 읽습니다.
PRELOADED는 경로·유형·표시명만 들고 있고 위험항목 자체는 안 들었습니다(#478·#403). 그래서 그 상품의 추출이 DB 에 누군가 넣어 준 뒤라야 200 입니다.전체 실행에서는 앞선 테스트가 넣어 둔 것이 H2 인메모리에 남아 통과하고, 단독 실행에서는 없어서 404 입니다. 어느 테스트가 남기는지까지는 안 좁혔습니다 —
SecurityConfigTest+RealExtractionWiringTest조합으로는 아직 빨갛습니다.❗왜 이게 문제인가 — 둘입니다
하나,
CLAUDE.md가 그 명령을 공식으로 적어 뒀습니다.보안 쪽을 고치는 사람이 그 형태로 돌리면 자기 변경과 무관한 빨강을 봅니다. 저는
rbac_policy.yaml을 고치던 중이라 잠깐 제가 깬 줄 알았습니다. 정책 파일을 만지는 사람은--tests '…security.*'를 가장 먼저 칠 사람이라, 이 자리에서 유독 자주 밟힙니다.둘, 그 테스트가 재려는 것과 실제로 재는 것이 다릅니다.
지금은 전체 실행에서 초록이라 결과적으로는 맞게 돌지만, 단정이 두 가지에 걸려 있습니다. 「인증」을 재는 테스트가 「데이터」 때문에 빨개지면, 다음에 진짜로 인증이 깨졌을 때도 같은 자리가 빨개져서 원인을 한 번 더 가려야 합니다.
고칠 방향 (제안 — 소유자 판단입니다)
저는 ⓐ 를 봅니다 — 재려는 것이 「인증이 안 막는다」이므로 404 든 200 이든 인증 때문이 아니면 통과가 그 테스트의 뜻에 맞습니다. 다만
SecurityConfig는 @hd0rable 님 파일이라 제가 고치지 않고 올립니다.곁 — 이 갈래가 CI 에서는 안 보입니다
ci.yml이 전체를 돌리므로 CI 는 언제나 초록입니다. 단독 실행은 사람 손에서만 일어나고, 그래서 각자 한 번씩 밟고 각자 넘어갑니다. 지금 그것을 한 번 적어 두는 것이 이 이슈의 값입니다.cc @hd0rable (
SecurityConfig·SecurityConfigTest) @junseo2323 (ci.yml)