정상우
hELLO.
정상우
전체 방문자
382,743
오늘
77
어제
709
  • hELLO. (121)
    • 컴퓨터과학 (4)
      • 알고리즘 & 자료구조 (4)
    • 언어 & 프레임워크 (63)
      • Go (23)
      • PHP & Laravel (40)
    • 웹 (7)
    • 블록체인 (12)
      • 메인넷 (9)
      • 암호화폐 플랫폼 (3)
    • 포트폴리오 (10)
    • 칼럼 (20)
      • 에세이 (4)
      • 개발자스럽게 살기 (14)
      • 회고 (2)
    • 티스토리 (5)

블로그 메뉴

  • ⚡ 개발자 이력서
  • 🌟 깃허브
  • 💻 강의
  • ✨ 예제코드
  • ⭐ 브런치
  • 태그 클라우드
  • 방명록

공지사항

  • 2차 도메인을 설정했습니다 ✨

인기 글

  • JWT(JSON Web Token)의 개념부⋯
    2021.07.29
    JWT(JSON Web Token)의 개념부⋯
  • 'REST' 를 보다 'RESTful' 하게⋯
    2021.08.14
    'REST' 를 보다 'RESTful' 하게⋯
  • [Laravel] 라라벨 프레임워크⋯
    2021.06.10
    [Laravel] 라라벨 프레임워크⋯
  • 깃허브를 포트폴리오로 쓰려면⋯
    2021.12.25
    깃허브를 포트폴리오로 쓰려면⋯
  • 암호화폐 트레이딩 봇을 만들었⋯
    2021.05.12
    암호화폐 트레이딩 봇을 만들었⋯

태그

  • 개발 리뷰
  • 라라벨
  • 블록체인
  • Algorithm
  • 프로그래머스
  • go
  • php
  • 포트폴리오
  • 코딩테스트
  • 개발

최근 댓글

  • 고맙습니다 ~^^
    정상우
  • 오늘 블로그 만들었는데 검색하⋯
    엥뿌삐
  • 좋은 스킨 정말 감사드립니다.⋯
    이태홍
  • 고맙습니다 ㅎㅎ
    정상우
  • 제가 원하던 최고의 스킨입니다⋯
    _HEON

최근 글

  • 빠르게 성장하는 개발자의 세⋯
    2022.06.08
    빠르게 성장하는 개발자의 세⋯
  • 개발자와 엔지니어, 그 사이에서
    2022.05.10
    개발자와 엔지니어, 그 사이에서
  • 아임포트(Iamport)로 결제기능⋯
    2022.04.03
    아임포트(Iamport)로 결제기능⋯
  • 아임포트(Iamport)로 결제기능⋯
    2022.04.01
    아임포트(Iamport)로 결제기능⋯
  • [Laravel] 카페24 호스팅에 라⋯
    2022.03.29
    [Laravel] 카페24 호스팅에 라⋯

티스토리

hELLO · Designed By 정상우.
정상우

hELLO.

언어 & 프레임워크/PHP & Laravel

PHP: MVC(Model, View, Controller)

2020. 6. 29. 23:59

MVC(Model, View, Controller)

모델, 뷰, 컨트롤러로 분리하는 이 아키텍쳐는 많은 프레임워크에서 사용되는 개념이다. 모델은 코드상 어플리케이션에서 사용되는 데이터인 데이터베이스를 클래스화 시켜놓은 것이라고 볼 수 있다. 뷰는 말 그대로 보여주기만 한다. 마지막으로 컨트롤러는 모델과 소통하여 뷰에게 현재의 상태를 알려주게 되는 것이다.

 

물론 위의 설명이 정확한 것이라고 볼 수는 없겠지만, 대체로 모델은 '무엇' 을 어플리케이션에게 제공(대체로 데이터)할 것이며, 컨트롤러는 '어떻게' 처리할 것인지에 대한 것이라고 보면 좋겠다. 이를 코드로 한정지어 이해할 필요는 없다. 이를테면 위에서 모델은 '클래스화 시켜 놓은 것' 이라고 했지만, 그것은 단지 코드에서일 뿐이다.

모델

우리가 블로그를 만든다고 가정하고, 먼저 간단한 Post 모델을 만들어보자. 라라벨과 같은 프레임워크에서는 ORM(Object-relational mapping)을 사용하여 직접 데이터베이스에서 객체를 얻어오지만, 우린 그러지 않을 것이다. 간단하게 가자.

class Post
{
    public $title;
    public $content;
    public $id;

    public function __construct($id, $title, $content) 
    {
        $this->title = $title;
        $this->content = $content;
        $this->id = $id;
    }
}
DAO, DTO, VO 같은 개념을 그다지 좋아하지 않으므로 언급하지 않는다. 굳이 사용하고 싶지 않다.

뷰

자 그럼 이제 뷰를 다음과 같이 작성하자. 뷰는 그저 데이터를 보여주면 그만이다. 단순히 post 객체에 있는 본문을 출력 할 뿐이다. 이 녀석의 파일 이름은 HelloWorld.php 로 지었다. 굳이 언급하는 이유는 아래에서 쓸 것이기 때문이다.

echo $post->content;

view 라는 함수를 만들어보자. 이것은 컨트롤러에서 사용할 것이며 뷰를 반환할 때 사용할 것이다. 아래의 함수는 넘어온 스크립트를 포함(include)하고, 내부 스코프에서 변수를 선언해준다는 것 이외의 역할은 없다.

function view($view, $vars = []) 
{
    foreach ($vars as $name => $value) {
        $$name = $value;
    }
    
    include $view;
}

컨트롤러

컨트롤러를 사용할 때는 보통 라우터를 함께 사용한다. 따라서 우리는 라우터를 먼저 만들 것이다. 이것은 그다지 어렵지 않다. Route::add() 메서드는 라우트를 등록하고, Route::run() 메서드는 $_SERVER['REQUEST_METHOD'] 와 $_SERVER['PATH_INFO'] 와 같은 정보를 사용하여 현재 경로를 파악하고, 콜백함수를 실행시켜준다.

class Route
{
    private static $routes = [];

    public static function add($method, $path, $callback)
    {
        self::$routes[] = compact('method', 'path', 'callback');
    }

    public static function run()
    {
        return call_user_func(
            current(
                array_filter(self::$routes, fn ($route) => self::match($route['method'], $route['path']))
            )['callback']
        );
    }

    private static function match($method, $path)
    {
        return $method === strtolower($_SERVER['REQUEST_METHOD']) && ($path === ($_SERVER['PATH_INFO'] ?? '/'));
    }
}
메서드가 꼭 정적 메서드일 필요는 없다. 이는 그저 편의를 위해 만든 것이다.

자 그럼 이제, 컨트롤러를 하나 만들자. IndexController::index() 는 Post 를 하나 만들고, view 를 반환하게 된다.

class IndexController
{
    public static function index()
    {
        $post = new Post(
            1, 
            'Lorem Ipsum', 
            'Lorem Ipsum is simply dummy text of the printing and typesetting industry.'
        );
        
        return view('HelloWorld.php', compact('post'));
    }
}
일반적으로 새로운 포스트를 만들고 등록하는 일은 PostController::create() 에서 하게 될 터이나, 편의상 여기서 만든다.

index.php

이제 직접 서버를 돌릴 Document Root 에선 어떻게 해주면 좋을까? 간단하다. Route::add() 로 라우트를 등록하고, 그것을 실행해버리면 된다. 아주 간단하지 않은가?

 

참고로 라우터를 사용하면 레거시를 사용하듯 다수의 php 파일에서 고통받을 필요가 없어진다. index.php 에서 모든 요청을 처리하고 라우터가 알아서 컨트롤러 로직으로 찾아갈 수 있도록만 해주면 된다.

Route::add('get', '/', 'IndexController::index');

Route::run();

더 읽을거리

https://www.inflearn.com/course/php7-reboot

https://www.inflearn.com/course/php7-oop

PHP 카테고리 목차 및 문서 정리

2020년, PHP 언어가 가지는 의미

https://www.php.net/manual/en/

    '언어 & 프레임워크/PHP & Laravel' 카테고리의 다른 글
    • PHP: PSR(PHP Standard Recommendation)
    • PHP: 의존성 관리자 — Composer
    • PHP: 파일 업로드와 다운로드
    • PHP: 데이터베이스 (MySQLi, PDO)
    mvc, php
    정상우
    정상우
    과거의 배움으로 현재를 바꾸고 미래를 만듭니다. #25+2살 #INFJ #개발자 #브런치작가
    댓글쓰기
    다음 글
    이더리움: 이더리움과 스마트 컨트렉트
    이전 글
    PHP: 파일 업로드와 다운로드
    • 이전
    • 1
    • ···
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • ···
    • 121
    • 다음

    티스토리툴바