루비 온 레일즈에서 MVC 아키텍처 설계하는 방법

루비 온 레일즈에서 MVC 아키텍처 설계하는 방법
Cozy CodingPosted On Aug 26, 20248 min read

image

소개

웹 개발을 막 시작한 분이라면, Ruby on Rails를 연구할 때 "MVC"라는 용어를 들어봤을 것입니다. MVC가 무엇을 의미하며, 더 중요한 것은 무엇을 하는 걸까요? 이 게시물에서는 MVC(Model-View-Controller) 아키텍처의 기본을 설명합니다. 기술적 배경이 없는 사람도 쉽게 이해할 수 있도록 매우 단순한 수준으로 분해해서 설명할 것입니다.

MVC 아키텍처란 무엇인가?

MVC는 Model-View-Controller의 약자입니다. 사실, 이는 응용 프로그램의 구조를 분리하는 디자인 패턴입니다. 이 패턴은 응용 프로그램을 세 가지 연결된 구성 요소로 분할하며, 각각을 응용 프로그램의 특정 부분으로 분할합니다. 이러한 구성 요소를 분해하면 다음과 같습니다:

  • Model: 데이터와 비즈니스 로직을 관리합니다.
  • View: 사용자 인터페이스와 프레젠테이션을 관리합니다.
  • Controller: Model과 View 사이의 인터페이스 역할을 하여 응용 프로그램의 동작을 제어하며 명령을 처리하거나 데이터를 관련시킴으로써 동작합니다.

MVC 구성 요소를 사용하여이 애플리케이션을 나누면 개발자가 애플리케이션을 더 효과적으로 처리하고 확장할 수 있습니다.

MVC의 다양한 구성 요소

루비 온 레일즈를 사용한 구현에서 각 요소를 간략히 살펴보고 어떻게 함께 작동하는지 살펴보겠습니다.

  • Model: 데이터 및 비즈니스 로직

MVC에서 모델은 애플리케이션의 데이터 부분을 의미합니다. 이 데이터는 데이터의 형태부터 데이터를 저장하거나 관리하는 방법까지 무엇이든 될 수 있습니다. Ruby on Rails에서는 모델이 주로 데이터베이스 상호작용에 사용됩니다.

예를 들어 블로그를 만들고 있다면, 아마도 게시물에 대한 모델을 가지고 있을 것입니다. 게시물 모델은 블로그 게시물이 포함해야 할 데이터를 정의합니다. 예를 들어 제목, 내용, 작성자 등이 있으며, 블로그 게시물을 저장하고 업데이트하며 데이터베이스에서 가져오기 위한 메서드가 포함될 것입니다.

데이터 저장: 데이터 구조와 데이터베이스가 데이터를 저장하는 방법을 정의합니다.

데이터 유효성 검사: 데이터가 저장되기 전에 특정 기준을 충족시키는지 확인합니다.

비즈니스 로직: 어플리케이션이 필요로 하는 몇 가지 규칙을 준수하고 일부 계산을 수행합니다.

Rails에서는 ActiveRecord 라이브러리를 사용합니다. 이 라이브러리는 모델과 관련된 대부분의 문제를 처리합니다 — 다시 말해, 데이터베이스와 상호 작용하기 위한 메서드를 제공합니다. 이는 데이터 작업을 훨씬 쉽게 만들어 줍니다.

# app/models/post.rb
class Post < ApplicationRecord
 # 제목과 내용의 존재 여부를 보장하는 유효성 검사
 validates :title, presence: true, length: { minimum: 5 }
 validates :body, presence: true, length: { minimum: 15 }
 
 # 다른 모델과의 관계 설정 (예: User 모델)
 belongs_to :user
end
  1. 뷰: 이것은 사용자 인터페이스입니다.

뷰(View)는 사용자가 주로 볼 수 있거나 상호 작용할 수 있는 부분입니다. 사용자에게 데이터를 특정 형식으로 표시하는 데 관심이 있는 부분입니다. 웹 애플리케이션에서는 일반적으로 사용자 브라우저에서 제시된 HTML 페이지에 표시됩니다.

간단한 블로그 예제로 돌아가보면, 뷰는 블로그 게시물 목록을 표시하거나 새 게시물을 작성하는 양식을 표시하는 템플릿일 수 있습니다. 뷰 자체는 많은 작업을 수행하지 않습니다. 단순히 컨트롤러가 제공한 데이터를 가져와 사용자에게 전달하는 역할을 합니다.

뷰의 주요 책임은 다음과 같습니다:

  • 사용자 인터페이스: 사용자가 이해할 수 있는 방식으로 데이터를 표시하기

템플릿: 데이터의 표현 방법을 설명하며, 일반적으로 HTML, CSS 및 내장 루비(ERB)를 사용하여 Rails에서 처리합니다.

상호작용: 폼 및 버튼과 같은 사용자 입력을 다루는 방법

Rails에서 뷰는 대부분 HTML과 루비 코드의 조합인 ERB로 생성됩니다. 이를 통해 HTML에 직접적으로 루비 코드를 삽입할 수 있습니다.

