Skip to content

플랫폼 정책을 허용·차단 한 축으로 교체 - #955

Merged
m-a-king merged 3 commits into
devfrom
feat/domain-access-policy
Aug 16, 2026
Merged

플랫폼 정책을 허용·차단 한 축으로 교체#955
m-a-king merged 3 commits into
devfrom
feat/domain-access-policy

Conversation

@m-a-king

@m-a-king m-a-king commented Aug 16, 2026

Copy link
Copy Markdown
Collaborator

Situation

  • 정책 테이블이 route 3값(SUPPORTED·HEADLESS_FIRST·UNSUPPORTED)과 허가 boolean 두 축으로 갈라져, 서로 다른 질문 네 개(등록을 받나 / 어떻게 가져오나 / 실측했나 / 어디까지 허락됐나)에 답하고 있었다.
  • 그래서 모순 조합이 DB 에 저장 가능했다. HEADLESS_FIRST + 허가 없음은 화면에 "브라우저 직행"으로 보이는데 실제로는 아무 일도 안 일어나는 상태이고, dev 에 그런 좀비 행이 3개 실재했다.
  • core 가 추출 수단의 구체적인 이름을 스키마·백오피스 문구·CSS 클래스·주석까지 들고 있었다. 수단은 다른 repo 가 소유하므로, 저쪽 구현이 바뀌면 이쪽 서술만 조용히 낡는다.

Task

  • 정책의 축을 하나로 줄이고, 그 축이 답하는 질문을 "이 도메인을 어떻게 대할 것인가" 하나로 고정한다.
  • core 가 아는 범위를 "허락을 받았는가"로 한정하고, 그 허락이 무엇을 여는지는 추출 모듈이 해석하게 한다.

Action

축을 하나로

DomainAccess { ALLOWED, BLOCKED }. 행이 없으면 기본 흐름이라 정책 테이블은 예외만 담고, 두 값 모두 실제 동작을 가져 기록 전용 값이 사라진다. 모순 조합은 표현 자체가 불가능해진다.

상태 의미 동작
행 없음 아직 판단하지 않음 등록 받음, 기본 수단으로 추출
ALLOWED 플랫폼의 명시적 허락을 받음 위 + 적극적인 수단까지 허용
BLOCKED 얻을 수 없다고 판단 등록 400, 재파싱도 요청 안 보냄

core 는 허락만 알고, 수단은 모듈이 해석한다

계약으로 나가는 값은 authorized 한 비트다. 원장의 세 상태를 모듈이 알아야 하는 만큼만 투영한 것이라 1:1 매핑이 아니다.

원장(core) 요청을 보내나 계약에 실리는 값
ALLOWED 보냄 authorized: true
행 없음 보냄 authorized: false
BLOCKED 안 보냄 등장하지 않음

"등록을 받을 것인가"는 우리 서비스의 결정이라 모듈이 알 이유가 없다. 그래서 BLOCKED 는 계약을 타지 않고 core 에서 끝난다.

같은 이유로 어휘도 core 에 두지 않는다. 주석과 백오피스 문구를 "기본 수단 / 적극적인 수단"으로 올리고, 무엇을 쓸지는 추출 모듈이 정한다는 사실까지만 남겼다. 타입·필드·스키마·계약에는 원래 수단 이름이 없었고, 이번에 걷어낸 것은 전부 주석과 운영자 대면 문구다.

최적화는 뺀다

"어떻게 가져오나"(HEADLESS_FIRST)는 최적화였고, 불완전 승격이 들어온 뒤로는 정책 없이도 같은 결과에 도달해 값을 넣을 유인이 사라졌다. 축에서 제거하고 필요해지면 별도 컬럼으로 되살린다. 성격이 다른 것을 한 축에 넣지 않는다.

차단은 출구 한 곳에서

BLOCKED 검사를 extractor 로 나가는 유일한 출구에 뒀다. 등록 경계만 막던 종전 구조는 차단 지정 이전에 담긴 아이템의 재파싱·새로고침이 그대로 나갔다. "거부 의사를 확인한 곳에 매번 다시 두드리지 않는다"는 계약이라 성능 판단이 아니다.

허락에는 근거를

ALLOWED 는 적극적인 수단을 여는 값이라 근거(permissionRef) 없이는 켤 수 없다. 입력 경계와 엔티티 불변식 양쪽에서 막는다.

