https://laravel.com/docs/6.0/releases

 

Release Notes - Laravel - The PHP Framework For Web Artisans

 

laravel.com

이번(2019년 9월 3일)에 Laravel LTS 버전 6.0이 공개되었습니다.

 

현재는 번역되지 않은 페이지 밖에 없지만 추후 생길 것 같고,

5.x버전에서 6.0버전으로 업그레이드 되면서 많은 변화는 없어 보입니다.

추가된 기능이나, 좀더 편해진 기능을 한번 살펴본다면,

이전버전에서 부터 사용하시던 분들이라면, 문제없이 바로 사용할수 있을것 같습니다.

 

버그수정은  21년 9월 3일

보안수정은 22년 9월 3일

까지 이루어진다고 합니다.

 

 

 

 

CSV를 다룰때 단순하게 작업을 하게 되면, 메모리부족으로 Allowed memory size of라는 문구를 볼수 있습니다.

 

PHP의 디폴트 메모리는 128MB로 되어있으며, 넘길 경우 'Allowed memory size of'가 됩니다,

그래서 메모리 사용량을 줄이기위해 사용하는 것 중 하나가 Generator입니다.

 

물론, 다른방법도 존재하고 있습니다.

  1. php.ini파일에서 memory_limit의 메모리를 늘리기
  2. 코드에 ini_set('memory_limit','512M') 를 사용하여 임시적으로 메모리 제한을 늘리기
제너레이터란

공식홈페이지의 내용 (https://www.php.net/manual/en/language.generators.syntax.php)

제너레이터 함수란, 겉보기엔 일반함수와 거의 같습니다.

다른점은 모든 값을 반환하는것이 아니라, 필요한 만큼의 값을 yield를 이용하여 반환 하는 것 입니다.

제너레이터 함수가 불려지면, 반복처리가 가능한 오브젝트를 반환합니다.

오브젝트가 (foreach나while등등)로 반복되면 값이 필요할 때마다 제너레이터 함수를 부릅니다. 그리고 제너레이터값이 yield 된 시점의 상태를 보존해 두고, 다음 값이 필요할때가 됬을때 그 보존 해준 다음 값부터 처리 됩니다.

yield가능한 값이 없어지면 제너레이터함수는 종료됩니다.

 

간단한 사용법

yield는 예제처럼 forearch를 이용하여 사용합니다.
return의 경우는 함수당 한번만 값을 반환하지만 yield의 경우는 필요할 때마다 언제나 값을 반환 할수 있습니다.

function test() {
    for ($i = 1; $i <= 3; $i++) {
        // for이 반복될때마다 $i의값도 같이 반환합니다.
        yield $i;
    }
}

foreach ($this->test() as $value) {
    echo "$value\n";
}
// 결과값
// 1
// 2
// 3

 

메모리 사용량

일반 배열과 제너레터의 메모리 사용량에 대해 알아보겠습니다.

 

셋팅

// 일반 배열 
public function arrayTest() 
{
  $data = [];
  $this->getMemoryUsage();
  for ($i=0; $i<2000000; $i++) {
    $data[] = $i;
  }
  $this->getMemoryUsage();
  return $data;
}

// 제너레이터
public function generatorTest()
{
  $this->getMemoryUsage();
  for ($i=0; $i<2000000; $i++) {
    yield $i;
  }
  $this->getMemoryUsage();
}

public function getMemoryUsage()
{
    print("Memory = ".round(memory_get_usage() / (1024*1024), 1)." MB");
}

 

결과

// 시작:10.2MB
// 종료:74.2MB 
foreach ($this->arrayTest() as $item => $value) {
  // 처리작업
}

// 시작:10.2MB
// 종료:10.2MB 
foreach ($this->generatorTest() as $item => $value) {
  // 처리작업
}

배열의 경우가 제너레이터보다 훨씬 많은 메모리를 사용하고 있는것을 알수 있었습니다.

 

 

CSV등 많은 데이터를 다루는 경우에는 제너레이터를 이용한 작업을 할때 이용하면 큰 도움이 됩니다.!

라라 벨 브로드캐스팅에 대해 알아보겠습니다.

라라 벨 브로드캐스팅이란, 서버에 데이터가 변경되면 메시지가 웹 소캣 연결로 보내져 클라이언트에 의해 처리될 수 있도록 합니다. 

바로 테스트를 해보도록 하겠습니다.

테스트는 모든 클라이언트에 대해 메시지를 송신하는 쪽으로 만들었습니다.

만들어 보는것

위와 같은 작업을 수행합니다.

  • 1) laravel서버 쪽에서 이벤트를 발생시켜, 레이디스 서버에 6379 포트를 이용하여 데이터를 전달합니다.
  • 2) laravel-echo-server와 redis의 SUB/PUB는 항상 연결되어있는 상태로 만들어줍니다. 

    • 혹시 redis의 SUB/PUB를 모르시는 분은 먼저 개념을 잡아오시는 게 좋을 듯합니다.
  • 3) 클라이언트와 laravel-echo-server는 websocket를 이용하여 항상 연결되어있는 상태로 만들어줍니다.
    • 1번에서 데이터를 넘겨주었을 때를 라라 벨에코서버는 SUB를 이용하여 데이터를 받아옵니다. 그후 받은 데이터를 클라이언트화면에 뿌려줍니다.
