256 lines
6.7 KiB
Markdown
256 lines
6.7 KiB
Markdown
# **Ruby에서 데이터베이스 연동 및 Active Record 사용법**
|
|
|
|
웹 애플리케이션을 개발할 때 데이터베이스(Database)는 필수적인 요소다. Ruby에서는 다양한 데이터베이스와 쉽게 연동할 수 있으며, 특히 **Active Record**를 사용하면 객체지향적으로 데이터를 다룰 수 있다. 이번 글에서는 **Ruby에서 데이터베이스를 연동하는 방법과 Active Record의 기본 개념 및 사용법**을 설명한다.
|
|
|
|
---
|
|
|
|
## **1. Ruby에서 데이터베이스 연동 방법**
|
|
|
|
Ruby는 다양한 데이터베이스를 지원한다. 대표적으로 **SQLite, MySQL, PostgreSQL** 등이 있으며, 각각의 데이터베이스를 사용하기 위해 적절한 **드라이버(Gem)** 를 설치해야 한다.
|
|
|
|
### **1.1. SQLite 사용하기**
|
|
|
|
SQLite는 가벼운 파일 기반의 데이터베이스로, 별도의 서버 설정 없이 사용할 수 있어 개발 및 테스트 환경에서 많이 사용된다.
|
|
|
|
#### **설치 및 초기 설정**
|
|
|
|
SQLite를 사용하려면 `sqlite3` gem을 설치해야 한다.
|
|
|
|
```sh
|
|
gem install sqlite3
|
|
```
|
|
|
|
데이터베이스 파일을 생성하고 연결하는 간단한 Ruby 코드:
|
|
|
|
```ruby
|
|
require "sqlite3"
|
|
|
|
# SQLite 데이터베이스 파일 생성 (파일이 없다면 자동 생성)
|
|
db = SQLite3::Database.new "test.db"
|
|
|
|
# 테이블 생성
|
|
db.execute <<-SQL
|
|
CREATE TABLE IF NOT EXISTS users (
|
|
id INTEGER PRIMARY KEY,
|
|
name TEXT,
|
|
age INTEGER
|
|
);
|
|
SQL
|
|
|
|
# 데이터 삽입
|
|
db.execute "INSERT INTO users (name, age) VALUES (?, ?)", ["홍길동", 30]
|
|
|
|
# 데이터 조회
|
|
db.execute "SELECT * FROM users" do |row|
|
|
puts row.join(", ")
|
|
end
|
|
|
|
db.close # 연결 종료
|
|
```
|
|
|
|
출력:
|
|
```
|
|
1, 홍길동, 30
|
|
```
|
|
|
|
SQLite는 파일 기반이므로 `test.db`라는 파일이 생성된다. 이후 Ruby 코드에서 해당 파일을 사용하여 데이터를 읽고 쓸 수 있다.
|
|
|
|
---
|
|
|
|
### **1.2. MySQL 사용하기**
|
|
|
|
MySQL은 대규모 프로젝트에서 자주 사용되는 데이터베이스다. MySQL과 연동하려면 `mysql2` gem을 설치해야 한다.
|
|
|
|
#### **설치**
|
|
|
|
```sh
|
|
gem install mysql2
|
|
```
|
|
|
|
#### **MySQL 데이터베이스 연결 및 쿼리 실행**
|
|
|
|
```ruby
|
|
require "mysql2"
|
|
|
|
# MySQL 클라이언트 설정
|
|
client = Mysql2::Client.new(
|
|
host: "localhost",
|
|
username: "root",
|
|
password: "password",
|
|
database: "test_db"
|
|
)
|
|
|
|
# 테이블 생성
|
|
client.query <<-SQL
|
|
CREATE TABLE IF NOT EXISTS users (
|
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
name VARCHAR(50),
|
|
age INT
|
|
);
|
|
SQL
|
|
|
|
# 데이터 삽입
|
|
client.query("INSERT INTO users (name, age) VALUES ('이순신', 45)")
|
|
|
|
# 데이터 조회
|
|
results = client.query("SELECT * FROM users")
|
|
results.each do |row|
|
|
puts row["id"], row["name"], row["age"]
|
|
end
|
|
|
|
client.close # 연결 종료
|
|
```
|
|
|
|
이 방식은 SQL을 직접 실행하는 방법으로, ORM(Object-Relational Mapping) 방식보다 코드가 길어질 수 있다. 이를 간편하게 하기 위해 **Active Record**를 사용할 수 있다.
|
|
|
|
---
|
|
|
|
## **2. Active Record란?**
|
|
|
|
**Active Record**는 Ruby on Rails에서 사용하는 ORM(Object-Relational Mapping) 라이브러리다. SQL을 직접 작성하지 않고도 Ruby 객체를 사용해 데이터를 조작할 수 있다.
|
|
|
|
Active Record를 사용하면 SQL 쿼리를 직접 작성할 필요 없이 **객체 지향 방식으로 데이터를 다룰 수 있다**.
|
|
|
|
### **2.1. Active Record 설치 및 설정**
|
|
|
|
Active Record는 별도로 Rails 프레임워크 없이 사용할 수도 있다.
|
|
|
|
#### **설치**
|
|
|
|
```sh
|
|
gem install activerecord sqlite3
|
|
```
|
|
|
|
#### **데이터베이스 연결 설정**
|
|
|
|
```ruby
|
|
require "active_record"
|
|
|
|
# SQLite 데이터베이스 연결
|
|
ActiveRecord::Base.establish_connection(
|
|
adapter: "sqlite3",
|
|
database: "test.db"
|
|
)
|
|
```
|
|
|
|
이제 Active Record를 활용하여 데이터를 다루는 방법을 살펴보자.
|
|
|
|
---
|
|
|
|
## **3. Active Record 사용법**
|
|
|
|
Active Record를 사용하려면 데이터베이스 테이블에 매핑되는 **모델(Model)** 을 정의해야 한다.
|
|
|
|
### **3.1. 모델 정의하기**
|
|
|
|
```ruby
|
|
class User < ActiveRecord::Base
|
|
end
|
|
```
|
|
|
|
위 코드에서 `User` 클래스는 `users` 테이블과 연결된다. Active Record는 자동으로 **클래스명을 기반으로 테이블명을 추론**하므로, `User` 모델은 `users` 테이블과 매칭된다.
|
|
|
|
---
|
|
|
|
### **3.2. 테이블 생성 (마이그레이션 사용)**
|
|
|
|
Active Record에서는 **마이그레이션(Migration)** 을 사용하여 테이블을 생성할 수 있다.
|
|
|
|
```ruby
|
|
require "active_record"
|
|
|
|
ActiveRecord::Schema.define do
|
|
create_table :users, if_not_exists: true do |t|
|
|
t.string :name
|
|
t.integer :age
|
|
t.timestamps
|
|
end
|
|
end
|
|
```
|
|
|
|
이제 `users` 테이블이 생성된다.
|
|
|
|
---
|
|
|
|
### **3.3. 데이터 삽입**
|
|
|
|
객체를 생성하고 `.save` 메서드를 호출하면 데이터베이스에 저장된다.
|
|
|
|
```ruby
|
|
user = User.new(name: "강감찬", age: 40)
|
|
user.save # 데이터베이스에 저장
|
|
```
|
|
|
|
또는 한 줄로 작성할 수도 있다.
|
|
|
|
```ruby
|
|
User.create(name: "김유신", age: 35)
|
|
```
|
|
|
|
---
|
|
|
|
### **3.4. 데이터 조회**
|
|
|
|
```ruby
|
|
users = User.all # 모든 데이터 조회
|
|
users.each do |user|
|
|
puts "#{user.id}, #{user.name}, #{user.age}"
|
|
end
|
|
```
|
|
|
|
특정 조건을 사용하여 데이터를 조회할 수도 있다.
|
|
|
|
```ruby
|
|
user = User.find_by(name: "강감찬")
|
|
puts user.age # 강감찬의 나이 출력
|
|
```
|
|
|
|
---
|
|
|
|
### **3.5. 데이터 수정**
|
|
|
|
```ruby
|
|
user = User.find_by(name: "강감찬")
|
|
user.age = 50
|
|
user.save # 변경된 내용 저장
|
|
```
|
|
|
|
또는 한 줄로 작성 가능하다.
|
|
|
|
```ruby
|
|
User.find_by(name: "강감찬")&.update(age: 50)
|
|
```
|
|
|
|
---
|
|
|
|
### **3.6. 데이터 삭제**
|
|
|
|
```ruby
|
|
user = User.find_by(name: "강감찬")
|
|
user.destroy # 데이터 삭제
|
|
```
|
|
|
|
또는 한 번에 여러 개 삭제할 수도 있다.
|
|
|
|
```ruby
|
|
User.where(age: 50).destroy_all
|
|
```
|
|
|
|
---
|
|
|
|
## **4. 정리**
|
|
|
|
Ruby에서 데이터베이스를 연동하는 방법과 **Active Record**를 활용하여 데이터를 다루는 방법을 살펴보았다.
|
|
|
|
### **📌 데이터베이스 연동 방식**
|
|
- `sqlite3`, `mysql2` 등의 Gem을 사용하여 SQL을 직접 실행할 수 있다.
|
|
- Active Record를 사용하면 ORM 방식으로 객체 지향적으로 데이터를 다룰 수 있다.
|
|
|
|
### **📌 Active Record 주요 기능**
|
|
- `User.create(name: "홍길동", age: 30)` → 데이터 삽입
|
|
- `User.all` → 모든 데이터 조회
|
|
- `User.find_by(name: "홍길동")` → 특정 데이터 조회
|
|
- `user.update(age: 35)` → 데이터 수정
|
|
- `user.destroy` → 데이터 삭제
|
|
|
|
Active Record를 사용하면 SQL을 직접 작성하지 않고도 데이터를 쉽게 관리할 수 있다. Ruby로 웹 애플리케이션을 개발할 계획이라면, Active Record는 반드시 익혀야 할 핵심 기술이다! |