Files
HeuJung 8328b1db77 docs(core,extensions): 확장 개발자 문서 9세트 집필과 생성기 정합 보강
S1 파일럿 3종(sirsoft-board · sirsoft-gdpr · sirsoft-admin_basic)에 이어
결제·본인인증 동형군 6종의 AGENTS.md · README.md · docs/ 5문서를 집필했다.
확장을 고치려는 쪽이 매번 src/ 를 훑어 구조를 재발견하지 않도록, 설계 의도와
확장점(발행·구독 훅)·수정 시 동반 의무·금지 패턴을 코드 근거로 서술했다.

생성기(ExtensionDocScaffolder)에서 표를 무의미하게 만들던 세 결함을 함께 고쳤다.
getLayoutExtensions 기본 구현이 돌려주는 절대경로가 파일 목록과 중복돼 로컬
머신 경로가 커밋 문서에 실리던 문제, getNotificationDefinitions 를 'key'/'event'
로 읽어 모든 행이 '-' 로 찍히던 문제, getSettingsLayout 절대경로가 정규화 없이
노출되던 문제다. 셋 다 예외를 남기지 않고 표만 조용히 망가뜨리므로
ExtensionDocContractTest 에 각각의 되돌림 red 를 확인한 단언을 두었다.
템플릿의 extensions/{id}/ 는 모듈·플러그인의 발행과 반대 방향(오버라이드)이라
별도 블록(template-overrides)으로 분리했다.

sirsoft-admin_basic 의 컴포넌트·핸들러·레이아웃 문서를 코어 docs/ 에서 그 템플릿
소유로 이관하고, 남은 참조 6축을 재는 가드를 추가했다. 이관 후 남은 옛 경로는
오류가 아니라 헛걸음으로만 나타나 드러나지 않는다. 의 상대 링크가
한 단계 얕아 공유 docs/ 대신 를 가리키던 문제도 함께 고쳤다.

README 상단의 확장명 이미지 배지를 평문 H1 로 바꿨다( 지시 2026-08-31).
루트 README.md · README.ko.md 도 같은 기준을 적용했다. 정보 배지는 유지한다.

sirsoft-gdpr: 회원탈퇴로 자동 철회된 동의가 관리자 동의 이력 화면의 출처 필터로
걸러지지 않던 문제를 고쳤다. Repository 가 'withdraw' 리터럴을 직접 UPDATE 에
싣는데 그 값이 ConsentSource enum 에 없어, 화면 필터 옵션·라벨 어느 쪽에도
도달하지 못했다. 어휘를 enum 단일 출처로 모으고 ko·en·ja 라벨과 필터 옵션을
함께 채웠으며, 어휘 대조 테스트의 모집단에 Repository 를 편입했다.
2026-08-31 15:57:44 +09:00

6.8 KiB

NHN KCP 휴대폰 본인확인 — 확장점

발행/구독 훅·미들웨어·채널·스케줄 · 진입점: AGENTS.md

발행 훅

이 확장은 훅을 발행하지 않습니다.

sirsoft-verification_kginicis는 같은 표에 3건이 잡히지만 실제로는 발행하는 훅이 아닙니다(코어 호출부를 보여주는 docblock 예시를 소스 자동 감지가 오인한 결과) — 이 플러그인은 그런 예시 서술 방식을 쓰지 않아 표가 정확히 비어 있습니다. 두 플러그인 모두 실제로 발행하는 도메인 전용 훅은 없습니다.

구독 훅

훅 이름 유형 리스너 메서드 우선순위
core.auth.after_register action (미선언) CompleteKcpRecordAfterRegister handle 50
core.auth.before_register action (미선언) AssertNoDuplicateKcpIdentity handle 20
core.identity.registered_providers filter RegisterKcpProviderListener register 20
core.plugin_settings.filter_save_data filter ValidateKcpSettingsListener normalizeLiveSiteCd 10
core.plugin_settings.update_validation_rules filter ValidateKcpSettingsListener addLiveModeRules 10
core.user.after_withdraw action (미선언) CleanKcpRecordOnUserWithdraw handle 50
core.user.before_delete action (미선언) CleanKcpRecordOnUserDelete handle 50

