단순한 웹 사이트를 프로그래밍 할 때 좋은 (정확한) 아키텍처 란 무엇입니까?


28

간단한 웹 사이트 (예 : 연락처를 추가, 삭제 및 업데이트 할 수있는 연락처)를 작성할 때 index.php사용자가 로그인하지 않은 경우 비밀번호를 입력하도록 요청하고 올바른 비밀번호를 입력 하면 파일이 생성 됩니다. 세션을 할당하고 연락처와 특정 작업을 수행 할 수 있습니다.

두 개의 파일이 있습니다.

  1. 첫 번째 ( contacts.php)는 HTML 코드를 표시하는 것입니다. HTML 코드 위에 두 번째 파일을 포함시키고 클래스를 만듭니다.
  2. 두 번째 ( contacts_class.php)에는 추가, 삭제 및 업데이트에 대한 모든 방법이 포함되어 있습니다.

괜찮다고 생각하지만 큰 프로젝트를 구현하려면 어떻게해야합니까? 모든 페이지에 대해 폴더를 작성하고 파일을 위와 같이 HTML과 클래스와 같이 넣어야합니까? 어떻게해야합니까? 다른 모든 프로그래머가 완벽하게 이해할 수있는 대규모 프로젝트를 구축하기위한 우수하고 깔끔한 아키텍처는 무엇입니까?

답변:


67

당신은 매우 흥미롭고 근본적인 질문을 제기했습니다. 대규모 프로젝트 아키텍처 및 폴더 구조 구성 (아키텍처의 2 차)에 관한 질문입니다.

오늘날 CMS 프레임 워크 아키텍처를 구축하는 가장 일반적인 방법은 MVC 패턴을 사용하는 것입니다. 자신의 MVC 프레임 워크를 빌드하는 방법에 대한 좋은 기사가 있는데, 그중 하나는 PHP로 MVC 프레임 워크 빌드 입니다.

MVC는 Model, View, Controller의 약자입니다. MVC, HMVC, MVP 등 원하는 방식으로 이러한 접근 방식을 호출 할 수 있습니다. 본질은 시스템의 개별 구성 요소를 격리시키는 것입니다. "Controller"는 "Model"에서 데이터를 검색하여 최종 HTML을 렌더링하는 "View"로 보냅니다. 귀하의 'V' contacts.php및 귀하의 'MC'를 이미 구현했습니다 contacts_class.php. 따라서 모델과 컨트롤러에서 뷰를 분리했습니다. 이제 다른 부분은 그대로두고 "보기"를 쉽게 변경할 수 있습니다.

MVC, MVP 또는 "MV"패턴을 맹목적으로 따르는 것이 좋습니다. 적절성, 효능 및 맛의 문제이다.

일반적인 동적 웹 사이트 응용 프로그램에는 다음과 같은 구성 요소가 포함될 수 있습니다.

  • 진입 점은 index.php
  • 헬퍼 라이브러리 / 클래스
  • 요청 라우터
  • 모듈, 구성 요소 또는 컨트롤러
  • 템플릿 엔진 또는 단일 뷰

실제 웹 응용 프로그램에는 이벤트 핸들러, 이벤트 디스패처 및 후크와 같은 다른 구성 요소가 포함될 수 있지만 실제로는 미묘한 차이가 있습니다. 자, 그것을 발표하고 싶은 방식으로 발표하겠습니다 :

작동 루틴 다이어그램

일반적인 프레임 워크 작업 루틴은 다음과 같습니다.

  1. 브라우저 요청은 진입 점 실행 파일 / 스크립트 ( index.php) 로 직접 전송됩니다 .
  2. 진입 점 스크립트는 헬퍼 라이브러리, 클래스를로드하고 프로그래밍 환경의 추가 초기화를 수행합니다.
  3. URL은 요청 라우터 인스턴스로 전달됩니다. 이 단계는 2 단계의 일부일 수 있습니다.
  4. 요청 라우터는 URL을 구문 분석하고 작업을 특정 구성 요소, 모듈 또는 컨트롤러에 전달합니다.
  5. 컴포넌트 (또는 컨트롤러)는 라우팅 된 요청을 처리하고 렌더링 할 뷰로 데이터를 보냅니다.

해당 프로젝트 폴더 구조가 다이어그램에 표시됩니다.

다른 프레임 워크가 어떻게 구현되는지 조사 할 것을 제안합니다. 시작하는 데 권장되는 CMS / 프레임 워크는 CodeIgniter, OpenCart, Joomla 1.5 및 Tango CMS입니다.


3
그 이미지를 만들기 위해 무엇을 사용 했습니까? 좋은 답변입니다!
Mark Tomlin

