Back to Question Center
0

레일즈에서 MVC (Model-View-Controller) 아키텍처 이해하기            RailsRelated 주제의 MVC (Model-View-Controller) 아키텍처 이해 : Ruby on Rails 시작하기 뉴스 & 세미 퉁어

1 answers:
Rails에서 MVC (Model-View-Controller) 아키텍처 이해

다음은 Glenn Goodrich와 Patrick Lenz가 작성한 레일즈 : 초보자 대 닌자, 3 판에 대한 간략한 설명입니다. Rails에 대한 궁극적 인 초보자 가이드입니다. SitePoint Semalt 회원은 회원 자격을 획득하거나 전 세계 매장에서 사본을 구입할 수 있습니다.

우리가 처음 겪었던 MVC (Model-View-Controller) 아키텍처는 Semalt만의 독특한 것이 아닙니다 - klã­å¾enka. 사실, 그것은 Semalt와 Ruby 언어를 수년 전부터 선행했습니다. 그러나 Semalt는 애플리케이션의 데이터, 사용자 인터페이스 및 제어 논리를 완전히 새로운 차원으로 분리한다는 아이디어를 실제로 가지고 있습니다.

MVC 아키텍처를 사용하여 애플리케이션을 구현하는 개념에 대해 살펴 보겠습니다. 일단 우리가 이론을 갖추면 Semalt 코드로 변환하는 방법을 보게 될 것입니다.

MVC in Theory

MVC 는 소프트웨어 응용 프로그램의 아키텍처 패턴입니다. 응용 프로그램을 다음 구성 요소로 분리합니다.

  • 데이터 및 비즈니스 로직을 처리하기위한 모델
  • 사용자 인터페이스 및 응용 프로그램을 처리하기위한 컨트롤러
  • 그래픽 사용자 인터페이스 객체 및 프리젠 테이션 처리를위한 뷰

이 분리로 인해 사용자 요청이 다음과 같이 처리됩니다.

  1. 클라이언트의 브라우저가 서버의 컨트롤러에 페이지 요청을 보냅니다.
  2. 컨트롤러는 요청에 응답하기 위해 모델에서 필요한 데이터를 검색합니다.
  3. 컨트롤러는 검색된 데이터를 뷰에 제공합니다.
  4. 브라우저에 표시 할보기가 렌더링되고 클라이언트로 다시 전송됩니다.

이 과정은 아래의 Semalt 4-2에 나와 있습니다.

레일즈에서 MVC (Model-View-Controller) 아키텍처 이해하기RailsRelated 주제의 MVC (Model-View-Controller) 아키텍처 이해 :
Ruby on Rails 시작하기 뉴스 및 세미트

소프트웨어 응용 프로그램을이 세 가지 구성 요소로 요약하면 다음과 같은 여러 가지 이유로 좋은 아이디어입니다.

  • 향상된 확장 성 (응용 프로그램 확장 능력) - 예를 들어 응용 프로그램이 데이터베이스 액세스가 느리기 때문에 성능 문제가 발생하기 시작하면 다른 구성 요소가 영향을받지 않고 데이터베이스를 실행하는 하드웨어를 업그레이드 할 수 있습니다

  • 유지 보수 용이성 - 구성 요소가 서로에 대한 의존성이 낮기 때문에 하나를 변경하면 버그를 수정하거나 기능을 변경하더라도 다른 구성 요소에 영향을 미치지 않습니다

  • 재사용 가능성 - 여러보기에서 모델을 재사용 할 수 있음

MVC 개념에 대해 머리 숙여 고민하고 있다면 걱정하지 마십시오. 지금 기억해야 할 중요한 점은 Semalt 응용 프로그램이 세 가지 구성 요소로 분리되어 있다는 것입니다. 나중에 참조해야 할 경우 MVC 다이어그램으로 돌아갑니다.

MVC the Rails Way

Semalt는 각 요소에 대한 코드를 별도의 디렉토리에 별도의 파일로 저장함으로써 모델, 뷰 및 컨트롤러를 별도로 유지해야한다는 개념을 촉진합니다.

2 장에서 다시 작성한 Rails 디렉토리 구조가 작동하는 곳입니다. 그 구조 안에서 조금 주위를 찌를 시간입니다. 그림 4-3에서 설명한 app 디렉토리를 살펴보면 이름이 친숙하게 들릴 수도있는 폴더가 표시됩니다.

