Erzsamatory Weblog


※ 외국 문서 번역 자료입니다.

원문: Fundamentals - Best MVC Practices
http://goo.gl/b3Nfqp


Yii Framework의 모델-뷰-컨트롤러 패턴


모델-뷰-컨트롤러 패턴은 거의 모든 웹 개발자들에게 알려졌지만, 아직까지도 실제 어플리케이션 개발에 있어서는 많은 사람들이 MVC 패턴을 제대로 사용하지 못 하고 있습니다. MVC를 기반으로 하는 프로그래밍의 가장 중요한 목적은 코드의 재사용성과 개발의 분리성입니다. 이 글에서는 Yii Framework를 통하여 웹 어플리케이션을 개발할 때의 MVC 패턴에 대한 가이드라인에 대해서 설명하도록 하겠습니다.

Yii 웹 어플리케이션 개발에 있어서의 MVC 패턴 가이드라인을 제대로 설명하기 위하여, 다음과 같이 하나의 웹 어플리케이션은 여러 개의 서브 어플리케이션으로 구성된다는 것을 전제로 하겠습니다.

  • Front End 일반적인 인터넷 유저와 가장 가깝게 위치하고 있는 웹 어플리케이션의 한 요소입니다. 검색엔진 크롤러가 접근할 수 있는 모든 영역이라고 보면 됩니다.
  • Back End 웹 사이트의 관리자만 접근할 수 있는 웹 어플리케이션의 한 요소입니다. 한 가지 예를 들자면, 익스프레스 엔진의 관리자 페이지와 티스토리의 관리자 페이지가 있습니다.
  • Console 웹 어플리케이션의 전체적인 제어를 위하여 터미널 윈도우에서 실행되는 어플리케이션입니다. 때문에 일반 웹 유저가 직접적으로는 이 어플리케이션에 접근할 수는 없으며, 정해진 작업을 할 때에만 터미널 윈도우에서 이 어플리케이션이 실행됩니다.
  • Web API 써드 파티 어플리케이션과의 통합을 위한 인터페이스를 제공하는 일종의 웹 프로그래밍 규약입니다.

위에서 설명했던 서브 어플리케이션은 웹 어플리케이션 모듈의 한 부분으로서 작동되거나 다른 서브 어플리케이션과의 정보 교환을 위하여 Yii Framework의 자체적인 웹 어플리케이션으로서  실행됩니다.


1. 모델 (Model)


모델은 웹 어플리케이션의 근본적인 데이터 처리를 하는 가장 대표적인 요소입니다. 일반적으로 모델은 Yii 웹 어플리케이션의 서브 어플리케이션들 사이에서 공유될 수 있습니다. 예를 들어, LoginForm 모델은 Font End와 Back End 서브 어플리케이션 모두에서 사용될 수 있습니다. 또한 News 모델은 Console commands, Web APIs 그리고 Font End와 Back End 서브 어플리케이션 모두에서 사용될 수 있습니다. 그러므로 모델은 다음과 같이 설명될 수 있습니다.

  • 모델은 특정한 데이터의 처리를 위한 정확한 속성 값을 포함하고 있어야 합니다.
  • 출력되는 데이터가 웹 어플리케이션의 설계 요건(웹 어플리케이션 초기 설계도)을 만족시키기 위하여, 모델은 사용자 인증 정책과 같은 비즈니스 로직을 포함하고 있어야 합니다.
  • 모델은 테이블 데이터를 제어할 수 있는 모든 코드를 포함하고 있을 수 있습니다. 예를 들어, 데이터 검색 결과를 보여주는 SerarchForm 모델은 실제 검색을 위한 검색 방법에 관한 내용을 포함하고 있어야 합니다.

Yii Framework 기반으로 웹 어플리케이션을 개발하다보면, 위에서 설명했던 맨 마지막 조건에 의하여 모델 스크립트의 크기가 매우 커지는 일이 종종 발생합니다. 한 개의 모델 클래스가 너무 많은 스크립트를 포함하고 있는 것입니다. 이렇게 된다면, 그 모델의 작동이 원할하지 않았을 경우에 유지 및 보수하는 과정이 매우 복잡해집니다. 쉬운 이해를 위하여 News 모델을 예로 들자면, 이 모델은 Font End 서브 어플리케이션에서 접근할 수 있는 getLatestNews 메소드와 Back End 서브 어플리케이션에서만 접근할 수 있는 getDeletedNews 메소드를 포함하고 있습니다. 이와 같은 설계된 모델은 규모가 작은 어플리케이션에서는 어느정도 괜찮습니다. 하지만 규모가 큰 어플리케이션에서는 이와 같은 설계가 적합하지 않습니다. 규모가 큰 어플리케이션에서는 모델의 유지 및 보수 효율성 강화를 위하여 다음과 같은 지침을 따라야 합니다.

  • Font End와 Back End 서브 어플리케이션에서 모두 사용될 수 있는 NewsBase 모델 클래스를 정의합니다. NewsBase 클래스는 기타 News 클래스의 부모 클래스가 됩니다.
  • 각각의 서브 어플리케이션에 NewsBase를 부모 클래스로 하는 News 모델 클래스를 정의합니다. 이 News 클래스 파일에는 각각의 서브 어플리케이션에서 필요로 하는 스크립트만 포함됩니다.

