커뮤니티

한동안 눈팅만 하다가 오랫만에 글을 써 봅니다.

깃허브 이슈에 쓰려다가 안그래도 공홈에 약간의 논쟁(?)이 있었으니, 이 참에... 

 

라이믹스 작업을 하면서 느꼈던 제일 큰 아쉬운 점은

관리자 페이지를 구축하기가 너무 까다롭다는겁니다.

 

UI의 미적인 요소 뿐 아니라 DX 측면에서도 삭아버렸어요. 라이믹스가 사전 정의한 클래스, 라이믹스 내장 모듈들이 사용하고 있는 UX 컨벤션들이 깔끔히 정리되지 않아

(설령 AI가 대신 해주더라도) 매번 내장 모듈의 것을 뒤적이며 작성해야 하는 상황이 반복됩니다.

 

이에 관리자 페이지의 표준화 및 정규화가 필요하다고 생각합니다.

 

가깝게는 이미 구현되어 있는 관리자 페이지 컴포넌트들의 지침과 문서를 작성하는 것일테고,

좀 더 나아가서는 컴포넌트화를 하거나, 아예 새로운 방식으로 선언하는 방법이 있겠네요.

 

컴포넌트화는 이미 어느정도의 준비가 되어 있죠.

blade 템플릿 엔진의 include 지시자를 사용하여 유사 컴포넌트를 구현할 수 있습니다. 파라미터 정보를 깔끔하게 제공하긴 힘들겠지만, 파일 최상단에 주석을 달아두는 정도로 대체해 볼 수 있겠습니다.

 

composer를 이용해서 버전 관리도 나름 가능하겠네요.

blade 파일 묶음을 컴포저 패키지로 배포하면, 각 모듈 개발자들은 해당 패키지를 설치해 사용하는 형태로요.

라이믹스 코어 버전에 따라 없는 컴포넌트를 사용하게 되는 문제에서도 자유로워집니다.

 

(각 모듈이 각자의 vendor 폴더를 가지는 것을 권장하니, 각자 충돌없이 자신이 원하는 버전의 컴포넌트를 끌어올 수 있습니다.)

 

새로운 방식으로 선언하는 것은... 음. 애드온이나 레이아웃이 사용하는 info.xml을 일부 채용하는 방향입니다.

자유도 측면에서 많은 제약이 있을거라, 크게 선호하지도 않고, 라이믹스 측에서 그리 반기는 선택지도 아니겠지만...

 

여러 개발자분들이 공개하신 대시보드 모듈, 부관리자 모듈 등 관리자 페이지를 커스터마이징 하는 모듈들에서 손쉽게 끼어들어 디자인을 변경하거나, 권한을 제어하는 등의 기능을 좀 더 안전하게 구현할 수 있다는 장점이 있습니다.

 

개인적으로 select 라는 백오피스 제품을 흥미롭게 봤습니다. 나름의 자유도를 챙기면서도 관리자 페이지를 쉽고 빠르게 구성할 수 있어서, 라이믹스에서도 유사한 컨셉을 고민해볼 수 있지 않을까 싶습니다.

 

--- 

 

이 새벽에 글 쓰다 보니 머리도 아프고 정신도 몽롱해져서... 일단은 어중간한 글로 마무리합니다. 이따 정신 말짱할 때 조금 더 다듬어 수정할게요ㅎㅎㅠ

네모 Lv. 5

