Skip to content

EGC_014~015 : 표준 표기 검사 인스펙션 추가와 리뷰 지적·한글 렌더링 결함 수정 - #24

Merged
YoHanKi merged 2 commits into
mainfrom
fix/review-batch-1
Aug 11, 2026
Merged

EGC_014~015 : 표준 표기 검사 인스펙션 추가와 리뷰 지적·한글 렌더링 결함 수정#24
YoHanKi merged 2 commits into
mainfrom
fix/review-batch-1

Conversation

@YoHanKi

@YoHanKi YoHanKi commented Aug 11, 2026

Copy link
Copy Markdown
Owner

main 에 없는 커밋 두 개를 함께 올립니다. EGC_014(기존 리뷰 지적 일괄 수정)와 EGC_015(이번 작업)입니다.

기능

표준 표기 검사 인스펙션 — 표준용어는 표준단어의 영문약어 조합이므로(명 → NM, 코드 → CD), userName 은 개념은 맞고 표기만 틀린 이름입니다. 사전은 단어 1,699개마다 영문명과 영문약어를 모두 담고 있었지만 둘을 함께 읽는 곳이 없었습니다. 이를 찾아 userNm 으로의 rename 리팩터링을 제안합니다.

기본값은 꺼짐입니다. 이 표준은 DB 컬럼명을 위한 것이라 일반 애플리케이션 코드에 그대로 적용하면 userServiceuserSrvc 로 바꾸자고 합니다. 실제 식별자 38개로 정밀도를 측정한 뒤 억제 장치를 세 겹 넣었습니다.

  • 이름의 모든 토큰이 해석될 때만 보고 (http, dto, mapper 하나라도 있으면 통과)
  • 타입 이름을 그대로 쓴 변수(UserService userService) 제외 — 노이즈의 최대 원인이었습니다
  • 단어 하나짜리 이름(name, code) 제외 — 표준용어를 조합했다는 증거가 없습니다

파일에서 가져오기 — 내보내기만 있고 반대가 없어, 공유받은 사전 파일을 쓰려면 편집기로 열어 전체 선택 후 붙여넣어야 했습니다. 텍스트 영역을 거치지 않고 바로 읽습니다.

수정

문제 원인
예시 JSON 의 한글이 네모(□)로 깨짐 편집기 글꼴을 Swing 텍스트 영역에 그대로 지정. 코딩 글꼴에는 한글 글리프가 없고, 텍스트 영역은 편집기와 달리 글자 단위 대체 글꼴을 쓰지 않음
/convert 가 비표준 이름을 표준이라고 응답 판정에 쓰던 isKnownWord 는 맞춤법 검사기용이라 영문명도 받아들여, USER_NAMEstandard: true 를 반환. 에이전트가 이름을 지어내지 않게 하려고 만든 엔드포인트가 정반대로 답하고 있었음
가져오기 시 UI 멈춤 JSON 파싱과 중복 검사를 EDT 에서 실행. 중복 검사는 기본 사전 3.7MB 를 로드함
매치 구간 하이라이팅이 안 됨 색인은 user_iduserId 를 같게 보고 검색해 주지만, 렌더러는 단순 indexOf 였음
배열이 아닌 문서의 오류 메시지가 영어 파서 원문이 그대로 노출. 항목 하나를 대괄호 없이 붙여넣는 흔한 실수
\u+041 같은 이스케이프가 통과 toIntOrNull(16) 이 부호를 허용해 문서에 없던 문자를 생성

번들 키 15개(미참조) 삭제, 검색 패널 totalCount volatile 처리도 포함합니다.

검증

  • ./gradlew build 성공, 테스트 138개 전부 통과
  • Java PSI 픽스처 도입(TestFrameworkType.Plugin.Java). 인스펙션이 필드를 보고하고, 퀵픽스가 선언과 사용처를 함께 바꾸며, 타입 이름 변수·단어 하나짜리 이름·메서드 이름을 건너뛰는지 실제 PSI 위에서 검증합니다.
  • 글꼴 수정은 JVM 에서 메커니즘까지 확인했습니다(Consolas.canDisplay(U+AC00)=false, Monospaced=true). 샌드박스 IDE 를 띄워 눈으로 확인하지는 않았습니다.

참고

  • 릴리스 버전은 [minor] 마커로 2.1.0 이 됩니다.
  • verifyPluginStructure 의 Kotlin supportsKotlinPluginMode 경고는 기존 사항입니다. 해당 선언은 선택적 의존 파일(egov-kotlin.xml)에 올바르게 들어 있고, 메인 descriptor 로 옮기면 Kotlin 없는 IDE 에서 로딩이 깨집니다.

🤖 Generated with Claude Code

