R 프로그래밍에서 predict() 함수 사용하는 방법

저자는 Girls Who Code를 기부 대상으로 선택하여 Write for Donations 프로그램의 일환으로 기부하였습니다.

소개

Devise 젬은 Ruby on Rails 애플리케이션의 인증 솔루션입니다. 이를 사용하면 프로젝트에서 모든 것을 직접 구현하지 않고도 제작용으로 준비된 사용자 인증을 설정할 수 있습니다. Devise는 사용자 세션 처리, OmniAuth 젬을 사용한 OAuth를 통한 타사 로그인 지원 등 많은 유용한 기능을 제공합니다. Devise는 비밀번호 재설정, 로그인 횟수와 타임스탬프 추적, 제한 시간 설정, 계정 잠금 등의 기능을 위한 내장 모듈도 함께 제공합니다.

Devise를 사용하면 젬을 초기화하고 필요한 기능을 갖춘 User 모델을 생성하는 것만으로 사용자 인증을 간단하게 설정할 수 있습니다. 처음부터 사용자 인증을 구현한다면 원하는 모든 기능에 대한 코드와 테스트를 작성하고 세션 처리, 쿠키 저장, 데이터 보안 등의 모든 예외 상황을 처리해야 할 것입니다. Devise 젬을 사용하면 이 모든 작업을 직접 하지 않고 앱 개발에 집중할 수 있습니다.

이 튜토리얼에서는 Rails를 사용하여 최소한의 웹 어플리케이션을 생성하고 Devise를 설치하는 방법을 알아보겠습니다. 이를 통해 사용자가 계정을 생성하고 로그인 및 로그아웃할 수 있게 됩니다.

전제 조건

이 튜토리얼을 완료하기 위해 필요한 사항은 다음과 같습니다:

단계 1 – 새로운 Rails 애플리케이션 생성

이 단계에서는 새로운 Rails 애플리케이션을 생성하고 로컬에서 실행합니다. rails 명령 줄 도구를 사용하여 프로젝트를 초기화합니다.

터미널에서 다음 명령을 실행하세요:

  1. rails new blog

rails new 명령은 blog 디렉토리에 새로운 Rails 프로젝트를 생성하며, 여러 개의 생성된 파일과 폴더가 포함되어 있습니다. 그 중 하나는 프로젝트의 종속성을 포함하는 Gemfile입니다. 단계 3 – Devise 설치 및 구성에서 Gemfile을 구성할 것입니다.

참고: Could not find gem 오류가 발생하면 프로젝트 디렉토리로 이동하여 (cd blog) bundle install을 실행하여 Gemfile에 나열된 모든 젬을 설치할 수 있습니다.

이 디렉토리를 원하는 텍스트 편집기에서 열거나 터미널을 사용하여 이동할 수 있습니다:

  1. cd blog

Rails 애플리케이션을 시작하려면 프로젝트 디렉토리에서 rails server 명령으로 개발 서버를 시작하세요.

  1. bundle exec rails server

이 명령은 Rails 개발 서버를 시작합니다. 웹 브라우저에서 http://localhost:3000을 열어서 Rails 환영 페이지에 접속하세요. 포트 번호를 지정하지 않은 경우 Rails는 응용 프로그램을 실행하기 위해 포트 번호 3000을 사용합니다.

**참고:*명령에 bundle exec를 추가하면 현재 번들의 컨텍스트에서 실행됩니다. 이는 프로젝트별로 지정된 Gemfile과 그 안에 정의된 젬 버전만 사용된다는 것을 의미합니다. 이는 전역적으로 설치된 동일한 버전의 젬이 다른 경우 유용합니다.

이제 새로운 Rails 애플리케이션을 초기화했으며, 나중에 사용자 인증을 추가할 것입니다. 다음 단계에서는 Rails가 제공하는 기본 홈페이지를 사용자 정의 랜딩 페이지로 대체하여 샘플 애플리케이션을 추가한 후에 탐색이 쉬워질 것입니다. 새로운 랜딩 페이지를 만든 후에는 사용자가 애플리케이션에 가입하고 로그인할 수 있는 링크를 추가할 것입니다.

2단계 – 랜딩 페이지 생성

기본 Rails 애플리케이션이 준비되었으므로, Rails가 제공하는 기본 페이지를 사용자 정의 랜딩 페이지로 대체할 것입니다. 사용자 정의 랜딩 페이지를 사용하면 응용 프로그램의 루트 URL에서 가입 및 로그인 링크를 사용자에게 보여주는 것이 쉬워집니다. 나중 단계에서는 로그인가입 링크를 추가할 것입니다.

랜딩 페이지를 만들기 위해 다음을 수행해야 합니다:

  • config/routes.rb 파일에 경로를 추가하십시오.
  • 이 경로로의 요청을 처리할 HomeController를 생성하십시오.
  • 경로로 접속했을 때 렌더링될 뷰 파일을 생성하십시오.

프로젝트를 생성할 때 생성된 routes.rb 파일에 루트 경로를 추가하십시오.

nano 또는 원하는 텍스트 편집기를 사용하여 이전에 생성된 config/routes.rb 파일을 엽니다:

  1. nano config/routes.rb

다음 줄을 추가하십시오:

config/routes.rb
Rails.application.routes.draw do
  root to: "home#index" 
end

root to:는 루트 경로로의 요청을 처리할 컨트롤러 액션을 정의합니다. 이 경우, 경로는 Rails 앱의 기본 포트인 http://localhost:3000입니다. 이 경로로의 요청은 home 컨트롤러의 index 액션에 의해 처리됩니다. 현재 이 파일은 존재하지 않으므로 다음으로 app/controllers/home_controller.rb 파일을 생성하겠습니다.

config/routes.rb를 저장하고 닫으십시오. nano를 사용하여 CTRL+X를 눌러 나가고, Y를 눌러 저장하고, ENTER를 눌러 파일 이름을 확인하고 파일을 닫으십시오.

다음으로, app/controllers/home_controller.rb 파일을 생성하고 다음 줄을 추가하십시오:

app/controllers/home_controller.rb
class HomeController < ApplicationController
  def index
    render
  end
end

이것은 뷰 파일과 연관된 컨트롤러 액션을 렌더링하는 HomeController의 기본 메소드인 index입니다.

이 경우, 뷰 파일은 app/views/home/index.html.erb 파일이 됩니다. 이 파일을 생성해야 하며, app/views 디렉토리 내에 home 디렉토리를 생성해야 합니다.

home 컨트롤러 파일을 저장하고 닫으세요.

다음으로, app/views 디렉토리에 home 디렉토리를 생성하세요:

  1. mkdir app/views/home/

home 디렉토리는 특정 Rails 컨트롤러의 모든 뷰를 보관합니다.

그런 다음, app/views/home/index.html.erb 파일을 생성하고 다음 라인을 추가하세요:

app/views/home/index.html.erb
<h1>Hello DigitalOcean!</h1>

app/views/home/index.html.erbHome 컨트롤러의 index 액션이 렌더링할 뷰 파일입니다. 이는 Ruby 코드를 삽입할 수 있는 HTML 파일입니다. 특정 컨트롤러 액션에 대한 라우트가 실행되면, 이 뷰 파일이 사용자의 브라우저에 렌더링됩니다.

파일을 저장하고 닫으세요.

루트 URL에서 변경 사항을 확인하려면, 브라우저에서 http://localhost:3000을 열거나(이미 열려 있다면 페이지를 새로 고침) 엽니다. 업데이트된 랜딩 페이지는 다음과 유사할 것입니다:

필요에 따라 이 페이지를 추가로 사용자 정의할 수 있지만, 이 튜토리얼에는 이것만 필요합니다.

이제 단순한 Rails 애플리케이션에 자체 랜딩 페이지가 추가되었으므로, Devise 젬을 사용하여 사용자 인증을 추가합니다.

단계 3 — Devise 설치 및 구성

이 단계에서는 Rails 애플리케이션에 Devise를 설치하고 구성하여 해당 젬에 포함된 메소드와 헬퍼를 사용할 수 있도록 합니다. user_signed_in? 메소드를 사용하여 브라우저 쿠키에 저장된 로그인한 사용자의 세션 정보를 확인할 수 있습니다. current_user 헬퍼를 사용하여 현재 로그인한 계정의 세부 정보를 가져올 수도 있습니다. 이 두 가지 메소드는 Devise에 내장되어 있으며 추가 코드를 작성하지 않고도 애플리케이션에서 직접 사용할 수 있습니다. 이 헬퍼 메소드에 대한 자세한 내용은 Devise 프로젝트의 GitHub 페이지에서 확인할 수 있습니다.

Devise를 설치하기 위한 첫 번째 단계는 Gemfile에 해당 젬을 추가하는 것입니다. Gemfile은 Ruby 프로젝트를 실행하는 데 필요한 모든 종속성에 대한 정보를 포함하고 있습니다. 이 경우, Rails 애플리케이션을 초기화할 때 생성된 Gemfile에는 이미 Rails를 실행하는 데 필요한 기본 젬이 모두 포함되어 있습니다.

그러나 Gemfile에 변경을 가하기 전에, 이전 단계에서 시작한 개발 서버를 터미널에서 CTRL+C를 눌러 중지시켜야 합니다.

그런 다음, Gemfile을 수정하기 위해 편집기에서 엽니다. Devise 젬을 추가하려면 파일의 끝쪽에 강조된 줄을 추가하십시오. 다만, development 그룹과 test 그룹 밖에 추가하시기 바랍니다.

Gemfile

# ...

# 캐싱을 통해 부팅 시간을 단축시킵니다. config/boot.rb에서 필요합니다.
gem "bootsnap", require: false

# Active Storage 변형 사용 [https://guides.rubyonrails.org/active_storage_overview.html#transforming-images]
# gem "image_processing", "~> 1.2"

gem "devise" 

group :development, :test do
  # https://guides.rubyonrails.org/debugging_rails_applications.html#debugging-with-the-debug-gem을 참조하세요.
  gem "debug", platforms: %i[ mri mingw x64_mingw ]
end

# ...

파일을 저장하고 닫으세요.

다음으로, 터미널에서 bundle install 명령을 실행하여 새로 추가된 젬을 설치합니다. 프로젝트 디렉토리(blog)에서 다음 명령을 실행하세요:

  1. bundle install

이 명령은 프로젝트에 Devise 젬을 설치하며, rails 명령 줄 도구와 함께 devise 명령을 사용하고 인증을 구성할 수 있게 해줍니다.

프로젝트에서 Devise를 설정하려면 다음 생성기 명령을 실행하세요:

  1. bundle exec rails g devise:install

위 명령에서 g 플래그는 generate를 나타내며 Rails 생성기를 호출하는 데 사용됩니다. 생성기는 시작점으로 사용될 수 있는 파일을 생성합니다. Rails 생성기에 대한 자세한 내용은 Rails 가이드를 참조할 수 있습니다.

이전 명령어는 초기화 파일과 Devise의 i18n 로케일 파일을 포함하여 여러 파일을 생성합니다. 자세한 내용은 아래에서 설명하는 초기화 파일은 앱을 처음 시작할 때 Devise를 구성하는 데 사용됩니다. i18n은 앱을 다른 언어로 실행하는 데 도움이되는 표준인 국제화를 나타냅니다.

이 시점에서 터미널에는 다음과 같은 지침도 출력됩니다:

Output
=============================================================================== Depending on your application's configuration some manual setup may be required: 1. Ensure you have defined default url options in your environments files. Here is an example of default_url_options appropriate for a development environment in config/environments/development.rb: config.action_mailer.default_url_options = { host: 'localhost', port: 3000 } In production, :host should be set to the actual host of your application. * Required for all applications. * 2. Ensure you have defined root_url to *something* in your config/routes.rb. For example: root to: "home#index" * Not required for API-only Applications * 3. Ensure you have flash messages in app/views/layouts/application.html.erb. For example: <p class="notice"><%= notice %></p> <p class="alert"><%= alert %></p> * Not required for API-only Applications * 4. You can copy Devise views (for customization) to your app by running: rails g devise:views * Not required * ===============================================================================

이 튜토리얼에서는이 수동 설정이 필요하지 않지만이 단계에서는 noticealert를위한 플래시 메시지를 추가합니다.

Devise의 설치가 완료되었습니다. 이제 방금 생성된 Devise 초기화 파일에서 몇 가지 설정을 구성해야합니다.

devise:install 명령을 실행하면 Devise의 초기화 파일인 config/initializers/devise.rb이 생성됩니다. Rails 애플리케이션을 시작할 때 Rails는 모든 젬과 플러그인을로드 한 다음 모든 초기화 파일을로드합니다. 이러한 초기화 파일에서 응용 프로그램의 특정 설정을 구성할 수 있습니다. 이러한 초기화 파일은 모두 config/initializers/ 디렉토리에 있으며 Devise 젬도 그곳에 초기화 파일을 생성합니다.

편집을 위해 config/initializers/devise.rb를 엽니다. 파일에서 Devise.setup 블록을 찾아 다음에 강조 표시된 줄을 추가합니다 (Devise.setup 블록 내에 다른 코드 블록이 있을 수 있지만 무시할 수 있습니다):

config/initializers/devise.rb
Devise.setup do |config|
  # ...

  config.navigational_formats = ['*/*', :html, :turbo_stream]

  # ...
end

이 줄은 탐색 형식으로 turbo_stream을 추가합니다. Turbo Streams는 많은 JavaScript를 사용하지 않고 서버에서 렌더링된 HTML을 보내고 페이지를 렌더링하는 Turbo의 일부입니다. Devise 4.8.1을 Rails 7과 함께 사용하려면 이것을 추가해야합니다. 그렇지 않으면 undefined method user_url 오류가 발생합니다.

파일을 저장하고 닫으십시오.

다음으로, 이전에 인쇄된 지침에서 강조된 메시지 알림 및 경고 플래시 메시지를 추가합니다. alertnotice 태그는 “잘못된 암호”와 같은 메시지가 사용자 인터페이스에 표시되는 위치입니다. 언제든지 애플리케이션에 사용자 정의 경고 메시지를 구현할 수 있지만(예: Axios 인터셉터를 사용하여 React를 프론트엔드로 사용하는 경우), 이 튜토리얼에서는 최소한의 Devise 설정을 완료합니다.

app/views/layouts/application.html.erb 파일을 편집하기 위해 엽니다. 본문 태그 바로 위에 "notice""alert" 메시지를 위한 태그를 추가합니다. :

app/views/layouts/application.html.erb
...
<body>
  <p class="notice"><%= notice %></p> 
  <p class="alert"><%= alert %></p> 
  <%= yield %>
</body>

뷰가 브라우저에서 렌더링될 때, <%= yield %> 블록은 뷰 파일에서의 내용으로 대체됩니다. 뷰 파일에서는 p 태그만 사용했습니다. 이 yield 태그는 해당 콘텐츠로 대체됩니다.

파일을 저장하고 닫으십시오.

이 단계에서는 프로젝트에 Devise를 설치하고 구성했습니다. 다음 단계에서는 Devise를 사용하여 응용 프로그램에 대한 사용자 모델을 생성하고 사용자 인증을 설정할 것입니다.

4단계 – Devise를 사용하여 사용자 모델 생성

이제 Devise를 사용하여 사용자 모델을 생성할 준비가 되었습니다. 이렇게 하면 필요한 모델 파일을 생성하고 응용 프로그램에서 users 테이블을 생성하는 마이그레이션을 생성할 수 있습니다. 누군가가 가입하면 데이터베이스의 users 테이블에 새 레코드를 생성해야 합니다. 사용자 모델을 사용하면 프론트엔드 뷰에서 이러한 데이터베이스 레코드를 조작할 수 있습니다.

이 단계에서는 사용자 모델을 생성하고 기본 구성을 검사한 다음 마이그레이션을 실행하여 데이터베이스를 업데이트합니다.

레일스는 모델-뷰-컨트롤러 (MVC) 프레임워크이기 때문에 각 데이터베이스 테이블에는 해당하는 클래스가 있으며, 이 클래스를 사용하여 테이블의 데이터를 처리할 수 있습니다. 이 경우에는 users 테이블을 생성하면 User.first 또는 User.find_by_email("[email protected]")과 같은 작업을 수행하기 위해 User 모델을 사용할 수 있습니다. 일반 클래스를 ApplicationRecord에서 상속받아 이 모델을 생성할 수도 있지만, Devise를 사용하여 사용자 모델을 생성하면 인증에 사용할 수 있는 다양한 메서드를 얻을 수 있습니다.

Devise 사용자를 생성하려면 다음 생성기 명령을 실행하세요:

  1. bundle exec rails g devise user

다음 출력이 화면에 표시됩니다:

Output
invoke active_record create db/migrate/20220908152949_devise_create_users.rb create app/models/user.rb invoke test_unit create test/models/user_test.rb create test/fixtures/users.yml insert app/models/user.rb route devise_for :users

출력에는 Devise가 여러 파일을 생성하고 테스트를 만들고 라우트를 추가했음을 보여줍니다. 첫 번째 파일인 db/migrate/20220908152949_devise_create_users.rb는 데이터베이스에 users 테이블을 생성하기 위한 마이그레이션 파일입니다. Rails 마이그레이션 파일은 데이터베이스에서 수행해야 할 변경 사항을 설명합니다. 각 마이그레이션의 파일 이름에는 타임스탬프가 포함되어 있어 Rails가 변경 사항을 어떤 순서로 수행해야 하는지 알 수 있습니다.

Devise는 또한 사용자 모델 파일(app/models/user.rb)과 해당하는 테스트도 생성했습니다. 출력의 마지막 줄은 기존의 config/routes.rb 파일에 라우트가 추가되었음을 나타냅니다. Devise는 devise_for :users 도우미를 사용하여 /users/sign_up/users/sign_out와 같은 모든 라우트를 자동으로 추가합니다.

마이그레이션 파일을 실행하여 데이터베이스에 users 테이블을 생성하기 전에 생성된 파일을 검토해봅시다. 이를 통해 Devise가 생성한 구성을 이해하고 마이그레이션을 실행할 때 무슨 일이 일어나는지 알 수 있습니다.

먼저, 생성된 마이그레이션 파일(db/migrate/20220908152949_devise_create_users.rb)을 열어 기본 코드를 검토하세요:

db/migrate/20220908152949_devise_create_users.rb
# frozen_string_literal: true

class DeviseCreateUsers < ActiveRecord::Migration[7.0]
  def change
    create_table :users do |t|
      ## 데이터베이스 인증 가능
      t.string :email,              null: false, default: ""
      t.string :encrypted_password, null: false, default: ""

      ## 복구 가능
      t.string   :reset_password_token
      t.datetime :reset_password_sent_at

      ## 기억 가능
      t.datetime :remember_created_at

      ## 추적 가능
      # t.integer  :sign_in_count, default: 0, null: false
      # t.datetime :current_sign_in_at
      # t.datetime :last_sign_in_at
      # t.string   :current_sign_in_ip
      # t.string   :last_sign_in_ip

      ## 확인 가능
      # t.string   :confirmation_token
      # t.datetime :confirmed_at
      # t.datetime :confirmation_sent_at
      # t.string   :unconfirmed_email # 다시 확인 가능한 경우에만

Devise에는 비밀번호 재설정 토큰 및 마지막 토큰 전송 시간과 같은 유용한 옵션이 많이 포함되어 있습니다. 로그인 실패 후 사용자를 잠그거나 로그인 세부 정보를 추적하는 등의 기능에 대한 라인도 있습니다.

수정할 필요가 없으므로 마이그레이션 파일을 닫습니다.

Devise는 User 모델 파일도 생성했습니다. 이 파일은 app/models/ 디렉토리에서 사용할 수 있습니다.

app/models/user.rb 모델 파일을 열어 기본 코드를 확인하세요:

blog/app/models/user.rb
class User < ApplicationRecord
# 기본 Devise 모듈을 포함합니다. 다른 사용 가능한 모듈은 다음과 같습니다:
# :confirmable, :lockable, :timeoutable, :trackable, :omniauthable
devise :database_authenticatable, :registerable,
       :recoverable, :rememberable, :validatable
