본문 바로가기
루비 온 레일즈

루비 온 레일즈의 데이터베이스 살펴보기

by 코딩의 세계 2025. 7. 26.

db

어떤 서비스이든 "데이터 베이스"는 필수이다. 물론 그냥 일반적인 랜딩 페이지면 상관없지만, "서비스"라고 부를 수 있는 프로덕트에는 반드시 데이터베이스가 필요하다.

그런 점에서 루비 온 레일즈는 자체적으로 데이터베이스를 제공해 주고, 그 데이터베이스를 컨트롤하며 화면에 렌더링 할 수 있게 한다.

Rails에서 데이터베이스 >

Rails에서는 주로 관계형 데이터베이스를 사용하며, 데이터베이스를 쉽게 다룰 수 있도록 Active Record라는 ORM (Object-Relational Mapper)을 제공한다.

  • Active Record: 데이터베이스 테이블을 Ruby 객체로 매핑하여, SQL 코드를 직접 작성하지 않고도 데이터를 처리할 수 있도록 도와준다.
  • SQLite: Rails 프로젝트를 처음 만들 때 기본적으로 설정되는 데이터베이스이다. 개발 환경에서 사용하기에 적합하다. (파일 기반 데이터베이스)
  • MySQL, PostgreSQL: 실제 서비스 환경에서 많이 사용되는 데이터베이스.
  • 데이터베이스 연결: config/database.yml 파일에서 데이터베이스 연결 설정을 한다.

여러 가지 DB를 사용 하지만, 기본은 SQLite를 쓰니 이 기준으로 설명해 보겠다.


데이터베이스 연결 설정하기

Rails에서 데이터베이스 연결 설정하기 (SQLite)

  1. config/database.yml 파일 확인:
  2. 코드 편집기에서 Rails 프로젝트 폴더를 열고, config 폴더 안에 있는 database.yml 파일을 찾아 엽니다.
  3. database.yml 파일은 데이터베이스 연결 설정을 저장하는 파일입니다.
  4. 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: 실제 서비스 환경에서 사용하는 데이터베이스

데이터베이스 연결 확인 방법

  1. Rails 콘솔 실행:
  2. 터미널에서 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를 쉽게 구현할 수 있다.

  1. 터미널에 다음 명령어를 입력하여 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
  1. 마이그레이션 실행:
  2. 터미널에 다음 명령어를 입력하여 데이터베이스에 테이블을 생성합니다.
   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)

  1. 코드 편집기에서 post.rb 파일 열기:
  2. 코드 편집기에서 app/models/post.rb 파일을 엽니다.
  3. post.rb 파일의 내용은 다음과 같습니다.
     class Post < ApplicationRecord
     end
 *   `Post` 모델은 `ApplicationRecord`를 상속받아 `Active Record` 기능을 사용할 수 있습니다.
  1. 모델에 필요한 기능 추가: (예시 - 유효성 검사)
   class Post < ApplicationRecord
     validates :title, presence: true
     validates :content, presence: true
   end
  • validates는 데이터 유효성을 검사하는 메서드입니다.
  • presence: true는 title과 content 속성이 반드시 값이 있어야 함을 나타냅니다.
  • 변경 내용 저장:
    • post.rb 파일을 저장합니다.

3단계: 데이터 저장하기

  1. Rails 콘솔 실행:
  2. 터미널에 rails console 명령어를 입력하여 Rails 콘솔을 실행합니다.
  3. 새로운 Post 객체 생성:
  4. 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)> 
  1. 데이터베이스에 저장:
  2. 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)> 
  1. 저장된 데이터 확인:
  2. 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 "게시글 삭제 완료"