Notice
Recent Posts
Recent Comments
Link
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

개발 기록

Laravel 이해하고 쓰자(시작/서비스 컨테이너) 본문

웹 자료/Laravel

Laravel 이해하고 쓰자(시작/서비스 컨테이너)

기록개발자 2020. 5. 20. 09:44

이 글의 목적은 Laravel을 사용하기 전 Laravel이 어떠한 방식으로 동작하는지 알기 위해 작성되었고 Laravel 5.7버전의 한글 공식문서를 기반으로 작성했습니다.

 

Laravel 시작

Laravel 애플리케이션 안 모든 요청의 시작점은 public/index.php로 부터 시작합니다. 그리고 해당 파일은 많은 코드를 가지고 있지 않습니다. 하지만 해당 파일은 프레임워크의 나머지 부분을 로딩할 시작점이 됨으로 중요한 역할을 수행한다.

 

HTTP/Console 커널(Kernel)

다음으로 애플리케이션이 시작된 유형에 따라 전송된 요청을 HTTP 커널이나 콘솔 커널 둘 중 하나로 보냅니다.

이 두가지의 커널은 모든 요청의 흐름 중심에서 작동하게 되고 여기에서는 app/Http/Kernel.php 에있는 HTTP 커널에 초점을 맞춰 봅시다.

 

HTTP 커널 

  1. Illuminate\Foundation\Http\Kernel 클래스를 상속

  2. 요청을 실행하기 전에 처리되는 bootstrappers (시작 코드)의 배열을 정의하고 있습니다. 이 시작 코드들은 에러          처  리, 로그 설정, 애플리케이션 동작 환경의 감지 등 실제로 요청이 처리되기 전에 수행해야 되는 작업들을 의미          합 니다.

  3. HTTP 커널은 애플리케이션에서 요청이 처리되기 전에 통과해야하는 HTTP 미들웨어의 목록을 정의하고 있습니다.       이 미들웨어들은 HTTP 세션을 읽고/쓰고, 애플리케이션이 유지 관리 모드인지 확인하고, CSRF 토큰을 확인 하는 작       업들을 처리합니다.

HTTP 커널의 handle 메소드의 사용법은 매우 간단합니다. 단순하게는 Request 를 받고 Response를 반환합니다. 커널을 애플리케이션 전체를 나타내는 하나의 큰 블랙 박스라고 생각해봅시다. HTTP 요청이 입력되면 HTTP 응답이 반환됩니다.

 

서비스 프로바이더(Service Provider)

서비스 프로바이더는 라라벨 프레임워크의 패키지 또는 익스텐션을 부팅해주는 매커니즘 정도로 이해하면 됩니다.

 

서비스 프로바이더의 역할 - 커널 부팅(부트스트래핑 - 맨아래 설명) 과정의 가장 중요한 것 중의 하나는 애플리케이션의 서비스 프로바이더를 로딩하는 것입니다. 애플리케이션의 모든 서비스 프로바이더는 config/app.php 파일의 providers 배열에 설정되어 있습니다. 먼저, 모든 서비스 프로바이더의 register 메소드가 호출되고, 이후에 등록 된 모든 서비스 프로바이더의 boot 메소드가 호출되어 집니다.

서비스 프로바이더는 프레임워크의 데이터베이스, 큐, validation, 라우팅 컴포넌트와 같은 다양한 컴포넌트의 부트스트래핑(부팅과 같은 기초 작업들)의 처리를 책임집니다. 프레임워크가 제공하는 모든 기능을 초기화 하고 설정하는 것으로, 서비스 프로바이더는 라라벨의 부팅(부트스트래핑) 과정에서 가장 중요한 기능이라고 할 수 있습니다.

 

서비스 프로바이더의 개념 및 용도, 외부 프로바이더를 등록하는 방법을 알아야 방대하고 강력한 라라벨 패키지를 원활하게 사용할 수 있으며 적절한 외부 패키지 사용은 NIH(Not invented here) 신드롬을 방지하고  프로젝트 자체에 집중할 수 있는 좋은 방법입니다.

 

요청 처리 - 디스패칭

애플리케이션이 부팅(부트스트래핑)되고 모든 서비스 프로바이더가 등록된 후, Request는 라우터 처리를 위해서 전달될 것입니다. 라우터는 라우팅 또는 컨트롤러로 요청-request을 전달할뿐만 아니라, 임의의 특정 라우트에 지정된 미들웨어도 실행합니다.

 

서비스 컨테이너(Service Container)

공식문서의 정의

라라벨의 서비스 컨테이너는 클래스의 의존성을 관리하고 의존성을 주입하는 강력한 도구 입니다. 의존성 주입이라는 멋진 말의 의미는 다음과 같습니다: 클래스간의 의존성은 클래스 생성될 때 또는 경우에 따라 "setter" 메소드에 의해서 "주입" 된다는 의미입니다.

 

의존성 주입이라는 말을 이해하자.

의존성 주입이란, 기존에 존재하는 디자인 패턴 중의 하나로 DI (Dependency Injection)이란 말로 많이 알려져 있습니다.

(구성요소 간의 의존 관계가 소스코드 내부가 아닌 외부의 설정 파일 등을 통해 정의되게 하게 만드는 것)

 

의존성 주입을 배제한 코드 예시

class TestLaravel{
 public function __construct() {
  $sql = new Mysql();
 }
}

class Mysql {
}

class Test {
 public function test(){
  $testLaravel = new TestLaravel();
 }
}

위의 코드에서 문제는 TestLaravel 클래스는 Mysql클래스를 의존하고 있는 것입니다. Mysql 하나만 사용하면 문제가 없지만 추후에 MongoDB 등 다른 DB를 필요로 하는 작업이 추가가 된다고 가정해봅시다.

100개 200개의 작업이 요청됐을때 골치 아파집니다. 1개의 작업마다 인스턴스를 새로 작성해주어야하기 때문이죠.

 

그래서 필요한 것이 의존성 주입입니다. 아래는 위의 비의존성 주입 코드에서 의존성 주입을 적용한 코드입니다.

class TestLaravel{
 protected $sql = null;

 public function __construct(DBInterface $sql) {
  $this->sql = $sql
 }
}

class Mysql implements DBInterface{
}
class MongoDB implements DBInterface{
}

interface DBInterface {
}


class Test {
 public function test(){
  $mongoDB = new MongoDB();
  $mysql = new Mysql();
  $mongoDBTestLaravel = new TestLaravel($mongoDB);
  $mysqlTestLaravel = new TestLaravel($mysql);
 }
}

의존성 주입을 적용함의 차이는 Interface를 사용한다는 점입니다.

Interface를 사용함으로써, 어떠한 작업에 상관없이 먼저 인스턴스를 만들고나서 값을 적용하게 되기 때문에 TestLaravel Class의 수정이 따로 필요없으므로 작업의 속도가 훨씬 빨라질 수 있게 됩니다.

 

의존성 주입과 서비스 컨테이너의 상관관계는

서비스 컨테이너는 프로바이더의 $this->app 속성을 통해서 컨테이너 인스턴스에 접근할 수 있다는 점입니다.

$this-app이 서비스 컨테이너 자체이자 위의 예제에서 썼던 인터페이스 역할을 하고 있는 것입니다.

$this->app->bind('HelpSpot\API', function ($app) {
    return new HelpSpot\API($app->make('HttpClient'));
});

위의 예제는 라라 벨 공식 홈페이지의 예제입니다.

$this-app을 이용하여 컨테이너 인스턴스에 접근한 뒤 bind메서드를 사용하여 HelpHelpSpot\API의 인스턴스를 의존성 주입하는 모습입니다.

 

$this-app이 서비스 컨테이너 인스턴스에 접근할 수 있다는 점을 기억해야 합니다.

 

Bootstrapping(부트스트래핑) 설명

아래 전문을 간단히 요약하자면 웹페이지가 요청을 받았을때 일련의 과정을 단어로 정의한 것입니다.

index.php --> 서비스 컨테이너를 만들고 --> 커널을 만들고 --> 파사드를 통해 컴포넌트들이 접근 가능하게 되는 과정입니다. 이 과정을 거치고 난 후에 웹페이지의 요청이 router/web.php로 넘어가게 됩니다.

https://stackoverflow.com/questions/46095426/what-is-bootstrapping-in-laravel

 

What is Bootstrapping in Laravel?

What is Bootstrapping in Laravel and how does it work?

stackoverflow.com

When a web page is requested, the request first goes to index.php. This file does very important things. First it auto-loads all the classes used in your application.

After that it sets up the laravel application i.e. laravel framework. One of the first thing laravel framework does is - it creates the service container. At this point the service container is empty.

After that framework creates kernal. Kernal loads all the middleware required by the application. One of the most important task of the kernal, there after, is to load all the service providers i.e. to load all the components into the service container.

The list of all the service providers loaded are in the config/app.php file i.e. providers array. This array defines which components are loaded into your service container.

These components can be accessed via facades. The list of all facades are also present in the config/app.php as aliases array. These facades are simply short-cuts to all the components loaded into the service container. This finishes the bootstrap process.

After all this, request is then handed over to the router i.e. routes/web.php file.

 

많은 도움을 받았습니다. 감사합니다.

https://kbseung12345.tistory.com/28?category=709818

 

[laravel 기초공부] 라라벨 - 02 (서비스 컨테이너)

안녕하세요 이번에는 라라 벨의 서비스 컨테이너에 대해 알아보도록 하겠습니다! 전 처음에 이 서비스 컨테이너에 정의가 제대로 잡히지 않아서 좀 고생했었습니다. :( 우선! 라라벨 홈페이지에

kbseung12345.tistory.com

https://laravel.kr/docs/5.7/container

 

라라벨 5.7 - 서비스 컨테이너

라라벨 한글 메뉴얼 5.7 - 서비스 컨테이너

laravel.kr

https://www.lesstif.com/laravelprog/%EC%84%9C%EB%B9%84%EC%8A%A4-%ED%94%84%EB%A1%9C%EB%B0%94%EC%9D%B4%EB%8D%94%EC%99%80-%ED%8C%8C%EC%82%AC%EB%93%9C-24445373.html

 

서비스 프로바이더와 파사드

 

www.lesstif.com