YoHanKi and others added 2 commits August 9, 2026 23:54
시니어 6인 병렬 리뷰에서 교차 확인된 결함을 한 브랜치에 모았다.

기능이 실제로 깨져 있던 것

- TERM 5,395건 전부에서 자동 완성 타입 칸이 비어 있었다. 데이터셋은 용어->도메인
  관계를 문자열 참조로만 표현하고 아무도 그 참조를 따라가지 않았다. dataType,
  dataLength, dataScale, domainGroup, unit 은 전부 DOMAIN 106행에만 있다.
  effectiveEntries 에서 조인한다. 참조는 dangling 없이 100% 해소된다.
  같은 이유로 죽어 있던 Query.domainGroup / domainCategory 필터도 함께 살아난다.
- 이어 타이핑하면 조합 완성이 나타나지 않았다. restartCompletionOnAnyPrefixChange
  가 인덱스 미준비 시에만 호출돼, 플랫폼은 기존 후보를 필터링만 했다. 그런데
  CompletionSearchStrategy 는 프리픽스마다 다른 검색을 한다 - hs 는 REPLACE,
  hsN 은 APPEND 로 hsNm 을 만든다. 애초에 후보에 없던 항목이라 필터링으로는
  나올 수 없었다. 전략 단위 테스트는 통과했다. 전략을 직접 호출하기 때문이다.
- 인덱스 빌드가 실패하면 플러그인이 조용히 죽었다. 실패 경로가 알림을 보내지
  않아 재시도를 스케줄할 유일한 경로가 오지 않았고, 사용자는 끝나지 않는
  "불러오는 중" 을 봤다. IndexStatus.FAILED 와 다시 시도 링크를 추가한다.
- 최근 검색어 기억 체크박스가 아무 동작도 하지 않았다. 저장까지 되지만 읽는
  코드가 없었다. 기록 지우기 버튼은 최근 검색어가 아니라 최근 사용 항목을
  지우면서 라벨은 검색어를 가리켰다.
- 복사와 삽입이 세 경로에서 조용히 실패했다. 도메인 행에서 Enter 를 누르거나
  파일이 열려 있지 않으면 아무 일도 일어나지 않았다. 미사용 상태였던
  action.copied 키를 쓴다.
- NameGenerator 가 한글을 구분자로 버려 가격N10 -> n10, API명 -> api 를 만들었다.
  툴윈도우는 identifierBase 를 거쳐 막혔지만 REST /convert 는 직접 호출한다.
- ko 번들에서 작은따옴표가 화면에 두 개로 출력됐다. 파라미터가 없는 문자열이라
  MessageFormat 을 거치지 않는다.
- 번들 데이터에 엑셀 부동소수 잔재가 남아 있었다. 9.999999999E9 88건,
  도메인 길이 "10.0" 107건. 후자는 조인 후 NUMERIC(10.0) 으로 표시됐을 것이다.

도달성

- 액션이 하나도 등록돼 있지 않았다. Find Action 에도 안 나오고 단축키를
  배정할 대상 자체가 없었다. 커서 위치의 이름을 검색어로 채우는 액션을 Tools
  메뉴와 에디터 팝업에 등록한다. 기본 단축키는 배정하지 않는다.
- GenericEgovLanguageSupport 가 SQL 과 JavaScript 로만 등록돼 있어 PyCharm,
  GoLand, RubyMine, PhpStorm, CLion, Rider 에서 기여자가 즉시 반환했다.
  catch-all 로 등록하고 forElement 가 allForLanguageOrAny 로 조회한다.
  language 속성은 "any" 가 아니라 생략한다. LanguageExtensionPoint.getKey 가
  빈 문자열로 정규화하고 그것이 Language.ANY 의 id 다.
- completion.contributor 는 반대로 "any" 리터럴을 쓴다. CompletionExtension 이
  언어 id + base 언어 + "any" 를 한 집합으로 모으므로, JAVA 와 "any" 양쪽에
  등록하면 같은 클래스가 두 번 반환돼 추천이 중복된다. 언어별 등록 4개를
  제거하고 plugin.xml 에 한 번만 등록한다.
- 완성 기여자에 DumbAware 를 붙인다. 자체 인덱스만 쓰므로 인덱싱 중 사라질
  이유가 없었다. 리네임 인텐션은 usage 검색이 필요해 제외한다.

MCP 및 REST

- 분당 30회 기본 한도는 에이전트가 엔티티 하나를 명명하다 소진한다.
  Retry-After 도 없고 본문이 HTML 이라 원인도 알 수 없었다. 600 으로 올린다.
- /convert 가 표준 여부를 검증하지 않아, 에이전트가 지어낸 이름을 넣고
  확인했다고 착각할 수 있었다. isKnownWord 로 토큰을 검사해 standard 와
  unknownTokens 를 함께 돌려준다.
