라라벨을 설치했다면, 이제 사용하기 위해 환경설정을 해야한다.
앞서 APP_KEY 세팅 때 잠깐 언급했지만 .env 라는 파일이 있다.
config 폴더의 여러 설정 파일들을 보면 env(**) 형식으로 된 것을 볼 수 있는데 env 파일의 값들을 참조하여 세팅이 되는 형식이다.
(config/app.php)
(.env)
이런 구조이기 때문에 일부의 설정을 제외하고 env의 값을 세팅해주면 환경설정이 끝난다.
또한, 설정 값이 바뀔 때 일일히 바꾸지 않고, env의 값만 변경하면 된다는 장점이 있다.
env파일을 수정하기 이전에 우선 env로 설정이 안되는 타임존 등의 설정을 해주었다.
vi /var/www/laravel/config/app.php
그리고 .env 파일에 설정 값들을 넣어 주었다.
vi /var/www/laravel/.env
에러발생시 에러메세지, 스택트레이스 등을 표시하는 여부. 실제 서버로 구동시엔 감추고 log를 통해 에러를 확인하는 것이 안전하다.
APP_DEBUG=false
실제 접속 URL
APP_URL=http://url
다음은 DB환경
DB_CONNECTION=연결할 데이터베이스 엔진(mysql)
DB_HOST=데이터베이스 연결 주소
DB_PORT=데이터베이스 포트
DB_DATABASE=사용할 데이터베이스 이름
DB_USERNAME=데이터베이스 유저 이름
DB_PASSWORD=패스워드
이 외에 건들여야 될 것들은 다른 것을 진행해보면서 수정하기로 하고,
본격적으로 프로젝트 만들기를 시작해보려고 한다.
프레임워크는 처음 사용해보는 만큼, 프레임워크라는 개념이 손에 잘 잡히지 않아서 이해하기가 힘든 부분이 있었다.
처음에는 프레임워크를 sdk 마냥 사용해서 하나의 개인적인 프로젝트를 만드는 거라고 생각했었는데
본격적으로 웹을 만들려고 살펴보니 설치한 laravel 디렉토리 자체가 내가 만들어갈 프로젝트가 되는 것이었다.
그리고 이런 라라벨을 좀 더 잘 사용(?)하기 위해서 개념을 이해하는 과정이 필요했는데
그 중 핵심적인 단어가 라우팅, 컨트롤러, 블레이드 였다.
라우팅은 MVC패턴에 있어 가장 앞에 위치하는 것으로 Front Controller라고도 한다. 웹 어플리케이션에서 이정표 역할을 하며, URL과 요청방식 등에 따라 서버의 처리 방식을 지정해준다. laravel에서 제공해주는 pretty url이라는 기능이 있는데 (url을 간편하고 예쁘게? index.php 같이 뒤에 잡다한 이름이 안붙는다. RESTFul기반 웹서비스를 제공하기 위해서는 필수요소!) 이런 url을 사용하면서 라우팅, 즉 url을 통한 페이지 연결을 가능하게 해준다.
*REST(REpresentational State Transfer) : ROA(Resource Oriented Architecture)를 따르는 웹 서비스 디자인 표준. 웹의 모든 리소스를 URI로 표현하고, 이를 구조적이고 유기적으로 연결하여, 비 상태 지향적인 방법으로, 일관된 method를 사용하여 리소스를 사용하는 웹 서비스 디자인 표준 (출처-http://www.iamcorean.net/22)
*RESTFul : REST 원리를 따르는 시스템
그리고 그냥 .php 파일로도 물론 연결이 되지만 라라벨에서는 .blade.php 파일을 사용하는데, 이런 블레이드 안에서 사용할 수 있는 많은 기능들이 있다. 조건문이나, 변수활용 등 기존의 php문법보다 간결한 문서 작성을 가능하게 해준다.
나는 이런 개념들을 이해하고, 기초 테스트를 통해서 가능한 환경인지 보려고 라우팅과 php, 블레이드 파일을 작성해서 띄워보는데
welcome.blade.php 파일과 그냥 php파일은 잘 띄워지는 반면에 새로 만든 blade 파일은 500 에러를 뿜어내며 뜨지 않는 현상을 보였다. 한참을 헤매다가 검색 끝에 chmod 777 storage/framework/views 커맨드로 해결이 되었다..
분명 저번 포스팅에도 썼다 시피 storage 권한을 775로 다 주었는데 왜 안되었던 건지.. 다른 말대로 777을 했어야 한 것일까
다시 775로 바꿔도 잘 띄워지는 것을 보니 조금 아이러니 하긴 했다.
이 때문에 시간을 많이 소모해버렸지만.. 다시 힘을 내서 컨트롤러까지 정복!
컨트롤러는 MVC패턴에 있어 핵심적이라고 할 수 있는 부분이다. MVC 패턴 정의를 기준으로 말하자면 클라이언트의 요청을 받아서 정보를 처리하고, 모델을 호출하며, 모델의 응답을 바탕으로 뷰를 생성하는 역할을 수행하는 곳이다. 이전에 테스트를 위해서 라우팅 파일에 변수를 적고 했었지만, 이런 부분을 수행하는 곳이 컨트롤러이다. 즉, 라우팅은 간단하게 URL과 컨트롤러를 연결해 주면 된다.
따라서 라우팅에서는 다음과 같은 내용이 들어가게 된다.
Route::[값 전달방식]('[URL]', '[Controller이름]@[함수명]');
ex)Route::get('gwcw/test', 'TestController@name1');
그리고 이런 컨트롤러는 artisan 명령어로 생성할 수 있다.
artisan 명령어는 laravel 루트 경로에서 커맨드로 사용할 수 있다.
php artisan make:controller [컨트롤러 이름]
ex) php artisan make:controller InsertController
생성 후에는 App/Http/Controllers 디렉토리 안에서 만들어진 컨트롤러를 확인 할 수 있다.
그리고 컨트롤러 내부의 함수를 이용해서 라우팅 파일에 있었던 뷰 호출이나 변수 생성, 전달기능 등을 작성하고 사용할 수 있다.
개념을 대충 이해한 후 컨트롤러에 대한 더 자세한 내용은 서비스를 직접 적용하는 과정 때 더 보기로 하고, 그 전에 우선 만들고자 하는 웹 페이지를 구성하는 일부터 시작하였다.
솔직히 무엇부터 봐야할지, 전체적인 구성을 어떻게 짜야할지 머리가 복잡했지만, 시각적으로 보고 기능을 구성하는 것이 제일이다 싶어서 우선 웹페이지 템플릿을 찾기 시작했다.
무료 html 반응형 템플릿에 대한 자료는 꽤 많았는데, 그 중에서도 html5up의 stella 테마를 사용하기로 하였다.
템플릿을 입맛대로 바꾸는 작업은 html과 css를 수정하면 되는 간단한 일이다.
svg 아이콘을 pin 모양으로 바꾸는 데에 조금 애를 먹었지만-결국 일러스트레이터를 사용했다- 바탕 그라데이션과 버튼 색상 등을 바꾸고 텍스트와 입력 폼을 넣어주었다.
(수정 전과 수정 후)
그리고 드디어 서버로 옮겨서 잘 구동되는지 확인할 시간이다. index.html 파일을 index.blade.php 파일로 바꿔주고 뷰에 위치하는 곳에 옮겨주었다. 하지만 템플릿대로 뷰와 같이 css/js 폴더를 넣어주니 적용이 안되는 문제가 발생..!
알아보니 라라벨에서의 리소스를 담는 폴더가 따로 있었다. 정보들이 /resources/assets에 넣어야 한다. /public에 넣어야 한다 많이 엇갈려있었는데, 기본 css와 fonts 폴더가 public에 있기도 하고, HTML::style(경로) 명령어가 작동하지 않아서 /public 폴더에 넣어주었다. 이런 경우 웹서버 설정에서 DocumentRoot를 라라벨의 public 폴더로 지정해 놓아야 정상적으로 작동한다고 한다. (이전 설정 때 그렇게 해놨었다.)
그리고 index파일에서 (템플릿의 index.html) css나 image, js 등의 경로를 넣는 부분이 있는데 기존의 경로 대신 {{ asset('[폴더-css/images..]/[파일]') }}을 사용해주면 public 폴더에 있는 해당 폴더의 파일 경로로 연결되게 된다.
laravel/public/css/main.css
.html
<link rel="stylesheet" href="assets/css/main.css">
→ .blade.php
<link rel="stylesheet" href="{{ asset('css/main.css') }}" />
그리고 라우팅으로 지정한 경로를 통해 웹페이지를 실행시켜보면
<link rel="stylesheet" href="http://<url>/css/main.css">
html 소스에 위처럼 지정된 경로가 출력되는 것을 확인 할 수 있다.
라라벨에서 사이트가 제대로 뜨는 것을 확인한 후에는 레이아웃을 분리해주었다.
구조가 복잡한 웹 서비스 같은 경우 페이지 수가 많기 때문에 같은 레이아웃을 사용할 때 파일마다 중복된 코드가 있게 된다. 이런 부분을 블레이드 기능을 사용하여 레이아웃으로 따로 나눌 수 있는데, 미니맵 서비스의 경우에는 단순히 정보를 입력하는 페이지라서 복잡한 구조가 아니라 분리할 필요가 크게 없지만 라라벨을 경험하는 셈 삼아서 분리해 보기로 했다. 코드가 길어서 content 부분만 편하게 보고 싶은 이유가 있기도 했고..
레이아웃은 일반적으로 (튜토리얼 사이트에선 다 그러더라) master.blade.php라는 이름으로 헤드 부분과 스크립트 부분을 분리해준다.
이과정으로 css와 자바스크립트 영역이 레이아웃으로 분리되는 것이다.
페이지마다 달라질 부분은 @yield('[string]')으로 표시해주고, 이 달라질 부분이 들어간 자식 블레이드를 만들어 주면 된다.
여기서 @yield는 두번째 파라미터를 통해서 해당 스트링의 자식 레이아웃이 없을 때 기본값을 설정해 줄 수도 있다.
ex)@yield('title', 'The Minimap')
나같은 경우에는 body부분만 분리하는 것이 아닌, 템플릿에서 반복되는 구조인 background, header와 footer부분도 분리해 주었는데, 다음과 같은 구조가 되었다.
-master
<html><head /><body>@yield('header')/@yield('content')/@yield('footer')<script /><body></html>
-header
@extends('master')
@section('header')
-footer
@extends('master')@section('footer')
-content
@extends('master')
@include('header')
@include('footer')
@section('content')
@extends는 말그대로 부모 레이아웃을 상속 받는다는 뜻이고, @include도 레이아웃을 포함 시킨다는 뜻이다.
그리고 부모 레이아웃에서 @yield에 쓰였던 string을 @section('[string]')으로 사용함으로써 마스터의 빈 부분, 섹션을 작성할 수 있다.
내용을 다 작성한 뒤에는 @endsection으로 섹션이 끝났음을 알려준다. 다른 예제에는 @stop으로 되어있었지만 (이렇게 써도 상관은 없었다) Laravel 5.3 공식 Document 예시에 그리되어 있었으니 @endsection을 쓰기로 하였다.
또한 같은 키워드의 @section을 여러개 작성한 경우 그냥 @section으로만 여러개 쓰면 가장 먼저 선언되는 섹션만 적용이 된다.
하지만 @section안에서 @parent를 추가해주면 이전의 섹션 내용에 이어서 쓸 수 있다.
ex)@section('script')
1
@endsection
@section('script')
@parent
2
@endsection
→결과 : 12
그리고 여태 ssh으로만 작업을 했었는데, ftp를 통해서 파일을 전송하고 옮기고 하는 과정이 은근히 번거롭고 귀찮았다.
에디터를 사용해서 서버와 원격으로 작업을 할 수 없을까.. 찾아보니 아니나 다를까 ssh 통신을 이용해서 php 에디터로 작업을 하는 방법이 있었다. php 에디터의 경우 유명한 phpstorm은 유료이기 때문에 익숙한 eclipse php를 사용했는데, remote 확장 기능을 설치해서 이전보다 수월하게 개발할 수 있는 환경을 만들 수 있었다. 이 부분은 다음 블로그의 글을 참고하였다.
기본적인 틀이 갖춰진 이 다음에는 본격적으로 서버의 데이터베이스와 연결되는 웹페이지를 만들기 위해서 데이터베이스 구성과, 웹페이지의 기능과 구조 설계 등을 다뤄볼 예정이다.
'Project > 제10회공개SW개발자대회' 카테고리의 다른 글
[The Minimap] 개발일지-3 (0) | 2016.08.24 |
---|---|
[The Minimap] 개발일지-2 (0) | 2016.08.24 |
[The Minimap] 개발일지-1 (0) | 2016.08.24 |
[The Minimap] 개발 환경 (0) | 2016.08.18 |
[The Minimap] 개발 개요 (0) | 2016.08.18 |