티스토리 뷰

[Rails] Rails에서의 subdomain 설정하기


레일즈를 이용하여 Web API를 제작할 때 서브도메인을 이용하면 DNS 레벨에서 트래픽을 로드밸랜싱해줘 효율적입니다.


서브도메인 설정은 routes.rb 파일에서 설정해주시면 됩니다.


config/routes.rb

resources :users

resources :posts,        constraints: { subdomain: 'api' }

resources :comments,   constraints: { subdomain: 'api' }


이렇게 설정하면 다음과 같이 사용할 수 있습니다.

http://api.example.com/posts

http://api.examle.com/comments


여러 resources들이 서브도메인이 필요한 경우 아래와 같이 묶어줄 수 있습니다.


config/routes.rb

resources :users


constraints subdomain: 'api' do

resources :posts

resources :comments

end


이는 첫번째에서 설정해준 것도 똑같은 효과를 가져다 줍니다.


다음으로 hosts 파일을 수정해줘야 합니다.

리눅스 계열에서는 다음과 같이 입력해줘야 합니다.


/etc/hosts

127.0.0.1    example.com

127.0.0.1    api.example.com


윈도우 환경이라면 C:\WINDOWS\system32\drivers\etc\hosts 파일을 위와 같이 입력해줘야 합니다.


위와 같이 입력하면 rails의 developments 환경에서도 사용하실 수 있습니다.

http://example.com:3000

http://api.examle.com/comments:3000




허나, 좀더 나아가면 대부분 웹사이트 용 코드와 web API 용 코드는 동일할텐데 controller의 위치 또한 동일하면 혼란을 야기할 수 있습니다.

# config/routes.rb

constraints subdomain: 'api' do

resources :users

end


resources :pages


# rake routes

Prefix    Verb    URI Pattern            Controller#Action

users    GET    /users(.:format)        users#index {:subdomain=>"api"}

          POST  /users(.:format)         users#create{:subdomain=>"api"}

...

pages   GET    /pages(.:format)        pages#index

  POST  /pages(.:format)        pages#create

...


web 컨트롤러를 API 컨트롤러 분리시키는 것이 좋습니다. routes.rb 파일에서 namespace로 묶어주면됩니다.


config/routes.rb

constraints subdomain: 'api' do

namespace :api do

resources :users

end

end


resources :pages


이럴경우 routes는 다음과 같이 됩니다.

# rake routes

Prefix    Verb    URI Pattern            Controller#Action

users    GET    /api/users(.:format)          api/users#index {:subdomain=>"api"}

          POST  /api/users(.:format)          api/users#create{:subdomain=>"api"}

...

pages   GET    /pages(.:format)        pages#index

  POST  /pages(.:format)        pages#create

...


이러면 API 컨트롤러는 그들만의 namespace를 가지게 됩니다. 그러면 API 컨트롤러는 API 모듈의 부분이 됩니다.


app/controllers/api/users_controller.rb

module Api

class UsersController < ApplicationController

end

end


app/controllers/pages_controller.rb

class PagesController < ApplicationController

end


하지만 URL 또한 api 디렉터리의 하위에 포함되게 됩니다.

http://api.example.com/api/users


이는 불필요한 중복이므로 다음과 같이 고쳐줌으로써 해결할 수 있습니다.


config/routes.rb

constraints subdomain: 'api' do

namespace :api, path: '/' do

resources :users

end

end


이렇게 하면 다음과 같은 라우트 결과를 얻을 수 있습니다.

# rake routes

Prefix    Verb    URI Pattern            Controller#Action

users    GET    /users(.:format)          api/users#index {:subdomain=>"api"}

          POST  /users(.:format)          api/users#create{:subdomain=>"api"}

...

pages   GET    /pages(.:format)        pages#index

  POST  /pages(.:format)        pages#create

...


CONSTRAINTS 와 NAMESPACES를 위한 단축 문법도 존재합니다.

# 기본 문법

constraints subdomain: 'api' do

namespace :api, path: '/' do

resources :users

resources :posts

end

end


# 단축 문법

namespace :api, path: '/', constraints: { subdomain: 'api' } do

resources :users

resources :posts

end


댓글