이관하지 않고 새로 만든다

같은 HEADLESS_FIRST 라도 kream 은 차단이고 store.kakao 는 차단이 아니라 기계적 매핑이 성립하지 않는다. 시드도 두지 않는다. 근거 없이 채우면 좀비 행이 생긴 경로를 그대로 반복한다. 쿠팡·네이버 등은 당분간 실패로 흐르지만 그건 "아직 판단하지 않았다"의 정직한 반영이고, 판단이 서면 백오피스에서 넣는다.

축 교체 후 남은 잔재 정리

어휘를 걷다 보니 앞 커밋이 놓친 자리가 함께 나왔다.

  • 삭제된 클래스를 가리키던 주석 15곳(ExtractionRoutingPolicy · ExtractionPlatformPolicyEntity)
  • 옛 정책 값 이름 5곳(UNSUPPORTED 정책 후보BLOCKED 정책 후보)
  • 필드명 extractionRoutingPolicyaccessPolicy. 타입은 이미 DomainAccessPolicy 인데 이름만 옛 축을 가리키고 있었다
  • 3열 시절의 죽은 CSS(rowspan 병합 규칙, 제거된 허가 체크박스 스타일)
  • 코드와 어긋난 주석. 추가 폼 기본값은 BLOCKED 인데 주석은 "기본값이 SUPPORTED 인 이유"를 설명하고 있었다. 값이 둘뿐이라 "아무것도 안 바꾸는 값"이 없고, 되돌리기 쉬운 쪽을 기본에 둔다는 근거로 다시 썼다

Result


연관 이슈

- 옛 route 3값(SUPPORTED·HEADLESS_FIRST·UNSUPPORTED)과 허가 boolean 은 서로 다른 질문(등록을 받나 / 어떻게 가져오나 / 실측했나 / 브라우저를 써도 되나)에 한 축으로 답하고 있었다. 그래서 '허가 없는 HEADLESS_FIRST' 같은 모순 조합이 DB 에 저장 가능했고 실제로 dev 에 좀비 행 3개가 있었다
- 축을 하나로 좁힌다: DomainAccess { ALLOWED, BLOCKED }. 행이 없으면 기본 흐름이라 정책 테이블은 예외만 담고, 두 값 모두 실제 동작을 가져 기록 전용 값이 사라진다. 모순 조합은 표현 자체가 불가능해진다
- '어떻게 가져오나'(HEADLESS_FIRST)는 최적화였고 불완전 승격이 들어온 뒤로는 정책 없이도 같은 결과에 도달해 값을 넣을 유인이 사라졌다. 축에서 제거하고, 필요해지면 별도 컬럼으로 되살린다(성격이 다른 것을 한 축에 넣지 않는다)
- BLOCKED 검사를 extractor 로 나가는 유일한 출구(HttpProductLinkExtractor)에 둔다. 등록 경계만 막던 종전 구조는 차단 지정 이전에 담긴 아이템의 재파싱·새로고침이 그대로 나갔다 - '거부 의사를 확인한 곳에 매번 다시 두드리지 않는다'는 계약이라 성능 판단이 아니다
- ALLOWED 는 '플랫폼의 명시적 허락을 받았다'는 뜻이고 그 결과로 렌더 서비스의 우회 수단이 열린다. 근거(permissionRef) 없이는 켤 수 없게 입력 경계와 엔티티 불변식 양쪽에서 막는다
- 테이블을 이관하지 않고 새로 만든다. 같은 HEADLESS_FIRST 라도 kream 은 차단이고 store.kakao 는 차단이 아니라 기계적 매핑이 성립하지 않는다. 시드도 두지 않는다 - 근거 없이 채우면 좀비 행이 생긴 경로를 그대로 반복한다
- 백오피스 3열을 2열로 개편하고 값 이름이 그대로 박혀 있던 CSS 클래스까지 함께 고친다. 허가 체크박스는 ALLOWED 값에 흡수됐다
- 옛 테이블은 이 마이그레이션에서 지우지 않는다. 코드가 참조를 끊은 배포가 한 바퀴 돈 뒤 별도 마이그레이션으로 제거한다(blue-green 공존 구간에서 구버전이 아직 읽는다)
@m-a-king m-a-king added the feat 외부 가시적 새 기능 label Aug 16, 2026
@m-a-king m-a-king self-assigned this Aug 16, 2026
@coderabbitai