따라서 위의 예제에 효율적인 모델 설계 방법을 적용한다면, Font End 서브 어플리케이션에서만 접근할 수 있고, getLatestNews 메소드를 포함하는  News 모델 클래스와 Back End 서브 어플리케이션에서만 접근할 수 있고, getDeletedNews 메소드를 포함하는 News 모델 클래스가 각각 생성될 것입니다.

일반적으로 모델에는 데이터 로직을 직접적으로 제어하는 코드가 포함되어서는 안 됩니다. 위에서 설명했던 모델 설명에 좀 더 상세한 설명을 추가하자면 다음과 같습니다.

  • 모델에서는 사용자의 요청을 직접적으로 수정하는데 사용될 수 있는 $_GET, $_POST 또는 이와 비슷한 역할을 수행하는 변수를 사용하면 안 됩니다. 모델은 각각의 서브 어플리케이션에서 따로 작동되는 것이기 때문에, 모델에서는 Yii 웹 어플리케이션 전체에 영향을 미치는 사용자의 요청을 수정하는 작업은 할 수 없습니다. 사용자의 요청 변수인 $_GET, $_POST 등과 같은 변수는 컨트롤러에 의해서만 수정되어야 합니다.
  • 모델에서는 HTML이나 기타 웹브라우저에 출력될 수 있는 소스코드를 사용해서는 안 됩니다. 외부에 출력될 수 있는 소스코드는 뷰 스크립트에서만 다루어져야 합니다.


2. 뷰 (View)


뷰는 사용자의 요청에 따라 모델에서 가공된 데이터를 최종적인 결과물로 재변환하여 출력해주는 스크립트입니다. 일반적으로 뷰는 다음과 같이 설명될 수 있습니다.

  • 뷰는 HTML과 같은 웹브라우저에 출력될 수 있는 소스코드를 포함하고 있어야 합니다. 웹브라우저 출력에 꼭 필요한 간단한 데이터 처리를 위한 PHP 소스코드 역시 포함될 수 있습니다.
  • 뷰에는 데이터베이스 쿼리를 실행할 수 있는 소스코드가 포함되면 안 됩니다. DB 쿼리 실행 소스코드는 모델에 포함되어야 합니다.
  • 사용자의 요청을 처리할 때 사용되는 $_GET, $_POST 또는 이와 비슷한 역할을 하는 변수에 직접적으로 접근하는 소스코드의 사용을 피해야 합니다. 이와 같은 작업은 컨트롤러에서 수행되어야 합니다. 뷰에서는 사용자의 요청 변수나 기타 데이터베이스 데이터에 접근하는 것보다는 웹브라우저에 적당한 HTML을 출력하는 소스코드만 사용되어야 합니다.
  • 뷰에서는 모델이나 컨트롤러의 메소드나 프로퍼티에 접근할 수 있습니다. 단, 이와 같은 작업은 결과 값 출력에 꼭 필요한 경우에만 허용됩니다.

뷰는 다음과 같이 매우 다양한 곳에서 재사용될 수 있습니다.

  • Layout 페이지 헤더나 풋터와 같은 일반적인 레이아웃 뷰 스크립트를 의미합니다.
  • Partial Views 레이아웃을 포함하고 있지 않은 부분적인 뷰 스크립트를 의미합니다. Partial View는 화면 출력 스크립트의 한 부분으로서써, 여러 곳에서 재사용될 수 있습니다. 예를 들어, _form.php 뷰 스크립트는 input form을 출력하는 부분적인 뷰 스크립트인데, 이 뷰는 create와 update 두 개의 페이지에서 모두 사용될 수 있습니다.
  • 위젯 뷰 스크립트에서 여러 개의 로직이 사용되어야 하는 경우에는, 이 뷰 스크립트는 그 로직을 포함하고 있는 클래스를 포함하는 하나의 위젯이 될 수도 있습니다.
  • Helper Classes 뷰 스크립트를 개발할 때 개발자는 종종 데이터 포맷 변경이나 HTML 태그를 변환하는 간단한 작업을 필요로 하는 경우가 있습니다. 이 때에는 그 간단한 작업을 수행하는 스크립트를 뷰 파일에 직접 포함시키는 것보다는 뷰 헬퍼 클래스에 포함시키는 것이 더 좋습니다. 이렇게 하면 개발자는 뷰 스크립트에서 헬퍼 클래스만 사용하면 됩니다. Yii Framework에는 HTML 소스코드를 자동으로 생성해주는 헬퍼 클래스인 CHtml 헬퍼 클래스를 기본적으로 제공하고 있습니다. 헬퍼 클래스는 개발자가 직접 불러올 수도 있지만, 이 클래스 파일을 자동 로드가 가능한 디렉터리에 저장하는 경우에는 따로 헬퍼 클래스를 불러오는 과정 없이 헬퍼 클래스를 뷰 스크립트에서 사용할 수 있습니다. 자동 로드가 가능한 디렉터리에 관한 자세한 설명은 [2014/02/27 2-9 기본개념: 경로 별칭과 네임스페이스] 글을 참고하십시오.