ValidateKcpSettingsListener가 2개 훅(filter_save_data/update_validation_rules)을 동시에 구독하는 것은 sirsoft-verification_kginicis의 ValidateInicisSettingsListener(1개 훅만 구독)와의 차이입니다 — kginicis 는 라이브 MID 프리픽스를 Provider 가 값을 쓸 때 동적으로 붙이는 반면, 이 플러그인은 저장 시점에 정규화해 DB 에 프리픽스 붙은 값을 남깁니다(§AGENTS.md "핵심 흐름"). AssertNoDuplicateKcpIdentity가 core.auth.before_register(가입 전)을 구독하는 이유와 core.user.before_delete가 sync: true인 이유는 kginicis 쪽과 동일합니다.

훅 리스너

리스너 구독 훅 등록 방식 HookListenerInterface 파일
AssertNoDuplicateKcpIdentity 1개 명시 등록 ✅ src/Listeners/AssertNoDuplicateKcpIdentity.php
CleanKcpRecordOnUserDelete 1개 명시 등록 ✅ src/Listeners/CleanKcpRecordOnUserDelete.php
CleanKcpRecordOnUserWithdraw 1개 명시 등록 ✅ src/Listeners/CleanKcpRecordOnUserWithdraw.php
CompleteKcpRecordAfterRegister 1개 명시 등록 ✅ src/Listeners/CompleteKcpRecordAfterRegister.php
RegisterKcpProviderListener 1개 명시 등록 ✅ src/Listeners/RegisterKcpProviderListener.php
ValidateKcpSettingsListener 2개 명시 등록 ✅ src/Listeners/ValidateKcpSettingsListener.php

6개 리스너 중 3개(CompleteKcpRecordAfterRegister, CleanKcpRecordOnUserWithdraw, CleanKcpRecordOnUserDelete)는 sirsoft-verification_kginicis와 동일하게 사용자 생명주기 각 단계에 맞춰 PII 레코드를 흡수하거나 정리하는 대칭 구조입니다 — 하나를 고칠 때 나머지 둘도 같은 PII 필드를 다루고 있는지 확인해야 합니다.

레이아웃 확장

대상 설명
resources/extensions/identity_provider_nhnkcp.json 다른 확장/템플릿 레이아웃에 주입되는 조각
resources/extensions/mypage_identity_card.json 다른 확장/템플릿 레이아웃에 주입되는 조각

mypage_identity_card.json은 sirsoft-verification_kginicis의 같은 이름 조각과 동일한 역할(마이페이지 "본인확인 완료" 상태 카드)입니다 — 여러 IDV provider 가 동시에 설치돼도 각자 자기 카드만 주입하므로 충돌하지 않습니다. identity_provider_nhnkcp.json은 코어 IDV 팝업이 이 provider 고유의 안내 문구·로고를 보여줄 때 쓰는 조각입니다.

미들웨어

등록하는 미들웨어가 없습니다.

결제 플러그인들과 달리 이 플러그인은 PG 서버가 직접 호출하는 웹훅/통보 엔드포인트가 없습니다 — 본인확인 결과는 팝업 콜백 또는 모바일 리다이렉트 콜백(둘 다 사용자 브라우저 경유)으로만 도달하므로 IP 화이트리스트 같은 서버간 통신 검증이 필요 없습니다.

브로드캐스트 채널

등록하는 브로드캐스트 채널이 없습니다.

인증 결과는 팝업의 종료 감지 또는 모바일 리다이렉트 복귀로 프론트가 직접 회수합니다 (§AGENTS.md "핵심 흐름") — 서버가 다른 클라이언트에 실시간으로 알려야 할 상태 변화가 없어 브로드캐스트 채널이 필요 없습니다.

스케줄

등록하는 스케줄이 없습니다.

nhnkcp_cert_transactions의 만료된 인증 거래나 redirectStash의 잔존 세션 데이터를 별도 배치로 청소하지 않습니다 — sessionStorage는 브라우저 세션 종료로 자연 소멸하고, 서버측 거래 레코드 정리는 사용자 삭제/탈퇴 시점 리스너가 담당합니다(§훅 리스너).

알림 정의

등록하는 알림 정의가 없습니다.

본인확인 성공/실패는 사용자가 즉시 확인하는 동기적 상호작용이라, 별도 알림(이메일/SMS 등)을 발송할 지점이 없습니다.