Sequel이란?
Sequel은 Rails 프레임워크 없이도 데이터베이스에 손쉽게 접근할 수 있도록 도와주는 Ruby 젬(gem)입니다.
데이터베이스와 소통하는 방법은 크게 두 가지로 나눌 수 있습니다.
- 원시(raw) SQL 명령문을 직접 전송하는 방법
- ORM을 사용하는 방법
먼저 원시 SQL과 MySQL 데이터베이스를 활용한 예제를 살펴보겠습니다.
require 'mysql2'
client = Mysql2::Client.new(host: "localhost")
results = client.query("SELECT * FROM users WHERE age > 21")
실행 결과는 어떨까요?
조회된 데이터가 해시(hash) 형태의 배열로 반환됩니다.
그런데 이 데이터를 객체 지향적으로 다루고 싶다면 어떻게 해야 할까요? 조회 결과를 객체로 변환해야 하는데, 바로 이것이 ORM이 담당하는 핵심 역할 중 하나입니다.
ORM이란 무엇인가요?
ORM은 "객체-관계 매핑(Object-Relational-Mapping)"의 약자입니다.
Sequel은 SQL(데이터베이스 질의 언어)의 발음에서 이름을 따온 ORM 라이브러리입니다.
지금부터 Sequel의 사용법을 하나씩 살펴보겠습니다!
Sequel 예제: 데이터베이스 연결하기
Sequel을 사용하기 위한 첫 번째 단계는 데이터베이스에 연결하는 것입니다.
예제는 다음과 같습니다:
require 'sequel'
DB = Sequel.sqlite('/tmp/testing.db')
이 코드는 Sequel::Database 객체를 생성하여 상수 DB에 할당합니다. 여기서는 SQLite3 데이터베이스를 사용했습니다.
물론 다른 데이터베이스도 사용할 수 있습니다.
Sequel.postgres— PostgreSQLSequel.mysql2— MySQLSequel.oracle— Oracle
다음 단계는?
데이터를 저장할 테이블을 생성해야 합니다.
테이블 생성 방법:
unless DB.table_exists?(:fruits)
DB.create_table :fruits do
primary_key :id
column :name, String
column :amount, Integer
end
end
참고로 Sequel에는 마이그레이션(migration) 시스템도 내장되어 있지만, 사용 여부는 선택 사항입니다.
이제 데이터를 추가하고 데이터베이스를 조회할 준비가 끝났습니다!
Sequel 데이터셋(Dataset) 사용 방법
데이터베이스의 특정 테이블과 상호작용하려면 데이터셋(dataset) 객체가 필요합니다.
데이터셋을 가져오는 방법:
table = DB[:fruits] # Sequel::SQLite::Dataset
완벽합니다! 이제 insert 메서드로 레코드를 추가할 수 있습니다.
다음과 같이 사용합니다:
table.insert(name: "Orange", amount: 10) table.insert(name: "Apple", amount: 2) table.insert(name: "Banana", amount: 7)
레코드 개수 세기:
table.count # 3
데이터셋의 모든 항목 가져오기:
table.all
# [
# { id: 1, name: "Orange", amount: 10 },
# { id: 2, name: "Apple", amount: 2 },
# { id: 3, name: "Banana", amount: 7 }
# ]
잠깐! 결과가 해시의 배열처럼 보이네요.
맞습니다. 실제로 그것이 정확히 해시 배열입니다.
Sequel은 모델 없이도 데이터베이스를 조회할 수 있지만, 모델을 활용할 수도 있습니다.
그 방법을 알아보겠습니다.
Sequel에서 모델(Model) 사용하기
Sequel의 모델은 ActiveRecord 모델과 매우 유사한 형태를 하고 있습니다.
예제:
class Fruit < Sequel::Model end
모델은 데이터셋과 완전히 동일하게 동작하지만, 조회 결과를 모델 클래스로 감싸서 반환한다는 차이점이 있습니다.
직접 확인해 볼까요?
Fruit.first
# Fruit @values={:id=>1, :name=>"Orange", :amount=>10}
기존의 Sequel::Dataset 메서드들을 그대로 사용할 수 있으므로, 여기에는 특별한 "마법" 같은 것이 없습니다.
추가 예제 몇 가지:
Fruit.map(:name) # ["Orange", "Apple", "Banana"] Fruit.where(name: "Apple").or(amount: 10).map(:name) # ["Orange", "Apple"] Fruit.first[:amount] # 10
정말 깔끔하죠!
Sequel vs ActiveRecord 비교
Sequel이 얼마나 훌륭한지 알게 되었으니, 이제 ActiveRecord와 비교하면 어떤지 궁금해질 수 있습니다.
ActiveRecord는 Rails의 기본 ORM입니다. 그리고 Rails는 컨벤션(규약)을 매우 중요하게 여기는 프레임워크입니다. 따라서 Rails 애플리케이션에서 ActiveRecord를 Sequel로 교체하는 것은 큰 의미가 없다고 생각합니다.
하지만 Sinatra 같은 다른 프레임워크를 사용하고 있다면, Sequel은 훌륭한 선택이 될 수 있습니다!
마무리
이번 글에서는 Ruby에서 ORM을 활용해 데이터베이스를 다루는 방법, 그중에서도 Sequel 젬의 사용법을 배웠습니다.
이제 직접 따라 해보면서 즐거운 코딩 시간을 보내시기 바랍니다!
읽어주셔서 감사합니다.