태그 커스텀 필드?

Tags에 ActivityPub 지원을 어떻게 가장 잘 추가할지 계획하고 있습니다. 즉, Tags가 ActivityPub 액터로 기능할 수 있도록 하는 것입니다. ActivityPub 지원이 필요한 모델에는 레코드별 맞춤 저장소가 필요합니다. 이를 위한 방법 중 하나는 커스텀 필드를 사용하는 것입니다. 예를 들어 다음과 같습니다.

같은 결과를 얻을 수 있는 다른 방법들도 있지만, 커스텀 필드가 아마도 가장 직관적이고, ActivityPub 플러그인뿐 아니라 Discourse 자체의 데이터 모델과도 가장 일관성이 있을 것입니다.

따라서 먼저 discourse/discourse에 PR을 만들어 Tags에 CustomField 지원을 추가할 수 있는지에 대한 의견을 들어보고자 합니다.

cc @pmusaraj

이 문제에 대한 PR을 작성했습니다. 태그 목록 직렬화도, 정보 편집(즉, 태그 정보 UI)도 필요하지 않으므로, 이는 가능한 가장 기본적인 구현입니다:

@sam 이 부분에 대해 어떻게 생각하시나요? 저희는 이미 꽤 오래전부터 내부적으로 커스텀 필드 사용을 자제해 왔기 때문에, 태그용으로 이 기능을 개방하는 것에 대해 크게 열려 있지 않습니다.

아니, 솔직히 저는 기본적으로 반대합니다. 이렇게 하면 나중에 너무 많은 고통과 번거로움이 생기기 때문입니다.

@angus 왜 여기 새 테이블을 만들고 tag_id 컬럼을 추가하지 않나요?

네, 할 수 있었어요.

커스텀 필드의 매력이 미리 정의된 통합 구조, 예를 들어 플러그인 레지스트리와 플러그인 API를 갖추고 있다는 점인 것 같아요. 제 관점에서 보면, 코어 모델과 안정적으로 통합하는 것이 커스텀 통합을 직접 만드는 것보다 훨씬 나을 거예요.

커스텀 필드에 대해 말씀하신 내용은 이해합니다. 제 생각에는 그런 문제들이 존재하는 것은 어쩔 수 없는 것 같아요. 태그 커스텀 필드가 있든 없든 그 점은 변하지 않을 거예요.

하지만 다른 옵션들도 있으니, 본인이 판단하셔서 선택하시면 될 것 같아요 :+1:

시간이 지남에 따라 커스텀 필드의 문제는 유연성이 지나치게 커서, 사람들이 거대한 복잡한 구조를 하나의 blob에 저장하려는 경향이 생겼다는 것입니다.

이 작업을 수행하는 방법에 대한 일종의 “공식적인” 매핑을 원하시는 마음을 충분히 이해합니다.

자, 질문을 되돌려 드리자면… 정확히 어떤 것을 이야기하고 계신 건가요?

  • 디스커스가 태그를 표시할 때마다 특별한 무언가를 표시해야 합니까? (태그가 표시되는 곳이 매우 많기 때문에 최적화하기가 매우 까다로운 문제입니다)
  • 단순히 태그 페이지에만 해당하나요?
  • 관리자가 설정하는 백그라운드 태스크에만 해당하나요?

자, 거기서부터 시작해 보죠? 정확히 무엇을 하시고 싶으신가요? 다양한 사용자는 무엇을 보게 되나요? 등등…

태그가 ActivityPub 액터 역할을 수행하도록, 태그와 연관된 ActivityPub 데이터를 저장할 예정입니다. discourse/discourse 클라이언트의 어떤 부분에도 직렬화가 필요하지 않습니다. 사용자는 일반적인 discourse/discourse 클라이언트의 어느 부분에서도 이 데이터를 볼 수 없습니다. 관리 클라이언트로의 직렬화는 다른 데이터와 함께 이루어지지만, 이는 플러그인이 전담하는 전용 플러그인 관리 라우트에서 관리됩니다. 말씀하신 대로 기존 discourse/discourse 태그 라우트(또는 사이트 직렬화기)에서의 직렬화는 여러 가지 이유로 까다로울 수 있으며, 저는 이를 시도하고 싶지 않으므로 preload나 editable API 메서드를 추가하지 않았습니다.

안정적인 API를 활용할 수 있다는 장점 외에도, ActivityPub 플러그인에서 이러한 방식이 선호되는 이유는 플러그인이 ActivityPub 활동을 별도의 데이터 모델 세트인 discourse_activity_pub_* 테이블에 저장하고, 이는 정의된 플러그인 API와 핵심 모델의 커스텀 필드를 통해 discourse/discourse와 통합되기 때문입니다. 여기에는 Discourse와 ActivityPub 데이터 간의 관심사 분리를 적절히 보장하기 위한 의도적인 중복이 존재합니다. Discourse와 ActivityPub는 서로 연관되어 있지만 서로 다른 개념과 데이터 모델을 가지고 있으므로, 크고 복잡한 플러그인에서 일정 수준의 명확성(그리고 건전성)을 유지하려면 ActivityPub 데이터와 discourse/discourse 데이터 간의 명확한 구분이 필요합니다. 커스텀 필드를 통합 지점으로 사용하는 것은 이러한 분리를 깔끔하고 안정적으로 유지하는 데 매우 유용합니다.

이에 대한 간단한 설명은 플러그인의 readme에 나와 있습니다.

이 질문에 대해 다시 한번 올려봅니다.

@angus님, 지연되어 죄송합니다. ActivityPub에 태그 커스텀 필드 없이 태그 지원 기능을 추가할 수 있을까요?

현재 카테고리에서 사용하고 있는 데이터 모델과 일관성이 없다는 점은 알고 있지만, 저희가 선호하는 접근 방식입니다. 코어에 태그용 커스텀 필드 지원 기능을 추가하면 코어에서 태그에 대한 전체적인 지원 기능을 열게 되며, PR에 해당 기능이 포함되지 않았다는 점은 알지만, 다음 개발자가 그 문을 조금 더 열게 만드는 계기가 될 것입니다.

괜찮아요, 배려해 주셔서 감사합니다. 다른 방법을 찾아볼게요.