Rails 헬퍼(Helper)란 무엇인가?
헬퍼는 주로 Rails 뷰(View)에서 재사용 가능한 코드를 공유하기 위해 사용되는 메서드입니다. Rails는 기본적으로 다양한 내장 헬퍼 메서드를 함께 제공합니다.
대표적인 내장 헬퍼 중 하나가 바로 time_ago_in_words입니다.
예시를 살펴보겠습니다:
time_ago_in_words(Time.now) # "less than a minute" time_ago_in_words(Time.now + 60) # "1 minute" time_ago_in_words(Time.now + 600) # "10 minutes"
이 메서드는 시간을 위와 같은 형식으로 표시하고 싶을 때 매우 유용합니다.
또 다른 Rails 뷰 헬퍼로는 number_to_human가 있습니다.
예시:
number_to_human(10_000) # "10 Thousand"
숫자를 사람이 읽는 방식 그대로 출력할 수 있어, 결과물이 훨씬 자연스럽고 친근하게 느껴집니다.
더 많은 헬퍼는 Ruby on Rails 공식 문서에서 확인할 수 있습니다.
그런데 직접 헬퍼를 만들 수 있다는 사실을 알고 계셨나요?
나만의 헬퍼 메서드 작성하기
커스텀 헬퍼 메서드를 작성하려면 app/helpers 디렉터리에 파일을 생성해야 합니다.
헬퍼는 헬퍼 모듈(helper module) 안에 작성합니다.
모든 Rails 애플리케이션에는 기본적으로 ApplicationHelper라는 이름의 베이스 헬퍼 모듈이 포함되어 있습니다.
바로 이곳에 헬퍼 메서드를 추가하면 됩니다.
여기에 정의된 메서드는 모든 뷰에서 자동으로 사용할 수 있습니다. 컨트롤러에서 헬퍼를 사용하는 방법과, 그것이 왜 좋지 않은 선택일 수 있는지는 뒤에서 살펴보겠습니다.
모든 헬퍼를 ApplicationHelper에 몰아서 작성할 수도 있습니다.
하지만 더 좋은 방법이 있습니다…
목적별로 헬퍼 모듈을 분리하면 메서드를 훨씬 체계적으로 관리할 수 있습니다.
작성 순서:
app/helpers아래에 새 파일을 생성합니다.user_helper.rb처럼 알아보기 쉬운 이름을 붙입니다.- 파일 이름과 일치하는 새 모듈을 추가합니다.
예시:
# app/helpers/user_helper.rb
module UserHelper
def format_name(user)
if user.gender == "M"
"Mr. #{user.name}"
else
"Ms. #{user.name}"
end
end
end
위 코드는 성별에 따라 사람을 격식 있게 호칭할 때 사용할 수 있습니다.
가장 큰 장점은 무엇일까요?
필요할 때마다 여러 뷰에서 같은 로직을 반복해서 작성하지 않아도 되고, 코드를 수정해야 할 때도 한 곳만 고치면 됩니다.
정말 편리하죠!
새로 만든 헬퍼 모듈 사용하기
뷰에서는 헬퍼 메서드를 바로 호출할 수 있습니다.
다음과 같이 사용합니다:
<%= format_name(@user) %>
아주 간단하죠?
반면 뷰 밖에서 헬퍼를 사용하려면 별도의 방법이 필요합니다.
컨트롤러에서 헬퍼 사용하기
흔한 방식은 아니지만, 컨트롤러 액션에서 헬퍼 메서드를 사용하는 것도 가능합니다.
Rails 5 이전 버전에서는 헬퍼 모듈을 직접 include 해야 했습니다.
최신 버전에서는 helpers(복수형) 객체를 통해 컨트롤러에서 헬퍼를 사용할 수 있습니다.
예시:
class UsersController
def index
helpers.time_ago_in_words(Time.now)
end
end
이렇게 하면 컨트롤러에서도 헬퍼를 사용할 수 있습니다. 다만 이런 구조는 설계상 문제를 나타내는 신호일 수 있으므로, 사용 전에 신중하게 고민해 보세요.
가능하면 일반 Ruby 객체(Plain Ruby Object)를 대신 활용하는 것이 좋습니다.
Rails 콘솔에서 헬퍼 활용하기
Rails 애플리케이션이 로드된 irb 환경인 Rails 콘솔은 메서드를 실험해 보기에 최고의 도구입니다.
헬퍼도 예외는 아닙니다!
콘솔에서는 helper.method_name 형태로 헬퍼를 호출할 수 있습니다.
에러를 피하려면 단수형인 "helper"를 사용해야 한다는 점에 유의하세요. 또한 콘솔은 코드 변경 사항을 자동으로 다시 로드하지 않으므로, 수정 후에는 reload가 필요합니다.
Rails 뷰 헬퍼 작성 모범 사례
그렇다면 언제 헬퍼 메서드를 만들어야 할까요?
HTML 조각을 생성하는 로직이 필요할 때입니다.
일반적으로 두 가지 경우에 해당합니다. 하나는 문자열 포맷팅(string formatting)이고, 다른 하나는 조건부 페이지 요소(conditional page elements) 처리입니다.
추가 팁 하나 더…
좋은 헬퍼를 작성하려면 인스턴스 변수를 사용하지 마세요. 현재 뷰에서는 해당 변수가 존재할 수 있지만, 다른 뷰에서는 없을 수 있습니다.
그러면 변수 누락으로 인한 에러가 발생합니다.
해결책은?
파라미터를 사용하세요. 메서드에 필요한 데이터를 명확하고 명시적으로 전달받는 것이 안전합니다.
# 잘못된 방법 def eat_healthy @fruit.eat end # 올바른 방법 def eat_healthy(fruit) fruit.eat end
마지막 팁은 헬퍼를 모듈 단위로 나누고, 각 모듈 이름이 담고 있는 메서드의 종류를 명확히 설명하도록 하는 것입니다.
다만 주의할 점:
메서드 이름이 중복되는 문제까지는 해결해 주지 못합니다. 중복된 이름은 에러와 혼란을 일으킬 수 있습니다.
따라서 모든 헬퍼는 고유한 이름을 가져야 합니다.
대안으로 프레젠터(presenter) 객체를 활용해 보는 것도 좋은 방법입니다.
마무리
지금까지 Rails의 헬퍼에 대해 알아보았습니다! 헬퍼는 뷰에서 포맷팅과 복잡한 로직을 깔끔하게 처리할 수 있게 해주는 유틸리티 메서드 모음입니다.
이제 직접 나만의 헬퍼를 만들어 보세요!
읽어주셔서 감사합니다 🙂