어떤 서비스이든 "데이터 베이스"는 필수이다. 물론 그냥 일반적인 랜딩 페이지면 상관없지만, "서비스"라고 부를 수 있는 프로덕트에는 반드시 데이터베이스가 필요하다.
그런 점에서 루비 온 레일즈는 자체적으로 데이터베이스를 제공해 주고, 그 데이터베이스를 컨트롤하며 화면에 렌더링 할 수 있게 한다.
Rails에서 데이터베이스 >
Rails에서는 주로 관계형 데이터베이스를 사용하며, 데이터베이스를 쉽게 다룰 수 있도록 Active Record라는 ORM (Object-Relational Mapper)을 제공한다.
- Active Record: 데이터베이스 테이블을 Ruby 객체로 매핑하여, SQL 코드를 직접 작성하지 않고도 데이터를 처리할 수 있도록 도와준다.
- SQLite: Rails 프로젝트를 처음 만들 때 기본적으로 설정되는 데이터베이스이다. 개발 환경에서 사용하기에 적합하다. (파일 기반 데이터베이스)
- MySQL, PostgreSQL: 실제 서비스 환경에서 많이 사용되는 데이터베이스.
- 데이터베이스 연결: config/database.yml 파일에서 데이터베이스 연결 설정을 한다.
여러 가지 DB를 사용 하지만, 기본은 SQLite를 쓰니 이 기준으로 설명해 보겠다.
데이터베이스 연결 설정하기
Rails에서 데이터베이스 연결 설정하기 (SQLite)
- config/database.yml 파일 확인:
- 코드 편집기에서 Rails 프로젝트 폴더를 열고, config 폴더 안에 있는 database.yml 파일을 찾아 엽니다.
- database.yml 파일은 데이터베이스 연결 설정을 저장하는 파일입니다.
- database.yml 파일은 일반적으로 다음과 같이 구성되어 있습니다.
default: &default
adapter: sqlite3
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
timeout: 5000
development:
<<: *default
database: storage/development.sqlite3
test:
<<: *default
database: storage/test.sqlite3
production:
primary:
<<: *default
database: storage/production.sqlite3
cache:
<<: *default
database: storage/production_cache.sqlite3
migrations_paths: db/cache_migrate
queue:
<<: *default
database: storage/production_queue.sqlite3
migrations_paths: db/queue_migrate
cable:
<<: *default
database: storage/production_cable.sqlite3
migrations_paths: db/cable_migrate
- 각 환경 (development, test, production) 별로 데이터베이스 설정을 정의합니다.
- default 설정은 공통 설정이며, 각 환경 설정에서 <<: *default를 사용하여 default 설정을 상속받습니다.
- SQLite 설정 확인:
- database.yml 파일에서 adapter: sqlite3 설정을 확인합니다.
- database: 설정은 데이터베이스 파일의 경로를 지정합니다.
- development 환경에서는 storage/development.sqlite3 파일을 사용합니다.
- test 환경에서는 storage/test.sqlite3 파일을 사용합니다.
- production 환경에서는 storage/production.sqlite3 파일을 사용합니다.
- 별도의 설정 변경 없이 기본 설정을 사용하면 SQLite 데이터베이스를 사용할 수 있습니다.
- 데이터베이스 생성 확인:
- Rails 프로젝트 폴더에 storage 폴더가 있는지 확인합니다.
- storage 폴더 안에 development.sqlite3 파일이 생성되어 있는지 확인합니다.
- Rails 프로젝트에서 처음으로 데이터베이스 관련 작업을 수행하면 자동으로 데이터베이스 파일이 생성됩니다.
- 아직 데이터베이스 파일을 생성하지 않았더라도, 데이터베이스 마이그레이션 작업을 진행하면 자동으로 생성됩니다.
- 데이터베이스 파일은 여러분이 데이터를 저장할 때 사용됩니다.
SQLite 설정 상세 설명
- adapter: sqlite3:
- 데이터베이스 어댑터를 SQLite로 지정합니다. Rails가 SQLite 데이터베이스와 통신할 때 사용합니다.
- pool::
- 데이터베이스 연결 풀 크기를 지정합니다. 여러 요청을 처리할 때 데이터베이스 연결을 재사용하여 성능을 향상시킵니다.
- timeout::
- 데이터베이스 연결 타임아웃 시간을 지정합니다. 지정된 시간 동안 데이터베이스 연결이 안 되면 오류가 발생합니다.
- database::
- 데이터베이스 파일 경로를 지정합니다. SQLite는 파일 기반 데이터베이스이므로 파일 경로가 데이터베이스 연결 정보가 됩니다.
- development, test, production:
- 각 개발 환경에 따라 데이터베이스를 분리하여 관리할 수 있도록 환경별로 설정합니다.
- development: 개발 환경에서 사용하는 데이터베이스
- test: 테스트 환경에서 사용하는 데이터베이스
- production: 실제 서비스 환경에서 사용하는 데이터베이스
- 각 개발 환경에 따라 데이터베이스를 분리하여 관리할 수 있도록 환경별로 설정합니다.
데이터베이스 연결 확인 방법
- Rails 콘솔 실행:
- 터미널에서 Rails 프로젝트 폴더로 이동한 후, 다음 명령어를 입력하여 Rails 콘솔을 실행합니다.
rails console
* 또는 다음과 같이 줄여서 입력할 수 있습니다.
rails c
rails-for-newbie/my_first_app ] rails console
Loading development environment (Rails 8.0.1)
my-first-app(dev)>
이런 식으로 뒤에 dev 가 붙으면 콘솔 명령어를 사용할 수 있게 된다.
명령어는 여러 가지가 존재하고, 명령어를 통해 CRUD를 쉽게 구현할 수 있다.
- 터미널에 다음 명령어를 입력하여 Post 모델을 생성합니다.
rails generate model Post title:string content:text
- rails generate model은 모델을 생성하는 명령어입니다.
- Post는 모델의 이름입니다.
- title:string과 content:text는 Post 모델에 추가할 속성 (column)과 데이터 형식을 지정합니다.
- title 속성은 문자열(string) 형식입니다.
- content 속성은 긴 문자열(text) 형식입니다.
- 파일 생성 확인:
- 명령어를 실행하면 다음과 같은 파일이 생성됩니다.
- app/models/post.rb: 모델 파일
- db/migrate/YYYYMMDDHHMMSS_create_posts.rb: 마이그레이션 파일
- YYYYMMDDHHMMSS는 날짜와 시간을 나타내는 숫자입니다.
rails generate model Post title:string content:text
invoke active_record
create db/migrate/20250205071912_create_posts.rb
create app/models/post.rb
invoke test_unit
create test/models/post_test.rb
create test/fixtures/posts.yml
- 마이그레이션 실행:
- 터미널에 다음 명령어를 입력하여 데이터베이스에 테이블을 생성합니다.
rails db:migrate
- rails db:migrate는 마이그레이션 파일에 정의된 대로 데이터베이스 스키마를 변경하는 명령어입니다.
- create_posts 마이그레이션 파일에 정의된 내용대로 posts 테이블이 생성됩니다.
- posts 테이블에는 title과 content 열이 생성됩니다.
rails db:migrate
== 20250205071912 CreatePosts: migrating ======================================
-- create_table(:posts)
-> 0.0022s
== 20250205071912 CreatePosts: migrated (0.0022s) =============================
2단계: 모델 파일 살펴보기 (app/models/post.rb)
- 코드 편집기에서 post.rb 파일 열기:
- 코드 편집기에서 app/models/post.rb 파일을 엽니다.
- post.rb 파일의 내용은 다음과 같습니다.
class Post < ApplicationRecord
end
* `Post` 모델은 `ApplicationRecord`를 상속받아 `Active Record` 기능을 사용할 수 있습니다.
- 모델에 필요한 기능 추가: (예시 - 유효성 검사)
class Post < ApplicationRecord
validates :title, presence: true
validates :content, presence: true
end
- validates는 데이터 유효성을 검사하는 메서드입니다.
- presence: true는 title과 content 속성이 반드시 값이 있어야 함을 나타냅니다.
- 변경 내용 저장:
- post.rb 파일을 저장합니다.
3단계: 데이터 저장하기
- Rails 콘솔 실행:
- 터미널에 rails console 명령어를 입력하여 Rails 콘솔을 실행합니다.
- 새로운 Post 객체 생성:
- Rails 콘솔에서 다음 Ruby 코드를 입력하고 엔터 키를 누릅니다.
post = Post.new(title: '첫 번째 게시글', content: '첫 번째 게시글 내용입니다.')
- Post.new는 새로운 Post 객체를 생성하는 명령어입니다.
- title:과 content:는 생성할 Post 객체의 속성 값을 설정합니다.
- '첫 번째 게시글'은 title 속성의 값입니다.
- '첫 번째 게시글 내용입니다.'는 content 속성의 값입니다.
my_first_app ] rails console
Loading development environment (Rails 8.0.1)
my-first-app(dev)> post = Post.new(title: '첫 번째 게시글', content: '첫 번째 게시글 내용입니다.')
=> #<Post:0x00007f91bff5c9b0 id: nil, title: "첫 번째 게시글", content: "첫 번째 게시글 내용입니다.", created_at: nil, updated_at: nil>
my-first-app(dev)>
- 데이터베이스에 저장:
- Rails 콘솔에서 다음 Ruby 코드를 입력하고 엔터 키를 누릅니다.
post.save
- post.save는 Post 객체의 데이터를 데이터베이스에 저장하는 명령어입니다.
- true가 출력되면 저장이 성공적으로 완료된 것입니다.
my-first-app(dev)> post.save
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION /*application='MyFirstApp'*/
Post Create (0.5ms) INSERT INTO "posts" ("title", "content", "created_at", "updated_at") VALUES ('첫 번째 게시글', '첫 번째 게시글 내용입니다.', '2025-02-05 07:27:23.094525', '2025-02-05 07:27:23.094525') RETURNING "id" /*application='MyFirstApp'*/
TRANSACTION (20.8ms) COMMIT TRANSACTION /*application='MyFirstApp'*/
=> true
my-first-app(dev)>
- 저장된 데이터 확인:
- Rails 콘솔에서 다음 Ruby 코드를 입력하고 엔터 키를 누릅니다.
Post.all
- 저장된 Post 객체 데이터가 출력됩니다.
my-first-app(dev)> Post.all
Post Load (0.1ms) SELECT "posts".* FROM "posts" /* loading for pp */ LIMIT 11 /*application='MyFirstApp'*/
=> [#<Post:0x00007f91c0cddd50 id: 1, title: "첫 번째 게시글", content: "첫 번째 게시글 내용입니다.", created_at: "2025-02-05 07:27:23.094525000 +0000", updated_at: "2025-02-05 07:27:23.094525000 +0000">]
my-first-app(dev)>
코드 설명:
- rails generate model Post title:string content:text: Post 모델을 생성하고, title과 content 속성을 지정하는 명령어입니다.
- rails db:migrate: 데이터베이스 스키마를 변경하는 명령어입니다. 모델 생성 시 자동으로 생성된 마이그레이션 파일을 실행합니다.
- app/models/post.rb: Post 모델을 정의하는 파일입니다. 데이터를 처리하고 저장하는 데 필요한 로직을 포함합니다.
- Post.new(...): 새로운 Post 객체를 생성하는 명령어입니다.
- post.save: Post 객체의 데이터를 데이터베이스에 저장하는 명령어입니다.
- Post.all: 데이터베이스에서 모든 Post 객체를 가져오는 명령어입니다.
데이터 불러오고 수정하고 삭제하기 >
Active Record란 무엇일까?
Active Record는 Rails에서 데이터베이스를 쉽게 다룰 수 있도록 해주는 ORM (Object-Relational Mapper) 라이브러리입니다. Active Record를 사용하면 SQL 쿼리문을 직접 작성하지 않고도 Ruby 코드로 데이터베이스 작업을 수행할 수 있습니다.
1. 데이터 불러오기 (Read)
- 모든 데이터 가져오기:
# Rails 콘솔에서 실행
Post.all
- Post.all은 posts 테이블의 모든 레코드를 가져와 ActiveRecord::Relation 객체로 반환합니다.
- ActiveRecord::Relation 객체는 배열처럼 사용할 수 있습니다.
- 특정 ID의 데이터 가져오기:
# Rails 콘솔에서 실행
Post.find(1)
- Post.find(1)은 posts 테이블에서 id가 1인 레코드를 가져와 Post 객체로 반환합니다.
- 해당 ID의 레코드가 없으면 ActiveRecord::RecordNotFound 예외가 발생합니다.
- 특정 조건을 만족하는 데이터 가져오기:
# Rails 콘솔에서 실행
Post.where(title: '첫 번째 게시글')
- Post.where(title: '첫 번째 게시글')은 posts 테이블에서 title이 '첫 번째 게시글'인 레코드를 모두 가져와 ActiveRecord::Relation 객체로 반환합니다.
- 데이터 정렬하기:
# Rails 콘솔에서 실행
Post.order(:title) # 제목 기준으로 오름차순 정렬
Post.order(created_at: :desc) # 생성일 기준으로 내림차순 정렬
- order 메서드를 사용하여 데이터를 정렬할 수 있습니다.
- 데이터 개수 제한하기:
# Rails 콘솔에서 실행
Post.limit(5) # 처음 5개의 게시글만 가져오기
- limit 메서드를 사용하여 가져올 데이터 개수를 제한할 수 있습니다.
- 특정 속성만 선택하기:
# Rails 콘솔에서 실행
Post.select(:id, :title) # id 와 title 속성만 선택
- select 메서드를 사용하여 특정 속성만 선택할 수 있습니다.
- 여러 조건을 함께 사용하기:
# Rails 콘솔에서 실행
Post.where(published: true).order(created_at: :desc).limit(10)
- where, order, limit 와 같은 메서드를 연결하여 복잡한 쿼리를 만들 수 있습니다.
2. 데이터 수정하기 (Update)
- 특정 레코드 가져오기:
# Rails 콘솔에서 실행
post = Post.find(1)
- 속성 값 변경:
# Rails 콘솔에서 실행
post.title = '수정된 제목'
post.content = '수정된 내용'
- 데이터베이스에 저장:
# Rails 콘솔에서 실행
post.save
- post.save는 변경된 데이터를 데이터베이스에 저장합니다.
- 저장이 성공하면 true를 반환하고, 실패하면 false를 반환합니다.
- update 메서드를 사용하여 한 번에 수정하기:
# Rails 콘솔에서 실행
post = Post.find(1)
post.update(title: '수정된 제목', content: '수정된 내용')
- update 메서드를 사용하면 속성 값을 변경하고 저장하는 과정을 한 번에 처리할 수 있습니다.
3. 데이터 삭제하기 (Delete)
- 특정 레코드 가져오기:
# Rails 콘솔에서 실행
post = Post.find(1)
- 데이터 삭제:
# Rails 콘솔에서 실행
post.destroy
- post.destroy는 해당 레코드를 데이터베이스에서 삭제합니다.
- delete 메서드를 사용하여 삭제하기:
ruby # Rails 콘솔에서 실행 Post.delete(1)
* `delete` 메서드를 사용하여 id 가 1인 레코드를 삭제할 수 있습니다.
- 조건에 맞는 모든 레코드 삭제하기:
# Rails 콘솔에서 실행
Post.where(title: '삭제할 게시글').destroy_all
- destroy_all 메서드를 사용하면 title 이 '삭제할 게시글' 인 모든 레코드를 삭제할 수 있습니다.
- delete_all 메서드를 사용하여 삭제하기:
# Rails 콘솔에서 실행
Post.where(title: '삭제할 게시글').delete_all
* `delete_all` 메서드는 `destroy_all` 과 유사하지만, 콜백 메서드를 실행하지 않고 바로 삭제하므로 더 빠릅니다.
4. Rails 콘솔 활용
- Rails 콘솔은 Rails 애플리케이션과 상호작용하고, 코드를 테스트하고, 데이터를 관리하는 데 유용한 도구입니다.
- 터미널에서 rails console 명령어를 입력하여 Rails 콘솔을 실행합니다.
- Rails 콘솔에서 Active Record 메서드를 사용하여 데이터를 불러오고, 수정하고, 삭제하는 연습을 해보세요.
- Rails 콘솔에서 모델 객체를 생성하고, 속성 값을 확인하고, 메서드를 호출하는 등 다양한 작업을 수행할 수 있습니다.
- exit 명령어를 입력하여 Rails 콘솔을 종료하거나 컨트롤 + D로도 종료가 가능합니다.
예시:
# Rails 콘솔에서 실행
# 1. 모든 게시글 가져오기
posts = Post.all
puts posts.inspect
# 2. ID가 1인 게시글 가져오기
post = Post.find(1)
puts post.title
puts post.content
# 3. 제목이 '첫 번째 게시글'인 게시글 가져오기
posts = Post.where(title: '첫 번째 게시글')
puts posts.inspect
# 4. ID가 1인 게시글의 제목 수정하기
post = Post.find(1)
post.title = '제목 수정됨'
post.save
puts post.title
# 5. ID가 1인 게시글 삭제하기
post = Post.find(1)
post.destroy
puts "게시글 삭제 완료"
'루비 온 레일즈' 카테고리의 다른 글
루비 온 레일즈 스카폴드 Scaffold - CRUD 딸깍 (4) | 2025.07.27 |
---|---|
루비 온 레일즈의 핵심. "MVC" 패턴 (3) | 2025.07.25 |
루비 온 레일즈 프로젝트의 폴더 구조 (4) | 2025.07.25 |
루비 온 레일즈 설치 및 프로젝트 세팅 (6) | 2025.07.24 |
Ruby on Rails란 (4) | 2025.07.24 |