사전작업

redis서버

nodeJs

laravel프레임워크

 

라이브러리 설치
npm install --save laravel-echo socket.io-client
composer require predis/predis
laravel-echo-server설치
npm install -g laravel-echo-server

라라 벨 에코 서버를 설치합니다.

참고로 라라벨 에코서버를 이용할 때는 redis서버가 반드시 필요하기 때문에 사전작업의 redis서버를 준비해 주세요

 

 

그 후 라라벨 에코 서버 json파일을 작성해줍니다.

laravel-echo-server init
? Do you want to run this server in development mode? Yes
? Which port would you like to serve from? 6001
? Which database would you like to use to store presence channel members? redis
? Enter the host of your Laravel authentication server. http://localhost:8000
? Will you be serving on http or https? http
? Do you want to generate a client ID/Key for HTTP API? Yes
? Do you want to setup cross domain access to the API? Yes
? Specify the URI that may access the API: http://localhost:8000
? Enter the HTTP methods that are allowed for CORS: GET, POST
? Enter the HTTP headers that are allowed for CORS: Origin, Content-Type, X-Auth-Token, X-Requested-With, Accept, Autho
rization, X-CSRF-TOKEN, X-Socket-Id
? What do you want this config to be saved as? laravel-echo-server.json
appId: fb9e72802cace662
key: 9bf6eb178b5601e2353d387c9d46531b

init을 이용하면 위와 같이 설정을 할 수 있습니다.

 

마지막으로 라라벨 에코 서버를(laravel-echo-server start) 기동시 킵니다.

$laravel-echo-server start

L A R A V E L  E C H O  S E R V E R

version 1.5.3

Starting server...

✔  Running at localhost on port 6001
✔  Listening for http events...
✔  Listening for redis events...

Server ready!

혹시 아래와 같은 에러가 보인다면 redis서버가 준비되어있지 않은 상태이니 한번 확인해주세요!

[ioredis] Unhandled error event: Error: connect ECONNREFUSED 127.0.0.1:6379
    at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1097:14)

 

 

라라벨 쪽 작업

1. config/app.php 코드 수정

App\Providers\BroadcastServiceProvider::class,

프로바이더 쪽에 위의 코드를 추가시켜주세요

 

2.. env파일 변경

BROADCAST_DRIVER=log로 되어있는 곳을

BROADCAST_DRIVER=redis

redis로 변경해주세요

 

서버 쪽 작업

전체 송신 기능용으로 작성하겠습니다.

 

1. Event관련 함수 작성

php artisan make:event PublicEvent

artisan커멘드를 이용하여 작성합니다.

 

2. app/Events/PublicEvent.php 파일 수정

<?php

namespace App\Events;

use Illuminate\Broadcasting\Channel;
use Illuminate\Queue\SerializesModels;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;

class PublicEvent implements ShouldBroadcast
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    /**
     * Create a new event instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Get the channels the event should broadcast on.
     *
     * @return \Illuminate\Broadcasting\Channel|array
     */
    public function broadcastOn()
    {
        // redis채널이름 
        return new Channel('public-event');
    }

    public function broadcastWith()
    {
      return [
        "message" => "hello world",
      ];
    }
}

위와 같이 코드를 변경해주세요.

 

3. route/web.php 코드 수정

어떤 이벤트가 발생해야 브로드캐스트가 가능하므로, 이벤트를 작성합니다.

이번 경우는 어떤 url로 접속했을 때 반응하는 브로드캐스트입니다.

Route::get('/public-event', function(){
	broadcast(new \App\Events\PublicEvent())
	return "return값은 없어도 상관없음.";
});

return 값은 없어도 상관없지만 화면에 아무것도 찍히지 않으면 헷갈리니까 넣어봤습니다.

 

클라이언트 쪽 작업

1. resources/js/bootstrap.js 코드 수정

//for Echo
import Echo from 'laravel-echo';
window.io = require('socket.io-client');

// 접속정보
window.Echo = new Echo({
    broadcaster: 'socket.io',
    host: 'http://localhost:6001',
});

// redis채널설정
window.Echo.channel('laravel_database_public-event')
    .listen('PublicEvent', (e) => {
        console.log(e);
    });

위의 코드를 추가해주세요.

자세히는 모르겠지만, 저 같은 경우는 laravel_database_뒤에 채널 이름이 만들어졌습니다...

redis 로그를 이용하여 어떤 채널이 만들어졌는지 확인해주세요....

 

2. laravelMix이용

npm install
npm run dev

laravel Mix를 이용하여 public/js/app.js에 수정한 코드를 추가시켰습니다.

 

 

3. blade페이지 수정

저 같은 경우는 resources/views/welcome.blade.php 파일을 수정하였습니다.

<meta name="csrf-token" content="{{ csrf_token() }}">
<script src="{{ asset('js/app.js')}}"></script>

위의 두 코드를 추가합니다.

 

 

확인 작업

localhost:8000/public-event 화면과

localhost:8000의 화면을 동시에 켜놓고

public-event화면을 새로고침 하면 아래와 같은 hello world가 출력되는 것을 볼 수 있습니다.

 

'IT' 카테고리의 다른 글

[laravel] Laravel 6.0 LTS  (0) 2019.09.04
PHP - 제너레이터  (0) 2019.06.03
인터페이스&추상클래스  (0) 2019.05.16
HTTP헤더 인젝션  (0) 2019.05.15
[laravel 기초공부] 라라벨 - 06 (뷰 블레이드- 기본)  (0) 2019.05.13

인터페이스와 추상클래스에 대해 알아보도록 하겠습니다.

 

인터페이스

인터페이스는 시작을 interface로 시작합니다.

인터페이스의 역할은 특정한 클래스가 인터페이스를 사용할때 대해 반드시 만들어야 하는 메소드를 구현 시키게 하는 역할을 하게 됩니다.

interface A
{
 public function Amethod(); 
}

class B implements A {
 public function Amethod(){
  //
 }
}

인터페이스는 클래스에서 사용할때 implements를 이용하며, 사용할 경우엔 반드시 메서드를 구현시켜 줘야 합니다.

그렇지 않으면, 에러가 나게 됩니다.

implements는 extends와는 다르게 복수의 인터페이스를 상속 가능합니다.

인터페이스에서 멤버 변수나 메서드들은 모두 public이여야합니다. 만약 public을 사용 하지 않았을때는 default로 public 멤버변수가 됩니다.

 

 

추상클래스

추상클래스는 abstract로 시작합니다.

추상클래스의 역할은 abtract메서드를 이용해 인터페이스와 같은 역할을 메소드를 가질수 있습니다.

abstract class A {
 abstract function Amethod();
}

class B extends A {
 function Amethod(){
  //
 }
}

또한 abtract를 사용하여 추상 메서드를 만들때는 abtract 키워드를 붙여줘야합니다.

그리고 인터페이스와 마찬가지로 메서드를 구현해줘야합니다.

추상클래스는 extends 를 이용하여 상속 합니다. 그러므로 상속 갯수는 하나밖에 안됩니다.

 

인터페이스와의 차이점은 완성된 메서드를 구현할수 있다는 점입니다.

abstract class A {
 public function Amethod();
 
 public function BMethod(){
  return "hello world"
 }
}

그러므로 보통 abstact를 사용 할 경우에는 부모클래스로써의 역할로 많이 사용됩니다.

 

 

 

HTTP헤더 인젝션은 유명한 해킹방법이며 어떻게 하는지와 대책을 알아보겠습니다.

 

일단 HTP헤더 인젝션은 알기 위해서는 HTTP방식과 HTTP를 이용한 통신 방법을 이해하는 것이 중요합니다.

잘 모르시는분은 위의 통신방법을 먼저 공부해 주시기를 추천드립니다.

 

 

예졔)

---------------------------------------------------

1) 브라우저 --------------------------> 웹서버

                          request

 

2) 브라우저 <-------------------------- 웹서버     

                          response  

--------------------------------------------------

위의 예제를 보시면 평소 인터넷의 Web구조입니다.

 

하지만, 요청시 데이터에 악성코드가 포함되는 경우엔 response를 할때 원래의 요청이 아닌 다른 내용의 컨텐츠를 표시하는 것입니다.

 

예를 들어 http://site.com?bug="ttttt"에 엑세스를 한다고 생각해봅니다.

위 요청을 받은 사이트는 bug의 매개변수로 설정되어있는 tttt를 응답헤더의 bug헤더로 설정하여 응답합니다.

 

여기서 tttt를 개행코드가 두줄이 설정되어있는 경우, 그외의 문자열의 레스폰스바디를 조작할수 있기 때문입니다.

위의 그림을 보시면 헤더와 바디 사이에 개행이 존재합니다.

개행을 넣음으로써 헤더가 아닌 바디로 취급되는것입니다.

그러므로 tttt가 아닌 개행코드가 있다면 그후 문자열에서 바디부분을 조작할수 있다는 점입니다.


좀더 구체적으로 본다면,

site.com?bug=%0d%0d<script type="javascript">alert("hello")</script>

%0d는 개행코드입니다.

개행코드 뒤의 script부분은 바디로 설정됩니다.

 

여기서 이게 왜 무서운가 좀더 설명하자면,

바디부분이 조작이 되어버리면, 사용자에게 표시되는 web컨텐츠 자체가 바뀌기 때문에,

사용자의 입력폼을 바꾸거나, 쿠키를 빼내는 스크립트를 포함 시킬수 있다는 것 입니다.

 

대책방법으로는,

1) 리퀘스트 바디의 값을 레스폰스헤더의 값으로 설정하지않는것

2) 리퀘스트바디의 값을 레스폰스헤더의 값으로 설정하는경우에는, 개행코드를 방지하는 할수 있게 하는것

 

그리고 PHP를 사용한다면, 좀더 쉽게 대책을 알아볼수 있습니다.

htmlspecialchars($str, ENT_QUOTES, ‘UTF-8′);

PHP에 있는 htmlspecialchars함수가 문자열을 이스케이프를 시켜주는 함수입니다.

 

이로써 http헤더인젝션에 대해 알아보았습니다.

다음에는 다른 공격방법에 대해서 알아보도록 하겠습니다.

안녕하세요 이번엔 뷰(블레이드 템플릿)에 대해 알아보도록 하겠습니다.

뷰는 디폴트로 resources/views에서 관리하고 있습니다.

 

라라 벨에서는 특수 템플릿이 있으며, blade의 확장자를 붙여 사용 가능합니다.

예를 들어보겠습니다.

test.blade.php

// test.blade.php
<html>
<head></head>
<body></body>
</html>

blade들 사용함으로써 사용 가능한 기능들에 대해 알아보도록 하겠습니다.

{{ }}

{{}} 를 사용하여 php 변수들을 바로바로 사용 가능합니다.

// test.blade.php
<html>
<head></head>
<body>
 {{ $data="테스트" }}
 {{ $data }}
</body>
</html>

 

레이아웃

@extends

@section

@yield

을 이용하여 레이아웃을 정의하거나 확장할 수 있습니다.

<head>
 <title>@yield('title')</title>
</head>
<body>
 @section('navigation')
  navigation
 @show
</body

 

반복문

foreach

{{ $data = [1,2,3,4,5] }}
@foreach($data as $index => $value)
 {{ $index}}:{{ $value }}
@endforeach

for

@for($i=1; $i<=10; $i++)
 {{ $i }}
@endfor

switch

@switch($number)
    @case(1)
        일
        @break
    @case(2)
        이
        @break
    @default
      다른숫자
@endswitch

@붙여 매우 간단히 foreach, for switch 구문을 사용할 수 있습니다.

 

조건문
@if($data == 1)
 하나
@elseif($data == 2)
 둘
@else
 다른 숫자
@endif

조건문은 if문을 사용할 수 있으며,

반복문과 마찬가지로 @를 붙여 사용할수 있습니다.

 

 

CSRF

라라 벨에서 특수한 경우가 있는데, form를 이용하여 post를 할 경우엔 CSRF를 붙여주시는 게 좋습니다.

<form method="POST" action="/post">
    @csrf
</form>

blade의 @csrf를 이용하여 사용 가능합니다.

별도의 설정 없이 post를 할 경우 @csrf를 사용하지 않는 경우에는 에러가 발생합니다.

 

CSRF에 대해서는 위키피디아를 참고하였습니다.

Cross-Site Request Forgery (CSRF) (크로스 사이트 요청 변조) CSRF공격은 로그온 된 피해자의 취약한 웹 애플리케이션에 피해자의 세션 쿠키와 기타 다른 인증정보를 자동으로 포함하여 위조된 HTTP 요청을 강제로 보내도록 하는 것이다. 이것은 공격자가 취약한 애플리케이션이 피해자로부터의 정당한 요청이라고 오해할 수 있는 요청들을 강제로 만들 수 있다.

 

 

안녕하세요 라라벨에서 데이터베이스 사용법에 대해 알아보도록 하겠습니다.

우선 라라벨에서 현재 4가지의 데이터베이스를 지원하고 있습니다.

  • MySQL
  • PostgreSQL
  • SQLite
  • SQL Server

데이터베이스를 연결하는 방법은 config/database.php으로 가서 원하는 데이터베이스를 작성해주시면됩니다.

예제를 보겠습니다.

'mysql' => [
    'read' => [
        'host' => ['192.168.1.1'],
    ],
    'write' => [
        'host' => ['196.168.1.2'],
    ],
    'sticky'    => true,
    'driver'    => 'mysql',
    'database'  => 'database',
    'username'  => 'root',
    'password'  => '',
    'charset'   => 'utf8mb4',
    'collation' => 'utf8mb4_unicode_ci',
    'prefix'    => '',
],

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

read와 write를 설정할수 있으며, 하나로 통일 하고싶은 경우는 read,write를 사용하지않고,

host => 192.168.1.2를 이용하여 바로 연결시켜 사용하면 됩니다.

 

기본쿼리에 대해 알아보도록 하겠습니다.

select
DB::select('select * from users where active = ?', [1]);
insert 
DB::select('select * from users where id = :id', ['id' => 1]);
update
DB::update('update users set votes = 100 where name = ?', ['John']);
delete
DB::delete('delete from users');

위의 기본쿼리들을 보시면 DB파사드를 이용하고 있으며 select, insert update 구문은, ?를 이용하여 좀더 인수로써 이용 하는 것을 알수있습니다.

 

또한 DB파사드에는 트랜잭션이 존재합니다.

예제를 살펴보겠습니다.

try {
 DB::transaction(function() use() {
  // query작성
})
}catch(Exception $e) {
 
}

try catch문을 이용하면 더욱 좋습니다.

트랜잭션의 클로져안에서 쿼리가 완벽하게 다 진행되었다면, 그대로 커밋을 할것이며, 실패한다면, rollback을 할 것입니다.

또한 주목할점은 보통 트랜잭션의 클로져에서는 클로져밖의 변수는 사용할수 없습니다. 

아래의 예제를 보시면

try {
 $name = "hello"
 DB::transaction(function() use($name) {
  DB::select("select * from users where name=?", [$name])
})
}catch(Exception $e) {
 
}

use()를 사용함으로써, 밖에서 사용하던 변수라도 클로져 안에서 사용할수 있도록 합니다.

 

다음으로 쿼리빌더에 대해 알아보도록 하겠습니다.

 

쿼리빌더

쿼리빌더는 PDO 파라미터 바인딩을 사용하여 SQL injection 공격을 방지를 위해 사용할수 있으며, sql을 간단하게 작성할수 있습니다.

 

예제를 들어보겠습니다.

DB::table("test")->get(); // 모든 데이터 조회
DB::table("test")->first(); // 하나의 데이터만 조회
DB::table("test")->where("id","3")->get(); // where문 사용하여 해당되는 데이터 모두 조회
DB::table("test")->join("test2","test2.id","=","test.id")->get(); // join문을 사용을 사용하여 모든 데이터 조회

위의 예제들을 보시면 알수 있지만, 쿼리빌더를 이용함으로써 복잡한 sql문이 보다 간결히 작성 되는 것을 알수 있습니다. 

 

위의 간단한 예제뿐만아니라 더욱 더 많은 기능들이 있습니다.

https://laravel.kr/docs/5.8/queries

 

라라벨 5.8 - 쿼리 빌더

라라벨 한글 메뉴얼 5.8 - 쿼리 빌더

laravel.kr

나머지 기능들은 공식 홈페이지를 통해 알아보시면 될듯 합니다. :)

안녕하세요 오늘은 라라 벨의 라우팅과 미들웨어에 대해 알아보도록 하겠습니다. :)

 

 

라라 벨의 라우팅은 대표적으로 get과 post를 이용하여 URI와 클로저를 전달 받아, 라우팅을 정의하고 있습니다.

제일 기본 예제를 알아보도록 하겠습니다.

Route::get("get-test", function (){
 return "get-test"
});

Route::post("post-test", function (){
 return "post-test"
});

위의 예제가 가장 기본적인 get과 post를 이용하여 작성한 라우팅입니다.

여기서 복습하자만 Route는 전 포스팅에서 공부한 내용인 프로바이더와 파사드를 이용하여 Route를 정적 메서드로써 사용할 수 있습니다.

 

또한, 

put, patch, delete, options등의 메서드도 있습니다.

PHP의 PSR7형식을 따르고 있습니다.

라우팅 과정에서 POST의 경우에는 CSRF 토큰 필드를 사용해야 합니다.

CSRF토큰 필드를 포함하지 않을 경우 request는 전달되지 않습니다.

 

라우팅에 미들웨어를 사용할 수도 있습니다.

그전에 미들웨어가 뭔지 알아보도록 하겠습니다.

미들웨어는 HTTP 요청을 간편하게 필터링할 수 있는 방법을 제공합니다.

예제를 들어보겠습니다.

class CheckAge
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if ($request->age <= 200) {
            return redirect('home');
        }

        return $next($request);
    }
}

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

살펴보면, handle메서드 안에 원하는 HTTP라우팅을 할 때 원하는 작업을 작성해 주시면 됩니다.

위의 예제는 age가 200보다 작으면 redirect 아니면 $next($request)를 이용하여, 계속 진행한다는 의미로 받아들이면 됩니다.

 

그 후, app/Http/Kernel.php안에 미들웨어를 등록한 후,

protected $routeMiddleware = [
    'checkAge' => CheckAge::class,
];

라우팅을 할 때 사용하고 싶다면,

Route::middleware("checkAge", function() {
 Route::get("test", function(){
  return "ok";
 });
});

위의 예제처럼 사용하시거나,

Route::get("test", function () {
    return "ok"
})->middleware('checkAge');

위의 예제처럼 사용하시면 됩니다.

 

또한 미들웨어 그룹을 이용하여, 라우팅 하는 순간뿐만 아니라, 별다른 설정 없이 모든 리퀘스트에 대하여, 미들웨어를 설정 포함시키는 방법도 있습니다.

protected $middlewareGroups = [
    'web' => [
        AgeCheck::class,
    ],
];

위의 예제처럼 사용하시면 됩니다.

여기서 중요한 포인트는 미들웨어에 순서가 존재하기 때문에, 미들웨어를 추가할 경우에는 순서를 잘 생각하여야 합니다. 또한 순서는 app/Http/Kernel.php 파일의 protected $middlewarePriority속성을 이용하여 우선순위를 정할 수 있습니다.

 

 

여기까지 라우팅과 미들웨어에 대해 알아보았습니다 :)

다음 포스팅에는 데이터베이스에 대해 알아보도록 하겠습니다.

+ Recent posts