3
내 답변에 대한 긍정적 인 평가에 감사드립니다! 정말 감사! 이 답변은 전적으로 제가 직접 수행 한 다양한 오픈 소스 웹 응용 프로그램 프레임 워크를 분석 한 결과입니다. 이미지 생성 방법 및 소프트웨어 사용 방법에 관심이있는 사용자를 위해 Inkscape 0.48 및 GIMP 2.6.10을 사용하여 이미지를 생성했습니다. 아무 문제 없습니다. 두 개의 레이어를 사용하십시오. 하나는 텍스트가있는 사각형 용이고 다른 하나는 그림자 (흐린 검은 색 사각형)입니다. 나는 당신이 나머지를 이해하는 것 같아요?

한 가지 질문은 왜 '컨택트'컨트롤러를 3 개의 파일로 분리하겠습니까? 그것들을 하나의 contacts.php로 결합하는 것이 더 깨끗하지 않습니까? 라우터에서 동작 매개 변수를 전달하기 만하면됩니다. 뷰가 템플릿 작업과 논리를 각 작업에 대해 하나의 파일로 혼합하지 않는 한 '연락처'보기에 대해서도 마찬가지입니다. 나는 PHP에서 많은 일을하지 않지만 (나는 주로 Python에서 일한다) 모든 프레임 워크 가이 접근법을 사용하지 않기를 바랍니다. 그렇지 않으면 훌륭한 쓰기를 위해 +1합니다.
Evan Plaice

2

어떤 질문을하고 어떤 솔루션을 사용할 수 있는지에 대한 아이디어를 얻으려면 Martin Fowler 의 Patterns of Enterprise Application Architecture 책을 추천합니다 . 그의 웹 사이트읽으면 책에 무엇이 있는지 알 수 있습니다

이 책은 이미 꽤 오래되었지만 (IT 부지에서는) 많은 원칙이 여전히 유효하거나 배우기 위해 배워야합니다. (말이 되나요?)

(소프트웨어) 아키텍처는 매우 광범위한 주제이며, 은색 총알을 기대하지 말고 시간과 돈이 다 ​​떨어질 때까지 항상 더 많은 질문과 의심을 받으십시오. 지금까지 최고의 솔루션을 고수해야합니다.


2

우선, 잘 개발 된 프로젝트를 살펴보십시오. Wordpress는 코드 구조의 매우 깔끔한 예입니다. 이해하기 쉽지만 많은 "플러그"를 제공합니다. 따라서 "플러그인"을 통해 워드 프레스를 쉽게 찾을 수 있습니다.

둘째, 아키텍처를 확인하는 가장 쉬운 방법은 단위 테스트를 작성하는 것입니다. 예를 들어 "Card Deck"클래스에 "shuffle ()"메서드가있는 경우 미리 정의 된 크기의 카드 데크 (예 : 5 개의 카드 1,2,3,4,5)를 생성하고 셔플을 호출하고 쉬운 결과 (ID 1,4,2,5,3)

전체 프로젝트 클래스를 인스턴스화하지 않고이를 수행 할 수 있어야하며 테스트는 읽기에 매우 깨끗해야합니다.

이를 수행 할 수없는 경우 클래스간에 레이어를 추가하고 쉽게 재구성 할 수있을 때까지 재구성해야합니다.

그런 다음 프로젝트의 모든 핵심 클래스에 대해이 단계를 반복하십시오.

마지막으로, 핵심 아키텍처가 아닌 클래스에서는 좋은 아키텍처가 "게으른"것일 수 있습니다 (경제의 문제입니다. 실제 환경에서는 디자인이 매우 비용이 많이 듭니다).


1

대규모 프로젝트에 적합한 아키텍처는 MVC (Model View Controller)입니다. http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller

그러나 다른 프로그래머가 그것을 이해하는지 여부는 완전히 다른 문제입니다. MVC는 복잡해질 수 있으며 때로는 소규모 프로젝트에는 과잉입니다. 그것의 장점 중 하나는 쉽게 확장된다는 것입니다.


그것은 아키텍처가 아닌 패턴입니다.
halfdan

나는이 경우에 그것들이 동일하다고 주장합니다. 두 가지를 어떻게 차별화하겠습니까? 또한 내가 게시 한 Wikipedia 페이지의 첫 줄을 읽습니다.
Chris Laplante

1
내 경험상 MVC는 복잡하지 않으며 소규모 프로젝트에서도 매우 유용합니다. 그러나 이것이 전체 아키텍처가 아니라 패턴이라는 데 동의합니다.
Danny Varod

MVC는 아키텍처 자체가 아니라 패턴이지만 아키텍처의 일부로 간주 될 수 있습니다. 그리고 결국 그렇게 복잡하지 않습니다.

1

질문을 올바르게 이해하면 기본적으로 아키텍처가 아니라 프로젝트 폴더 구조에 대해 이야기하고 있습니다. 내 이해가 정확하다면 계속 읽으십시오. 그렇지 않으면 질문을 편집하거나 의견을 남기면 그에 따라 답변을 편집하겠습니다.

