SlideShare una empresa de Scribd logo
1 de 51
Descargar para leer sin conexión
Laravel 로 배우는 서버사이드 #5
게시판 만들어보기
ABCD, SNOWKIWI / 한성일
1. 어플리케이션 구조
게시판
HTML 파일들
파일 구조
- add.blade.php
- edit.blade.php
- list.blade.php
- login.blade.php
- view.blade.php
- default.blade.php
resources/views/board/contents/
resources/views/board/layout/
public/css/
- abcd.css
- BoardContents.php
- BoardUser.php
app/
- BoardController.php
app/Http/Controllers/
2. VIEW 설정
부트스트랩
http://getbootstrap.com/
CSS 등록
public/css/abcd.css
css 폴더를 만들고 abcd.css 생성
/* Common */
.vertical-align {
display: flex;
align-items: center;
flex-direction: row;
}
.content {
position: relative;
padding: 15px;
margin: 0 -15px 15px;
border-color: #e5e5e5 #eee #eee;
border-style: solid;
border-width: 1px 1px;
-webkit-box-shadow: inset 0 3px 6px rgba(0,0,0,.05);
box-shadow: none;
}
/* Login Form */
.form-signin {
max-width: 330px;
padding: 15px;
margin: 0 auto;
}
.form-signin input[type="email"] {
margin-bottom: -1px;
border-bottom-right-radius: 0;
border-bottom-left-radius: 0;
}
.form-signin input[type="password"] {
margin-bottom: 10px;
border-top-left-radius: 0;
border-top-right-radius: 0;
}
View 구조
- add.blade.php
- edit.blade.php
- list.blade.php
- login.blade.php
- view.blade.php
- default.blade.php
resources/views/board/contents/
resources/views/board/layout/
Default Layout
resources/views/board/layout/default.blade.php
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title> @yield('title') </title>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet">
<link href="css/abcd.css" rel="stylesheet">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
</head>
<body class="container">
@yield('content')
</body>
</html>
등록 컨텐츠
resources/views/board/contents/add.blade.php
@extends('board.layout.default')
@section('title')
등록
@stop
@section('content')
<div class="page-header">
<h1>ABCD <small>ABout CoDing</small></h1>
</div>
<form action="/add" id="addForm" method="post" >
<div class="form-group">
<input type="text" name="title" class="form-control" placeholder="제목을 입력하세요." required autofocus>
</div>
<div class="form-group">
<textarea name="contents" class="form-control" rows="5" required></textarea>
</div>
<input type="hidden" name="_token" value="{{ csrf_token() }}">
<div class="vertical-align">
<div class="col-md-11 text-right">
<button class="btn btn-primary" type="submit">등록</button>
</div>
<div class="col-md-1 text-left ">
<button class="btn btn-default" id="listBtn" type="button">
목록
</button>
</div>
</div>
</form>
<script>
$(document).ready(function(){
$("#listBtn").click(function(){
location.href = "/list";
});
});
</script>
@stop
수정 컨텐츠
resources/views/board/contents/edit.blade.php
@extends('board.layout.default')
@section('title')
수정
@stop
@section('content')
<div class="page-header">
<h1>ABCD <small>ABout CoDing</small></h1>
</div>
<form action="/edit" id="editForm" method="post" >
<div class="form-group">
<input type="text" name="title" class="form-control"
placeholder="제목을 입력하세요." value="{{$contents->title}}" required autofocus>
</div>
<div class="form-group">
<textarea name="contents" class="form-control" rows=“5" required>{{$contents->contents}}</textarea>
</div>
<input type="hidden" name="pageid" value="{{ $pageid }}">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
<div class="vertical-align">
<div class="col-md-11 text-right">
<button class="btn btn-primary" type="submit">수정</button>
</div>
<div class="col-md-1 text-left ">
<button class="btn btn-default" id="listBtn" type="button">
목록
</button>
</div>
</div>
</form>
<script>
$(document).ready(function(){
$("#listBtn").click(function(){
location.href = "/list";
});
});
</script>
@stop
소스 설명
@extends('board.layout.default')
@section('title')
수정
@stop
@section(‘content')
~
@stop
default.blade.php 에 지정된 영역
<input type="hidden" name="_token" value="{{ csrf_token() }}">
POST 전달에 사용되는 토큰 Post form 에 히든으로 위치
없으면 서버전송시 에러 발생
목록 컨텐츠 1
resources/views/board/contents/list.blade.php
@extends('board.layout.default')
@section('title')
목록
@stop
@section('content')
<div class="page-header">
<h1>ABCD <small>ABout CoDing</small></h1>
</div>
<div class="panel panel-default">
<!-- Table -->
<table class="table">
<thead>
<tr>
<th class="col-md-1">#</th>
<th class="col-md-6">제목</th>
<th class="col-md-2">작성자</th>
<th class="col-md-2">작성일</th>
<th class="col-md-1">조회수</th>
</tr>
</thead>
<tbody>
@foreach ($contents as $item)
<tr>
<th scope="row">{{ $item->id }}</th>
<td><a href="/view?pageid={{ $item->id }}">{{ $item->title }}</a></td>
<td>{{ $item->reg_user_name }}</td>
<td>{{ $item->created_at }}</td>
<td>{{ $item->view_count }}</td>
</tr>
@endforeach
</tbody>
</table>
</div>
목록 컨텐츠 2<div class="vertical-align">
<div class="col-md-8">
<?php echo $contents->render(); ?>
</div>
<div class="col-md-3 text-right ">
@if (Session::has('login'))
<button type="button" id="addFormBtn" class="btn btn-default btn-primary">등록</button>
@endif
</div>
<div class="col-md-1 btn-group text-right">
@if (Session::has('login'))
<button class="btn btn-default" id="logoutBtn" type="button">
로그아웃
</button>
@else
<button class="btn btn-default" id="loginFormBtn" type="button">
로그인
</button>
@endif
</div>
</div>
<script>
$(document).ready(function(){
$("#addFormBtn").click(function(){
location.href = "/add-form";
});
$("#loginFormBtn").click(function(){
location.href = "/login-form";
});
$("#logoutBtn").click(function(){
location.href = "/logout";
});
});
</script>
@stop
소스설명
@if (Session::has(‘login'))
// 실행될 문장
@endif
세션이 있을때만 실행
<?php echo $contents->render(); ?>
페이지네이션 생성
로그인 컨텐츠
resources/views/board/contents/login.blade.php
@extends('board.layout.default')
@section('title')
로그인
@stop
@section('content')
<div>
<form class="form-signin" action="login" method="post">
<h2>ABCD 로그인</h2>
<input type="email" name="email" class="form-control"
placeholder="이메일" required autofocus>
<input type="password" name="password" class="form-control"
placeholder="비밀번호" required>
<button class="btn btn-lg btn-primary btn-block" type="submit">로그인</button>
<input type="hidden" name="_token" value="{{ csrf_token() }}">
</form>
</div>
@stop
게시물 보기 컨텐츠 1
resources/views/board/contents/view.blade.php
@extends('board.layout.default')
@section('title')
{{$contents->title}}
@stop
@section('content')
<div class="page-header">
<h1>ABCD <small>ABout CoDing</small></h1>
</div>
<div class="row vertical-align">
<div class="col-md-8">
<h4>{{$contents->title}}</h4>
</div>
<div class="col-md-4 text-right">
<p>작성자 : {{$contents->reg_user_name}} 작성일 : {{$contents->created_at}}</p>
</div>
</div>
<div class="content">
{{$contents->contents}}
</div>
<div class="vertical-align">
<div class="col-md-8"></div>
<div class="col-md-3 text-right ">
<div class="btn-group" role="group">
@if (Session::has('login'))
<button type="button" id="editFormBtn" class="btn btn-default">수정</button>
<button type="button" id="delBtn" class="btn btn-default">삭제</button>
@endif
<button type="button" id="listBtn" class="btn btn-default">목록</button>
</div>
</div>
게시물 보기 컨텐츠 1
<div class="col-md-1 btn-group text-right">
@if (Session::has('login'))
<button class="btn btn-default" id="logoutBtn" type="button">
로그아웃
</button>
@else
<button class="btn btn-default" id="loginFormBtn" type="button">
로그인
</button>
@endif
</div>
</div>
<script>
$(document).ready(function(){
$("#editFormBtn").click(function(){
location.href = "/edit-form?pageid={{$pageid}}";
});
$("#delBtn").click(function(){
location.href = "/delete?pageid={{$pageid}}";
});
$("#listBtn").click(function(){
location.href = "/list";
});
$("#loginFormBtn").click(function(){
location.href = "/login-form";
});
$("#logoutBtn").click(function(){
location.href = "/logout";
});
});
</script>
@stop
3. DB설정
acbd 커넥션에 연결
#4 참조
USE abcd_db;
기본 스키마 생성
CREATE TABLE users (
id INT NOT NULL AUTO_INCREMENT,
email VARCHAR(45) NULL,
password VARCHAR(45) NULL,
name VARCHAR(45) NULL,
PRIMARY KEY (id))
ENGINE = InnoDB;
CREATE TABLE contents (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
title VARCHAR(45) NULL,
contents TEXT NULL,
reg_user_id INT NOT NULL,
reg_user_name VARCHAR(45) NULL,
view_count INT NULL DEFAULT 0,
updated_at TIMESTAMP NULL,
created_at TIMESTAMP NULL,
PRIMARY KEY (id),
INDEX fk_contents_users_idx (reg_user_id ASC),
CONSTRAINT fk_contents_users
FOREIGN KEY (reg_user_id)
REFERENCES abcd_db.users (id)
ON DELETE CASCADE
ON UPDATE CASCADE)
ENGINE = InnoDB;
회원 정보 입력
insert into
users (email, password, name)
values ( 'test@test.com', password('1234'), 'test user');
insert into
users (email, password, name)
values ( ‘jamie@snowkiwi.com’, password('1234'), ‘Jamie Han');
기본 회원 생성확인
SELECT * FROM users;
4. Model 설정
모델 생성
콘솔 홈 디렉토리로 이동1
cd ~/Documents/laravel-space/abcd
cd C:laravel-spaceabcd
2
php artisan make:model BoardUser
php artisan make:model BoardContents
app/BoardContents.php
app/BoardUser.php3 파일 생성 확인
BoardUser 모델
app/BoardUser.php
<?php
namespace App;
use IlluminateDatabaseEloquentModel;
class BoardUser extends Model
{
protected $table = 'users';
protected $fillable = ['id', 'email', 'password', 'name'];
protected $hidden = ['password'];
}
BoardContents 모델
app/BoardContents.php
<?php
namespace App;
use IlluminateDatabaseEloquentModel;
class BoardContents extends Model
{
protected $table = 'contents';
protected $fillable = ['id', 'title', 'reg_user_id',
'reg_user_name', 'view_count', 'updated_at', 'created_at' ];
protected $hidden = [];
}
5. Route 설정
routes.php
/* Board */
Route::get('/login-form', 'BoardController@loginForm');
Route::post('/login', 'BoardController@login');
Route::get('/logout', 'BoardController@logout');
Route::get('/add-form', 'BoardController@addForm');
Route::post('/add', 'BoardController@add');
Route::get('/edit-form', 'BoardController@editForm');
Route::post('/edit', 'BoardController@edit');
Route::get('/delete', 'BoardController@delete');
Route::get('/list', 'BoardController@listView');
Route::get('/view', 'BoardController@view');
app/Http/routes.php
6. 컨트롤러 설정
컨트롤러 생성
콘솔 홈 디렉토리로 이동1
cd ~/Documents/laravel-space/abcd
cd C:laravel-spaceabcd
2
3
파일 생성 확인
php artisan make:controller BoardController
app/Http/Controllers/BoardController.php
코딩 위치
app/Http/Controllers/BoardController.php
class BoardController extends Controller
{
기본 생성 함수 삭제후 코딩
}
use AppBoardContents;
use AppBoardUser;
다음라인 추가
로그인
public function loginForm() {
return view('board.contents.login');
}
public function login(Request $request) {
$email = $request->input('email');
$password = $request->input('password');
$user = BoardUser::whereRaw('email = ? and password = password(?)', [$email,
$password] );
if ( $user->count() > 0 ) { // 로그인 성공
$request->session()->put('login', true);
$request->session()->put('user_id', $user->get()[0]->id);
$request->session()->put('user_name', $user->get()[0]->name);
return redirect('/list');
} else { // 로그인 실패
return redirect('/login-form');
}
}
로그인 실행
http://localhost/login-form
게시물 등록
public function addForm() {
return view('board.contents.add');
}
public function add(Request $request) {
$title = $request->input('title');
$contents = $request->input('contents');
$boardContents = new BoardContents();
$boardContents->title = $title;
$boardContents->contents = $contents;
$boardContents->reg_user_id = $request->session()->get('user_id');
$boardContents->reg_user_name = $request->session()->get('user_name');
$boardContents->save();
return redirect('/list');
}
게시물 등록
http://localhost/add-form
게시물 목록
public function listView() {
// 페이지네이션 사용
$contents = BoardContents::orderBy('id', 'desc')->paginate(5);
$contents->setPath('/list');
return view('board.contents.list')->with('contents', $contents);
}
게시물 목록
/add
http://localhost/list
게시물 수정
public function editForm(Request $request) {
$pageid = $request->input('pageid');
$boardContents = BoardContents::find($pageid);
return view('board.contents.edit')->with('contents', $boardContents)
->with('pageid', $pageid);
}
public function edit(Request $request) {
$pageid = $request->input('pageid');
$title = $request->input('title');
$contents = $request->input('contents');
$boardContents = BoardContents::find($pageid);
$boardContents->title = $title;
$boardContents->contents = $contents;
$boardContents->save();
return redirect('/view?pageid='.$pageid);
}
게시물 수정
http://localhost/list
게시물 삭제
public function delete(Request $request) {
$pageid = $request->input('pageid');
$boardContents = BoardContents::whereRaw('id = ?', [$pageid]);
$boardContents->delete();
return redirect('/list');
}
게시물 삭제
http://localhost/list
로그아웃
public function logout(Request $request) {
$request->session()->flush();
return redirect('/list');
}
로그아웃 실행
http://localhost/list
게시물 보기
public function view(Request $request) {
$pageid = $request->input('pageid');
BoardContents::whereRaw('id = ?', [$pageid])->increment('view_count');
$contents = BoardContents::find($pageid);
return view(‘board.contents.view')->
with('contents', $contents)->with('pageid', $pageid);
}
게시물 보기 실행
http://localhost/view
View
http://localhost/login-form
http://localhost/add-form http://localhost/edit-form
/add
http://localhost/list
http://localhost/view
게시판 소스는 꼭 한번 해보시고 수정해보세요.
그러면 라라벨 웹개발 프로세스를 이해하시는데
큰도움이 될거라 생각합니다.
이번 과정이 모두 끝났습니다.
그동안 정말 수고하셨습니다. :)
궁금하신 부분은 슬렉으로 문의 주세요.
http://abcds.kr/wp-login.php?action=slack-invitation
https://abcds.slack.com
정말!! 수고하셨습니다. :)
http://abcds.kr/

Más contenido relacionado

La actualidad más candente

AnkaraJUG Kasım 2012 - PrimeFaces
AnkaraJUG Kasım 2012 - PrimeFacesAnkaraJUG Kasım 2012 - PrimeFaces
AnkaraJUG Kasım 2012 - PrimeFacesAnkara JUG
 
Frameworks da nova Era PHP FuelPHP
Frameworks da nova Era PHP FuelPHPFrameworks da nova Era PHP FuelPHP
Frameworks da nova Era PHP FuelPHPDan Jesus
 
Rails 3 overview
Rails 3 overviewRails 3 overview
Rails 3 overviewYehuda Katz
 
Creating a Simple PHP and MySQL-Based Login System
Creating a Simple PHP and MySQL-Based Login SystemCreating a Simple PHP and MySQL-Based Login System
Creating a Simple PHP and MySQL-Based Login SystemAzharul Haque Shohan
 
Action View Form Helpers - 1, Season 2
Action View Form Helpers - 1, Season 2Action View Form Helpers - 1, Season 2
Action View Form Helpers - 1, Season 2RORLAB
 
&lt;img src="../i/r_14.png" />
&lt;img src="../i/r_14.png" />&lt;img src="../i/r_14.png" />
&lt;img src="../i/r_14.png" />tutorialsruby
 
파이썬 플라스크로 배우는 웹프로그래밍 #4 (ABCD)
파이썬 플라스크로 배우는 웹프로그래밍 #4 (ABCD)파이썬 플라스크로 배우는 웹프로그래밍 #4 (ABCD)
파이썬 플라스크로 배우는 웹프로그래밍 #4 (ABCD)성일 한
 
Sprout core and performance
Sprout core and performanceSprout core and performance
Sprout core and performanceYehuda Katz
 
Web2py tutorial to create db driven application.
Web2py tutorial to create db driven application.Web2py tutorial to create db driven application.
Web2py tutorial to create db driven application.fRui Apps
 
Web2py Code Lab
Web2py Code LabWeb2py Code Lab
Web2py Code LabColin Su
 
https://www.facebook.com/valdyna.monna?fref=ts
https://www.facebook.com/valdyna.monna?fref=tshttps://www.facebook.com/valdyna.monna?fref=ts
https://www.facebook.com/valdyna.monna?fref=tsArif Alexi
 
FamilySearch Reference Client
FamilySearch Reference ClientFamilySearch Reference Client
FamilySearch Reference ClientDallan Quass
 
Mashing up JavaScript – Advanced Techniques for modern Web Apps
Mashing up JavaScript – Advanced Techniques for modern Web AppsMashing up JavaScript – Advanced Techniques for modern Web Apps
Mashing up JavaScript – Advanced Techniques for modern Web AppsBastian Hofmann
 
ActiveResource & REST
ActiveResource & RESTActiveResource & REST
ActiveResource & RESTRobbert
 

La actualidad más candente (20)

AnkaraJUG Kasım 2012 - PrimeFaces
AnkaraJUG Kasım 2012 - PrimeFacesAnkaraJUG Kasım 2012 - PrimeFaces
AnkaraJUG Kasım 2012 - PrimeFaces
 
CodeIgniter 3.0
CodeIgniter 3.0CodeIgniter 3.0
CodeIgniter 3.0
 
Frameworks da nova Era PHP FuelPHP
Frameworks da nova Era PHP FuelPHPFrameworks da nova Era PHP FuelPHP
Frameworks da nova Era PHP FuelPHP
 
Symfony2 and AngularJS
Symfony2 and AngularJSSymfony2 and AngularJS
Symfony2 and AngularJS
 
Rails 3 overview
Rails 3 overviewRails 3 overview
Rails 3 overview
 
YUI on the go
YUI on the goYUI on the go
YUI on the go
 
Creating a Simple PHP and MySQL-Based Login System
Creating a Simple PHP and MySQL-Based Login SystemCreating a Simple PHP and MySQL-Based Login System
Creating a Simple PHP and MySQL-Based Login System
 
Action View Form Helpers - 1, Season 2
Action View Form Helpers - 1, Season 2Action View Form Helpers - 1, Season 2
Action View Form Helpers - 1, Season 2
 
Backbone - TDC 2011 Floripa
Backbone - TDC 2011 FloripaBackbone - TDC 2011 Floripa
Backbone - TDC 2011 Floripa
 
&lt;img src="../i/r_14.png" />
&lt;img src="../i/r_14.png" />&lt;img src="../i/r_14.png" />
&lt;img src="../i/r_14.png" />
 
파이썬 플라스크로 배우는 웹프로그래밍 #4 (ABCD)
파이썬 플라스크로 배우는 웹프로그래밍 #4 (ABCD)파이썬 플라스크로 배우는 웹프로그래밍 #4 (ABCD)
파이썬 플라스크로 배우는 웹프로그래밍 #4 (ABCD)
 
Sprout core and performance
Sprout core and performanceSprout core and performance
Sprout core and performance
 
Web2py tutorial to create db driven application.
Web2py tutorial to create db driven application.Web2py tutorial to create db driven application.
Web2py tutorial to create db driven application.
 
Mojolicious
MojoliciousMojolicious
Mojolicious
 
Mashing up JavaScript
Mashing up JavaScriptMashing up JavaScript
Mashing up JavaScript
 
Web2py Code Lab
Web2py Code LabWeb2py Code Lab
Web2py Code Lab
 
https://www.facebook.com/valdyna.monna?fref=ts
https://www.facebook.com/valdyna.monna?fref=tshttps://www.facebook.com/valdyna.monna?fref=ts
https://www.facebook.com/valdyna.monna?fref=ts
 
FamilySearch Reference Client
FamilySearch Reference ClientFamilySearch Reference Client
FamilySearch Reference Client
 
Mashing up JavaScript – Advanced Techniques for modern Web Apps
Mashing up JavaScript – Advanced Techniques for modern Web AppsMashing up JavaScript – Advanced Techniques for modern Web Apps
Mashing up JavaScript – Advanced Techniques for modern Web Apps
 
ActiveResource & REST
ActiveResource & RESTActiveResource & REST
ActiveResource & REST
 

Destacado

Laravel 로 배우는 서버사이드 #4
Laravel 로 배우는 서버사이드 #4Laravel 로 배우는 서버사이드 #4
Laravel 로 배우는 서버사이드 #4성일 한
 
Laravel 로 배우는 서버사이드 #1
Laravel 로 배우는 서버사이드 #1Laravel 로 배우는 서버사이드 #1
Laravel 로 배우는 서버사이드 #1성일 한
 
Laravel 로 배우는 서버사이드 #2
Laravel 로 배우는 서버사이드 #2Laravel 로 배우는 서버사이드 #2
Laravel 로 배우는 서버사이드 #2성일 한
 
Laravel 로 배우는 서버사이드 #3
Laravel 로 배우는 서버사이드 #3Laravel 로 배우는 서버사이드 #3
Laravel 로 배우는 서버사이드 #3성일 한
 
Python 으로 Slackbot 개발하기
Python 으로 Slackbot 개발하기Python 으로 Slackbot 개발하기
Python 으로 Slackbot 개발하기성일 한
 
2016 ABCD 소개
2016 ABCD 소개2016 ABCD 소개
2016 ABCD 소개성일 한
 
Ionic으로 모바일앱 만들기 #4
Ionic으로 모바일앱 만들기 #4Ionic으로 모바일앱 만들기 #4
Ionic으로 모바일앱 만들기 #4성일 한
 
Ionic으로 모바일앱 만들기 #3
Ionic으로 모바일앱 만들기 #3Ionic으로 모바일앱 만들기 #3
Ionic으로 모바일앱 만들기 #3성일 한
 
Ionic으로 모바일앱 만들기 #5
Ionic으로 모바일앱 만들기 #5Ionic으로 모바일앱 만들기 #5
Ionic으로 모바일앱 만들기 #5성일 한
 
Ionic으로 모바일앱 만들기 #2
Ionic으로 모바일앱 만들기 #2Ionic으로 모바일앱 만들기 #2
Ionic으로 모바일앱 만들기 #2성일 한
 
Ionic으로 모바일앱 만들기 #1
Ionic으로 모바일앱 만들기 #1Ionic으로 모바일앱 만들기 #1
Ionic으로 모바일앱 만들기 #1성일 한
 
2016 W3C Conference #5 : UNIVERSAL RENDERING (React.JS 중심)
2016 W3C Conference #5 : UNIVERSAL RENDERING (React.JS 중심)2016 W3C Conference #5 : UNIVERSAL RENDERING (React.JS 중심)
2016 W3C Conference #5 : UNIVERSAL RENDERING (React.JS 중심)양재동 코드랩
 
2016 W3C Conference #7 : Electron, 웹 기술로 담아내는 데스크톱 애플리케이션
2016 W3C Conference #7 : Electron, 웹 기술로 담아내는 데스크톱 애플리케이션2016 W3C Conference #7 : Electron, 웹 기술로 담아내는 데스크톱 애플리케이션
2016 W3C Conference #7 : Electron, 웹 기술로 담아내는 데스크톱 애플리케이션양재동 코드랩
 
2016 W3C Conference #6 : ReactiveX + Meteor 종단간 암호화 구현 사례
2016 W3C Conference #6 : ReactiveX + Meteor 종단간 암호화 구현 사례2016 W3C Conference #6 : ReactiveX + Meteor 종단간 암호화 구현 사례
2016 W3C Conference #6 : ReactiveX + Meteor 종단간 암호화 구현 사례양재동 코드랩
 
2016 W3C Conference #2 : VANILA JS로 개발하기
2016 W3C Conference #2 : VANILA JS로 개발하기2016 W3C Conference #2 : VANILA JS로 개발하기
2016 W3C Conference #2 : VANILA JS로 개발하기양재동 코드랩
 
2016 W3C Conference #4 : ANGULAR + ES6
2016 W3C Conference #4 : ANGULAR + ES62016 W3C Conference #4 : ANGULAR + ES6
2016 W3C Conference #4 : ANGULAR + ES6양재동 코드랩
 
2016 W3C Conference #1 : 웹 개발의 현재와 미래
2016 W3C Conference #1 : 웹 개발의 현재와 미래2016 W3C Conference #1 : 웹 개발의 현재와 미래
2016 W3C Conference #1 : 웹 개발의 현재와 미래양재동 코드랩
 
2016 W3C Conference #9 : 컨테이너와 웹 어플리케이션
2016 W3C Conference #9 : 컨테이너와 웹 어플리케이션2016 W3C Conference #9 : 컨테이너와 웹 어플리케이션
2016 W3C Conference #9 : 컨테이너와 웹 어플리케이션양재동 코드랩
 
Data-binding AngularJS
Data-binding AngularJSData-binding AngularJS
Data-binding AngularJSEunYoung Kim
 
가볍게 살펴보는 AngularJS
가볍게 살펴보는 AngularJS가볍게 살펴보는 AngularJS
가볍게 살펴보는 AngularJSJae Sung Park
 

Destacado (20)

Laravel 로 배우는 서버사이드 #4
Laravel 로 배우는 서버사이드 #4Laravel 로 배우는 서버사이드 #4
Laravel 로 배우는 서버사이드 #4
 
Laravel 로 배우는 서버사이드 #1
Laravel 로 배우는 서버사이드 #1Laravel 로 배우는 서버사이드 #1
Laravel 로 배우는 서버사이드 #1
 
Laravel 로 배우는 서버사이드 #2
Laravel 로 배우는 서버사이드 #2Laravel 로 배우는 서버사이드 #2
Laravel 로 배우는 서버사이드 #2
 
Laravel 로 배우는 서버사이드 #3
Laravel 로 배우는 서버사이드 #3Laravel 로 배우는 서버사이드 #3
Laravel 로 배우는 서버사이드 #3
 
Python 으로 Slackbot 개발하기
Python 으로 Slackbot 개발하기Python 으로 Slackbot 개발하기
Python 으로 Slackbot 개발하기
 
2016 ABCD 소개
2016 ABCD 소개2016 ABCD 소개
2016 ABCD 소개
 
Ionic으로 모바일앱 만들기 #4
Ionic으로 모바일앱 만들기 #4Ionic으로 모바일앱 만들기 #4
Ionic으로 모바일앱 만들기 #4
 
Ionic으로 모바일앱 만들기 #3
Ionic으로 모바일앱 만들기 #3Ionic으로 모바일앱 만들기 #3
Ionic으로 모바일앱 만들기 #3
 
Ionic으로 모바일앱 만들기 #5
Ionic으로 모바일앱 만들기 #5Ionic으로 모바일앱 만들기 #5
Ionic으로 모바일앱 만들기 #5
 
Ionic으로 모바일앱 만들기 #2
Ionic으로 모바일앱 만들기 #2Ionic으로 모바일앱 만들기 #2
Ionic으로 모바일앱 만들기 #2
 
Ionic으로 모바일앱 만들기 #1
Ionic으로 모바일앱 만들기 #1Ionic으로 모바일앱 만들기 #1
Ionic으로 모바일앱 만들기 #1
 
2016 W3C Conference #5 : UNIVERSAL RENDERING (React.JS 중심)
2016 W3C Conference #5 : UNIVERSAL RENDERING (React.JS 중심)2016 W3C Conference #5 : UNIVERSAL RENDERING (React.JS 중심)
2016 W3C Conference #5 : UNIVERSAL RENDERING (React.JS 중심)
 
2016 W3C Conference #7 : Electron, 웹 기술로 담아내는 데스크톱 애플리케이션
2016 W3C Conference #7 : Electron, 웹 기술로 담아내는 데스크톱 애플리케이션2016 W3C Conference #7 : Electron, 웹 기술로 담아내는 데스크톱 애플리케이션
2016 W3C Conference #7 : Electron, 웹 기술로 담아내는 데스크톱 애플리케이션
 
2016 W3C Conference #6 : ReactiveX + Meteor 종단간 암호화 구현 사례
2016 W3C Conference #6 : ReactiveX + Meteor 종단간 암호화 구현 사례2016 W3C Conference #6 : ReactiveX + Meteor 종단간 암호화 구현 사례
2016 W3C Conference #6 : ReactiveX + Meteor 종단간 암호화 구현 사례
 
2016 W3C Conference #2 : VANILA JS로 개발하기
2016 W3C Conference #2 : VANILA JS로 개발하기2016 W3C Conference #2 : VANILA JS로 개발하기
2016 W3C Conference #2 : VANILA JS로 개발하기
 
2016 W3C Conference #4 : ANGULAR + ES6
2016 W3C Conference #4 : ANGULAR + ES62016 W3C Conference #4 : ANGULAR + ES6
2016 W3C Conference #4 : ANGULAR + ES6
 
2016 W3C Conference #1 : 웹 개발의 현재와 미래
2016 W3C Conference #1 : 웹 개발의 현재와 미래2016 W3C Conference #1 : 웹 개발의 현재와 미래
2016 W3C Conference #1 : 웹 개발의 현재와 미래
 
2016 W3C Conference #9 : 컨테이너와 웹 어플리케이션
2016 W3C Conference #9 : 컨테이너와 웹 어플리케이션2016 W3C Conference #9 : 컨테이너와 웹 어플리케이션
2016 W3C Conference #9 : 컨테이너와 웹 어플리케이션
 
Data-binding AngularJS
Data-binding AngularJSData-binding AngularJS
Data-binding AngularJS
 
가볍게 살펴보는 AngularJS
가볍게 살펴보는 AngularJS가볍게 살펴보는 AngularJS
가볍게 살펴보는 AngularJS
 

Similar a Laravel 로 배우는 서버사이드 #5

Practical PHP by example Jan Leth-Kjaer
Practical PHP by example   Jan Leth-KjaerPractical PHP by example   Jan Leth-Kjaer
Practical PHP by example Jan Leth-KjaerCOMMON Europe
 
Implementation of GUI Framework part3
Implementation of GUI Framework part3Implementation of GUI Framework part3
Implementation of GUI Framework part3masahiroookubo
 
Clever Joomla! Templating Tips and Tricks
Clever Joomla! Templating Tips and TricksClever Joomla! Templating Tips and Tricks
Clever Joomla! Templating Tips and TricksThemePartner
 
Vaadin Components @ Angular U
Vaadin Components @ Angular UVaadin Components @ Angular U
Vaadin Components @ Angular UJoonas Lehtinen
 
Ex[1].3 php db connectivity
Ex[1].3 php db connectivityEx[1].3 php db connectivity
Ex[1].3 php db connectivityMouli Chandira
 
Oracle Application Express & jQuery Mobile - OGh Apex Dag 2012
Oracle Application Express & jQuery Mobile - OGh Apex Dag 2012Oracle Application Express & jQuery Mobile - OGh Apex Dag 2012
Oracle Application Express & jQuery Mobile - OGh Apex Dag 2012crokitta
 
Enjoy the vue.js
Enjoy the vue.jsEnjoy the vue.js
Enjoy the vue.jsTechExeter
 
Building iPhone Web Apps using "classic" Domino
Building iPhone Web Apps using "classic" DominoBuilding iPhone Web Apps using "classic" Domino
Building iPhone Web Apps using "classic" DominoRob Bontekoe
 
Desenvolvimento web com Ruby on Rails (parte 2)
Desenvolvimento web com Ruby on Rails (parte 2)Desenvolvimento web com Ruby on Rails (parte 2)
Desenvolvimento web com Ruby on Rails (parte 2)Joao Lucas Santana
 
Using Geeklog as a Web Application Framework
Using Geeklog as a Web Application FrameworkUsing Geeklog as a Web Application Framework
Using Geeklog as a Web Application FrameworkDirk Haun
 
Kohana bootstrap - modal form
Kohana   bootstrap - modal formKohana   bootstrap - modal form
Kohana bootstrap - modal formJulio Pari
 
Kohana bootstrap - modal form
Kohana   bootstrap - modal formKohana   bootstrap - modal form
Kohana bootstrap - modal formJulio Pari
 
Rails 3: Dashing to the Finish
Rails 3: Dashing to the FinishRails 3: Dashing to the Finish
Rails 3: Dashing to the FinishYehuda Katz
 
HTML5 New and Improved
HTML5   New and ImprovedHTML5   New and Improved
HTML5 New and ImprovedTimothy Fisher
 

Similar a Laravel 로 배우는 서버사이드 #5 (20)

Practical PHP by example Jan Leth-Kjaer
Practical PHP by example   Jan Leth-KjaerPractical PHP by example   Jan Leth-Kjaer
Practical PHP by example Jan Leth-Kjaer
 
PHP POWERPOINT SLIDES
PHP POWERPOINT SLIDESPHP POWERPOINT SLIDES
PHP POWERPOINT SLIDES
 
Implementation of GUI Framework part3
Implementation of GUI Framework part3Implementation of GUI Framework part3
Implementation of GUI Framework part3
 
Clever Joomla! Templating Tips and Tricks
Clever Joomla! Templating Tips and TricksClever Joomla! Templating Tips and Tricks
Clever Joomla! Templating Tips and Tricks
 
Framework
FrameworkFramework
Framework
 
Vaadin Components @ Angular U
Vaadin Components @ Angular UVaadin Components @ Angular U
Vaadin Components @ Angular U
 
Ex[1].3 php db connectivity
Ex[1].3 php db connectivityEx[1].3 php db connectivity
Ex[1].3 php db connectivity
 
Blog Hacks 2011
Blog Hacks 2011Blog Hacks 2011
Blog Hacks 2011
 
Oracle Application Express & jQuery Mobile - OGh Apex Dag 2012
Oracle Application Express & jQuery Mobile - OGh Apex Dag 2012Oracle Application Express & jQuery Mobile - OGh Apex Dag 2012
Oracle Application Express & jQuery Mobile - OGh Apex Dag 2012
 
Enjoy the vue.js
Enjoy the vue.jsEnjoy the vue.js
Enjoy the vue.js
 
Building iPhone Web Apps using "classic" Domino
Building iPhone Web Apps using "classic" DominoBuilding iPhone Web Apps using "classic" Domino
Building iPhone Web Apps using "classic" Domino
 
Desenvolvimento web com Ruby on Rails (parte 2)
Desenvolvimento web com Ruby on Rails (parte 2)Desenvolvimento web com Ruby on Rails (parte 2)
Desenvolvimento web com Ruby on Rails (parte 2)
 
HTML5
HTML5HTML5
HTML5
 
Pp checker
Pp checkerPp checker
Pp checker
 
Using Geeklog as a Web Application Framework
Using Geeklog as a Web Application FrameworkUsing Geeklog as a Web Application Framework
Using Geeklog as a Web Application Framework
 
HTML5 - Pedro Rosa
HTML5 - Pedro RosaHTML5 - Pedro Rosa
HTML5 - Pedro Rosa
 
Kohana bootstrap - modal form
Kohana   bootstrap - modal formKohana   bootstrap - modal form
Kohana bootstrap - modal form
 
Kohana bootstrap - modal form
Kohana   bootstrap - modal formKohana   bootstrap - modal form
Kohana bootstrap - modal form
 
Rails 3: Dashing to the Finish
Rails 3: Dashing to the FinishRails 3: Dashing to the Finish
Rails 3: Dashing to the Finish
 
HTML5 New and Improved
HTML5   New and ImprovedHTML5   New and Improved
HTML5 New and Improved
 

Más de 성일 한

파이어베이스 스터디
파이어베이스 스터디파이어베이스 스터디
파이어베이스 스터디성일 한
 
Vuejs 시작하기
Vuejs 시작하기Vuejs 시작하기
Vuejs 시작하기성일 한
 
Electron 개발하기
Electron 개발하기Electron 개발하기
Electron 개발하기성일 한
 
챗봇 시작해보기
챗봇 시작해보기챗봇 시작해보기
챗봇 시작해보기성일 한
 
인플루언서 마케팅 (INFLUENCER MARKETING)
인플루언서 마케팅 (INFLUENCER MARKETING)인플루언서 마케팅 (INFLUENCER MARKETING)
인플루언서 마케팅 (INFLUENCER MARKETING)성일 한
 
처음배우는 자바스크립트, 제이쿼리 #4
처음배우는 자바스크립트, 제이쿼리 #4처음배우는 자바스크립트, 제이쿼리 #4
처음배우는 자바스크립트, 제이쿼리 #4성일 한
 
처음배우는 자바스크립트, 제이쿼리 #3
처음배우는 자바스크립트, 제이쿼리 #3처음배우는 자바스크립트, 제이쿼리 #3
처음배우는 자바스크립트, 제이쿼리 #3성일 한
 
처음배우는 자바스크립트, 제이쿼리 #2
처음배우는 자바스크립트, 제이쿼리 #2처음배우는 자바스크립트, 제이쿼리 #2
처음배우는 자바스크립트, 제이쿼리 #2성일 한
 
처음배우는 자바스크립트, 제이쿼리 #1
처음배우는 자바스크립트, 제이쿼리 #1처음배우는 자바스크립트, 제이쿼리 #1
처음배우는 자바스크립트, 제이쿼리 #1성일 한
 
CSS 선택자와 디버그
CSS 선택자와 디버그CSS 선택자와 디버그
CSS 선택자와 디버그성일 한
 
워드프레스 기초 (ABCD) #2
워드프레스 기초 (ABCD) #2워드프레스 기초 (ABCD) #2
워드프레스 기초 (ABCD) #2성일 한
 
워드프레스 기초 (ABCD) #1
워드프레스 기초 (ABCD) #1워드프레스 기초 (ABCD) #1
워드프레스 기초 (ABCD) #1성일 한
 
파이썬 플라스크로 배우는 웹프로그래밍 #3 (ABCD)
파이썬 플라스크로 배우는 웹프로그래밍 #3 (ABCD)파이썬 플라스크로 배우는 웹프로그래밍 #3 (ABCD)
파이썬 플라스크로 배우는 웹프로그래밍 #3 (ABCD)성일 한
 
파이썬 플라스크로 배우는 웹프로그래밍 #2 (ABCD)
파이썬 플라스크로 배우는 웹프로그래밍 #2 (ABCD)파이썬 플라스크로 배우는 웹프로그래밍 #2 (ABCD)
파이썬 플라스크로 배우는 웹프로그래밍 #2 (ABCD)성일 한
 
파이썬 플라스크로 배우는 웹프로그래밍 #1 (ABCD Foundation)
파이썬 플라스크로 배우는 웹프로그래밍 #1 (ABCD Foundation)파이썬 플라스크로 배우는 웹프로그래밍 #1 (ABCD Foundation)
파이썬 플라스크로 배우는 웹프로그래밍 #1 (ABCD Foundation)성일 한
 

Más de 성일 한 (15)

파이어베이스 스터디
파이어베이스 스터디파이어베이스 스터디
파이어베이스 스터디
 
Vuejs 시작하기
Vuejs 시작하기Vuejs 시작하기
Vuejs 시작하기
 
Electron 개발하기
Electron 개발하기Electron 개발하기
Electron 개발하기
 
챗봇 시작해보기
챗봇 시작해보기챗봇 시작해보기
챗봇 시작해보기
 
인플루언서 마케팅 (INFLUENCER MARKETING)
인플루언서 마케팅 (INFLUENCER MARKETING)인플루언서 마케팅 (INFLUENCER MARKETING)
인플루언서 마케팅 (INFLUENCER MARKETING)
 
처음배우는 자바스크립트, 제이쿼리 #4
처음배우는 자바스크립트, 제이쿼리 #4처음배우는 자바스크립트, 제이쿼리 #4
처음배우는 자바스크립트, 제이쿼리 #4
 
처음배우는 자바스크립트, 제이쿼리 #3
처음배우는 자바스크립트, 제이쿼리 #3처음배우는 자바스크립트, 제이쿼리 #3
처음배우는 자바스크립트, 제이쿼리 #3
 
처음배우는 자바스크립트, 제이쿼리 #2
처음배우는 자바스크립트, 제이쿼리 #2처음배우는 자바스크립트, 제이쿼리 #2
처음배우는 자바스크립트, 제이쿼리 #2
 
처음배우는 자바스크립트, 제이쿼리 #1
처음배우는 자바스크립트, 제이쿼리 #1처음배우는 자바스크립트, 제이쿼리 #1
처음배우는 자바스크립트, 제이쿼리 #1
 
CSS 선택자와 디버그
CSS 선택자와 디버그CSS 선택자와 디버그
CSS 선택자와 디버그
 
워드프레스 기초 (ABCD) #2
워드프레스 기초 (ABCD) #2워드프레스 기초 (ABCD) #2
워드프레스 기초 (ABCD) #2
 
워드프레스 기초 (ABCD) #1
워드프레스 기초 (ABCD) #1워드프레스 기초 (ABCD) #1
워드프레스 기초 (ABCD) #1
 
파이썬 플라스크로 배우는 웹프로그래밍 #3 (ABCD)
파이썬 플라스크로 배우는 웹프로그래밍 #3 (ABCD)파이썬 플라스크로 배우는 웹프로그래밍 #3 (ABCD)
파이썬 플라스크로 배우는 웹프로그래밍 #3 (ABCD)
 
파이썬 플라스크로 배우는 웹프로그래밍 #2 (ABCD)
파이썬 플라스크로 배우는 웹프로그래밍 #2 (ABCD)파이썬 플라스크로 배우는 웹프로그래밍 #2 (ABCD)
파이썬 플라스크로 배우는 웹프로그래밍 #2 (ABCD)
 
파이썬 플라스크로 배우는 웹프로그래밍 #1 (ABCD Foundation)
파이썬 플라스크로 배우는 웹프로그래밍 #1 (ABCD Foundation)파이썬 플라스크로 배우는 웹프로그래밍 #1 (ABCD Foundation)
파이썬 플라스크로 배우는 웹프로그래밍 #1 (ABCD Foundation)
 

Último

Large Language Models for Test Case Evolution and Repair
Large Language Models for Test Case Evolution and RepairLarge Language Models for Test Case Evolution and Repair
Large Language Models for Test Case Evolution and RepairLionel Briand
 
Real-time Tracking and Monitoring with Cargo Cloud Solutions.pptx
Real-time Tracking and Monitoring with Cargo Cloud Solutions.pptxReal-time Tracking and Monitoring with Cargo Cloud Solutions.pptx
Real-time Tracking and Monitoring with Cargo Cloud Solutions.pptxRTS corp
 
Post Quantum Cryptography – The Impact on Identity
Post Quantum Cryptography – The Impact on IdentityPost Quantum Cryptography – The Impact on Identity
Post Quantum Cryptography – The Impact on Identityteam-WIBU
 
Patterns for automating API delivery. API conference
Patterns for automating API delivery. API conferencePatterns for automating API delivery. API conference
Patterns for automating API delivery. API conferencessuser9e7c64
 
SAM Training Session - How to use EXCEL ?
SAM Training Session - How to use EXCEL ?SAM Training Session - How to use EXCEL ?
SAM Training Session - How to use EXCEL ?Alexandre Beguel
 
Understanding Flamingo - DeepMind's VLM Architecture
Understanding Flamingo - DeepMind's VLM ArchitectureUnderstanding Flamingo - DeepMind's VLM Architecture
Understanding Flamingo - DeepMind's VLM Architecturerahul_net
 
SensoDat: Simulation-based Sensor Dataset of Self-driving Cars
SensoDat: Simulation-based Sensor Dataset of Self-driving CarsSensoDat: Simulation-based Sensor Dataset of Self-driving Cars
SensoDat: Simulation-based Sensor Dataset of Self-driving CarsChristian Birchler
 
Introduction to Firebase Workshop Slides
Introduction to Firebase Workshop SlidesIntroduction to Firebase Workshop Slides
Introduction to Firebase Workshop Slidesvaideheekore1
 
2024 DevNexus Patterns for Resiliency: Shuffle shards
2024 DevNexus Patterns for Resiliency: Shuffle shards2024 DevNexus Patterns for Resiliency: Shuffle shards
2024 DevNexus Patterns for Resiliency: Shuffle shardsChristopher Curtin
 
2024-04-09 - From Complexity to Clarity - AWS Summit AMS.pdf
2024-04-09 - From Complexity to Clarity - AWS Summit AMS.pdf2024-04-09 - From Complexity to Clarity - AWS Summit AMS.pdf
2024-04-09 - From Complexity to Clarity - AWS Summit AMS.pdfAndrey Devyatkin
 
What’s New in VictoriaMetrics: Q1 2024 Updates
What’s New in VictoriaMetrics: Q1 2024 UpdatesWhat’s New in VictoriaMetrics: Q1 2024 Updates
What’s New in VictoriaMetrics: Q1 2024 UpdatesVictoriaMetrics
 
VictoriaMetrics Q1 Meet Up '24 - Community & News Update
VictoriaMetrics Q1 Meet Up '24 - Community & News UpdateVictoriaMetrics Q1 Meet Up '24 - Community & News Update
VictoriaMetrics Q1 Meet Up '24 - Community & News UpdateVictoriaMetrics
 
Salesforce Implementation Services PPT By ABSYZ
Salesforce Implementation Services PPT By ABSYZSalesforce Implementation Services PPT By ABSYZ
Salesforce Implementation Services PPT By ABSYZABSYZ Inc
 
Revolutionizing the Digital Transformation Office - Leveraging OnePlan’s AI a...
Revolutionizing the Digital Transformation Office - Leveraging OnePlan’s AI a...Revolutionizing the Digital Transformation Office - Leveraging OnePlan’s AI a...
Revolutionizing the Digital Transformation Office - Leveraging OnePlan’s AI a...OnePlan Solutions
 
GraphSummit Madrid - Product Vision and Roadmap - Luis Salvador Neo4j
GraphSummit Madrid - Product Vision and Roadmap - Luis Salvador Neo4jGraphSummit Madrid - Product Vision and Roadmap - Luis Salvador Neo4j
GraphSummit Madrid - Product Vision and Roadmap - Luis Salvador Neo4jNeo4j
 
OpenChain Education Work Group Monthly Meeting - 2024-04-10 - Full Recording
OpenChain Education Work Group Monthly Meeting - 2024-04-10 - Full RecordingOpenChain Education Work Group Monthly Meeting - 2024-04-10 - Full Recording
OpenChain Education Work Group Monthly Meeting - 2024-04-10 - Full RecordingShane Coughlan
 
Zer0con 2024 final share short version.pdf
Zer0con 2024 final share short version.pdfZer0con 2024 final share short version.pdf
Zer0con 2024 final share short version.pdfmaor17
 
Machine Learning Software Engineering Patterns and Their Engineering
Machine Learning Software Engineering Patterns and Their EngineeringMachine Learning Software Engineering Patterns and Their Engineering
Machine Learning Software Engineering Patterns and Their EngineeringHironori Washizaki
 
Simplifying Microservices & Apps - The art of effortless development - Meetup...
Simplifying Microservices & Apps - The art of effortless development - Meetup...Simplifying Microservices & Apps - The art of effortless development - Meetup...
Simplifying Microservices & Apps - The art of effortless development - Meetup...Rob Geurden
 
JavaLand 2024 - Going serverless with Quarkus GraalVM native images and AWS L...
JavaLand 2024 - Going serverless with Quarkus GraalVM native images and AWS L...JavaLand 2024 - Going serverless with Quarkus GraalVM native images and AWS L...
JavaLand 2024 - Going serverless with Quarkus GraalVM native images and AWS L...Bert Jan Schrijver
 

Último (20)

Large Language Models for Test Case Evolution and Repair
Large Language Models for Test Case Evolution and RepairLarge Language Models for Test Case Evolution and Repair
Large Language Models for Test Case Evolution and Repair
 
Real-time Tracking and Monitoring with Cargo Cloud Solutions.pptx
Real-time Tracking and Monitoring with Cargo Cloud Solutions.pptxReal-time Tracking and Monitoring with Cargo Cloud Solutions.pptx
Real-time Tracking and Monitoring with Cargo Cloud Solutions.pptx
 
Post Quantum Cryptography – The Impact on Identity
Post Quantum Cryptography – The Impact on IdentityPost Quantum Cryptography – The Impact on Identity
Post Quantum Cryptography – The Impact on Identity
 
Patterns for automating API delivery. API conference
Patterns for automating API delivery. API conferencePatterns for automating API delivery. API conference
Patterns for automating API delivery. API conference
 
SAM Training Session - How to use EXCEL ?
SAM Training Session - How to use EXCEL ?SAM Training Session - How to use EXCEL ?
SAM Training Session - How to use EXCEL ?
 
Understanding Flamingo - DeepMind's VLM Architecture
Understanding Flamingo - DeepMind's VLM ArchitectureUnderstanding Flamingo - DeepMind's VLM Architecture
Understanding Flamingo - DeepMind's VLM Architecture
 
SensoDat: Simulation-based Sensor Dataset of Self-driving Cars
SensoDat: Simulation-based Sensor Dataset of Self-driving CarsSensoDat: Simulation-based Sensor Dataset of Self-driving Cars
SensoDat: Simulation-based Sensor Dataset of Self-driving Cars
 
Introduction to Firebase Workshop Slides
Introduction to Firebase Workshop SlidesIntroduction to Firebase Workshop Slides
Introduction to Firebase Workshop Slides
 
2024 DevNexus Patterns for Resiliency: Shuffle shards
2024 DevNexus Patterns for Resiliency: Shuffle shards2024 DevNexus Patterns for Resiliency: Shuffle shards
2024 DevNexus Patterns for Resiliency: Shuffle shards
 
2024-04-09 - From Complexity to Clarity - AWS Summit AMS.pdf
2024-04-09 - From Complexity to Clarity - AWS Summit AMS.pdf2024-04-09 - From Complexity to Clarity - AWS Summit AMS.pdf
2024-04-09 - From Complexity to Clarity - AWS Summit AMS.pdf
 
What’s New in VictoriaMetrics: Q1 2024 Updates
What’s New in VictoriaMetrics: Q1 2024 UpdatesWhat’s New in VictoriaMetrics: Q1 2024 Updates
What’s New in VictoriaMetrics: Q1 2024 Updates
 
VictoriaMetrics Q1 Meet Up '24 - Community & News Update
VictoriaMetrics Q1 Meet Up '24 - Community & News UpdateVictoriaMetrics Q1 Meet Up '24 - Community & News Update
VictoriaMetrics Q1 Meet Up '24 - Community & News Update
 
Salesforce Implementation Services PPT By ABSYZ
Salesforce Implementation Services PPT By ABSYZSalesforce Implementation Services PPT By ABSYZ
Salesforce Implementation Services PPT By ABSYZ
 
Revolutionizing the Digital Transformation Office - Leveraging OnePlan’s AI a...
Revolutionizing the Digital Transformation Office - Leveraging OnePlan’s AI a...Revolutionizing the Digital Transformation Office - Leveraging OnePlan’s AI a...
Revolutionizing the Digital Transformation Office - Leveraging OnePlan’s AI a...
 
GraphSummit Madrid - Product Vision and Roadmap - Luis Salvador Neo4j
GraphSummit Madrid - Product Vision and Roadmap - Luis Salvador Neo4jGraphSummit Madrid - Product Vision and Roadmap - Luis Salvador Neo4j
GraphSummit Madrid - Product Vision and Roadmap - Luis Salvador Neo4j
 
OpenChain Education Work Group Monthly Meeting - 2024-04-10 - Full Recording
OpenChain Education Work Group Monthly Meeting - 2024-04-10 - Full RecordingOpenChain Education Work Group Monthly Meeting - 2024-04-10 - Full Recording
OpenChain Education Work Group Monthly Meeting - 2024-04-10 - Full Recording
 
Zer0con 2024 final share short version.pdf
Zer0con 2024 final share short version.pdfZer0con 2024 final share short version.pdf
Zer0con 2024 final share short version.pdf
 
Machine Learning Software Engineering Patterns and Their Engineering
Machine Learning Software Engineering Patterns and Their EngineeringMachine Learning Software Engineering Patterns and Their Engineering
Machine Learning Software Engineering Patterns and Their Engineering
 
Simplifying Microservices & Apps - The art of effortless development - Meetup...
Simplifying Microservices & Apps - The art of effortless development - Meetup...Simplifying Microservices & Apps - The art of effortless development - Meetup...
Simplifying Microservices & Apps - The art of effortless development - Meetup...
 
JavaLand 2024 - Going serverless with Quarkus GraalVM native images and AWS L...
JavaLand 2024 - Going serverless with Quarkus GraalVM native images and AWS L...JavaLand 2024 - Going serverless with Quarkus GraalVM native images and AWS L...
JavaLand 2024 - Going serverless with Quarkus GraalVM native images and AWS L...
 

Laravel 로 배우는 서버사이드 #5

  • 1. Laravel 로 배우는 서버사이드 #5 게시판 만들어보기 ABCD, SNOWKIWI / 한성일
  • 5. 파일 구조 - add.blade.php - edit.blade.php - list.blade.php - login.blade.php - view.blade.php - default.blade.php resources/views/board/contents/ resources/views/board/layout/ public/css/ - abcd.css - BoardContents.php - BoardUser.php app/ - BoardController.php app/Http/Controllers/
  • 8. CSS 등록 public/css/abcd.css css 폴더를 만들고 abcd.css 생성 /* Common */ .vertical-align { display: flex; align-items: center; flex-direction: row; } .content { position: relative; padding: 15px; margin: 0 -15px 15px; border-color: #e5e5e5 #eee #eee; border-style: solid; border-width: 1px 1px; -webkit-box-shadow: inset 0 3px 6px rgba(0,0,0,.05); box-shadow: none; } /* Login Form */ .form-signin { max-width: 330px; padding: 15px; margin: 0 auto; } .form-signin input[type="email"] { margin-bottom: -1px; border-bottom-right-radius: 0; border-bottom-left-radius: 0; } .form-signin input[type="password"] { margin-bottom: 10px; border-top-left-radius: 0; border-top-right-radius: 0; }
  • 9. View 구조 - add.blade.php - edit.blade.php - list.blade.php - login.blade.php - view.blade.php - default.blade.php resources/views/board/contents/ resources/views/board/layout/
  • 10. Default Layout resources/views/board/layout/default.blade.php <!DOCTYPE html> <html lang="ko"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title> @yield('title') </title> <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet"> <link href="css/abcd.css" rel="stylesheet"> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script> </head> <body class="container"> @yield('content') </body> </html>
  • 11. 등록 컨텐츠 resources/views/board/contents/add.blade.php @extends('board.layout.default') @section('title') 등록 @stop @section('content') <div class="page-header"> <h1>ABCD <small>ABout CoDing</small></h1> </div> <form action="/add" id="addForm" method="post" > <div class="form-group"> <input type="text" name="title" class="form-control" placeholder="제목을 입력하세요." required autofocus> </div> <div class="form-group"> <textarea name="contents" class="form-control" rows="5" required></textarea> </div> <input type="hidden" name="_token" value="{{ csrf_token() }}"> <div class="vertical-align"> <div class="col-md-11 text-right"> <button class="btn btn-primary" type="submit">등록</button> </div> <div class="col-md-1 text-left "> <button class="btn btn-default" id="listBtn" type="button"> 목록 </button> </div> </div> </form> <script> $(document).ready(function(){ $("#listBtn").click(function(){ location.href = "/list"; }); }); </script> @stop
  • 12. 수정 컨텐츠 resources/views/board/contents/edit.blade.php @extends('board.layout.default') @section('title') 수정 @stop @section('content') <div class="page-header"> <h1>ABCD <small>ABout CoDing</small></h1> </div> <form action="/edit" id="editForm" method="post" > <div class="form-group"> <input type="text" name="title" class="form-control" placeholder="제목을 입력하세요." value="{{$contents->title}}" required autofocus> </div> <div class="form-group"> <textarea name="contents" class="form-control" rows=“5" required>{{$contents->contents}}</textarea> </div> <input type="hidden" name="pageid" value="{{ $pageid }}"> <input type="hidden" name="_token" value="{{ csrf_token() }}"> <div class="vertical-align"> <div class="col-md-11 text-right"> <button class="btn btn-primary" type="submit">수정</button> </div> <div class="col-md-1 text-left "> <button class="btn btn-default" id="listBtn" type="button"> 목록 </button> </div> </div> </form> <script> $(document).ready(function(){ $("#listBtn").click(function(){ location.href = "/list"; }); }); </script> @stop
  • 13. 소스 설명 @extends('board.layout.default') @section('title') 수정 @stop @section(‘content') ~ @stop default.blade.php 에 지정된 영역 <input type="hidden" name="_token" value="{{ csrf_token() }}"> POST 전달에 사용되는 토큰 Post form 에 히든으로 위치 없으면 서버전송시 에러 발생
  • 14. 목록 컨텐츠 1 resources/views/board/contents/list.blade.php @extends('board.layout.default') @section('title') 목록 @stop @section('content') <div class="page-header"> <h1>ABCD <small>ABout CoDing</small></h1> </div> <div class="panel panel-default"> <!-- Table --> <table class="table"> <thead> <tr> <th class="col-md-1">#</th> <th class="col-md-6">제목</th> <th class="col-md-2">작성자</th> <th class="col-md-2">작성일</th> <th class="col-md-1">조회수</th> </tr> </thead> <tbody> @foreach ($contents as $item) <tr> <th scope="row">{{ $item->id }}</th> <td><a href="/view?pageid={{ $item->id }}">{{ $item->title }}</a></td> <td>{{ $item->reg_user_name }}</td> <td>{{ $item->created_at }}</td> <td>{{ $item->view_count }}</td> </tr> @endforeach </tbody> </table> </div>
  • 15. 목록 컨텐츠 2<div class="vertical-align"> <div class="col-md-8"> <?php echo $contents->render(); ?> </div> <div class="col-md-3 text-right "> @if (Session::has('login')) <button type="button" id="addFormBtn" class="btn btn-default btn-primary">등록</button> @endif </div> <div class="col-md-1 btn-group text-right"> @if (Session::has('login')) <button class="btn btn-default" id="logoutBtn" type="button"> 로그아웃 </button> @else <button class="btn btn-default" id="loginFormBtn" type="button"> 로그인 </button> @endif </div> </div> <script> $(document).ready(function(){ $("#addFormBtn").click(function(){ location.href = "/add-form"; }); $("#loginFormBtn").click(function(){ location.href = "/login-form"; }); $("#logoutBtn").click(function(){ location.href = "/logout"; }); }); </script> @stop
  • 16. 소스설명 @if (Session::has(‘login')) // 실행될 문장 @endif 세션이 있을때만 실행 <?php echo $contents->render(); ?> 페이지네이션 생성
  • 17. 로그인 컨텐츠 resources/views/board/contents/login.blade.php @extends('board.layout.default') @section('title') 로그인 @stop @section('content') <div> <form class="form-signin" action="login" method="post"> <h2>ABCD 로그인</h2> <input type="email" name="email" class="form-control" placeholder="이메일" required autofocus> <input type="password" name="password" class="form-control" placeholder="비밀번호" required> <button class="btn btn-lg btn-primary btn-block" type="submit">로그인</button> <input type="hidden" name="_token" value="{{ csrf_token() }}"> </form> </div> @stop
  • 18. 게시물 보기 컨텐츠 1 resources/views/board/contents/view.blade.php @extends('board.layout.default') @section('title') {{$contents->title}} @stop @section('content') <div class="page-header"> <h1>ABCD <small>ABout CoDing</small></h1> </div> <div class="row vertical-align"> <div class="col-md-8"> <h4>{{$contents->title}}</h4> </div> <div class="col-md-4 text-right"> <p>작성자 : {{$contents->reg_user_name}} 작성일 : {{$contents->created_at}}</p> </div> </div> <div class="content"> {{$contents->contents}} </div> <div class="vertical-align"> <div class="col-md-8"></div> <div class="col-md-3 text-right "> <div class="btn-group" role="group"> @if (Session::has('login')) <button type="button" id="editFormBtn" class="btn btn-default">수정</button> <button type="button" id="delBtn" class="btn btn-default">삭제</button> @endif <button type="button" id="listBtn" class="btn btn-default">목록</button> </div> </div>
  • 19. 게시물 보기 컨텐츠 1 <div class="col-md-1 btn-group text-right"> @if (Session::has('login')) <button class="btn btn-default" id="logoutBtn" type="button"> 로그아웃 </button> @else <button class="btn btn-default" id="loginFormBtn" type="button"> 로그인 </button> @endif </div> </div> <script> $(document).ready(function(){ $("#editFormBtn").click(function(){ location.href = "/edit-form?pageid={{$pageid}}"; }); $("#delBtn").click(function(){ location.href = "/delete?pageid={{$pageid}}"; }); $("#listBtn").click(function(){ location.href = "/list"; }); $("#loginFormBtn").click(function(){ location.href = "/login-form"; }); $("#logoutBtn").click(function(){ location.href = "/logout"; }); }); </script> @stop
  • 23. 기본 스키마 생성 CREATE TABLE users ( id INT NOT NULL AUTO_INCREMENT, email VARCHAR(45) NULL, password VARCHAR(45) NULL, name VARCHAR(45) NULL, PRIMARY KEY (id)) ENGINE = InnoDB; CREATE TABLE contents ( id INT UNSIGNED NOT NULL AUTO_INCREMENT, title VARCHAR(45) NULL, contents TEXT NULL, reg_user_id INT NOT NULL, reg_user_name VARCHAR(45) NULL, view_count INT NULL DEFAULT 0, updated_at TIMESTAMP NULL, created_at TIMESTAMP NULL, PRIMARY KEY (id), INDEX fk_contents_users_idx (reg_user_id ASC), CONSTRAINT fk_contents_users FOREIGN KEY (reg_user_id) REFERENCES abcd_db.users (id) ON DELETE CASCADE ON UPDATE CASCADE) ENGINE = InnoDB;
  • 24. 회원 정보 입력 insert into users (email, password, name) values ( 'test@test.com', password('1234'), 'test user'); insert into users (email, password, name) values ( ‘jamie@snowkiwi.com’, password('1234'), ‘Jamie Han');
  • 27. 모델 생성 콘솔 홈 디렉토리로 이동1 cd ~/Documents/laravel-space/abcd cd C:laravel-spaceabcd 2 php artisan make:model BoardUser php artisan make:model BoardContents app/BoardContents.php app/BoardUser.php3 파일 생성 확인
  • 28. BoardUser 모델 app/BoardUser.php <?php namespace App; use IlluminateDatabaseEloquentModel; class BoardUser extends Model { protected $table = 'users'; protected $fillable = ['id', 'email', 'password', 'name']; protected $hidden = ['password']; }
  • 29. BoardContents 모델 app/BoardContents.php <?php namespace App; use IlluminateDatabaseEloquentModel; class BoardContents extends Model { protected $table = 'contents'; protected $fillable = ['id', 'title', 'reg_user_id', 'reg_user_name', 'view_count', 'updated_at', 'created_at' ]; protected $hidden = []; }
  • 31. routes.php /* Board */ Route::get('/login-form', 'BoardController@loginForm'); Route::post('/login', 'BoardController@login'); Route::get('/logout', 'BoardController@logout'); Route::get('/add-form', 'BoardController@addForm'); Route::post('/add', 'BoardController@add'); Route::get('/edit-form', 'BoardController@editForm'); Route::post('/edit', 'BoardController@edit'); Route::get('/delete', 'BoardController@delete'); Route::get('/list', 'BoardController@listView'); Route::get('/view', 'BoardController@view'); app/Http/routes.php
  • 33. 컨트롤러 생성 콘솔 홈 디렉토리로 이동1 cd ~/Documents/laravel-space/abcd cd C:laravel-spaceabcd 2 3 파일 생성 확인 php artisan make:controller BoardController app/Http/Controllers/BoardController.php
  • 34. 코딩 위치 app/Http/Controllers/BoardController.php class BoardController extends Controller { 기본 생성 함수 삭제후 코딩 } use AppBoardContents; use AppBoardUser; 다음라인 추가
  • 35. 로그인 public function loginForm() { return view('board.contents.login'); } public function login(Request $request) { $email = $request->input('email'); $password = $request->input('password'); $user = BoardUser::whereRaw('email = ? and password = password(?)', [$email, $password] ); if ( $user->count() > 0 ) { // 로그인 성공 $request->session()->put('login', true); $request->session()->put('user_id', $user->get()[0]->id); $request->session()->put('user_name', $user->get()[0]->name); return redirect('/list'); } else { // 로그인 실패 return redirect('/login-form'); } }
  • 37. 게시물 등록 public function addForm() { return view('board.contents.add'); } public function add(Request $request) { $title = $request->input('title'); $contents = $request->input('contents'); $boardContents = new BoardContents(); $boardContents->title = $title; $boardContents->contents = $contents; $boardContents->reg_user_id = $request->session()->get('user_id'); $boardContents->reg_user_name = $request->session()->get('user_name'); $boardContents->save(); return redirect('/list'); }
  • 39. 게시물 목록 public function listView() { // 페이지네이션 사용 $contents = BoardContents::orderBy('id', 'desc')->paginate(5); $contents->setPath('/list'); return view('board.contents.list')->with('contents', $contents); }
  • 41. 게시물 수정 public function editForm(Request $request) { $pageid = $request->input('pageid'); $boardContents = BoardContents::find($pageid); return view('board.contents.edit')->with('contents', $boardContents) ->with('pageid', $pageid); } public function edit(Request $request) { $pageid = $request->input('pageid'); $title = $request->input('title'); $contents = $request->input('contents'); $boardContents = BoardContents::find($pageid); $boardContents->title = $title; $boardContents->contents = $contents; $boardContents->save(); return redirect('/view?pageid='.$pageid); }
  • 43. 게시물 삭제 public function delete(Request $request) { $pageid = $request->input('pageid'); $boardContents = BoardContents::whereRaw('id = ?', [$pageid]); $boardContents->delete(); return redirect('/list'); }
  • 45. 로그아웃 public function logout(Request $request) { $request->session()->flush(); return redirect('/list'); }
  • 47. 게시물 보기 public function view(Request $request) { $pageid = $request->input('pageid'); BoardContents::whereRaw('id = ?', [$pageid])->increment('view_count'); $contents = BoardContents::find($pageid); return view(‘board.contents.view')-> with('contents', $contents)->with('pageid', $pageid); }
  • 50. 게시판 소스는 꼭 한번 해보시고 수정해보세요. 그러면 라라벨 웹개발 프로세스를 이해하시는데 큰도움이 될거라 생각합니다. 이번 과정이 모두 끝났습니다. 그동안 정말 수고하셨습니다. :) 궁금하신 부분은 슬렉으로 문의 주세요. http://abcds.kr/wp-login.php?action=slack-invitation https://abcds.slack.com