<!-- app/views/posts/index.html.erb -->
<h1>모든 포스트</h1>

<% @posts.each do |post| %>
  <div class="post">
    <h2><%= link_to post.title, post_path(post) %></h2>
    <p><%= truncate(post.body, length: 100) %></p>
    <p><%= post.user.name %> 님이 게시함</p>
  </div>
<% end %>
  1. 컨트롤러: 어플리케이션의 두뇌

컨트롤러는 모델과 뷰 사이의 다리 역할을 합니다. 주로 모델의 도움을 받아 사용자 입력을 받은 후, 무엇을 사용자에게 정확히 보여줄지를 결정하는 것이 기본적인 역할입니다. 요약하면, 이것이 어플리케이션에서의 "두뇌", 의사결정자입니다.

예를 들어, 사용자가 블로그 글 목록을 보고 싶어 할 때, 컨트롤러는 포스트 모델로부터 필요한 데이터를 요청하고, 그 목록을 보여줄 뷰를 렌더링합니다. 사용자가 새로운 블로그 글을 제출하면, 컨트롤러는 해당 데이터를 가져와 모델을 사용하여 데이터베이스에 저장한 후 사용자를 업데이트된 글 목록으로 리디렉션합니다.

컨트롤러의 중요한 역할은:

요청 처리: 사용자로부터 입력을 받아들이는 것은 HTTP 요청과 관련이 있습니다.

데이터 처리: 데이터는 모델을 사용하여 조작되거나 검색됩니다.

뷰 렌더링: 데이터와 사용자의 입력에 기초하여 어떤 뷰를 렌더링할지 결정합니다.

Rails에서 이러한 것들은 ApplicationController에서 상속된 Ruby 클래스입니다. 컨트롤러의 각 메서드는 작업으로, 각 작업은 사용자에게 무언가를 제공합니다: 뷰, 새로운 양식 또는 편집 양식을 포함할 수 있습니다.

# app/controllers/posts_controller.rb
class PostsController < ApplicationController
  # 모든 게시물을 표시하는 액션
  def index
    @posts = Post.all
  end

  # 단일 게시물을 표시하는 액션
  def show
    @post = Post.find(params[:id])
  end

  # 새로운 게시물을 생성하는 액션
  def new
    @post = Post.new
  end
end

루비 온 레일스에서 MVC가 어떻게 함께 작동하는지

이제 MVC의 세 가지 구성 요소를 모두 다루었으니, 전형적인 레일스 애플리케이션에서 이들이 어떻게 함께 작동하는지 살펴보겠습니다.

블로그 웹사이트를 방문하는 사용자를 고려해 보겠습니다. MVC가 요청을 처리하는 방법은 다음과 같습니다: 사용자 요청(컨트롤러) 사용자가 블로그 글 목록을 보기 위해 홈페이지로 이동합니다. 사용자의 웹 요청은 레일스 애플리케이션으로 전달됩니다. 이 요청은 컨트롤러 액션으로 보내집니다. 예를 들어, PostsController#index와 같습니다.

요청 처리하기 (모델 및 컨트롤러): PostsController의 index 액션은 데이터베이스에서 모든 포스트를 검색하기 위해 Post 모델을 사용합니다.

뷰 렌더링하기 (컨트롤러 및 뷰): 컨트롤러는 이 포스트 목록을 index.html.erb 뷰 템플릿에 전달합니다. 이 erb 템플릿은 HTML로 렌더링되어 사용자의 브라우저로 다시 전송됩니다.

결과 표시하기 (뷰): HTML이 사용자의 브라우저로 전송되고 모든 블로그 포스트 목록이 화면에 사용자에게 표시됩니다.

컨트롤러는 흐름을 관리하고, 모델은 데이터를 나타내며, 뷰는 정보를 사용자에게 보여줍니다.

루비 온 레일즈에서 MVC를 사용하는 이유

루비 온 레일즈의 MVC 아키텍처를 사용하면 복잡한 웹 애플리케이션을 개발할 때 여러 부분을 분리하여 다룰 수 있습니다. 여기에는 다음과 같은 장점이 있습니다:

  • 관심사의 분리

관심사의 분리는 MVC의 가장 큰 장점 중 하나여야 합니다. 전체 애플리케이션을 세 가지 매우 다른 부분으로 분리할 수 있으며, 서로 다른 사람들이 독립적으로 애플리케이션의 각 부분에서 작업을 시작할 수 있습니다. 이는 애플리케이션을 관리하고 확장하는 데 더 간단하게 만들어 줍니다. 특히 애플리케이션 복잡성이 증가하는 시기에 이점이 있습니다.

예를 들어, 프론트엔드 개발자는 데이터가 어떻게 가져오거나 저장되는지에 관심이 없어도 뷰에서 작업을 수행할 수 있습니다. 반면에 백엔드 개발자는 모델 및 컨트롤러에서 작업을 수행하여 데이터가 올바르게 처리되도록 합니다.

  1. 재사용성과 유연성