응용 프로그램을 디자인하는 동안 (무엇을, 누구에게?)와 같은 몇 가지 기본적인 질문에 대답 한 후 구성 요소를 식별하고 기능과 책임에 따라 분류해야합니다. 내가 아는 두 가지 주요 방법이 있습니다. 구성 요소를 기반으로 분류하거나, 사용 사례 (로그인, 검색 등) 또는 리소스 (개체 ..)를 기준으로 분류 할 수 있습니다. 첫 번째 방법은 활동 지향이며 두 번째 방법은 자원 지향입니다. 전통적으로 대부분의 응용 프로그램은 활동을 기반으로 구성 요소를 분류합니다 (디자이너는 문제 도메인에서 솔루션 도메인으로 이전하는 동안 쉽게 알 수 있었지만).

구성 요소 분류가 식별되면 계층을 기반으로 분류를 식별해야합니다. 일반적인 웹 애플리케이션에는 View Tier, Model Tier 및 Controller Tier (MVC)가 있습니다. 물론 더 복잡한 응용 프로그램도있을 수 있습니다. (대부분의 실제 응용 프로그램은 이보다 간단합니다.)

이 두 분류법을 식별 한 후 각 계층을 식별하는 최상위 폴더를 만듭니다. (UI, 컨트롤러, 서비스, 유틸리티 등). 각 고급 폴더 아래에서 기능 또는 리소스 (프로젝트-/ EditProject-/ SearchProject 등)를 기반으로 하위 폴더를 만듭니다. 이상적으로 기능 분류는 다단계입니다.


리소스 지향 디자인과 활동 지향 디자인의 차이점에 대해서는 자세히 다루지 않았습니다. 막론 외에도 그 질문에 대해서는 확신이 없었습니다. 그러나 개인적으로 디자인의 명확성 (새로운 개발자가 기본 구성 요소 및 디자인을 얼마나 쉽게 이해할 수 있는지)과 관련하여 Resource Oriented Architecture가 더 좋습니다. 폴더 계층 구조 만 살펴보면 개발자는 전체 참여 리소스와 하위 리소스를 이해할 수 있으며 각 리소스에 대한 작업도 균일합니다.

1

좋은 아키텍처와 나쁜 아키텍처는 있지만은 총알은 없습니다. 아키텍처는 현재 및 미래의 가능한 요구 사항에 적합해야합니다.

좋은 지침은 응용 프로그램의 각 부분이 다른 부분에 미치는 영향을 최소화하면서 변경 될 수 있고 각 부분에 자동화 된 전체 적용 단위 및 통합 테스트가 있는지 확인하는 것입니다.


1

아키텍처는 장기적으로 계속 개발할 수 있도록하는 것입니다. 더 큰 응용 프로그램의 경우 여러 사람이 동시에 작업하고 중복 (DRY)을 피하여 프로젝트를 민첩하게 유지할 수 있도록 사물을 독립적으로 만드는 것 사이의 절충이 포함됩니다. PHP 프로젝트는 독립적으로 만들고 많은 양의 중복을 만드는 데 중점을 두는 경향이 있습니다.

다른 극단적 인 위치에 대해 좋은 느낌을 얻으려면 해변을 살펴보십시오.


1

큰 프로젝트를 구성하는 방법을 모른다면 몇 가지 좋은 PHP 프레임 워크 중 하나를 사용하여 다른 사람의 디자인 / 아키텍처를 빌려야합니다. CakePHP, CodeIgniter 또는 Symfony를 추천합니다. 이들 모두는 웹 개발에서 잘 작동하는 Model, View, Controller, MVC 패턴을 구현하며, 모두 가볍고 배우기 쉽습니다.

이러한 프레임 워크 중 하나를 알게되면 특정 프로젝트를위한 고유 한 구조를 설계 할 수 있습니다. 그러나 막 시작한 경우에는 다른 사람의 작업에 의존하고 바퀴를 재발 명합니다.


0

MVC는 가장 일반적으로 사용되는 아키텍처이며 대부분의 문제를 해결하는 것으로 입증되었습니다. 좋은 아키텍처는 다음과 같은 기능을 갖습니다.

  1. 단위 테스트 가능
  2. 우려의 분리
  3. 여러 사람이 충돌없이 작업 할 수 있습니다.
  4. 큰 문제없이 확장 가능
  5. 확장 가능할 수 있습니다. 대규모 프로젝트의 경우 확장 성이 주요 관심사입니다. 잘 작성되어 있고 잘 확장 될 수있는 Checkout Kohana 프레임 워크

0

프로덕션 코드를 작성하기 전에 2 주 (밤 :)가 걸리고이 책을 읽으십시오. 프로그래밍 아키텍처, 실습 및 패키징에 대해 오랫동안 마음을 바꿀 것입니다.

Prentice Hall의 민첩한 원칙, 패턴 및 사례 C #

예제는 C #에 있지만 쉽게 읽을 수 있습니다. 올바른 코드 구문을 작성하는 방법이 아니라 프로그래머로 생각하는 방법에 관한 것입니다.

나는 당신이 당신의 PC에서 가장 적합한 장소에 그것을 저장하고 그것을 알지 못하고 프로그래밍 한 것에 놀라게 될 것이라고 약속합니다. 그것은 당신의 생각을 바꿀 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.