시리얼라이저에서 include_* 메서드 오버라이드

@david 님, 안녕하세요.

이 비권장(deprecation) 처리에 대한 의도에 대해 간단한 질문이 있습니다.

비권장 공지: add_to_serializer를 사용하여 include_*? 메서드를 직접 오버라이드하지 마세요.

관련 컨텍스트: DEV: Improve add_to_serializer include_* options (#21220) · discourse/discourse@26b7f8a · GitHub

add_to_serializer 메서드의 표준 사용에서 include_condition 인자로 사용자들을 유도하려는 의도는 이해합니다. 즉, 직렬화기에 자체 메서드를 추가하는 경우를 말하죠.

하지만 플러그인이 직렬화기에 include_* 메서드를 추가하되, 해당 사례와 일치하지 않는 경우가 있습니다. 예를 들어, 자체 커스텀 속성이 포함되는지 여부를 결정하는 것이 아니라 코어 직렬화기의 include_* 메서드를 오버라이드하는 경우입니다.

예시: discourse-custom-wizard/plugin.rb at main · paviliondev/discourse-custom-wizard · GitHub

코어 메서드: discourse/app/serializers/site_serializer.rb at main · discourse/discourse · GitHub

해당 특정 사용 사례는 사이트 직렬화기 메서드를 오버라이드할 필요가 없도록 재설계할 수 있거나, 다른 방식으로 오버라이드를 달성할 수 있다는 점은 인정합니다. 하지만 add_to_serializer 메서드를 이러한 방식으로 사용하는 것에 본질적인 단점이 있는지, 그리고 이 비권장 처리가 해당 메서드의 이러한 사용 방식이 제거되는 결과로 이어질지 궁금합니다.

네, 제 추천도 그렇습니다.

최근 '플러그인 수정자(plugin modifiers)'라는 새로운 시스템을 도입했습니다. 이는 매우 비용이 낮은 확장 지점(extension points)으로, DiscourseEvent와 유사하지만 입력 값을 받아 값을 반환합니다. 따라서 귀하의 경우, 관련 include_ 메서드에 DiscoursePluginRegistry.apply_modifier 호출을 추가하는 코어 PR을 생성한 후, 플러그인에서 register_modifier를 사용하여 값을 오버라이드할 수 있습니다.

결국 이를 완전히 차단할 가능성이 높습니다, 네. 또한 로그에 비추천(deprecation) 알림을 출력하는 메서드를 사용하는 것은 정말로 피해야 합니다.

코어의 협조 없이 메서드를 오버라이드해야 한다면, modify_class가 더 나은 선택이 될 것입니다. add_to_serializer에 대한 전용 메서드가 있는 주된 이유는 플러그인이 활성화된 경우에만 적용되도록 include_* 메서드를 자동으로 정의하기 때문입니다.

즉, 귀하가 링크한 코드 스니펫은 현재 두 개의 메서드를 정의하고 있습니다. include_wizard_required?와 include_include_wizard_required? :sweat_smile:

해당 Readme에는 "스택(선입선출)으로 동작한다"라고 되어 있지만, 이는 큐(queue)입니다. 스택은 선입후출(LIFO) 구조입니다. (휴대전화에서 텍스트를 복사하는 방법조차 모르겠습니다.)

좋은 지적이네요. 네, 스택은 LIFO이고 큐는 FIFO입니다.

이 수정자의 주요 기능:

  • 스택 방식으로 동작 (먼저 등록되면 먼저 호출됨)
  • 플러그인이 비활성화되면 자동으로 비활성화됨
  • 모든 블록 호출의 누적 결과를 호출자에게 전달

이것은 '미들웨어 스택’에 더 가깝습니다: 순서대로 실행되는 메서드들의 집합으로, 각 메서드는 자신의 결과를 다음 메서드의 입력으로 전달합니다.

여기에 LIFO/FIFO 용어를 적용하려는 시도는 효과가 없을 것 같습니다: '스택’에 아무것도 추가되거나 제거되지 않으며, '출력(out)'이라는 개념 자체가 없기 때문입니다.

아. 그러면 스택 자료구조가 아니군요.

제가 1987년에 CS 학위를 받았을 때와 요즘 사람들이 배우는 것의 차이에 대해 뭔가 말하려던 참이었습니다. :joy:

내 문제는 대략 이렇습니다. 25년 넘게 컴퓨터와 함께 일해 왔는데, 최근 10년 가까이 컴퓨터를 거의 안 썼거든요. 그래서 마치 방대한 지식 베이스의 큰 부분이 빠져 있는 것 같은 느낌이에요.