Computer >> 컴퓨터 >  >> 프로그래밍 >> Ruby

Rails 렌더링 완벽 가이드: 기본 개념부터 실전 활용까지

Rails에서 렌더링(Rendering)이란 무엇일까요?

렌더링은 Ruby on Rails 애플리케이션의 최종 목표입니다. 우리는 주로 HTML과 Ruby 코드가 섞여 있는 .html.erb 파일 형태의 뷰(View)를 렌더링합니다.

뷰란 사용자가 최종적으로 보게 되는 화면입니다.

Rails 앱이 수행해야 하는 모든 작업의 결과물이 바로 뷰이며, 뷰는 로직과 데이터, 뷰 템플릿을 결합하여 사용자의 요청을 처리합니다.

흥미로운 점은 JSON 응답조차 하나의 뷰로 간주할 수 있다는 것입니다.

그렇기 때문에 열심히 만든 작업이 헛되지 않으려면 Rails의 렌더링 시스템에 대해 최대한 많이 학습하는 것이 중요합니다.

Rails의 렌더링은 때때로 의외의 동작을 보이기도 합니다. 따라서 알면 알수록 좋습니다.

그럼 기본 개념부터 시작해 보겠습니다!

뷰 렌더링의 기본 원리

기본 설정에서는 Rails에게 렌더링을 지시하지 않아도, 나머지 설정이 올바르게 되어 있다면 뷰는 정상적으로 동작합니다.

이것이 바로 "Convention over Configuration(설정보다 관습)" 철학의 일부입니다.

어떻게 이것이 가능할까요?

Rails는 개발자가 인지하지 못할 수 있는 여러 가지를 '가정'하고 동작합니다. 덕분에 작업량이 줄어들지만, 내부 동작을 모른 채 사용하면 마치 마법처럼 느껴질 수 있습니다.

바로 이 지점에서 문제가 발생하기 쉽습니다!

이 경우 Rails가 세우는 가정은 다음과 같습니다. 요청을 처리하는 컨트롤러 액션과 같은 이름의 템플릿을 렌더링한다는 것입니다.

예를 들어 BooksController#index를 호출하면 Rails는 자동으로 books/index.erb를 렌더링합니다.

그런데 말입니다:

이 기본 동작보다 더 세밀하게 제어할 수도 있습니다. 즉, 기본값이 아닌 다른 뷰를 렌더링할 수 있습니다.

방법은 다음과 같습니다:

class BooksController < ApplicationController
  def index
    render :listing
  end
end

이렇게 하면 books/listing.erb가 렌더링됩니다(HAML 뷰를 사용한다면 .haml 파일이 됩니다).

심볼 대신 문자열을 사용할 수도 있습니다.

예를 들면:

render 'shared/buttons'

이 경우 Rails는 shared/buttons.erb를 렌더링합니다.

반드시 알아야 할 중요한 사실

다른 액션과 연관된 뷰를 렌더링한다고 해서 그 액션이 실행되지는 않습니다.

즉, create 액션 안에서 render :index를 호출해도 index 메서드 자체는 실행되지 않습니다.

왜 이것이 중요할까요?

해당 뷰에 필요한 인스턴스 변수들이 설정되지 않기 때문입니다!

따라서 필요한 변수는 직접 설정해 주어야 합니다.

예제:

def index
  @users = User.all
end

# 여기서 `@users`가 없으면 에러가 발생하거나 빈 index 뷰가 출력됩니다.
# 대신 `redirect_to`를 사용하면 `index` 메서드가 실제로 실행됩니다.
def create
  render :index
end

렌더링에는 이 외에도 알아야 할 내용이 많습니다. 계속 살펴보겠습니다!

다양한 렌더링 방식

템플릿을 렌더링하는 것 외에도 몇 가지 옵션이 있습니다.

다음과 같은 것들이 가능합니다:

  • HTML 문자열 렌더링
  • 일반 텍스트 문자열 렌더링
  • JSON 렌더링

문자열 렌더링은 개발 과정에서 유용합니다. 에러를 처리할 적절한 템플릿이 아직 없거나, 특정 컨트롤러 액션의 뷰를 아직 작성하지 않았을 때 간단한 메시지를 보여줄 수 있기 때문입니다.

예제:

if @user
  render :show
else
  render plain: "User not found."
end

JSON 직접 렌더링은 간단한 API를 만들 때 활용할 수 있습니다. 최선의 방법은 아니지만, 시작 단계에서는 큰 도움이 됩니다.

예제:

render json: @user

HTML 렌더링은 저도 사용해 본 적이 없는데, 좋은 활용 사례를 알고 계시다면 공유해 주세요!

파셜(Partial) 렌더링 방법

렌더링은 컨트롤러에만 국한되지 않습니다.

뷰 안에서 또 다른 뷰를 렌더링할 수도 있는데, 이를 파셜(partial)이라고 부릅니다.

왜 파셜을 사용해야 할까요?

코드가 깔끔해지고 재사용성이 높아지기 때문입니다.

동일한 폼을 서로 다른 3개 페이지에서 사용한다면, 이를 파셜로 추출하는 것이 좋은 선택입니다. 이후 수정이 필요할 때 한 곳만 고치면 되니까요.

사용 예제:

<%= render :form %>

파셜이 정상 동작하려면 뷰 파일 이름을 밑줄(언더스코어)로 시작해야 합니다. 예를 들어 _form.erb와 같이요. 다만 render 호출 시에는 언더스코어를 붙이지 않습니다.

파셜 안에서는 인스턴스 변수에 접근할 수 있습니다. 그렇다면 지역 변수는 어떻게 전달할까요?

다음과 같이 하면 됩니다:

<%= render :form, message: "Apples Are Good" %>

이렇게 하면 파셜 내부에서 message를 지역 변수로 사용할 수 있습니다.

다음으로, 단 한 번의 render 호출로 여러 요소를 렌더링하는 방법을 알아보겠습니다!

컬렉션(Collection) 렌더링 방법

파셜을 활용하면 반복문 없이 컬렉션을 손쉽게 렌더링할 수 있습니다.

예를 들어 @books를 렌더링한다고 가정해 보겠습니다.

다음과 같이 작성하면 됩니다:

<%= render @books %>

단, _book.erb 파셜이 존재하고 그 템플릿 안에서 book이라는 변수명을 사용해야 합니다.

파셜 파일 예제:

# app/views/books/_book.erb

<%= image_tag(book.cover) %>

<%= book.title %>

<%= book.author %> <%= link_to "Read Book", book %>

CSS 클래스 등을 위해 현재 순번(카운터)이 필요하다면 book_counter를 사용하세요. 여기서 book_는 해당 모델의 이름입니다.

개인적으로 컬렉션 렌더링은 제가 가장 좋아하는 Rails 기능 중 하나입니다!

Rails 레이아웃 이해하기

Rails 앱을 새로 생성하면 views 폴더 아래에 "layouts" 폴더가 함께 만들어집니다.

그 안에는 application.html.erb 파일이 있는데, 이것이 바로 기본 레이아웃입니다.

레이아웃이란 무엇일까요?

레이아웃은 사이트 전체에 일관된 디자인을 적용할 수 있게 해줍니다.

레이아웃에 포함되는 요소들:

  • 메뉴(네비게이션)
  • 푸터
  • CSS 및 JavaScript 파일 로딩 등

대부분의 경우 기본 레이아웃만으로 충분합니다.

하지만 특정 페이지에만 다른 레이아웃을 적용하고 싶다면 어떻게 해야 할까요?

layout 옵션을 사용하면 됩니다.

예제:

render :index, layout: 'admin'

레이아웃을 비활성화할 수도 있습니다.

render :index, layout: false

컨트롤러 단위로 레이아웃을 지정하는 것도 가능합니다.

예를 들면:

class AdminsController < ApplicationController
  layout 'admin'
end

렌더링은 액션을 종료하지 않는다

흔히 겪는 혼란 중 하나는, 컨트롤러 액션 안에서 렌더링(및 리다이렉트)을 호출하면 이후 코드가 실행되지 않을 것이라고 생각하는 것입니다.

render를 여러 번 호출할 때 이 문제와 마주치게 됩니다.

잘못된 예제:

def create
  if yellow_fruit?
    render :bananas
  end

  render :apples
end

이 코드는 에러를 발생시킵니다. 조건과 관계없이 render :apples가 항상 실행되며, 하나의 컨트롤러 액션에서는 두 번 렌더링할 수 없기 때문입니다.

해결 방법:

def create
  if yellow_fruit?
    render :bananas
  else
    render :apples
  end
end

또 다른 방법으로 render 뒤에 return 키워드를 사용하는 것도 가능하지만, 코드 가독성을 위해 메서드 중간에 return 문을 두는 것은 되도록 피하는 것이 좋습니다.

마무리

지금까지 Ruby on Rails에서 매우 중요한 주제인 렌더링에 대해 알아보았습니다.

렌더링은 애플리케이션 사용자에게 콘텐츠를 반환하는 역할을 하며, 컨트롤러 액션의 마지막 단계 중 하나입니다. 렌더링을 제대로 이해하면 더 나은 Rails 애플리케이션을 작성할 수 있습니다.

이제 여러분 차례입니다. 에디터를 열고 배운 내용을 직접 코딩하며 연습해 보세요.

읽어주셔서 감사합니다!