coderabbitai Bot commented Aug 16, 2026

Copy link
Copy Markdown

Important

Review available on request

  • 🔍 Trigger review

Reviews should be triggered manually for repositories with fewer than 10 stars. Select Trigger review above or comment @coderabbitai review to review the latest changes. For a full review, comment @coderabbitai full review.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yml

Review profile: CHILL

Plan: Pro Plus

Run ID: 4088a322-7073-43e5-94fb-a6b912bcfab6


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions

Copy link
Copy Markdown

Discord 스레드 연동용 메타데이터입니다. discord-pr-bot 워크플로가 자동 생성하며, 수정·삭제하면 PR 과 Discord 알림 연동이 끊깁니다.

m-a-king and others added 2 commits August 17, 2026 00:09
- core 가 아는 것은 "이 도메인이 허락을 받았는가" 하나여야 하는데, 주석과 백오피스 문구가 "우회 수단(지문 보정·프록시)", "정적 fetch → 안 되면 브라우저" 처럼 렌더 모듈의 구현을 서술하고 있었다. 수단이 바뀌면 core 쪽 서술만 조용히 낡으므로 "기본 수단 / 적극적인 수단" 으로 올리고, 무엇을 쓸지는 추출 모듈이 정한다는 사실까지만 남긴다
- 타입·필드·스키마·계약에는 원래 수단 어휘가 없었다. 이번에 걷어낸 것은 전부 주석과 운영자 대면 문구다
- 백오피스 정책 설명은 문장을 개조식으로 풀었다 — 한 항목이 한 사실을 져야 갈래끼리 세로로 훑어 비교된다
- 축 교체 후 남아 있던 잔재를 함께 정리했다: 삭제된 클래스를 가리키던 주석(ExtractionRoutingPolicy · ExtractionPlatformPolicyEntity), 옛 정책 값 이름(UNSUPPORTED 정책 후보 → BLOCKED), 화면 제목의 "추출 라우팅 정책" → "도메인 접근 정책"
- 필드명 extractionRoutingPolicy 를 accessPolicy 로 바꿨다. 타입은 이미 DomainAccessPolicy 인데 이름만 옛 축을 가리키고 있었다
- 3열 시절의 죽은 CSS(rowspan 병합 규칙, 제거된 허가 체크박스의 .check·.badge.allowed·.badge.denied)를 지웠다
- 코드와 어긋나 있던 주석도 정정했다. 추가 폼 기본값이 BLOCKED 인데 주석은 "기본값이 SUPPORTED 인 이유" 를 설명하고 있었다 — 값이 둘뿐이라 "아무것도 안 바꾸는 값" 이 없고, 되돌리기 쉬운 쪽을 기본에 둔다는 근거로 다시 썼다
@m-a-king
m-a-king merged commit 06026c3 into dev Aug 16, 2026
7 checks passed
@m-a-king
m-a-king deleted the feat/domain-access-policy branch August 16, 2026 15:40
m-a-king added a commit that referenced this pull request Aug 19, 2026
- 단계 배포(add → 양쪽 공존 → drop)의 마지막 단계다. #955 에서 새 테이블을 만들고 코드 참조를 전부 끊었지만, blue-green 공존 구간의 구버전 인스턴스가 부팅 때 이 테이블을 읽어(@PostConstruct findAll) 그때는 남겨 뒀다. 그 배포가 dev·prod 를 한 바퀴 돌아 이제 지운다
- 행을 옮기지 않는다. 옛 route 3값은 새 축으로 기계적 매핑이 성립하지 않아(같은 HEADLESS_FIRST 라도 kream 은 차단, store.kakao 는 아님) 새 테이블을 비운 채 시작했고, 여기서 되살릴 근거도 없다. reason 에 남아 있던 실측 메모를 보존할지 물었으나 새로 가는 쪽으로 결정했다
- 별도 테스트는 두지 않는다. 통합 테스트가 빈 DB 에 전체 마이그레이션을 새로 적용하므로 이 DROP 의 순서·성립 여부가 그 실행으로 검증된다
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

feat 외부 가시적 새 기능

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants