티스토리 뷰

자라나라, M리M리!

M! 하면 M자형 탈모를 생각하셨다면! 아쉽게도 아닙니다.

해당 글에서는 루비온 레일즈의 MVC 패턴 중 M : Model에 대해서 이야기를 나눠보고자 합니다.

 

 

  • Model 간단 개념

레일즈에서 Model은 테이블의 연결관계(외래 테이블 참고), 데이터들의 집합을 뜻합니다.

 

 

  • Model 데이터베이스

레일즈에서 데이터베이스는 기본적으로 SQLite3 이 사용됩니다.

데이터베이스에 대한 상세한 설정은  config/database.yml  에서 할 수 있습니다.

 

현재는 SQLite3 및 Local DB로서 쓰이고 있지만 Remote DB 및, PostgreSQL 등 다양한 DB 환경에 대해서도 설정을 해서 사용할 수 있습니다.

 

 

  • Model Relationship

모델 표현관계는 다음과 같이 표현할 수 있습니다.

 

1) 하나의 게시글(post)에는 많은 댓글을 가지고 있다. (1:M)

class Post < ApplicationRecord
	has_many :comments
end

## has_many로 가리켜지는 모델은 끝에 s가 붙습니다.

 

2) 게시글(post)의 작성자는 User에 종속된다. (M:1)

class Post < ApplicationRecord
	belongs_to :user
end

## belongs_to 가리켜지는 모델은 이름이 '단수' 입니다.

3) 해시태그 Text는 다양한 게시물에서 쓰인다. (M:N)

class Post < ApplicationRecord
	has_and_many :tags, :through
end

 

 

  • 제약조건 명시

모델에서 작성되는 데이터에 있어, 제약조건을 명시할 수도 있습니다.

 

1) title에 작성되는 내용에 있어 동일한 내용(중복) 금지

class Post < ApplicationRecord
	validates_uniqueness_of :title
end

2) 종속된 데이터가 삭제되면 has_many 대상의 데이터도 함께 자동으로 삭제

class Post < ApplicationRecord
	has_many :comments, dependent: :destroy
end

3) 내용을 입력했는지 검사 (만약에 지정된 컬럼(에트리뷰트)에 내용을 안썼다면 error 메세지 반환)

class Post < ApplicationRecord
	## title, content에 내용을 안쓸 경우 에러 메세지 return
	validates :title, :content, presence: true
end

 

 

  • 데이터 탐색

홈페이지 내부에서 데이터를 불러올 시 서버 로그기록창에 다음과 같이 SQL문을 이용해서 가져온다.

보통 데이터는 SQL 쿼리 탐색을 통해 검색이 됩니다.

레일즈에서도 사용자가 홈페이지 방문에 있어 실제로 서버 내부를 보면 SQL 단위로 데이터 탐색이 이루어집니다.

 

하지만 View, Controller에서는 데이터를 가져올 때 있어 SQL이 아닌 객체를 참고해서 가져오는 방식입니다.

 

예를들어 Controller에서 hit_products라는 테이블에서 모든 데이터를 불러온다고 정의를 내린다 할 때

레일즈 내 표현 방식은

HitProduct.all

위와같이 표현을 하면 됩니다.

위와같이 HitProduct 라는 모델(객체)을 참조해서 데이터를 가져오는 방식을 ORM 이라고 합니다. 

* ORM : 테이블 내 데이터 검색에 있어 객체와 SQL 검색 방식을 서로 맵핑을 시켜주는 방식

 

그러나 결국 위와같은 표현은 다음 아래 SQL 표현과 동일하기도 합니다.

SELECT * FROM hit_products

 

Rails의 가장 큰 장점은 SQL 문법을 몰라도 됩니다.

하지만 이게 단점이 될 수도 있습니다.

 

 

  • Model 파일 생성

모델 파일은 다음 명령어를 이용해서 간단히 생성을 할 수 있습니다.

# rails generate model [Model 이름] [에트리뷰트들...]
rails generate model post title content:text

 참고  암묵적으로 Model 파일은 Controller의 파일 이름 규칙과는 다르게 단수 로 표현합니다.

- 간단 설명

1) post는 Model 파일의 이름

2) title과 content는 에트리뷰트 이름, 에트리뷰트는 기본적으로 string 타입을 가집니다.

  * title은 string 타입, content는 text 타입을 가집니다.

 

반대로, 모델을 제거하고 싶으면 다음과 같이 입력을 하면 됩니다.

# rails destroy model [모델이름]
rails destroy model post

 

db/migrate로 가시면 저희가 만들어낸 모델의 테이블을 확인해보실 수 있습니다.

## db/migrate/(기간)_create_posts.rb
class CreatePosts < ActiveRecord::Migration[5.2]
  def change
    create_table :posts do |t|
      t.string :title
      t.text :content

      t.timestamps
    end
  end
end

 

하지만 여기서 끝이 아닙니다.

저희는 해당 테이블에 대해 테이블 전체를 관리하는 스키마 파일에 적용을 해야합니다.

아래 명령어를 입력하면 스키마에 테이블이 업데이트가 된게 확인이 됩니다.

rake db:migrate

 

혹시 반대로 모든 데이터(DB)의 기록을 없애고 싶을 경우 다음 명령어를 입력해주세요.

rake db:drop

 

 

  • Model 관리 유의사항

이미  rake db:migrate  까지 마친 Model에 있어,  db/migrate/(기간)_create_(테이블명).rb  파일에 가서 새로운 컬럼(에트리뷰트)을 생성할 땐 신중히 생각해주세요.

 

예를들어 Post 모델은 title, content 컬럼(에트리뷰트)만 가지고 있었고, 이미 DB Migrate까지 마친 상태입니다.

하지만 nickname 컬럼(에트리뷰트)를 새로 추가하고 싶은 상태입니다.

## 20191031110610_create_posts.rb
class CreatePosts < ActiveRecord::Migration[5.2]
  def change
    create_table :posts do |t|
		t.string :title
		t.text :content
		t.string :nickname

		t.timestamps
    end
  end
end

위와같이 migrate 파일을 열람해서 내용을 수정하고  rake db:migrate  를 시도하면 아무런 반응이 없습니다.

만약에 중간에 테이블 내 컬럼(에트리뷰트)을 추가하고 싶을 경우 2가지 방법이 존재합니다.

 

1) Drop 후 migrate 파일 수정 후, 다시 Migrate

데이터를  rake db:drop  후 migrate 파일에 대해 내용을 수정 후, 다시  rake db:migrate  시 새로 추가된 컬럼(에트리뷰트)이 반영이 된게 확인합니다.

대신 이 방법은 모든 데이터를 날려야 하므로 이미 운영되는 서비스에 대해선 적합하지 않습니다.

 

2) Migrate 파일을 새로 추가해서 추가 에트리뷰트(컬럼) 반영

Drop을 할 수 없는 상황이라면 제일 추천드리고 싶은 방법입니다.

# rails g migration add_FieldName_to_ModelName FieldName
rails g migration add_nickname_to_post nickname:string

 참고  rails generaterails g 라고 줄여서 쓸 수 있습니다.

 

위 코드의 예시는 posts 테이블에 nickname이라는 컬럼(에트리뷰트)를 추가하는 방법입니다.

새로운 컬럼의 속성을 설명하는 migrate 파일을 생성 후,  rake db:migrate  시 제대로 반영이 된게 확인이 됩니다.

 참고  테이블 데이터를 열람하는 위 기능은 rails_db 라는 Gem을 활용한 겁니다.

 

루비온 레일즈 Ruby on Rails ROR

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2023/09   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함