[Ruby on Rails] Custom Exception Class 사용하기

Ruby on Rails에서 입력값 검증을 Model과 Controller 중 어느 곳에서 하는 게 맞느냐에 대한 논의는 아직도 결론이 나지 않은 것 같다.

일부는 Model을 통하면 아주 쉽게 입력값에 대한 검증을 할 수 있기 때문에 이를 주장하는가 하면, 일부는 Controller에서도 일부 검증이 필요하다고 주장하고 있다.

나는 후자의 의견에 동의한다.

그래서 입력값에 대한 최소한의 검증 (필드의 유무 등) 과정을 Controller가 담당하게 하고, 이를 Custom Exception Class를 사용하기로 했다.

일단 Custom Exception Class를 작성한다.

ROR의 Exception은 별도의 code 없이 message만을 갖기 때문에 code를 받을 수 있는 BaseException Class를 작성하고, 개별 Exception들은 BaseException을 상속받도록 한다.

lib/exceptions.rb

module Exceptions
 class BaseException < StandardError
  attr_accessor :code, :message
  def initialize(code, message)
    @code = code
    @message = message
   end
 end

 class BadInput < BaseException
  def initialize(message)
   super(10000, message)
  end
 end
end

이 class를 사용하는 곳에서 직접 require를 통해 파일의 내용을 로드해도 되지만, 귀찮으므로, lib 하위의 파일은 Application 시작 시 자동으로 로드하도록 설정한다.

config/application.rb

config.autoload_paths += Dir["#{config.root}/lib/**/"]

개별 Controller에서는 다음과 같이 사용하면 된다.

class SomeController < ApplicationController
  def someaction
    begin
      raise Exceptions::BadInput.new("email is empty") if params[:email].nil?
    rescue Exceptions::BaseException => e
      render json: { "code" => e.code, "message" => e.message }
      return
    end
    render json: { "code" => 0, "message" => "SUCCESS" }
  end
 end

위의 rescue 구문에서 처리하는 Exception들은 모두 Exceptions::BaseException을 상속받았기 때문에, 개별 Exception들을 모두 나열하지 않고, BaseException 만을 써줘도 하위 Exception들도 모두 처리가 된다.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s