- 빈 q 는 점수 0짜리 20건을 정상 결과처럼 반환했고, 잘못된 type 은 조용히
  무시됐다. 둘 다 거절한다. 모든 응답을 ok 필드가 있는 JSON 으로 통일한다.
- MCP 응답의 들여쓰기를 제거하고 기본 limit 을 5로 낮춘다. 프로토콜 버전은
  지원 목록과 교집합을 취한다.
- indexBlocking 이 building 가드를 우회해 동시 요청이 각각 전체 인덱스를
  빌드했다. 동기화한다.

테스트 114개 통과. verifyPlugin 은 243/251/252/253/261/262 에서 호환성 문제
없음.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
기능

- 표준 표기 검사 인스펙션. 표준용어는 표준단어의 영문약어 조합이므로 userName 은 개념은
  맞고 표기만 틀린 이름이다. 사전은 단어 1,699개마다 영문명과 영문약어를 모두 담고 있었으나
  둘을 함께 읽는 곳이 없었다. 기본값은 꺼짐 -- 이 표준은 DB 컬럼명을 위한 것이라 일반 코드에
  그대로 적용하면 userService 를 userSrvc 로 바꾸자고 한다. 오탐을 줄이기 위해 이름의 모든
  토큰이 해석될 때만 보고하고, 타입 이름을 그대로 쓴 변수(UserService userService)와 단어
  하나짜리 이름은 건너뛴다. 퀵픽스는 실제 rename 리팩터링이라 사용처까지 바뀐다.
- 가져오기 탭에 파일에서 가져오기 버튼. 내보내기만 있고 반대가 없어서 공유받은 사전 파일을
  쓰려면 편집기로 열어 전체 선택 후 붙여넣어야 했다. 텍스트 영역을 거치지 않고 바로 읽는다.

수정

- 예시 보기로 나오는 JSON 의 한글이 네모로 깨지던 문제. 편집기 글꼴을 Swing 텍스트 영역에
  그대로 지정했는데, 코딩 글꼴에는 한글 글리프가 없고 텍스트 영역은 편집기와 달리 글자 단위
  대체 글꼴을 쓰지 않는다. 한글을 그릴 수 있는 글꼴을 골라 쓴다.
- GET /convert 가 비표준 이름을 표준이라고 답하던 문제. 판정에 쓰던 isKnownWord 는 맞춤법
  검사기용이라 영문명도 아는 단어로 받아들여, USER_NAME 에 standard: true 를 반환했다.
  에이전트가 이름을 지어내지 않게 하려고 만든 엔드포인트가 정반대로 답하고 있었다.
- 가져오기의 JSON 파싱과 중복 검사가 EDT 에서 실행되던 문제. 중복 검사는 기본 사전 3.7MB 를
  읽어들이므로, 색인 생성 전에 가져오기를 실행하면 그동안 UI 가 멈췄다.
- 결과 하이라이팅이 구분자를 무시하지 못하던 문제. 색인은 user_id 와 userId 를 같게 보고
  검색해 주지만 정작 결과 행에는 아무 표시도 되지 않았다.
- 최상위가 JSON 배열이 아닐 때의 오류 메시지를 한국어로 표시.
- \u 이스케이프에 부호가 섞여 있어도 통과시켜 문서에 없던 문자를 만들어 내던 허용 범위를
  표준대로 좁힘.
- 검색 패널의 totalCount 를 volatile 로. 검색 스레드가 쓰고 EDT 가 읽는다.

정리

- 어디에서도 참조하지 않는 메시지 번들 키 15개 삭제.
- Java PSI 픽스처 도입(TestFrameworkType.Plugin.Java). 인스펙션이 실제 PSI 위에서 무엇을
  보고하고 무엇을 건너뛰는지 검증한다. 테스트 138개 통과.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

Qodana Community for JVM

1 new problem were found

Inspection name Severity Problems
Unstable API Usage 🔶 Warning 1

💡 Qodana analysis was run in the pull request mode: only the changed files were checked

View the detailed Qodana report

To be able to view the detailed Qodana report, you can either:

To get *.log files or any other Qodana artifacts, run the action with upload-result option set to true,
so that the action will upload the files as the job artifacts:

      - name: 'Qodana Scan'
        uses: JetBrains/qodana-action@v2025.1.1
        with:
          upload-result: true
Contact Qodana team

Contact us at qodana-support@jetbrains.com

@YoHanKi
YoHanKi merged commit 487b59d into main Aug 11, 2026
6 checks passed
@YoHanKi
YoHanKi deleted the fix/review-batch-1 branch August 11, 2026 15:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant