Skip to content

SecurityConfigTest 를 단독으로 돌리면 빨갛다 — CLAUDE.md 가 적어 둔 명령이 그 형태다 #611

Description

@gitIt-sehyeon

#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)

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    serverSpring (:8000)

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions