모델, 뷰, 컨트롤러
MVC란 무엇인가요?
애플리케이션을 만들 때마다 적절한 파일을 쉽게 찾고 유지보수하기 위해 코드를 정리하는 방법을 찾아야 합니다. 대부분의 웹 프레임워크와 마찬가지로 CodeIgniter는 파일 정리를 위해 모델, 뷰, 컨트롤러(MVC) 패턴을 사용합니다. 이를 통해 애플리케이션의 데이터, 프레젠테이션, 흐름을 개별적인 부분으로 유지합니다.
각 요소의 정확한 역할에 대해서는 많은 견해가 있을 수 있지만, 이 문서는 당사의 입장을 설명합니다. 다르게 생각하신다면 필요에 따라 각 요소를 사용하는 방식을 자유롭게 수정할 수 있습니다.
모델(Models) 은 애플리케이션의 데이터를 관리하고 애플리케이션에 필요한 특별한 비즈니스 규칙을 적용하는 데 도움을 줍니다.
뷰(Views) 는 로직이 거의 없거나 아예 없는 단순한 파일로, 사용자에게 정보를 표시합니다.
컨트롤러(Controllers) 는 뷰(또는 이를 보는 사용자)와 데이터 저장소 사이에서 데이터를 주고받으며 관리하는 ‘접착제 코드’ 역할을 합니다.
가장 기본적으로 컨트롤러와 모델은 특정 작업을 수행하는 클래스일 뿐입니다. 물론 여러분이 사용할 수 있는 유일한 클래스 유형은 아니지만, 이 프레임워크가 설계된 핵심적인 사용 방식을 구성합니다. 이들은 app 디렉토리에 전용 저장 디렉토리가 있지만, 적절하게 네임스페이스가 지정되어 있다면 원하는 어디든 저장할 수 있습니다. 이에 대해서는 아래에서 더 자세히 논의하겠습니다.
세 가지 주요 구성 요소를 각각 더 자세히 살펴보겠습니다.
구성 요소
뷰(Views)
뷰는 가장 단순한 파일이며 일반적으로 소량의 PHP가 포함된 HTML입니다. PHP는 매우 간단해야 하며, 보통 변수 내용을 표시하거나 일부 항목을 루프하여 테이블에 정보를 표시하는 정도여야 합니다.
뷰는 컨트롤러로부터 표시할 데이터를 전달받으며, 컨트롤러는 간단한 echo 호출로 표시할 수 있는 변수 형태로 데이터를 뷰에 전달합니다. 뷰 내에서 다른 뷰를 표시할 수도 있어 모든 페이지에 공통 헤더나 푸터를 표시하는 것이 매우 간단합니다.
뷰는 일반적으로 app/Views에 저장되지만, 어떤 방식으로든 정리하지 않으면 금방 다루기 힘들어질 수 있습니다. CodeIgniter는 어떠한 조직 방식도 강요하지 않지만, 좋은 규칙 중 하나는 각 컨트롤러에 대해 Views 디렉토리에 새 디렉토리를 만드는 것입니다. 그런 다음 메서드 이름으로 뷰의 이름을 지정합니다. 이렇게 하면 나중에 뷰를 매우 쉽게 찾을 수 있습니다. 예를 들어, 사용자 프로필이 User라는 컨트롤러와 profile이라는 메서드에 표시될 수 있습니다. 이 메서드의 뷰 파일은 app/Views/user/profile.php에 저장할 수 있습니다.
이러한 조직 방식은 기본적인 습관으로 들여두기에 좋습니다. 때로는 다르게 구성해야 할 수도 있지만 문제없습니다. CodeIgniter가 파일을 찾을 수만 있다면 표시할 수 있습니다.
모델(Models)
모델의 임무는 애플리케이션을 위해 단일 유형의 데이터를 유지 관리하는 것입니다. 이는 사용자, 블로그 게시물, 거래 등이 될 수 있습니다. 이 경우 모델의 임무는 두 부분으로 나뉩니다. 데이터가 데이터베이스에서 추출되거나 데이터베이스에 입력될 때 비즈니스 규칙을 적용하는 것과 데이터베이스에서 데이터를 실제로 저장하고 검색하는 것을 처리하는 것입니다.
많은 개발자에게 어떤 비즈니스 규칙이 적용되는지 결정할 때 혼란이 옵니다. 이는 간단히 말해 데이터에 대한 모든 제한이나 요구 사항이 모델에 의해 처리됨을 의미합니다. 여기에는 회사의 표준을 충족하기 위해 저장되기 전의 원시 데이터를 정규화하거나, 컨트롤러에 전달하기 전에 특정 방식으로 컬럼 형식을 지정하는 것 등이 포함될 수 있습니다. 이러한 비즈니스 요구 사항을 모델에 유지함으로써 여러 컨트롤러에서 코드를 반복하지 않고 실수로 업데이트를 누락하는 일을 방지할 수 있습니다.
모델은 일반적으로 app/Models에 저장되지만, 필요한 방식으로 그룹화하기 위해 네임스페이스를 사용할 수 있습니다.
컨트롤러(Controllers)
컨트롤러는 몇 가지 다른 역할을 수행합니다. 가장 명확한 역할은 사용자로부터 입력을 받은 다음 어떻게 처리할지 결정하는 것입니다. 여기에는 데이터를 모델에 전달하여 저장하거나, 모델에 데이터를 요청한 다음 이를 뷰에 전달하여 표시하는 작업이 포함되는 경우가 많습니다. 또한 필요한 경우 모델의 범위를 벗어난 전문적인 작업을 처리하기 위해 다른 유틸리티 클래스를 로드하는 것도 포함됩니다.
컨트롤러의 또 다른 책임은 HTTP 요청과 관련된 모든 것(리다이렉트, 인증, 웹 보안, 인코딩 등)을 처리하는 것입니다. 요약하자면, 컨트롤러는 사용자가 해당 페이지에 접근할 수 있는지 확인하고, 필요한 데이터를 사용할 수 있는 형식으로 제공받을 수 있도록 하는 곳입니다.
컨트롤러는 일반적으로 app/Controllers에 저장되지만, 필요한 방식으로 그룹화하기 위해 네임스페이스를 사용할 수 있습니다.