end

A few options are added by Devise to configure how the user model works. The basic modules (database_authenticatable, registerable, recoverable, rememberable, and validatable) are already included. There are some additional options commented out, corresponding to the extra features you saw in the migration file. You can add these modules to the model file and configure the migration, depending on how much functionality you need in your application.

기본 모듈이 하는 역할은 다음과 같습니다:

  • database_authenticatable: 사용자는 로그인 및 비밀번호 필드로 자체 인증을 할 수 있습니다. 암호화된 비밀번호가 데이터베이스에 저장됩니다.
  • registerable: 사용자는 자신을 등록하고 계정을 편집하거나 삭제할 수 있습니다.
  • recoverable: 사용자는 비밀번호를 재설정하고 자격 증명을 잊어버린 경우 계정을 복구할 수 있습니다.
  • rememberable: 이 모듈은 사용자의 세션을 브라우저 쿠키에 저장하여 기억합니다.
  • validatable: 이 모듈은 사용자의 이메일 및 비밀번호 필드에 대한 유효성 검사를 제공합니다. (예를 들어, 애플리케이션이 비밀번호를 최소 여섯 자 이상 입력하도록 요구할 때, 모델에 사용자 정의 유효성 검사를 정의하지 않았음에도 불구하고)

이러한 기본 모듈은 방금 생성한 User 모델에 포함되어 있습니다. Devise와 함께 제공되는 모듈의 전체 목록은 Devise GitHub 저장소에서 찾을 수 있습니다.

변경할 필요가 없으므로 User 모델 파일을 닫으십시오.

다른 업데이트 사항은 config/routes.rb 파일이 수정되어 users에 대한 devise_for 라인이 추가되었습니다.

Rails.application.routes.draw do
  devise_for :users

  root "home#index"
end

이는 /users/sign_in, /users/sign_out, /users/password/new와 같은 사용자 인증과 관련된 모든 필요한 경로를 정의하는 유용한 메소드입니다. Devise는 이 모든 것을 대신 처리하고 경로 파일을 깔끔하게 유지해줍니다. devise_for :users를 추가하면 이러한 경로가 자동으로 생성되는 방식을 이해하려면 Devise GitHub 리포지토리에서 메소드의 소스 코드를 확인할 수 있습니다.

여기에는 변경할 필요가 없으므로 config/routes.rb 파일을 닫으십시오.

애플리케이션에서 정의된 경로를 확인하려면 다음 명령을 실행하여 목록화 할 수 있습니다:

  1. bundle exec rails routes

이 명령은 모든 애플리케이션 경로와 이러한 경로를 처리하는 컨트롤러를 출력합니다. 인증의 경우, 이러한 모든 경로는 Devise에 의해 생성되었으며 수동으로 추가할 필요가 없습니다.

출력은 김발지만, 여기에는 일부 경로가 표시된 스니펫이 있습니다:

Prefix Verb URI Pattern Controller#Action
new_user_session GET /users/sign_in(.:format) devise/sessions#new
user_session POST /users/sign_in(.:format) devise/sessions#create
destroy_user_session DELETE /users/sign_out(.:format) devise/sessions#destroy
new_user_password GET /users/password/new(.:format) devise/passwords#new
edit_user_password GET /users/password/edit(.:format) devise/passwords#edit
user_password PATCH /users/password(.:format) devise/passwords#update
PUT /users/password(.:format) devise/passwords#update
POST /users/password(.:format) devise/passwords#create
cancel_user_registration GET /users/cancel(.:format) devise/registrations#cancel

출력에 표시된 경로는 라우트 파일에 devise_for :users 라인을 포함할 때 Devise에 의해 추가된 경로입니다. 이는 sign in, sign up, reset password 등의 작업에 대한 경로입니다.

이제 Devise에서 생성된 파일과 구성을 검토했으므로, 다음 명령어로 이전 단계에서 생성한 마이그레이션을 실행할 수 있습니다:

  1. bundle exec rails db:migrate

위의 명령어는 각 마이그레이션 파일에서 변경 사항을 데이터베이스에 적용합니다. 변경 사항은 파일에서 정의된 대로 순차적으로 적용되어야 합니다. Rails는 마이그레이션 실행 순서를 알아야 하기 때문에 파일 이름에 타임스탬프가 포함되어 있습니다.

다음과 같은 출력이 화면에 출력됩니다:

Output
== 20220908152949 DeviseCreateUsers: migrating ================================ -- create_table(:users) -> 0.0040s -- add_index(:users, :email, {:unique=>true}) -> 0.0012s -- add_index(:users, :reset_password_token, {:unique=>true}) -> 0.0011s == 20220908152949 DeviseCreateUsers: migrated (0.0074s) =======================

마이그레이션이 실행된 후에는 데이터베이스가 설정됩니다. 프로젝트에서 사용자 인증을 설정하는 데 필요한 모든 작업을 완료했습니다.

이 시점에서 Rails 서버를 재시작하세요:

  1. bundle exec rails server

이전에 언급한 이니셜라이저 파일은 Rails가 부팅될 때만 로드됩니다. Rails가 새로운 Devise 이니셜라이저 파일을 로드하고 사용자 인증을 위한 모든 설정을 완료할 수 있도록 서버를 재시작해야 합니다.

브라우저에서 http://localhost:3000/users/sign_up로 이동하면, 이메일과 비밀번호를 입력하여 계정을 생성할 수 있는 가입 양식이 표시됩니다. (다음 단계에서는 랜딩 페이지에서 가입 및 로그인 버튼을 추가하여 이 URL로 쉽게 이동할 수 있도록 만듭니다.)

인증을 테스트하기 위해 [email protected]과 같은 테스트 이메일과 비밀번호를 입력하세요.

가입하면 루트 페이지로 리디렉션됩니다. 이 페이지에는 Hello DigitalOcean!이 표시되며, 가입에 성공했다는 메시지가 표시됩니다. 다음과 같이 렌더링됩니다:

이 가입 성공 알림은 application.html.erb 파일에 추가한 <p class="notice"><%= notice %></p> 태그에 의해 표시됩니다.

이 시점에서 프로젝트에서 Devise를 사용하여 사용자 인증을 구성하고 샘플 계정을 사용하여 가입했습니다. Devise를 사용하여 애플리케이션의 요구 사항을 충족시키도록 구성하면서, Devise는 사용자 가입 경험을 용이하게 하는 라우트, 뷰 및 컨트롤러를 생성했습니다.

이제 가입 프로세스가 예상대로 작동하는 것을 확인했으므로, 다음 단계는 단계 2에서 만든 랜딩 페이지에 이 인증을 추가하는 것입니다. 다음 단계에서는 가입 페이지를 랜딩 페이지에 연결하여 사용자가 특정 URL로 이동하지 않아도 가입할 수 있도록합니다.

단계 5 – 인증을 랜딩 페이지에 연결하기

프로젝트에는 모든 기능이 설정되어 있지만, 여전히 Devise가 생성한 페이지를 랜딩 페이지에 연결해야 합니다. 이전 단계에서는 수동으로 /users/sign_up 페이지를 방문하여 로그인을 했습니다. 이번 단계에서는 랜딩 페이지에 필요한 링크를 추가하여 모든 페이지를 연결합니다. 또한 사용자의 상태에 따라 응용 프로그램에 로그인 또는 로그아웃할 수 있는 링크를 조건부로 표시합니다.

이를 위해 Devise의 몇 가지 도우미 메서드를 사용할 것입니다. Devise 젬에는 직접 구현하지 않고도 사용할 수 있는 많은 도우미 메서드가 포함되어 있습니다. 이렇게 하면 코드를 읽기 쉽고 유지하기 쉽게 만들 수 있습니다.

먼저 사용자가 로그인되어 있는지 확인하기 위해 코드를 추가하겠습니다. 사용자가 로그인되어 있다면 랜딩 페이지에는 사용자의 이메일과 응용 프로그램에서 로그아웃할 수 있는 링크가 표시됩니다. 사용자가 로그인되지 않은 경우 랜딩 페이지에는 로그인 페이지로 이동할 수 있는 링크가 표시됩니다.

편집할 app/views/home/index.html.erb 파일을 열고 강조된 줄을 추가하세요:

app/views/home/index.html.erb
<% if user_signed_in? %> 
 <div> Welcome <%= current_user.email %> </div> 
  <%= button_to "Sign out", destroy_user_session_path, method: :delete %> 
<% else %>
  <%= button_to "Sign in", new_user_session_path %> 
<% end %>
<h1>Hello DigitalOcean!</h1>

user_signed_in?은 Devise의 컨트롤러와 관련된 도우미 메서드에서 가져옵니다. 사용자가 로그인되어 있는지 여부를 확인하고 부울 true 또는 false 값을 반환합니다. 이 결과를 사용하여 사용자가 로그인되어 있는 경우 사용자의 계정 정보와 같은 다른 기능을 프로그래밍할 수 있습니다. 이 도우미 메서드에 대한 자세한 내용은 Devise GitHub 저장소에서 소스 코드를 확인할 수 있습니다.

current_user은 현재 응용 프로그램에 로그인한 사용자의 세부 정보에 액세스하는 Devise 도우미입니다. 예를 들어, [email protected]으로 로그인하면 current_user 도우미는 [email protected]에 대한 사용자 모델을 반환합니다. 따라서 current_user.email을 사용하면 결과로 [email protected]을 얻을 수 있습니다. Devise를 사용하면 이러한 로직을 처음부터 구현할 필요가 없어 시간과 노력을 절약할 수 있습니다.

마지막으로, 이 코드를 사용하여 랜딩 페이지에 로그인로그아웃 버튼을 추가했습니다. user_signed_in? 도우미 메서드의 결과에 따라 새로 추가된 로그인로그아웃 버튼을 사용하여 로그인 또는 로그아웃 옵션을 표시합니다.

특정 경로로 이동하는 버튼을 정의하기 위해 button_to 메서드를 사용하고 있습니다. 이러한 경로를 얻기 위해 도우미 메서드를 사용하고 있습니다: destroy_user_session_path/users/sign_out로 해석되고, new_user_session_path/users/sign_in로 해석됩니다. (이전 단계에서 언급한 대로 bundle exec rails routes를 실행하여 전체 경로 URL 도우미 목록을 검토할 수 있습니다.)

파일을 저장하고 닫으세요.

브라우저에서 페이지를 새로 고쳐서 변경 사항을 확인하세요.

이미 시도해보지 않았다면 페이지의 로그인 버튼을 클릭하여 /users/sign_in 경로를 방문하여 애플리케이션에 가입할 수 있습니다. 여기서 가입 링크를 클릭하여 새 계정을 만들 수 있습니다. [email protected]과 비밀번호와 같은 테스트 이메일을 입력하세요. 가입하면 다시 랜딩 페이지로 이동됩니다. 이제 랜딩 페이지에는 현재 로그인한 사용자의 이메일 주소와 로그아웃 버튼이 표시됩니다. 다음과 같이 표시됩니다:

또한 가입이 성공적으로 완료되었습니다라는 메시지도 받게 됩니다.

이로써 Devise 젬을 성공적으로 통합하고 애플리케이션에서 사용자 인증을 설정했습니다.

결론

이 튜토리얼에서는 Devise를 사용하여 Rails 앱에 사용자 인증을 추가했습니다. Devise의 도우미 메서드를 사용하여 사용자가 계정을 생성하고 가입하며 로그아웃할 수 있는 앱을 만들었습니다.

Devise와 추가 도우미 및 메서드에 대해 더 잘 이해하기 위해 Devise GitHub 리포지토리의 README 파일을 확인해보세요. 이 튜토리얼의 다음 단계로는 사용자가 로그인 여부에 따라 페이지에 Hello 사용자명과 같은 “안녕하세요 세계!” 인사말을 조건부로 렌더링해 볼 수 있습니다.

이 프로젝트의 코드는 DigitalOcean 커뮤니티 GitHub 저장소에서 찾을 수 있습니다.

Source:
https://www.digitalocean.com/community/tutorials/how-to-set-up-user-authentication-with-devise-in-a-rails-7-application