학습
Ruby 루비 온 레일즈 (Ruby on Rails) 심화
Ruby 루비 온 레일즈 (Ruby on Rails) 심화 — 고급
루비 온 레일즈 (Ruby on Rails) 심화
1. 도입 (왜 배워야 하는가)
루비 온 레일즈(Ruby on Rails, 줄여서 Rails)는 웹 애플리케이션 개발을 위한 강력한 프레임워크로, 빠르고 효율적인 개발을 지원합니다. Rails는 '관습을 따르기'를 통해 개발자의 생산성을 극대화하며, 이는 실무에서 필수적인 요소입니다. 이 프레임워크를 제대로 이해하고 활용하지 못하면 프로젝트의 유지보수성이나 확장성이 떨어질 수 있으며, 이는 결국 비용 증가와 시간 낭비로 이어질 수 있습니다.
예를 들어, Rails의 RESTful 구조를 이해하지 못하면 API 설계가 비효율적이 되어, 클라이언트와 서버 간의 데이터 통신이 복잡해질 수 있습니다. 이러한 문제는 협업에서 혼란을 초래하고, 결과적으로는 제품의 품질 저하로 이어질 수 있습니다.
2. 핵심 개념 설명
RESTful 디자인
REST(Representational State Transfer)는 웹 서비스 설계의 원칙으로, 리소스를 URL로 표현하고 HTTP 메소드를 통해 조작합니다. 이를 통해 클라이언트와 서버 간의 명확한 인터페이스를 제공합니다.
비유: RESTful API는 레스토랑의 메뉴와 같습니다. 메뉴는 고객이 주문할 수 있는 항목을 명확하게 보여주고, 주문은 특정한 방식(전화, 온라인 등)으로 이루어집니다.
| 용어 | 설명 |
|---|---|
| 리소스 | 웹에서 다루는 데이터 단위 |
| HTTP 메소드 | 리소스에 대한 작업 방법 |
| 엔드포인트 | 리소스에 접근하기 위한 URL |
3. 기본 코드 예제
Rails에서 RESTful 리소스를 설정하는 기본적인 방법을 살펴보겠습니다.
# config/routes.rb
Rails.application.routes.draw do
resources :products
end
위 코드는 products라는 리소스에 대한 RESTful 경로를 자동으로 생성합니다.
실행 결과
이 코드를 실행하면 다음과 같은 경로가 생성됩니다:
- GET /products (모든 제품 목록)
- POST /products (새 제품 추가)
- GET /products/:id (특정 제품 조회)
- PATCH/PUT /products/:id (특정 제품 수정)
- DELETE /products/:id (특정 제품 삭제)
Rails.application.routes.draw do: Rails 애플리케이션의 라우팅을 정의하기 시작합니다.resources :products:products리소스에 대한 RESTful 경로를 자동으로 생성합니다.
코드 한 줄씩 동작 설명
4. 실전 활용 예제
쇼핑몰에서 장바구니 구현
장바구니 기능을 구현할 때, 사용자는 상품을 추가하거나 삭제할 수 있어야 합니다. 이를 위해 Cart라는 리소스를 만들어 보겠습니다.
# app/controllers/carts_controller.rb
class CartsController < ApplicationController
def show
@cart = current_user.cart
end
def add_item
product = Product.find(params[:product_id])
current_user.cart.add(product)
redirect_to cart_path
end
def remove_item
product = Product.find(params[:product_id])
current_user.cart.remove(product)
redirect_to cart_path
end
end
상황 설명
이 코드는 사용자가 자신의 장바구니를 조회하고, 상품을 추가하거나 삭제할 수 있는 메소드를 제공합니다. current_user.cart는 현재 로그인한 사용자의 장바구니를 나타냅니다.
5. 흔한 실수와 주의사항
실수 1: RESTful 원칙을 무시
잘못된 코드:
# 잘못된 접근
get '/products/add', to: 'products#add'
올바른 코드:
# RESTful 접근
post '/products', to: 'products#create'
주의사항: RESTful 원칙을 따르지 않으면 API가 비효율적이 됩니다.
실수 2: 데이터베이스 쿼리 최적화 부족
잘못된 코드:
# N+1 쿼리 문제
@products = Product.all
@products.each do |product|
puts product.category.name
end
올바른 코드:
# eager loading 사용
@products = Product.includes(:category).all
@products.each do |product|
puts product.category.name
end
주의사항: N+1 쿼리 문제를 피하지 않으면 성능 저하가 발생합니다.