각 구성 요소가 독립적이기 때문에 MVC 아키텍처에서 코드를 재사용하고 유지보수하는 것이 더 쉽습니다. 데이터 표시 방식을 변경하려면 모델과 컨트롤러를 신경 쓰지 않고 새 뷰만 만들면 됩니다. 마찬가지로 처리 방식을 변경해야 하는 경우에는 뷰가 아닌 모델을 업데이트하면 됩니다.

모듈화 또한 새로운 기능이나 변경 사항을 추가하는 것을 더 쉽게 만듭니다. 예를 들어, 블로그 작업 중에 새 페이지를 추가하려는 경우 새 컨트롤러 액션과 뷰 템플릿을 만들기만 하면 됩니다. 전체 애플리케이션을 변경할 필요가 없습니다.

애플리케이션이 점점 커짐에 따라 유지 보수와 확장이 더 어려워지는데요. 여기서 MVC가 도움이 되는 거죠. 코드를 특정한 방식으로 조직화하면 더 쉽게 관리할 수 있습니다. 각 구성 요소가 하나의 역할을 갖고 있기 때문에 버그를 빨리 찾아 고칠 수 있습니다. 또한 기존 기능을 손상시키지 않고 새로운 기능을 추가할 수 있습니다.

이로써 대규모 그룹에서는 분업이 명확하게 이루어지므로 협력이 촉진됩니다. 이를 통해 프로젝트 구성원들의 작업을 동시에 진행할 수 있어 전체 개발 시간을 최소화하고 생산성을 극대화할 수 있습니다.

  1. 테스트 용이성

테스트는 애플리케이션을 구축하는 핵심 부분입니다. MVC 아키텍처를 통해 애플리케이션을 테스트하는 것이 정말 쉬워집니다. 모든 구성 요소가 독립적이기 때문에 각각을 별도로 테스트할 수 있습니다. 따라서 오류를 조기에 발견하고 애플리케이션이 가정대로 작동하는지 확인할 수 있습니다.

Ruby on Rails를 사용한 MVC의 실제 예시

실제로 MVC를 사용하여 어떻게 구현되는지에 대해 더 잘 이해하기 위해, 아래는 전자 상거래 웹사이트의 예시입니다.

  1. 전자 상거래 웹사이트

예를 들어, Ruby on Rails를 사용하여 전자 상거래 사이트를 구축한다고 가정해보겠습니다. 이 경우, 다음이 여러분의 MVC가 될 것입니다:

모델: 제품, 주문, 고객을 위한 모델이 있을 것입니다. 이 모델은 데이터의 구조를 정의하고 데이터베이스와 상호작용하는 방법을 포함합니다.

뷰: 뷰는 제품 목록, 쇼핑 카트, 심지어 주문 확인과 같은 템플릿으로 구성됩니다. 이러한 템플릿은 사용자에게 데이터를 제공하고 사용자 입력을 처리합니다. 예를 들어, 제품을 장바구니에 추가하는 경우와 같은 작업을 다룹니다.

컨트롤러: 컨트롤러는 애플리케이션의 흐름을 관리합니다. 예를 들어, ProductsController는 제품 목록을 보는 모든 요청을 관리하고, OrdersController는 결제 프로세스를 관리합니다.

루비 온 레일스에서 MVC의 단점

MVC 프레임워크는 많은 혜택을 제공하지만 일정 수준의 복잡성도 함께 가지고 있습니다. 여기서 몇 가지 문제를 살펴봅시다.

  1. 대규모 응용프로그램의 복잡성

응용프로그램의 규모와 복잡성이 증가함에 따라 MVC 구성 요소를 다루는 것이 상당히 어려워집니다. 컨트롤러는 과도한 로직을 축적하게 되어 유지 관리가 어려워집니다. 때때로 "fat controllers" 또는 "fat models"로 불리기도 합니다.

  1. 성능 오버헤드

가끔 MVC에서 채택된 엄격한 관심사 분리는 성능에 부담을 줄 수 있습니다. 예를 들어, 뷰를 렌더링하는 동안 하나 이상의 데이터베이스 쿼리가 필요할 수 있어 전체 애플리케이션 성능이 저하될 수 있습니다.

결론

루비 온 레일즈의 기본 기반은 MVC에 근간을 두고 있으며, 이것은 웹 애플리케이션 개발 방식을 심도있게 정의했습니다. MVC는 애플리케이션을 모델, 뷰 및 컨트롤러 세 가지 주요 구성 요소로 분할합니다. 이로써 복잡한 애플리케이션을 더 쉽고 더 짧은 시간에 개발하기 위한 명확한 구조를 제공합니다.

MVC의 이점인 관심사 분리, 재사용성, 유지보수성, 테스트 용이성은 웹 개발자들에게 강력한 도구로 작용했습니다.

MVC 아키텍처를 이해하고 정복한 후에는 견고하고 확장 가능한 응용 프로그램을 구축할 수 있게 될 거예요. 그러니 깊게 파고들고, 개발을 시작하고, 그 힘을 실제로 경험해 보세요!