본문 바로가기

소프트웨어 이야기/장고와 루비온레일즈

레일즈 엔진 (Rails Engine)

레일즈 애플리케이션 프로젝트가 여러개 있을 때, 공통으로 사용하는 함수나 상수가 있으면 ruby gem을 사용하면 된다.


그런데 

공통으로 사용하는 view가 여러개 있으면 어떻게 할까?

공통으로 사용하는 함수가 Model이라면?

공통으로 사용하는 함수가 레일즈를 기반으로한다면?


이럴 때는 Gem으로 공통 라이브러리를 관리하기에는 한계가 있다.


이런 상황에 필요한 레일즈 기능은 Engine이다.


처음에 레일즈 Engine을 알게된 배경은, 리멤버의 블로그를 통해서였다.

리멤버 개발 블로그 - Rails Engine을 이용한 Zeus 프로젝트 


레일즈 엔진은 레일즈를 모듈처럼 쪼개놓은 것 같은 느낌이다.

내가 만들고 있는 레일즈 애플리케이션에 엔진을 끼워넣는 느낌으로 사용하는거다.

- 공통적으로 사용하는 컨트롤러를 만들 수 있다. 

   여러 프로젝트에서 공통적으로 사용되는 Controller를 만들었다면, route.rb에 엔진의 API를 마운트해서 사용할 수도 있다.

- 마이그레이트 파일을 engine에 넣을 수도 있다. 

   단, 엔진마다 붙는 DB를 다르게 설정하는건 불가능하다. ( 가능은 하겠지만, 이건 좀 부적절하게 사용하는거다 )

-  공통적으로 사용하는 모델을 만들 수 있다.


엔진은 레일즈 애플리케이션 프로젝트 파일을 새로 만들듯이, 만들 수 있다.


$ rails plugin new blorgh --mountable


이렇게 명령문을 치면, 아래 처럼 파일들이 생성된다. 레일즈 애플리케이션 프로젝트를 만드는 것처럼 생겼다.

레일즈 엔진 안에서도 독립적으로 테스트코드를 만들 수도 있다. 

레일즈 어플리케이션의 시작인 Rails::Application도 사실은 레일즈 엔진이다.

인증으로 유명한 gem인 devise도 엔진을 기반으로 만들어져있다.


사용법을 포스팅하기는 귀찮아서, 참고할만한 슬라이드쉐어를 첨부한다.