3. 컨트롤러 (Controller)


컨트롤러는 Yii Framework 웹 어플리케이션에서 매우 중요한 역할을 담당하고 있습니다. 컨트롤러는 개발된 뷰와 모델 그리고 기타 필요한 구성요소들을 통합하여 웹 어플리케이션이 제대로 실행될 수 있도록 해줍니다. 모델이나 뷰에서는 할 수 없었으나, 컨트롤러에서는 사용자의 요청을 직접적으로 제어할 수 있습니다. 그러므로 컨트롤러는 다음과 같이 설명될 수 있습니다.

  • 컨트롤러는 $_GET, $_POST 또는 이와 비슷한 역할을 하는 변수에 접근할 수 있습니다.
  • 컨트롤러는 모델 클래스의 인스턴스를 생성하고, 해당 인스턴스를 직접적으로 관리합니다. 예를 들어, 일반적인 모델과 업데이트 액션을 생각해보면 다음과 같습니다. 컨트롤러는 가장 먼저 모듈 클래스의 인스턴스를 생성합니다. 그리고 난 후, 컨트롤러는 $_POST로 입력된 사용자 요청 정보를 통하여 모델에서 원하는 결과 값을 받아옵니다. 컨트롤러는 사용자가 결과 값을 확인할 수 있도록 웹브라우저의 화면을 리다이렉트합니다. 꼭 기억해야 하는 것은 실제 결과에 사용될 수 있는 데이터를 생성하는 작업은 컨트롤러가 아닌 모델에서 해야 한다는 사실입니다.
  • 컨트롤러는 SQL 쿼리 구문을 포함하지 않아야 합니다. 데이터베이스 처리 작업은 모델에서 해야 하는 역할입니다.
  • 컨트롤러에는 HTML 마크업이나 기타 웹브라우저 출력 소스코드가 포함되어 있으면 안 됩니다. 이와 같은 것들은 뷰에 포함되어야 합니다.

잘 설계된 MVC 패턴의 웹 어플리케이션이라면, 컨트롤러의 스크립트 분량은 몇 줄의 코드만 포함하고 있을 정도로 매우 가벼워야 합니다. 반면에, 모델은 데이터의 처리를 위한 모든 스크립트를 포함해야 하므로, 모델 스크립트의 분량은 매우 방대해질 것입니다. 그 이유는 모델에 포함되어 있는 데이터 구조와 비즈니스 로직은 웹 어플리케이션의 특수성을 의미해야 하는 이유 때문입니다. 컨트롤러는 이러한 모델의 작업을 지원하는 역할만 할 뿐이고, 그렇기 때문에 그 스크립트의 분량은 축소될 수 밖에 없습니다. 이와 같은 컨트롤러의 역할은 프레임워크 아래에서 좀 더 축소됩니다. 왜냐하면 프레임워크가 하나의 컨트롤러의 역할을 하기 때문입니다.


목차
1. 시작하기
     1-1. Yii란 무엇인가?
     1-2. 설치
     1-3. 아파치 웹서버와 Nginx 설정
     1-4. 첫 Yii 어플리케이션 생성

2. 기본 개념
     2-1. 모델-뷰-컨트롤러 (MVC)
     2-2. 엔트리 스크립트
     2-3. 어플리케이션
     2-4. 컨트롤러
     2-5. 모델
     2-6.
     2-7. 컴포넌트
     2-8. 모듈
     2-9. 경로 별칭과 네임스페이스
     2-10. 일반 규칙
     2-11. 개발 흐름 (Workflow)
     2-12. MVC 예제 (현재 페이지)

3. 양식(Form) 사용 연습
     3-1. 개요
     3-2. 모델 생성
     3-3. 액션 생성
     3-4. 양식 생성
     3-5. 테이블 추출
     3-6. 양식 생성기 사용하기

4. 데이터베이스 사용 연습
     4-1. 개요
     4-2. DB 액세스 객체
     4-3. 쿼리 빌더
     4-4. 동적 레코드
     4-5. Relational Active Record
     4-6. 데이터베이스 변환

5. 캐싱
     5-1. 개요
     5-2. 데이터 캐시
     5-3. 부분 캐시
     5-4. 페이지 캐시
     5-5. 동적 컨텐츠

6. Yii 확장
     6-1. 개요
     6-2. 확장 사용하기
     6-3. 확장 생성하기
     6-4. 써드파티 라이브러리 사용하기

7. 테스트
     7-1. 개요
     7-2. Defining Fixtures
     7-3. Unit Testing
     7-4. Functional Testing

원문: http://www.yiiframework.com/doc/guide/
http://www.erzsamatory.net/trackback/140

건전한 댓글 문화를 만들어주시기 바랍니다 ^^
불건전한 댓글이 등록되는 경우 관리자의 임의적 판단으로 삭제될 수 있음을 미리 공지드립니다.

비밀글로 작성하기