[PHP laravel 5.7] 인증기능을 포함한 기본 라라벨 프로젝트 준비하기
운영이 아닌 개인 개발환경에서 라라벨로 개발을 시작할 때 마다 하나의 프로젝트를 생성하고 기본적인 세팅을 해야 한다. 특히 개발환경에서는 composer를 통한 정상적인 프로젝트 설치 후에도 작업을 시작하다보면 오류가 발생하는 경우가 있다.
여기서는 DB를 핸들링할 때 문제가 없도록 세팅하고 구글로 메일을 보낼 수 있는 개발환경을 세팅하는 것에 대해서 단계별로 진행해본다.
1. composer를 통한 프로젝트 설치
제일 먼저 프로젝트명을 정하고 composer를 이용해 프로젝트를 세팅한다. 별다른 옵션이 없으면 가장 최신의 라라벨 프로젝트가 세팅된다. 여기서는 myLaravelApp이라는 이름으로 프로젝트를 생성한다.
끝의 -vvv 옵션을 주지 않으면 설치가 진행되고 있는건지 아닌건지 알기가 어려우므로 꼭 주는 것이 좋다.
실시간으로 배포 repository에서 다운로드를 받기 때문에 프로젝트 설치가 완료되기까지 제법 시간이 걸린다. 현재일 기준으로 5.7 버전이 설치된다.
2. 프로젝트 환경설정
환경설정파일(.env)을 열어 프로젝트 명과 URL을 세팅한다. 개발환경에서 사용할 도메인은 미리 세팅했다고 가정한다. 필자의 경우 xampp를 사용했고 로컬 개발환경에서의 작업을 위해 윈도우의 hosts 파일을 수정하여 도메인을 세팅해 놓았다. 참고로 여기서 사용한 도메인은 http://twinsoul-app.test/ 이다.
.env 파일 수정
APP_ENV=local
APP_KEY=base64:5z55ujxsx2JL9GWBlGIz3hkjIDOgM4qq47oedhf3X9c=
APP_DEBUG=true
APP_URL=http://twinsoul-app.test
APP_NAME과 APP_URL을 미리 정해놓은 이름으로 변경한다. 개발환경이므로 APP_DEBUG 옵션은 true로 하는게 좋겠다.
welcome.blade.php 파일을 열고 config 헬퍼함수로 방금 수정한 APP_NAME의 값을 출력해본다.
<div class="content"> <div class="title m-b-md"> {{ config("app.name") }} </div> <div class="links"> <a href="https://laravel.com/docs">Documentation</a> <a href="https://laracasts.com">Laracasts</a> <a href="https://laravel-news.com">News</a> <a href="https://nova.laravel.com">Nova</a> <a href="https://forge.laravel.com">Forge</a> <a href="https://github.com/laravel/laravel">GitHub</a> </div> </div>그럼 화면과 같이 변경된 타이틀이 출력된다.
메일(Gmail) 수정
메일 보내는 기능을 위해 메일 설정을 한다. 참고로 필자는 구글메일을 사용하므로 gmail을 등록하였다. 그리고 구글 OTP를 통한 2단계 인증을 사용하고 있기 때문에 사전에 이 환경설정 파일에 세팅할 gmail 앱 비밀번호가 없다면 미리 생성해두어야 한다.
앱 비밀번호 생성은 여기(https://support.google.com/accounts/answer/185833?hl=ko)를 참고한다.
MAIL_HOST=smtp.gmail.com
MAIL_PORT=465
MAIL_USERNAME=GMAIL꼐정@gmail.com
MAIL_PASSWORD=앱비밀번호
MAIL_ENCRYPTION=ssl
MAIL_FROM_ADDRESS=GMAIL계정@gmail.com
MAIL_FROM_NAME="myLaravelApp Manager"
메일 발송시 보내는 사람과 관련된 정보는 MAIL_FROM_ADDRESS, MAIL_FROM_NAME 값으로 세팅한다.
3. 기본제공되는 인증기능 사용하기
라라벨에서는 로그인과 회원가입, 로그아웃, 비밀번호 분실시 변경하기 등과 같은 기본적인 인증기능을 제공한다. 다음과 같은 artisan 명령어 하나로 관련된 클래스와 뷰 등을 현재 프로젝트에 추가해준다.
Authentication scaffolding generated successfully.
페이지를 다시 띄워보면 인증기능이 추가되어 기존 페이지에 로그인과 회원가입 링크가 보인다.
DB 테이블 생성을 위해 migrate 명령을 실행하면 오류가 발생한다.
Illuminate\Database\QueryException : SQLSTATE[HY000] [1045] Access denied for user...
오류 발생시 AppServiceProvider.php 파일의 boot() 메소드에 아래와 같이 한 줄 추가해준다.
<?php namespace App\Providers; use Illuminate\Support\Facades\Schema; use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider { /** * Bootstrap any application services. * * @return void */ public function boot() { Schema::defaultStringLength(191); } /** * Register any application services. * * @return void */ public function register() { // } } ?>
이제 다음과 같이 다시 db migrate 명령을 통해 테이블을 생성한다.
Generating optimized autoload files
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover --ansi
Discovered Package: beyondcode/laravel-dump-server
Discovered Package: fideloper/proxy
Discovered Package: laravel/nexmo-notification-channel
Discovered Package: laravel/slack-notification-channel
Discovered Package: laravel/tinker
Discovered Package: nesbot/carbon
Discovered Package: nunomaduro/collision
Package manifest generated successfully.
$ php artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated: 2014_10_12_000000_create_users_table
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated: 2014_10_12_100000_create_password_resets_table
정상적으로 세팅이 되었다.
4. 이메일로 비밀번호 찾기 기능확인
이제 회원가입을 통해 이메일 계정을 하나 등록하고 로그아웃 한 뒤 비밀번호 찾기기능을 수행한다. 이메일을 등록하면 앞서 세팅해두었던 구글메일을 통해 비밀번호를 잊어버린 대상 이메일에 리셋을 위한 메일이 발송되는데 여기서 오류가 발생할 수 있다.
이런 오류가 발생하는 경우 메일과 관련 환경설정 파일에 아래와 같이 stream 항목을 추가해준다. 수정해야 할 파일은 config 폴더에 있는 mail.php 파일이다.
<?php 'stream' => [ 'ssl' => [ 'allow_self_signed' => true, 'verify_peer' => false, 'verify_peer_name' => false, ], ], ?>
이제 다시 비밀번호 리셋기능을 실행해보면 메일일 정상적으로 전송되는 것을 알 수 있다.
그러면 실제 이런 메일을 받게 되며 여기서 링크를 통해 새로운 비밀번호를 세팅할 수 있게 된다.
이제 프로젝트를 시작할 기본적인 세팅이 끝났다. 여기서부터 새로운 개발작업을 시작하면 된다. 인증을 JWT(Jason Web Token) 토큰방식으로 바꿀 수도 있고 Oauth2를 이용한 Passport로 교체할 수도 있겠다.
매번 프로젝트를 생성할 때 마다 잡아주어야 하는 세팅이라 기억해 놓기 위한 차원에서 정리해보았다.