댓글 11

  • 두 가지 이슈가 섞여 있는 것 같습니다.

     

    첫째는 현재(v2.1) 관리자 화면이 오래된 버전의 부트스트랩 기준으로 만들어진 것이다 보니, HTML 마크업과 눈에 보이는 디자인 양쪽 모두 아주 구리다는 점입니다. 좀더 모던한 디자인 시스템, 깔끔한 마크업을 사용하는 새로운 표준 컴포넌트들을 마련할 필요가 있습니다. 여기에 대해서는 100% 동의합니다. 이견의 여지가 없죠.^^

     

    둘째는 이런 컴포넌트들을 제공하고 활용하는 방법입니다. 언급하신 예시들을 보면 "관리자 화면 작성의 편의성"을 넘어서서 "관리자 화면 커스터마이징"(내 모듈의 설정 화면뿐 아니라 남의 모듈이나 코어 영역, 즉 대시보드 전체에 내 디자인을 일괄 적용하려는 니즈)까지 생각하고 계신 듯 한데, 여기에 대해서는 의문이 있습니다. 전자에는 분명 도움이 되겠지만, 후자는 "표준화"라는 작업의 특성상 오히려 된서리를 맞을 수도 있거든요.

     

    클라이언트의 요구나 자사 상품 홍보 등 여러 가지 이유로 남의 모듈 화면까지 커스터마이징하려는 시도가 종종 일어나는데, 그런 니즈를 공식적으로 지원한다고 너무 복잡하게  pluggable한 구조를 만들어 놓으면 절대 다수의 일반 사용자와 제작자가 불편해질 수 있습니다. 예를 들어 게시판의 "추가 설정" 화면처럼 여러 모듈이 개입하는 화면에 각각 다른 디자인 시스템을 들고 오도록 허용한다면 난장판이 되겠지요. 표준을 벗어나는 영역은 비공식으로 놔두는 것이 어떨지...

     

    (물론 .x_control-group 같은 기존 구조를 사용하는 자료들이 하루 아침에 깨져 버리면 곤란할 테니, 기존의 CSS 클래스에도 일관성있는 스타일을 적용해 주는 작업 역시 필요합니다. 새로운 디자인까지는 모두들 좋다고 덤비는데, 하위 호환성 보장 얘기가 나오면 부리나케 도망갑니다. 하위 호환성 챌린지를 즐기는 저 같은 변태는 흔하지 않은지라...)

  • @기진곰

    "애드온이나 레이아웃이 사용하는 info.xml을 일부 채용하는 방향"에 대한 코멘트라고 이해하고 답변드리자면,

    아예 별개의 관리자 페이지용 클래스 등을 제공하여 구조화된 데이터만으로 관리자 페이지를 구성할 수 있도록 하기-의 의미였습니다.

     

    ```

    // AdminController.php

    class AdminController extends Module {

        public function dispDummyAdmin() {

            return ModuleAdminModel::buildNewAdmin(__DIR__ . '/admin.yaml');

        }

    }

     

    // admin.yaml

    menus:

    - path: appuser

       name: 유저 조회

    - path: appuser/{{id}}

       name: 유저 상세

       placement: page-only

    pages:

    - path: appuser

       class: container

       blocks:

          - type: markdown

            content: |

                https://www.selectfromuser.com/ 의 문법을 그대로 작성해봄.

                라이믹스의 컨셉에 맞게 적절한 선을 찾아야 할 것.

    ```

     

    위 코드처럼 관리자 페이지를 선언하는 세팅파일만 작성하면 라이믹스가 알아서 관리자 페이지를 만들어주는... 뭐 그런 느낌으로요.

     

    관리자 페이지 구성의 자율성은 많이 떨어지겠지만,

    통일성있는 UI/UX를 제공해줄 수 있고, 서드파티는 특정 메뉴, 페이지, 블럭에 안전하게 끼어들 수 있겠지요.

     

    ```

    function triggerBeforeRenderNewAdmin ($obj) {

      if ($obj->page->path !== '/board/additional-config-blah') {

        return;

      }

      $obj->page->blocks[] = (object) [

        'type' => 'block',

        'content' => [ ... ]

      ];

    }

    ```

    같은 식으로 언급하신 게시판의 추가 설정 화면에 통일성있는 디자인으로 새로운 내용을 추가해줄 수도 있는거죠.

  • @네모

    위 댓글은 일단 info.xml (또는 yaml)을 활용하자는 제안과는 관련이 없고, Blade 컴포넌트를 composer로 설치해서 쓴다는 제안에 대한 코멘트였습니다. 자유도가 높아지는 만큼 파편화가 심해질 수 있고, 폼 관련 컴포넌트야 어차피 뻔하다 보니 서로 유사한 컴포넌트를 각자 수정해서 쓰다가 충돌할 가능성도 높아집니다.

     

    물론 서드파티 자료가 커스텀 디자인을 사용하겠다는 것을 막을 수도 없고 막아서도 안 되겠지만, 굳이 코어에서 "각자 쓰고 싶은 컴포넌트 들고 와"을 권장하는 듯한 구조를 택할 필요는 없다는 거죠. 제작자분들이 믿고 쓸 수 있는 디폴트가 코어에 포함되어 있어야 하고, 그것을 어떤 문법으로 끌어다 쓰느냐는 다른 문제입니다.

  • @기진곰

    컴포넌트화 기능 제안은 커스터마이징을 고려하지 않은 제안이었습니다.

    커스터마이징은 info.xml 을 도입했을 때에만 기대할 수 있는 장점...

    컴포넌트: 6-8문단만 / info.xml: 9-11문단만으로 분리해 별개의 다른 방향성으로 인지하고 읽어주시면 되겠습니다.

     

    이 밑으로는 info.xml과 외부 조작 관련 내용은 완전히 배제하겠습니다.

     

    ---

     

    컴포저 패키지를 이야기한 이유는, 오히려 코어 버전이 올라 관리자 페이지의 UI가 완전히 변하더라도 하위 호환성을 지킬 수 있는 방향이 되지 않을까 해서였습니다. 서드파티들이 패키지를 이리저리 만들어 커스터마이징하는 목적보다는, 공식 컴포넌트를 별도의 패키지로 분리하자는게 주 논지에요.

     

    1. 코어 CSS에 영향을 받지 않는 새로운 클래스 체계를 도입해 독립적으로 작동할 수 있는 공식 컴포넌트를 제작

    2. CI/CD를 사용해 자동으로 클래스명에 버전 prefix를 붙여 packagist 배포

    3. 사용자는 원하는 버전의 패키지 rhymix/admin-component@2.2.0를 설치해 사용

    4. 이후 라이믹스 3.0 버전이 관리자 페이지가 부트스트랩이 아닌 블라블라UI 기반으로 변경한다 하더라도, 사용자는 독립적으로 작동하는 2.2.0 패키지를 설치해 사용하고 있으므로, 화면이 깨지지 않음

    5. 또 사용자가 rhymix/admin-component@3.0.0을 설치해 사용하더라도, 마찬가지로 독립적으로 작동하므로 2.2.0에서도 깨지지 않고 출력됨

     

    코어에 남는 레거시는 지금까지의 것으로 한정하고,

    이후 추가 도입될 것들은 별도 패키지로 분리해 코어를 깔끔하게 유지하면서도 하위/상위 호환성을 보장할 수 있다는 것이죠.

     

    물론 이렇게 되면 확실히 "믿고 쓸 수 있는 디폴트가 코어에 포함"되지 않는다는 문제가 존재하고,

    또, 같은 CSS 파일을 여러번 컴파일 하는 등 성능 상 문제가 존재하겠지만...

     

    믿고 쓸 수 있는 디폴트를 코어에 포함시키는 만큼

    코어의 프론트엔드 파일들이 점점 비대해지거나, 하위 호환성 때문에 관리자 페이지의 개편이 한도 끝도 없이 미뤄질 수 밖에 없지 않을까 싶습니다.

     

    또, 같은 CSS 파일을 여러번 컴파일하는 문제는

    같은 해시의 파일은 경로가 다르더라도 여러번 컴파일 하지 않도록 하거나, 별도의 버전별 에셋 관리 클래스를 하나 둬서 해당 클래스가 에셋을 불러오도록 처리하면 회피할 수 있을거구요.

  • @네모

    아, 저는 컴포넌트는 무한 커스터마이징이 가능하고 info.xml과 유사한 방식이 오히려 자유도를 낮추는 것이라고 이해했는데, 네모님은 정반대로 생각하고 계셨군요.

     

    라이믹스 3.0이나 4.0에서 일부 모듈만 2.2 버전의 관리자 화면 스타일로 박제되어 있는 것을 원하는 분이 얼마나 될지 모르겠습니다. 라이믹스 생태계는 한 번 만들어 놓고 수 년간 방치하는 자료가 대부분이고, 웬만하면 그렇게 방치해도 괜찮다는 것이 라이믹스의 장점 중 하나이다 보니 ㅋㅋ 실제로 일어날 가능성이 매우 높은 시나리오입니다.

     

    만약 관리자 화면의 전반적인 UI/UX가 바뀐다면, 기존 모듈들의 관리자 화면도 (불가피한 사정이 없다면) 새 스타일에 어울리는 모습으로 나오기를 기대하는 것이 더 상식적이고 일반적인 기대치 아닐까요?

  • 하위호환성은 중요하지만 점진적인 전환을 장기 계획으로 시작 할 수 있겠죠.

     

    관리페이지를 만들다보면 투박한 느낌을 지우기 쉽지않은건 물론이고, 서드파티가 내 모듈의 설정만 따로 꾸미려 추가 CSS를 끌어다쓰기도 번거롭고 굳이? 그런 느낌이 듭니다.

    그냥 투박한채로 두고 말죠.

    투박하다는 느낌보다도 UX 개선이 쉽지않은게 문제 같습니다.

     

     

    탈 jQuery, CSP, 비컴파일 같은 내용을 본 것 같습니다.

    React, Tailwind 등 개발자들이 선호하는 것들은 있지만 이런 기조에 적합하지 않아보이고, 부트스트랩의 버전업과 jQuery의 일부 목적의 대안으로 Alpinejs를 고려해볼 수 있을 것 같습니다.

    다만, 장기적으로 병행할 수 밖에 없고 부트스트랩 버전에 따른 차이와 더불어 라이믹스는 부트스트랩의 일부 컴포넌트 이름을 변경해 사용해왔기 때문에 골치아픈 문제는 있습니다.

     

    라이믹스와 최신버전의 부트스트랩 두 버전을 로드해 하위호환성을 유지하면서 작업을 시도해봤었고, 병행이 가능한 구조를 갖출 수는 있습니다.

    .x 클래스로 신/구 버전을 가르고 폼 UI 컴포넌트의 개선도 필요하는 등 많은 작업이 필요했습니다. 투박한 구 디자인이 더 구려질 수 있는 문제가 있어서 조금 더 다듬어 줄 필요도 있고요. 

     

    관리페이지의 UI, UX 개선은 언젠가는 이뤄져야할 부분이라고 생각합니다.

  • 관리페이지에 부트스트랩 두 개 버전을 로드하는 것으로 개조해 본 입장에서는 하위호환성 유지가 쉽지는 않지만 불가한 것은 아니었습니다.

     

    여타 다른 CSS 프레임워크는 라이믹스의 기조에 따라 비컴파일 또는 PHP로 작성된 SCSS 컴파일 엔진이 지원하는 문법 범위를 초과하기 때문에 적용이 적합해 보이진 않습니다.

     

    두 개의 부트스트랩을 로드하는 비효율적인 문제가 있지만 하위호환성을 최대한 살리면서 버전업은 가능한 범위였습니다.

    다만, ".x" 상위 클래스에 의존하거나 ".x_*" prefix를 가진 일부 클래스 보다는 모든 부트스트랩 클래스에 prefix를 사용하거나, 일반 유저페이지에서 설정화면을 제거하고 관리페이지 전용으로 옮기는 등의 조치는 필요해보였습니다.

     

     

    구/신 버전의 부트스트랩 구분은 ".rxadmin-*" 또는 ".rxadmin *"(예시) 같은 현재와 완전히 구분된 prefix를 사용하는 것이 스타일 충돌과 같은 문제를 쉽고 빠르게 피할 수 있는 방법으로 생각합니다. 

     

    일반 유저페이지에서 게시판 설정과 같은 설정 기능을 제공하는 것은 편리할 수 있겠지만 스타일이나 JS 충돌 가능성을 줄이는 방안으로 이를 제거하는 것이 나을 수 있습니다.

     

     

    비록 공개는 못했지만 시도해 본 경험으로는

    - 2개 버전의 부트스트랩 로드 및 하위호환성 유지는 불가능이 아님

    - 다만, 신버전의 부트스트랩은 모든 클래스에 prefix를 붙이는게 가장 쉽고 빠른 선택

     - 게시판 설정 등 관리페이지 CSS가 적용되어야할 부분은 제거하여 관리페이지에서만 가능하도록 제한하는 것이 현실적임

    - 기타 다른 CSS 프레임워크를 선택할 수도 있겠으나 tailwind 같은 사전 컴파일이 필요한 것은 대안으로 삼기 적합하지 않을 것으로 생각됨

    - jQuery의 대안으로 AlpineJS를 고려해보는 것도 추천

     

    라이믹스 v10이 나올때나 구버전 UI 리소스를 제거할 수 있을지도 모르겠지만, 개선과 대안은 필요하다고 느껴집니다.

    서드파티가 각자의 UI를 들고오면 난장판이 될 것이며, 라이믹스 자체에서 개선하는 것이 가장 현실적으로 보입니다. 

  • @kkigomi

    댓글을 몇 번에 나누어 쓰셔서, 가장 내용이 많은 곳에 답글 답니다.

     

    - 관리자 페이지에 완전히 새로운 UI/UX를 도입하더라도 .x_control-group .x_controls 같은 기존 클래스명을 사용하는 서드파티 모듈 설정 화면에도 최소한의 스타일은 입혀 주어야 하기 때문에, 부트스트랩이 아니더라도 해당 CSS 선택자들이 완전히 깨끗해지기는 어렵습니다. 기껏해야 "나는 그런 거 필요없으니 빼줘!"라고 선언할 수 있도록 해드리는 정도?

     

    - 이런 문제가 재발하는 것을 막기 위해, 관리자 모듈 리뉴얼시 어떤 버전의 부트스트랩도 사용하지 않을 생각입니다. 따라서 이미 있는 쓰레기만 prefix로 회피하시면 앞으로 또다른 문제가 생길 일은 없을 겁니다.

     

    - jQuery 대체 얘기는 왜 나온 건지 모르겠습니다. 무엇을 쓰든 jQuery를 대체하는 것이 아니라 추가로 도입하는 것이 됩니다. 전역 스코프에 `$` 변수 하나쯤 선언해 놓는다고 다른 라이브러리를 못 쓰는 것도 아니니, jQuery를 안 좋아하는 분은 그냥 무시하시면 되고요. (굳이 충돌나게 만든 AlpineJS가 오히려 유별난 듯)

     

    - 가능하면 어떤 프론트엔드 라이브러리라도 공식적으로 도입한다는 선언은 하지 않을 계획입니다. 한 번 도입해 놓으면 5년이고 10년이고 계속 가져가야 하는데.... 18년째 큰 변화 없이 잘 쓰고 있는 jQuery와 달리, 요즘은 18개월 지원이 LTS라고 주장하는 미친놈들이 넘쳐나니 믿을 수가 있어야죠.

     

    - 관리자 화면의 전체적인 틀을 깨지 않으면서 내 모듈 영역 안에서만은 모던하게 개발하고 싶다면 Svelte를 추천드립니다. 이 녀석은 화면 전체를 자기가 컨트롤해야 한다는 강박관념이 없어서, 원하는 영역에 빌드 파일을 인클루드하면 그 안에서 잘 놀더군요.

     

    - 하나의 서비스를 도맡아서 구축하는 전문 개발자분들의 니즈와, 여러 자료를 조합하여 홈페이지를 운영하는 일반 사용자분들의 니즈가 크게 다른 것을 느낍니다. 주로 전자가 최근 개발 트렌드에 적극적이신데, 후자를 고려하면 "하나의 개발팀이 서비스 전체를 컨트롤한다는 가정" 위에서 정립된 일반적인 개발 방법론과 거기에 맞추어 설계된 최근 툴들을 도입하기가 무척 힘들지요. 라이믹스의 숙명과도 같은 딜레마입니다.

  • @기진곰

    - 다른 부트스트랩 버전을 사용하지 않는다면 다른 대안을 생각하시는 것 같네요. 자체 컴포넌트 제작에 대한 내용도 어디선가 본 것 같기도 합니다.

     

    - jQuery는 좀 뜬금없을 수는 있지만 좀 넓게 생각해서 포함된 의견입니다. 탈 jQuery 의견을 봤던 것 같은데 기억이 정확하진 않아서 라이믹스가 아닌 다른 데서 봤던거랑 헷갈렸을 수도 있을 것 같네요.

    jQuery도 CSP 적용이 불가능한 것은 아니지만 탈 jQuery 와 CSP 이슈까지 포함한 의견이고, 일반 사용자페이지 보다 선제적으로 관리페이지에 적용하기에 좋을 것 같아서 포함한 의견입니다. 

  • @kkigomi

    jQuery 자체는 CSP와 아무 관련이 없습니다. CSP 적용시 일부 위험한 기능이나 오래된 플러그인이 막히는 것 뿐인데, 맹목적으로 jQuery를 혐오하는 부류들이 잘못된 정보를 퍼뜨리는 것 같아요.

     

    물론 라이믹스 입장에서는 인라인 스크립트로 떡칠해 놓은 서드파티 레이아웃, 스킨들에 비하면 이 정도는 문제 축에도 못 들지만요.

     

    최소한 순정 코어에서는 unsafe-inline 없이 CSP를 적용할 수 있도록 하는 것을 목표로, 인라인 스크립트 및 스타일 선언을 꾸준히 제거해 나가고 있습니다. v2.2 브랜치 기준으로 코어가 무조건 주입하는 HTML 헤더와 푸터에는 더이상 인라인 스크립트가 없고, 기본 레이아웃과 기본 관리자 화면도 손을 댈 일이 있을 때마다 정리하려고 합니다.

  • 모듈 등 서드파티에서 컴포저를 활용하는 것을 막고있지는 않지만 현실적으로 "기도메타"로 충돌이 없기를 바라는 방법 뿐입니다.

    UI 컴포넌트를 컴포저로 끌어다 쓰는 것은 현실적으로 어려워보입니다.

     

    자유도는 떨어지지만 라이믹스에서 개선된 UI, UX 리소스를 제공하고 그 범위에서 응용해 사용하는 것이 현실적으로 생각합니다.