상세 컨텐츠

본문 제목

최고의 PHP 프레임워크 라라벨의 A to Z를 설명한 책: 어썸 라라벨, 실전 프로젝트로 배우는 라라벨 입문서

책 속으로

by 비제이퍼블릭 2023. 5. 2. 09:49

본문

 

PHP는 레거시 프로젝트가 많고 대규모 비즈니스에는 어울리지 않는다고 생각한다면 그건 철 지난 이야기가 아닐까요? 전 세계 수많은 웹 시스템의 기반이 되는 대표 서버 사이드 스크립트 언어 PHP는 과거 보안이나 성능 이슈가 있기도 했습니다. 인기가 많고 자유도가 높아 레거시 프로젝트도 많았고요. 하지만 지금 PHP는 한 걸음 더 나아갔어요.

PHP7은 PHP5.6보다 속도가 두 배 이상 빠르고 PHP8은 JIT(Just in Time)컴파일러 도입으로 성능이 최대 2배까지 향상됐습니다. 이에 더해 PHP 역사에 한 획을 그을 만한 사건이 일어나죠. 바로 라라벨의 등장입니다. 라라벨은 PHP를 사용하여 웹 어플리케이션을 개발할 때 사용하는 프레임워크입니다. 라라벨을 이용하면 프로젝트에 규칙을 부여해 레거시 프로젝트를 줄일 수 있고 패키지 매니저인 컴포저(Composer)를 활용해 다른 오픈 소스 패키지를 포함시킬 수 있는 등 많은 장점이 있습니다.

JAVA 진영의 스프링 프레임워크와 마찬가지로 MVC 패턴에 따라 코드를 작성하기에 구조적으로 잘 짜인 애플리케이션을 구성할 수도 있습니다. 프레임워크로 구조를 강제하면 각 회사 프로젝트 디렉터리 구조 차가 적어져서 유지보수가 용이해요. 설계 시 아키텍처에 대한 고민을 덜 수 있어 비즈니스 로직에 집중할 수 있기도 하고요.

라라벨 프레임워크, 우리 솔루션에도 한 번 적용해보고 싶다고요? 그럼 오늘 설명할 내용이 많은 도움이 될 거예요. 오늘은 라라벨 핵심구조를 압축적으로 정리해보려 합니다. 프레임워크 사용에는 구조 이해가 필수이니까요! 자, 그럼 함께 라라벨을 구성하는 4가지 뼈대를 만나볼까요?

 

 

1.MVC 패턴

 

앞서 말한 것처럼 라라벨은 MVC 구조로 설계되었습니다. MVC 패턴은 코드로 데이터를 제어하는 모델, 화면을 관리하는 뷰, 모델과 뷰를 이어주는 컨트롤러까지 세 부분으로 분리합니다. 이렇게 기능에 맞게 소스를 분리하면 중복 코드도 줄어들고 기능별로 모듈화돼서 확장성과 재사용성도 높아진다고 해요!

조금 더 자세히 설명해 볼까요? 사용자가 댓글을 쓰고 입력 버튼을 누르면 댓글이 달리게 되는데요. 화면에서 댓글을 입력하고 입력 버튼을 누르는 건 뷰의 영역입니다. 컨트롤러는 화면으로부터 받은 데이터를 알맞게 가공해 모델로 보내죠. 그러면 모델은 DB에 댓글 데이터를 저장하게 됩니다. 저장한 데이터는 다시 모델, 컨트롤러로 전송되고 뷰는 데이터를 받아 화면에 새 댓글을 추가합니다.

2. Model

 

MVC 패턴에 대해 어느 정도 이해가 되셨나요? 그럼 라라벨의 MVC는 타 MVC 프레임워크와 비교해 어떤 특징이 있는지도 알아봐야겠죠? 먼저 Model부터 알아볼까요? 라라벨의 모델은 데이터베이스 테이블과 1:1 매핑됩니다. 각 칼럼은 프로퍼티로 매핑하면 되고요.

 

$pdo = new PDO(...); 
   $sth = $pdo->prepare("SELECT * FROM users"); 
     if ($sth->execute()) { 
         $users = []; 

         while ($user = $sth->fetchObject()) { 
         array_push($users, $user); 
  } 
}

3. View

 

라라벨은 블레이드라는 뷰 전용 템플릿을 사용하고 있습니다. Mustache, Twig등의 템플릿을 사용해 본 경험이 있다면 어렵지 않게 익힐 수 있습니다.

블레이드 템플릿은 레이아웃 템플릿을 상속하거나 컴포넌트와 슬릇 등의 개념을 사용해 마크업을 구성할 수 있어요.

@if (Route::has('login'))
 <div class="sm:fixed sm:top-0 sm:right-0 p-6 text-right">
@auth
 <a href="{{ url('/home') }}" class="font-semibold text-gray-600 
    hover:text-gray-900 dark:text-gray-400 dark:hover:text-white focus:outline 
    focus:outline-2 focus:rounded-sm focus:outline-red-500">Home</a>
@else
 <a href="{{ route('login') }}" class="font-semibold text gray-600 hover:text-gray-900 dark:text-gray-400 dark:hover:text-white 
     focus:outline focus:outline-2 focus:rounded-sm focus:outline-red-500">Log 
 in</a>
    @if (Route::has('register'))
        <a href="{{ route('register') }}" class="ml-4 font-semibold 
        text-gray-600 hover:text-gray-900 dark:text-gray-400 dark:hover:text white focus:outline focus:outline-2 focus:rounded-sm focus:outline-red 500">Register</a>
    @endif
    @endauth
 </div>
@endif

위 소스는 resources/views/welcome. blade.php 파일 속 블레이드 템플릿 예시입니다. 컴포넌트와 슬릇은 마크업 코드를 모듈화한 소스입니다. 슬릇이 더 작은 개념이라서 컴포넌트안에 여러 개의 슬릇을 넣을 수 있죠.

4. Controller

 

이번엔 라라벨 컨트롤러를 살펴봐요. 컨트롤러(Controller)에는 어플리케이션의 주요 로직이 담겨있습니다. 사용자가 HTTP 요청을 하고 라우터를 통해 컨트롤러에 도달하는 과정을 알아볼까요? 라라벨은 프론트 컨트롤러(Front Controller)를 사용해 사용자의 모든 요청을 public/index.php로 모으게 됩니다.

Index.php에서는 어플리케이션을 부드스트래핑하고 PSR-4 Autoloader Standard에 따라 오토로더를 초기화한 뒤, 사용자의 요청을 주소에 맞게 각 컨트롤러로 전달하게 됩니다.

index.php에 오토로터가 설정되면 include, require 등의 PHP 문법을 사용하지 않고 use를 통해 필요한 기능을 불러올 수 있습니다.

그 다음으로 살펴볼 건 라우터입니다. 라우터에 컨트롤러 클래스를 등록하면 각 URL과 클래스를 매핑시킬 수 있습니다.

Route::get('/', \App\Http\Controllers\WelcomeController::class);

 

등록 후, 루트로 들어온 데이터가WelcomeController 클래스와 매핑되어 안전하게 전달될 수 있겠죠?

라우터를 거쳐 컨트롤러로 사용자의 요청을 전달하기 전 미들웨어(Middleware)라는 계층을 하나 더 통과하게 됩니다. 미들웨어는 세션을 활성화하고 CSRF 토큰과 인증된 사용자인지 확인하는 일을 할 수 있습니다.

app/Http/Kernel.php 소스에서 라라벨 미들웨어에 대해 확인이 가능하니 더 알아보고 싶다면 소스를 열어보는 것도 좋겠습니다.

5. 컨테이너

 

의존성 주입이 어떤 개념인지 알고있나요? 의존성 주입은 외부에서 생성자, 메서드, 세터(Setter)에 파라미터를 통해 객체를 넣는 것을 말합니다. 의존성 주입을 사용하지 않고 비즈니스 로직 내부에서 객체를 생성하면 클래스 간 결합도가 증가해서 유연성이 떨어지게 돼요.

보통 서비스 프로바이더에 등록하면 되고 아래 3가지 방법을 사용할 수 있어요.

1.타입 힌트를 통한 오토 와이어링

use Illuminate\Http\Request; 
   
  class WelcomeController extends Controller { 
      public function __invoke(Request $request) { return view('welcome'); } 
   }

위 소스에서는 Illuminate\Http\Request를 주입 받고 있습니다. Request를 타입힌트만 했을 뿐인데도 올바르게 동작하는 걸 알 수 있어요.

2.헬퍼함수 사용

use Illuminate\Http\Request;

public function __invoke() { 
    // $request = app(Request::class); 
    $request = app()->make(Request::class); 
    return get_class($request); // Illuminate\Http\Request 
}

app() 함수를 사용해 의존성을 해결하는 걸 볼 수 있어요. resolve()를 사용해 같은 기능을 구현하기도 합니다.

그 외 app->make(), app->bind()를 쓸 수도 있는데 클래스보다는 인터페이스를 통한 의존성 해결에 많이 사용됩니다.

app->when()을 사용하면 특정 문맥에 따라 의존성 해결법을 제공할 수도 있습니다. 인터페이스 Qux를 만족하는 객체를 WelcomeController에서 사용할 때만 Quux를 반환해 볼까요?

use App\Controllers\WelcomeController; 
use App\Qux; 
use App\Quux; 
use App\Quuz; 

public function register() { 
    $this->app->when(WelcomeController::class) 
         ->needs(Qux::class) 
         ->give(Quux::class); 
   $this->app->bind(Qux::class, Quuz::class); 
}

 

3. 서비스 프로바이더

서비스 프로바이더는 라라벨 어플리케이션에 기능을 제공하기 위해 사용됩니다. 라우트, 이벤트, 브로드캐스팅, 인증 등을 예로 들 수 있어요.

기본적으로 라라벨 프레임워크 템플릿의 기본 서비스 프로파이더들은 app/Providers에 존재하니 이곳의 소스를 분석하면 서비스 프로바이더를 이해하는 데 도움을 받을 수 있을 거예요.

라라벨에는 지연된 서비스 프로바이더라는 기능도 있습니다. 어플리케이션이 부트스트래핑될 때 서비스 프로바이더를 로드하는 게 아니라 의존성 해결이 필요한 경우에만 로드하고 등록해 쓸 수 있어서 효율적입니다.

 

4. 파사드

라라벨의 파사드(Facades)를 이용하면 세션, 큐와 같은 라라벨의 기능을 정적 메서드의 형태로 사용할 수 있답니다. 아래 소스를 보면서 파사드의 개념을 익혀보세요!

use Illuminate\Contracts\View\Factory; 
use Illuminate\Support\Facades\View; 

class WelcomeController extends Controller { 
   public function __invoke(Factory $factory) { 
     return view('welcome'); // Helper Functions 
     return View::make('welcome'); // Facades 
     return $factory->make('welcome'); // Dependency Injections 
  } 
}
 

 

오늘은 이렇게 라라벨의 핵심 내용을 쭉 정리해봤는데요. 모든 내용은 정상우 개발자의 《어썸 라라벨》을 참고했어요.

어썸라라벨은 라라벨의 기능을 나열하는 백과사전식 개념서가 아닌 개발할 때 꼭 이해해야 하는 내용을 뽑아 자세히 설명했답니다. 문서만 나와도 찾을 수 있는 내용은 배제하고 라라벨 개발자라면 꼭 고민해야 하는 내용들을 담았어요.

사실 간단한 개념이나 단순 문법은 공식 문서만 봐도 알 수 있잖아요? MVC 패턴이나 의존성 주입이 무엇인지 라라벨은 이런 개념들을 어떻게 적용했는지, 의존성 주입을 구현하는 여러 방법과 각 방법의 차이점 등 큰 그림을 중심으로 공부하다 보면 라라벨과 수월하게 친해질 수 있을 거라고 해요.

핵심 로직이 담겨있는 라라벨 기본 소스를 분석해보는 것도 좋겠죠? 어썸 라라벨 한 권으로 라라벨 아키텍처를 완벽히 이해하고 실전 프로젝트까지 도전해보세요!

 

책 구매하러 가기▼

관련글 더보기

댓글 영역