디스코urs 플러그인과 Rails 초기화 프로그램(Initializers)에 대해 간단한 질문이 있습니다.
디스코urs 플러그인에 "config"라는 이름의 디렉터리가 있고, 그 아래 "initializers"라는 하위 디렉터리가 있을 때, 디스코urs Rails 앱이 Rails 6에서처럼 “initializers” 디렉터리 아래에 있는 모든 플러그인 초기화 파일들을 읽어드리는지 궁금합니다.
이렇게 질문하는 이유는, 현재 클라이언트를 위해 순수 Rails 6 애플리케이션(EmberJS나 기타 JS 프레임워크 없이)을 처음부터 작성하고 있는 중인데, 초기화 프로그램 디렉터리 아래에 다음과 같은 구조의 디렉터리가 있기 때문입니다:
./config/initializers/client/
… 그리고 클라이언트 고유의 모든 초기화 프로그램은 “client” 하위 디렉터리에 있습니다.
Rails 6는 표준 초기화 프로그램 디렉터리 아래에 있는 모든 파일(하위 디렉터리 포함)을 읽기 때문에, 유사한 초기화 프로그램 디렉터리 구조를 가진 디스코urs 플러그인도 Rails 6처럼 동작하여 플러그인 내의 모든 초기화 프로그램을 다음과 같은 방식으로 읽어드리는지 궁금합니다:
P.S. GitHub에서 약 10개의 디스코urs 플러그인을 살펴봤는데, 확인한 플러그인 중 config 디렉터리 아래에 초기화 프로그램이 있는 것은 없었습니다. 그래서 이 질문을 게시하게 되었습니다 (현재 제 Rails 개발 환경은 디스코urs가 아닌 클라이언트용으로 설정되어 있습니다).
네, 요즘 그 Rails 가이드를 자주 읽고 있습니다. 기본적으로 Rails 6의 설정 방식에는 "괜찮다"고 생각합니다(아직 학습 중이지만, 매일 조금씩 더 익숙해지고 있습니다).
다만, Discourse 플러그인(초기화 파일)에서도 동일한 구조를 사용할 수 있는지 궁금합니다. Rails 6처럼 서브디렉터리의 초기화 파일도 Rails가 읽어들이는지, 아니면 plugin.rb에서 플러그인 초기화 파일 디렉터리를 설정 “자산(asset)”(더 좋은 표현이 없어서 이렇게 표현합니다)으로 등록해야 하는지요.
질문을 드린 이유는 현재 기업용 대규모 Rails 6 애플리케이션을 개발 중인데, 수십 년간 사용되어 온 레거시 백오피스 스크립트를 Rails 애플리케이션으로 전환하는 작업을 하고 있기 때문입니다. 초기화자를 추가하기 위해 config/initializers (Rails) 아래에 하위 디렉터리를 만들고, 모든 초기화자 파일을 포함시키기 위해 별도의 코드를 작성할 필요 없이 깔끔하게 포함됩니다.
yml 파일 변경 사항에 대한 라이브 리로딩을 조사해 보았는데, 실제로 작동합니다. 플러그인이 reloadable_patch를 올바르게 사용하지 않으면 이 라이브 리로딩이 깨질 수 있지만, 모든 플러그인이 안전하게 리로드될 수 있도록 하면 yml 변경 사항도 함께 리로드됩니다.
Rails에서는 모든 초기화자(initializer)가 Rails가 시작될 때만 로드되므로, 초기화자에 기반하여 코드를 실행하는 플러그인(예: “after_initializer”)은 Rails가 시작되거나 재시작될 때만 실행됩니다(잘못된 부분이 있다면 지적해 주세요).
이 주제에 익숙한 이유는 현재 클라이언트를 위해 Rails 애플리케이션을 개발 중이며, 다양한 작업(불리언 값, 정적 배열 등)을 위해 수많은 초기화자를 작성했기 때문입니다. 각 경우에서 Rails 초기화자의 코드를 변경하면, 초기화자의 새 값을 Rails 애플리케이션에 반영하려면 Rails를 재시작(“개발 환경에서는 Control c, rails s”)해야 합니다.
잘못된 부분이 있다면 꼭 지적해 주세요! 감사합니다.
때로는 “Discourse가 이렇게 한다” 또는 "Discourse가 저렇게 한다"라고 쓸 때, 실제로 설명하려는 것이 Discourse 자체와는 무관한 Rails의 핵심 기능이나 속성인 경우가 있습니다. 이는 주로 Rails 애플리케이션 전반이 아닌 Discourse 플러그인 개발에 집중하는 개발자, 특히 Discourse 플러그인 개발자에게는 다소 혼란을 줄 수 있습니다.
Rails 6는 config/initializers 디렉터리(및 모든 config/initializers 하위 디렉터리)의 모든 파일을 오직 Rails가 시작될 때만 읽습니다. 마찬가지로(플러그인에 대해서는 100% 확신은 없으나) after_initialize에 의존하는 코드가 포함된 Discourse 플러그인은 Rails 부팅 프로세스의 근본적인 속성인 관계로, Rails가 시작되거나 재시작될 때만 Rails 애플리케이션에 의해 로드됩니다(확인해 주실 분 계신가요?).
제 추측으로는 여기에서 Rails를 다루는 분들은 이미 이 사실을 알고 있을 것입니다. 저는 이러한 세부 사항들을 이제 막 알게 되고 있으며(전문가가 되기까지는 아직 갈 길이 멀다고 느낍니다), 요즘 매일 Rails 애플리케이션 작업을 하고 있기 때문입니다. 참고로, LAMP 개발 배경에서 온 저로서는 Rails가 훨씬 더 낫다(작업하기 쉽고 재미있다)고 생각하여, 10년 전에 Rails를 시작했으면 좋았을 것이라 생각합니다.
올해 저는 Rails의 열렬한 팬이 되었으며, 저를 그 길로 이끌어 준 Discourse에 매우 감사드립니다.
다시 한번, 잘못된 부분이 있다면 지적해 주세요! 감사합니다. 저는 Rails에 대해 더 전문적으로 되고자 노력하고 있습니다.