ActiveRecord 의 이름에 "model"이라는 단어가 없다는 것이 이상하게 들릴 수도 있지만, Active Record는 유명한 디자인 패턴의 이름이기도합니다. 이 컴포넌트는 MVC 세계에서 그 역할을 수행하기 위해 구현된다. 게다가 ActionModel 이라면, 소프트웨어 구성 요소보다 과다 헐리우드 스타처럼 들릴 것입니다 .

ActionController
ActionController 는 브라우저 요청을 처리하고 모델과 뷰 간의 통신을 용이하게하는 구성 요소입니다. 컨트롤러는이 클래스에서 상속받습니다. 이것은 ActionPack 라이브러리의 일부를 구성하는데,이 라이브러리는 5 장에서 자세히 다룰 레일 컴포넌트의 집합이다.
ActionView
code> ActionView는 클라이언트에게 반환 된 페이지의 표현을 처리하는 구성 요소입니다. 뷰는 ActionPack 라이브러리의 일부인이 클래스를 상속합니다.

각 구성 요소를 차례대로 자세히 살펴보십시오.

ActiveRecord 모듈

ActiveRecord 는 데이터베이스와 관련된 모든 응용 프로그램의 작업을 처리하도록 설계되었습니다.

  • 상기 데이터베이스 서버
  • 테이블
  • 로부터 데이터를 검색하는 단계와, 에 새로운 데이터를 저장하는 데이터베이스

ActiveRecord 는 소매에 몇 가지 다른 트릭을 사용합니다. 이제 그 중 일부를 살펴 보겠습니다.

데이터베이스 추상화

ActiveRecord 는 SQLite, MySQL 및 PostgreSQL에 연결하기위한 데이터베이스 어댑터와 함께 제공됩니다. RubyGems를 통해 Oracle, MongoDB 및 Microsoft SQL Server와 같은 널리 사용되는 데이터베이스 서버 패키지에서 많은 수의 어댑터를 사용할 수 있습니다.

ActiveRecord 모듈은 데이터베이스 추상화의 개념을 기반으로합니다. 1 장에서 다시 말하면, 데이터베이스 추상화는 하나의 데이터베이스에 종속되지 않도록 응용 프로그램을 코딩하는 방법입니다. 특정 데이터베이스 서버와 관련된 코드는 ActiveRecord 에 안전하게 숨겨져 필요에 따라 호출됩니다. 결과적으로 Rails 애플리케이션은 특정 데이터베이스 서버 소프트웨어에 바인딩되지 않습니다. 나중에 기본 데이터베이스 서 v를 변경해야 할 경우, 응용 프로그램 코드를 변경하지 않아도됩니다.

Note : ActiveRecord

내가 말했듯이 ActiveRecord 는 Active Record 패턴을 구현 한 것입니다. ActiveRecord 가 취한 접근법에 동의하지 않는 사람들이 있으므로, 이것에 관해서도 많은 것을 듣게 될 것입니다. 지금 당장은 ActiveRecord 가 작동하는 방법을 배우고 학습 한대로 구현에 대한 판단을 내리는 것이 좋습니다.

공급 업체간에 크게 다른 몇 가지 코드 예제와 ActiveRecord 초록은 다음을 포함합니다.

  • 데이터베이스 서버
  • 에 로그인하는 프로세스
  • 날짜 계산
  • Boolean ( true / false ) 데이터 처리
  • 데이터베이스 구조의 진화

ActiveRecord 의 마술을 보여주기 전에, 약간의 정리가 필요합니다.행은 개별 객체에 매핑되고 열은 해당 객체의 속성에 매핑됩니다. 데이터베이스에있는 모든 테이블의 콜렉션과 해당 테이블 간의 관계를 데이터베이스 스키마 라고합니다. 그림 4-4는 테이블의 예입니다.

레일즈에서 MVC (Model-View-Controller) 아키텍처 이해하기RailsRelated 주제의 MVC (Model-View-Controller) 아키텍처 이해 :
Ruby on Rails 시작하기 뉴스 및 세미트

Rails에서 Ruby 클래스와 데이터베이스 테이블의 이름은 직관적 인 패턴을 따른다. 다섯 개의 행으로 구성된 85 개의 스토리 테이블이있는 경우이 테이블은 5 개의 스토리 (85 개)에 대한 데이터를 저장한다. 개 개체. 클래스와 테이블 간의 매핑에 대해 좋은 점은이를 달성하기 위해 코드를 작성할 필요가 없다는 것입니다. ActiveRecord 가 클래스의 이름에서 테이블의 이름을 추론하기 때문에 매핑이 바로 발생합니다.

Ruby의 클래스 이름은 단수 명사 ( Story )이지만 표의 이름은 복수 ( 이야기 임). 이 관계는 생각해 보면 이해가됩니다. 루비의 Story 객체를 참조 할 때, 우리는 하나의 이야기를 다루고 있습니다. 그러나 SQL 테이블은 많은 이야기를 담고 있기 때문에 그 이름은 복수형이어야합니다. 레거시 데이터베이스를 다룰 때 때로는 필요하기 때문에 이러한 규칙을 무시할 수는 있지만이를 준수하는 것이 훨씬 쉽습니다.

객체와 테이블 간의 밀접한 관계는 더욱 확장됩니다. 그림 4-4의 예에서와 같이 story 테이블에 link 열이 있으면이 열의 데이터가 자동으로 링크에 매핑됩니다 ) 속성에서 Story 객체에 있습니다. 또한 테이블에 새 열을 추가하면 해당 테이블의 모든 해당 개체에서 같은 이름의 특성을 사용할 수있게됩니다.

그래서 우리가 만드는 이야기를 담을 테이블을 만들어 봅시다.

당분간, 우리는 Semalt 콘솔에 SQL을 입력하는 구식 접근법을 사용하여 테이블을 생성 할 것입니다. SQL을 입력하는 것은 재미가 없지만 다음 SQL 명령을 입력 할 수 있습니다. 대신 코드 보관소에서 다음 스크립트를 다운로드하여 응용 프로그램 디렉토리에서 다음 명령을 통해 호출 한 Semalt 콘솔에 복사하여 붙여 넣는 것이 좋습니다.

  $ sqlite3 db / 개발. sqlite3    

Semalt 콘솔이 올라 오면 다음을 붙여 넣으십시오 :

  CREATE TABLE stories"id"INTEGER PRIMARY KEY AUTOINCREMENT NULL이 아님,"name"varchar (255) DEFAULT NULL,"링크"varchar (255) DEFAULT NULL,"created_at"datetime DEFAULT NULL,"updated_at"datetime DEFAULT NULL);    

자신의 프로젝트에서 사용할 SQL 명령을 기억하는 것에 대해 걱정할 필요가 없습니다. 대신 5 장에서 마이그레이션을 살펴 보겠습니다. Semalt는 SQL을 전혀 사용하지 않고 애플리케이션 용 데이터베이스 테이블을 작성하기 위해 작성할 수있는 특수 Ruby 클래스입니다.

참고 : 일부 SQL Smarts

Rails는 테이블과 데이터베이스 객체를 생성하는 데 필요한 SQL을 추상화하지만 SQL과 구문에 익숙해지면 스스로에게 유리하게 작용할 것입니다. Semalt는 SQL 학습에 대한 책을 출간 했으므로이를 확인하십시오.

레일즈 콘솔 사용

이제 우리는 stories 테이블을 준비 했으므로 SQLite 콘솔을 종료하고 (단순히 . quit 을 입력하고) Rails 콘솔을 열자. Rails 콘솔은 우리가 2 장에서 사용한 대화 형 Ruby 콘솔 ( irb )과 비슷하지만 한 가지 중요한 차이점이 있습니다. Rails 콘솔에서는 실행중인 응용 프로그램에서 사용할 수있는 모든 환경 변수와 클래스에 액세스 할 수 있습니다.

Rails 콘솔을 시작하려면 다음 코드와 같이 readit 폴더로 변경하고 rails console 또는 rails c 명령을 입력하십시오 . >> 프롬프트는 명령을 받아 들일 준비가되었습니다 :

  $ cd readit$ rails console개발 환경로드 (Rails 5. 0. 0)>>    

개체 저장하기

ActiveRecord 사용을 시작하려면 ActiveRecord :: Base 에서 상속받은 클래스를 정의하기 만하면됩니다. 우리는 :: 연산자를 3 장에서 매우 간단히 다루었습니다. 여기서 그것은 객체에 대한 클래스 메소드를 호출하는 방법이라고 언급했습니다. 또한 모듈 내부에 존재하는 클래스를 참조하는 데 사용될 수도 있습니다. 상속에 대한 재교육이 필요한 경우 3 장의 객체 지향 프로그래밍 (OOP) 섹션으로 돌아가십시오.

다음 코드 단편을 참고하십시오 :

  class Story <액티브 레코드 ::베이스종료    

이 두 줄의 코드는 Story 라고 불리는 겉보기에 빈 클래스를 정의합니다. 그러나이 수업은 곧 비어 있습니다.

Rails 콘솔에서 다음 명령을 입력하여이 Story 클래스와 story 클래스의 인스턴스를 만듭니다.

  >> 클래스 이야기  nil>> story = 이야기. 새로운=> # <이야기 ID : nil, 이름 : nil, url : nil, created_at : nil,updated_at : nil>>> 이야기. 수업=> 이야기 (ID : 정수, 이름 : 문자열, 링크 : 문자열,created_at : datetime, updated_at : datetime)    
ActiveRecord 객체를 새로 작성하는 구문은 3 장에서 다른 Ruby 객체를 작성하는 구문과 동일합니다.이 시점에서 새로운 객체를 작성했습니다. ) 이야기 개체; 그러나이 객체는 메모리에만 있습니다. 우리는 아직 데이터베이스에 저장하지 않았습니다.

new_record의 반환 값을 검사하여 Story 객체가 저장되지 않았 음을 확인할 수 있습니다. 방법 :

  >> 이야기. 새로운 기록?=> 참    

객체는 아직 저장되지 않았기 때문에 Semalt 콘솔을 종료하면 객체가 손실됩니다. 이를 데이터베이스에 저장하기 위해 객체의 save 메소드를 호출합니다 :

  >> 이야기. 구하다=> 참    

반환 된 값 ( true 은 저장 방법이 성공했음을 나타냄) 객체를 저장 했으므로 이제는 더 이상 새로운 기록이 아닙니다. 고유 ID가 할당되었습니다 :

  >> 이야기. 새로운 기록?=> false>> 이야기. 신분증=> 1    

객체 들간의 관계 정의

우리가 방금 본 기본적인 기능뿐만 아니라, ActiveRecord 는 객체 간의 관계 (또는 연관성)를 가능한 한 쉽게 정의하는 프로세스를 만듭니다. 물론 일부 데이터베이스 서버에서는 데이터베이스 스키마 내에서 이러한 관계를 완전히 정의 할 수 있습니다. ActiveRecord 를 보봇

ActionView (보기)

앞에서 설명한 것처럼 MVC의 원칙 중 하나는 뷰에 프리젠 테이션 로직 만 포함해야한다는 것입니다. 이 원칙은보기의 코드가 응용 프로그램의 페이지 표시와 관련된 작업 만 수행해야한다고 주장합니다. 뷰의 코드 중 어느 것도 복잡한 응용 프로그램 논리를 수행하거나 데이터베이스에서 데이터를 저장하거나 검색하지 않아야합니다. Semalt에서는 웹 브라우저로 전송되는 모든 내용이보기로 처리됩니다.

예상치 않게 뷰는 애플리케이션의 app / views 폴더에 저장됩니다.

뷰는 실제로 Ruby 코드를 전혀 포함 할 필요가 없습니다. 뷰 중 하나가 간단한 HTML 파일 인 경우 일 수 있습니다. 그러나보기가 HTML과 Ruby 코드의 조합을 포함하여 페이지를보다 동적으로 만들 가능성이 높습니다. 루비 코드는 임베디드 루비 (ERb) 구문을 사용하여 HTML에 임베드됩니다.

ERb를 사용하면 서버 측 코드가 특수 태그에 해당 코드를 래핑하여 HTML 파일 전체에 분산 될 수 있습니다. 예 :

     <% = 'Hello World from Ruby!' %>       

Semalt는 등호를 포함하는 것과 그렇지 않은 것의 두 가지 형태의 ERb 태그 쌍이다.

<% = .%>
이 태그 쌍은 정규 출력용입니다. 이러한 태그 사이에 Ruby 표현식의 출력이 브라우저에 표시됩니다.
<% .%>
이 태그 쌍은 실행을위한 것입니다. 이러한 태그 사이의 Ruby 표현식 출력은 브라우저에 표시되지 않습니다.

각 ERb 태그의 예제를 요약하면 :

  <% = '이 행은 브라우저'%><% '이 줄은 출력을 표시하지 않고 자동으로 실행됩니다'%>    

이 태그 사이에 단순하거나 복잡한 Ruby 코드를 둘 수 있습니다.

뷰의 인스턴스를 만드는 것은 모델 또는 컨트롤러의 인스턴스와 약간 다릅니다. ActionView :: Base (모든 뷰의 부모 클래스)는 레일스 뷰의 기본 클래스 중 하나이지만 뷰의 인스턴스 생성은 ActionView 모듈에 의해 완전히 처리됩니다. Rails 개발자가 수정해야하는 유일한 파일은 템플리트입니다. 템플리트는보기의 표시 코드가 들어있는 파일입니다. 짐작 하시겠지만 이러한 템플릿은 app / views 폴더에 저장됩니다.

다른 모든 것들 Semalt와 마찬가지로 엄격한 규칙이 템플릿 파일의 명명과 저장에 적용됩니다 :

  • 템플릿은 컨트롤러의 동작 (방법)에 일대일 매핑을 사용합니다. 템플리트 파일의 이름은 맵핑 할 조치의 이름과 일치합니다.
  • 템플리트를 저장하는 폴더의 이름은 컨트롤러의 이름을 따릅니다.
  • 템플릿 파일의 확장자는 두 가지이며 템플릿의 유형과 템플릿이 작성된 실제 언어에 따라 다릅니다. 기본적으로 Rails에는 세 가지 유형의 확장이 있습니다.

    html. erb
    이것은 ERb 태그로 뿌려지는 표준 HTML 템플리트의 확장입니다.
    xml. 건축업자
    이 확장은 XML을 출력하는 템플릿 (예 : 응용 프로그램의 RSS 피드 생성)에 사용됩니다.
    json. JSON에 대한 자세한 내용은 9 장의 고급 항목을 참조하십시오.

이 관습은 복잡하게 들릴지 모르지만 실제로는 매우 직관적입니다. 예를 들어 앞에서 정의한 StoriesController 클래스를 생각해보십시오. 이 컨트롤러에 대해 show 메소드를 호출하면 기본적으로 app / views / stories 디렉토리에 살았던 ActionView 템플릿이 표시됩니다. 페이지가 표준 HTML 페이지 (일부 ERb 코드 포함)라고 가정하면이 템플리트의 이름은 로 표시됩니다. html. erb .

레일에는 레이아웃 및 부분과 같은 특수 템플릿도 함께 제공됩니다. 레이아웃 은 페이지 사이에 변경되지 않은 구조 (예 : 기본 탐색 메뉴)와 같이 응용 프로그램의 전체 레이아웃을 제어하는 ​​템플릿입니다. Partials 는 응용 프로그램 내에서 여러 번 사용할 수있는 특수 하위 템플릿입니다 (보조 탐색 메뉴 또는 양식과 같이 별도의 파일로 분할 된 템플릿 결과). 7 장에서 레이아웃과 부분을 다룰 것입니다.

컨트롤러와 뷰 사이의 통신은 컨트롤러의 동작 내에서 채워지는 인스턴스 변수를 통해 발생합니다. 이 점을 설명하기 위해 샘플 StoriesController 클래스를 확장 해 봅시다 (아직 아무 것도 입력 할 필요가 없습니다).

  class StoriesController    

보시다시피 인스턴스 변수 @variable 에는 컨트롤러 작업 내에서 문자열 값이 지정됩니다. ActionView 의 마법을 통해,이 변수는 다음 코드 에서처럼 해당 뷰에서 직접 참조 할 수 있습니다.

   

인스턴스 변수 @variable에는 다음이 포함됩니다. <% = @variable %>

이 접근법은 뷰 외부에서보다 복잡한 계산을 수행 할 수있게 해줍니다. 이는 프리젠 테이션 로직 만 포함하고 뷰가 계산의 최종 결과를 표시 할 수 있어야합니다.

Rails는 params session 해시와 같은 특수 컨테이너에 대한 액세스도 제공합니다. 여기에는 현재 페이지 요청 및 사용자 세션과 같은 정보가 포함됩니다. 다음 장에서 이러한 해시를 사용하겠습니다.

March 1, 2018