Skip to content

develop: konsist ResponseDtoContract 가드가 58건으로 실패 — 예외 목록이 DTO 리네임과 어긋났다 #1467

Closed as not planned

Description

@Sadturtleman

📜 Overview

develop 에서 :konsist:test 가 실패한다. 내 변경을 stash 하고 clean develop 에서 재확인했다.

$ ./gradlew :konsist:test
ResponseDtoContractKonsistTest > 응답 DTO 의 non-null 프로퍼티는 보정형 기본값을 두지 않는다 FAILED
6 tests completed, 1 failed

58건이 「새로 추가됐다」로 보고되는데, 실제로는 새 위반이 아니라 KNOWN_COERCING_DEFAULTS 목록이 이름과 어긋난 것으로 보인다.

원인 — 클래스 이름이 바뀌었는데 목록은 옛 이름을 들고 있다

목록에 적힌 이름 위반으로 보고된 이름
AfternotePlaylistDto.songs AfternotePlaylist.songs
AfternotePageDto.content · .page · .size · .hasNext AfternoteListResponse.content · .page · .size · .hasNext
ReceivedAfternoteListDto.afternotes · .totalCount ReceivedAfternoteListResponse.afternotes · .totalCount
ReceivedPlaylistDto.songs ReceivedPlaylistInfo.songs
MusicSearchResponseDto.tracks MusicSearchResponse.tracks
ReceivedTimeLetterDto.blocks ReceivedTimeLetterResponseDto.blocks

목록 항목이 하나도 안 맞으니 전부 「새 위반」으로 되살아난다. 게다가 AfternoteDetailDto 와 AfternoteDetailResponse, ReceiverDiaryItem 과 ReceiverDiaryItemDto 처럼 옛 이름과 새 이름이 둘 다 위반 목록에 있어, 같은 계약의 클래스가 두 벌 존재하는 상태로 보인다.

왜 PR CI 에서 안 걸렸나 (가설)

resolve-pr-impact.mjs 는 바뀐 파일로 모듈을 고른다. :konsist:test 는 konsist 모듈이나 그 스캔 대상이 걸릴 때만 선택되므로, DTO 이름만 바꾼 PR 은 이 태스크를 안 돌리고 통과했을 수 있다. 이 가드는 전 저장소를 스캔하는 성격이라 모듈 선택과 잘 안 맞는다.

✅ 수용 기준

  • KNOWN_COERCING_DEFAULTS 를 현재 클래스 이름으로 갱신한다 — 또는 이름이 아니라 파일 경로+프로퍼티 처럼 리네임에 덜 취약한 키로 바꾼다
  • 옛 이름과 새 이름이 함께 존재하는 클래스(AfternoteDetailDto/AfternoteDetailResponse, ReceiverDiaryItem/ReceiverDiaryItemDto 등)가 의도된 두 벌인지, 이관 잔재인지 확인한다
  • :konsist:test 를 전 저장소 가드로 취급해 모듈 선택과 무관하게 항상 돌게 한다 — 지금은 DTO 만 바꾼 PR 이 이 가드를 지나친다
  • develop 이 초록으로 돌아온다

📍 Note

Activity

  1. github-actions commented on Aug 29, 2026

    @github-actions
    Contributor

    이 이슈는 필수 메타데이터를 판정할 수 없어 자동으로 닫았습니다.

    • 작업 유형이 없거나 허용된 값이 아닙니다.
    • 주 담당 모듈이 없거나 허용된 값이 아닙니다.

    이슈 등록 양식에 맞게 본문을 보완한 뒤 다시 열어 주세요.

  2. Sadturtleman commented on Aug 29, 2026

    @Sadturtleman
    CollaboratorAuthor

    제 오진이었습니다 — develop 은 멀쩡합니다

    (이 이슈는 메타데이터 가드가 이미 자동으로 닫았지만, 잘못된 신호를 남긴 채 두지 않으려 정정을 남깁니다.)

    로컬 :konsist:test 실패는 제 작업 환경 탓이었습니다. 이 저장소 디렉터리 안에 중첩된 git worktree 가 여러 개 있고(.claude/worktrees/agent-*, 각각 feat/443·feat/528 등 다른 브랜치), Konsist.scopeFromProject() 가 그 파일들까지 스캔합니다.

    $ git grep -l "class AfternoteDetailResponse" origin/develop
    (0건)
    
    $ grep -rl "AfternoteDetailResponse" .claude/worktrees
    .claude/worktrees/agent-ab6871f74023fb9bc/feature/afternote/data/.../AfternoteDto.kt   ← feat/528
    

    제가 「리네임 이후 예외 목록이 어긋났다」고 읽은 옛 이름·새 이름 두 벌(AfternoteDetailDto / AfternoteDetailResponse, ReceiverDiaryItem / ReceiverDiaryItemDto)은 리네임 잔재가 아니라 서로 다른 브랜치의 같은 파일이었습니다. 58건 중 develop 것은 13건뿐이고, 그 13건은 예외 목록에 정상 등재돼 있어 경고만 납니다.

    CI 실행 로그로도 확인했습니다 — clean checkout 이라 중첩 worktree 가 없고, ResponseDtoContractKonsistTest 는 실패 없이 「해소된 항목은 경고로 알린다」 13건 경고만 출력합니다.

    발행 전에 clean checkout 에서 재현했어야 했습니다.

    남는 관찰 하나만 적어 둡니다. scopeFromProject() 가 중첩 작업 디렉터리를 걸러내지 않습니다 — 저장소 안에 worktree 를 두는 도구를 쓰면 같은 유령 위반을 봅니다. CI 는 영향이 없고 로컬에서만 나타나므로 우선순위는 낮습니다.

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

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions