티스토리 뷰
[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