목차


 문자열 리턴

Route::get('/hi', function () {
    return '안녕하세요.';
});

 

 뷰 리턴

뷰 파일이 없으면 에러 발생

디버그모드 설정(.env 파일)이 false면 500에러, true면 에러의 상세정보 출력

<!-- resources/view/Myview.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.0">
    <title>MyView</title>
</head>
<body>
    <h1>MyView!!!</h1>
</body>
</html>
Route::get('/myview', function () {
    return view('myview');
});

 

 HTTP 메소드 대응 라우트

여러 라우트에 해당될 경우 가장 마지막에 정의된 것이 실행

// Home
Route::get('/home', function() {
    return view('home');
});

 

// GET 요청에 대한 처리
Route::get('/method', function() {
    return 'GET Method!!';
});

 

// POST 요청에 대한 처리
Route::post('/method', function() {
    return 'POST Method!!';
});

 

<!-- resources/view/home.blade.php -->
<form action="/method" method="POST">
	<!-- @csrf : 라라벨의 CSRF(Cross-Site Request Forgery) 보호를 위한 토큰을 출력하는
    	라라벨 블레이드 템플릿의 지시문, 
        토큰은 폼 제출 시 보안을 강화하기 위해 사용됨 -->
    @csrf
    @method('PUT')
    <button type="submit">PUT</button>
</form>
// PUT 요청에 대한 처리
Route::put('/method', function() {
    return 'PUT Method!!';
});

 

<form action="/method" method="POST">
    @csrf
    @method('DELETE')
    <button type="submit">DELETE</button>
</form>
// DELETE 요청에 대한 처리
Route::delete('/method', function() {
    return 'DELETE Method!!';
});

 

// 모든 요청에 대한 처리 (중복되는 처리를 하지않도록 주의)
Route::any('/method', function() {
    return 'ANY Method!!';
});

 

// 지정한 특정 메소드 요청에 대한 처리
Route::match(['get', 'post'], '/method', function() {
    return 'MATCH Method!!';
});

 

 라우트에서 파라미터 제어

http://localhost/query?id=IDID&name=NAMENAME

use Illuminate\Http\Request;

Route::get('/query', function(Request $request) {
    return $request->id.", ".$request->name;
});

 

http://localhost/segment/1

// URL 세그먼트로 지정 파라미터 획득
// 세그먼트가 없을경우 404 ERROR
// http://localhost/segment/1로 GET 요청을 보내면 1이라는 값이 $id 변수에 할당됨
Route::get('/segment/{id}', function($id) {
    return 'segment ID : '.$id;
});

 

http://localhost/segment2

// URL 세그먼트로 지정 파라미터 획득 : 기본값 설정(404 ERROR 안뜨게)
Route::get('/segment2/{id?}', function($id = 'base') {
    return 'segment2 ID : '.$id;
});
// Request로도 세그먼트 파라미터 획득 가능, 세그먼트 파라미터가 없어도 404 ERROR 발생 안함
Route::get('/segment2/{id?}', function(Request $request) {
    return 'segment2 ID : '.$request->id;
});

 

 라우트의 이름 지정

 

<a href="{{route('names.index');}}">names</a>
// 사용법 : <a href="{{route('names.index');}}">names</a>
Route::get('/names', function() {
    return 'name.index !!!';
})->name('names.index');

 

 라우트 매칭 실패시 대체 라우트 정의

 

http://localhost/aaaa

Route::fallback(function() {
    return '잘못된 경로로 접속하셨습니다.';
});

 

 라우트의 그룹 및 공통경로설정

 

// 공통 경로 : prefix('공통 경로 이름')->group();
// Route::prefix('users')->group()은 /users를 공통 경로로 지정하고 해당 그룹 내에서 라우트를 정의하는 것을 의미함
// 이렇게 공통 경로를 지정하면, 그룹 내의 각 라우트는 /users 접두사를 가져야 함
// 		ex) localhost/users/login, localhost/users/logout, ...
Route::prefix('users')->group(function() {
    Route::get('/login', function() {
        return 'Login!!';
    })->name('users.login');
    Route::get('/logout', function() {
        return 'Logout!!';
    })->name('users.logout');
    Route::get('/registration', function() {
        return 'Registration!!';
    })->name('users.registration');
});

 

 서명 라우트

http://localhost/sign
서명된 URL링크

use Illuminate\Support\Facades\URL;

Route::get('/makesign', function() {
    // 일반적인 URL 링크 생성하기
    $baseUrl = route('sign');

    // 서명된 URL 링크 생성하기
    $signUrl = URL::signedRoute('sign');

    // 유효기간이 있는 서명된 URL 링크 생성하기
    $limitSignUrl = URL::temporarySignedRoute('sign', now()->addSecond(10));

    return $baseUrl . '<br><br>' . $signUrl . '<br><br>' . $limitSignUrl . '<br><br><a href="' . $limitSignUrl . '">유효기간이 있는 서명된 URL</a>';
});

Route::get('/sign', function() {
    return 'Sign!!';
})->name('sign')->middleware('signed');

 

 컨트롤러

 

// 커맨드(cmd, powershell)로 컨트롤러 생성 : php artisan make:controller TestController
use App\Http\Controllers\TestController;
Route::get('/test', [TestController::class, 'index'])->name('tests.index');

// 커맨드(cmd, powershell)로 컨트롤러 생성 : php artisan make:controller TasksController --resource
use App\Http\Controllers\TasksController;
Route::resource('/tasks', TasksController::class);

 

Github

Link

 

'Laravel > Laravel_ex' 카테고리의 다른 글

seeders(database/seeders), factories(database/factories)  (0) 2023.05.27
migrations(database/migrations)  (0) 2023.05.27
블레이드 템플릿(resources/views)  (0) 2023.05.24
Laravel  (0) 2023.05.23

목차


 Laravel 이란?

오픈소스 PHP 웹 프레임워크 중 하나

MVC모델로 웹 애플리케이션을 개발하기 위해 고안됨


 

 Laravel Application의 Life Cycle

1-1. Entry Point
        시작지점 (public/index.php)
1-2. HTTP Kernel
        Application 셋업 및 미들웨어를 설정하고, 라우터를 실행
1-3. Router
        Request에 일치하는 경로를 찾고 정의된 Controller나 Action Method, Closure 등을 실행
1-4. Middleware
        경로에 지정된 처리의 실행 전후에 임의의 처리를 실행
        Request나 Response에 포함 된 값의 갱신이나 암호화, 세션 실행, 인증 처리 등을 실행
        여러 미들웨어를 조합하여 사용 가능
1-5. Controller or Closure
        HTTP Request에 대응하는 처리를 실행
        실질적인 비지니스 로직이 구현되는 곳으로 좁은 의미로의 Application의 실행 기점
        처리를 완료하면 Response를 만들고 반환 


 

 디렉토리 구조

root/
        |-- app/  : 컨트롤러나 모델, 미들웨어 등 주요한 처리 클래스가 모여있는 디렉토리
        |-- bootstrap : 가장 먼저 실행되는 처리나 autoloading 설정, 퍼포먼스 향상을 위한 cache 등을 배치 (일반적으로 수정 불필요)
        |-- config : 설정 파일을 배치 (composer로 프로젝트를 생성했을 경우 .env로 대체 됨, .env에 없는 설정을 config디렉토리의 설정을 사용)
        |-- database : DB 관련 파일을 배치
        |-- lang : 다국어 파일을 배치
        |-- public : 엔트리 포인트(index.php)가 배치되는 루트로 설정
        |-- resources : 뷰 파일, CSS, JavaScript 파일 등을 배치
        |-- routes : 루트 정의 파일을 배치
        |-- storage : 라라벨이 만드는 파일을 출력하는 위치로, 로그파일이나 캐시 및 컴파일 된 파일등을 배치
        |-- tests : 테스트 코드 파일을 배치
        |-- vendor : composer로 프로젝트를 생성했을 경우 다운로드된 패키지 및 Laravel 본체 코드가 배치, 버전관리에 비포함


 

 루트 디렉토리의 파일

.editorconfig : IDE 또는 에디터에서 참고하는 코딩 표준 스타일 설정 파일
.env  : 환경 변수를 지정하는 파일
.env.example : 환경설정 예제 파일
.gitattributes : git 디렉토리 및 파일 단위로 설정을 적용하는 파일
.gitignore : git 버전 관리 제외 대상 설정 파일
composer.json : 개발자가 편집하는 composer 설정 파일, 프로젝트의 구성과 의존성에 대한 정보
composer.lock : 자동으로 생성되는 composer 설정 파일, 프로젝트의 구성과 의존성에 대한 정보
package.json : 프론트엔드의 파일과 의존성에 대한 정보가 있는 설정 파일
phpunit.xml : 테스트에서 사용하는 PHPUnit 설정 파일


 

Github

Link

 

목차


 Session, Cookie, Token의 사용 이유

- HTTP 통신은 Request -> Response가 종료되면 클라이언트와 서버간에 연결이 끊김
  따라서, 현재 누가 요청한 것인지 알기위해서 Session, Cookie, Token을 사용 해야함


 

 Session

- 세션은 필요한 데이터를 서버에 저장하는 것
- 세션은 서버에 저장하기 때문에 유저가 늘어날 수록 서버 부하가 증가
- 세션에는 클라이언트를 식별 할 수 있는 Session Id와 정보를 저장하고,
  쿠키에는 Session Id만 저장

 

$user_id = "php506";
$user_pw = "506";

// session명 지정, 지정하지 않으면 "PHPSESSID"로 지정됨, session_start 전에 선언
session_name( "Kim" );

// session 시작
session_start();


// -------------------
// 유저 인증 작업 필요, 지금은 생략( 넘어온 id와 pw가 허용범위 내인지 확인 후, db검색 )
// -------------------


// session에 데이터 저장
$_SESSION[ "id" ] = $user_id; // $_SESSION[ "id" ] : 원래는 id로 하지않고, 보안 규정에 따라 네이밍
$_SESSION[ "del" ] = "delete";

 

// session명을 지정해 줬을 경우 사용전에도 session명을 지정해 줘야함
session_name( "Kim" );

// 사용전 항상 session_start();
session_start();

var_dump( $_SESSION );
var_dump( session_id() ); // sessionID를 반환
var_dump( $_COOKIE ); // 세션을 시작하면 자동으로 sessionId가 cookie에 저장됨

 

"del"이 삭제됨

session_name( "Kim" );
session_start();

// 세션 파기

// 서버에 저장된 sessionID를 파기
session_destroy();

// session 정보 삭제( session이 파기되는것은 아님 ) : 세션 ID는 남겨두고 그 외의 정보들을 삭제
session_unset();

// session 특정 요소를 삭제
unset( $_SESSION[ "del" ] );

 

 Cookie

- 쿠키는 필요한 데이터를 클라이언트의 브라우저에 저장하는 것입니다.
- 클라이언트의 브라우저에 저장하는 것이므로 보안이 매우 취약
- 서버는 클라이언트의 요청에 대한 응답을 할 때, 
  클라이언트 측에 저장하고 싶은 정보를 Response Header에 보내 쿠키에 저장
  이후 클라이언트가 재요청 할 때 저장된 쿠키를 Request Header에 담아 서버에 요청

 

// cookie 작성
// string 형태만 저장할 수 있음

// setcookie( "이름", "값", "유효기간(시간)" );
setcookie( "name", "Kim", time() + 30 ); // 현재 + 30초
setcookie( "age", "26", time() + 300 );

// cookie 삭제 방법
setcookie( "age", "", 0 );

// cookie 사용법
var_dump( $_COOKIE );

 

 Token

- 세션 기반 인증에서 서버 부하의 단점의 부담때문에 토큰기반의 인증 개념이 생겨남
- 최초 1회만 유저의 정보를 인증하고, 인증한 정보를 암호화 하여 클라이언트에 저장
  이후에는 해당 토큰이 유효한지만 체크하여 유저 인증을 함
- Web 환경에서는 JWT방식이 많이 사용되고 있음


 

Github

Link

 

'PHP > PHP_ex' 카테고리의 다른 글

OOP  (0) 2023.05.11
try-catch  (0) 2023.04.04
fnc DB connect  (0) 2023.04.03
PDO  (0) 2023.04.03
prepared_statement  (0) 2023.04.03

목차


 객체지향 프로그래밍(Object oriented programming)이 나온 배경

하드웨어의 빠른 발전 속도에 비해 소프트웨어의 개발 시간이 따라가지 못하게 되었고,
하드웨어의 리소스를 좀 더 사용하더라도 모듈화와 캡슐화를 통해 개념적으로 접근하여,
소프트웨어의 개발 시간을 단축시기키 위해 탄생


 

 객체지향 프로그래밍(Object oriented programming)이란?

- 프로그램 구현에 필요한 객체를 파악하고,
  객체들의 역할을 정의하여 객체들 간의 상호작용을 통해 로직을 구성하는 프로그래밍 기법
- 레고에 빗대어 표현하자면, 객체는 각각의 레고 조각이 되고,
  레고의 조각을 조립해서 무언가를 만드는 것을 객체지향 프로그래밍이라고 할 수 있음


 

 객체(Object)란?

- 프로그램에서 사용되는 데이터 또는 식별자(identifier)(변수나 클래스 함수등의 이름으로 쓰일 수 있는 문자열)에 의해 참조되는 공간을 의미
- 레고에 빗대어 표현하자면, 각각의 레고 조각이라고 할 수있음


 

 객체지향 프로그래밍(Object oriented programming)의 특징

추상화(abstraction)
- 객체에서 공통된 기능 또는 속성을 찾아 추출하고 타입을 정의하는 과정

 

캡슐화(encapsulation)
- 서로 연관있는 속성과 기능들을 하나의 캡슐로 만들어 데이터를 외부로부터 보호
- 캡슐화를 통해 데이터 보호와 데이터 은닉을 꾀함(접근제어자를 활용)
> 데이터 보호 : 외부로부터 클래스에 정의된 속성과 기능들을 보호
> 데이터 은닉 : 내부의 동작을 감추고 외부에는 필요한 부분만 노출

 

상속(inheritance)
- 하위클래스가 상위클래스의 속성과 기능을 물려받는 것
- 재사용성과 범용성이 증가
- 상위 클래스의 변경이 어려워지고, 불필요한 클래스가 증가 할 수 있음

 

다형성(polymorphism)
- 객체의 속성이나 기능이 상황에 따라 여러가지 형태를 가지는 성질
- PHP의 오버라이딩 기능이 대표적


 

 객체지향 프로그래밍(Object oriented programming)의 장단점

장점
- 모듈화를 통해 개발하기 때문에 업무분담이 편하고, 대규모 소프트웨어 개발에 적합
- 클래스단위로 수정이 가능하기에 유지 보수가 용이
- 클래스의 재사용 및 상속을 통해 확장하므로 코드 재사용이 용이

 

단점
- 처리속도가 상대적으로 느려짐
- 객체의 수가 증가함에 따라 용량이 커질 수 있음
- 설계에 많은 시간과 노력이 필요 함
- 소규모 소프트웨어 개발의 경우 오히려 복잡해 질 수 있음


 

 객체지향 설계 5원칙(SOLID)

1. 단일 책임 원칙(Single Responsibility Principle)
- 하나의 클래스는 단 하나의 책임만 가져야 한다.

 

2. 개방 폐쇄 원칙(Open/Closed Principle)
- 소프트웨어 요소는 확장에는 열려있으나, 변경에는 닫혀 있어야 한다.

 

3. 리스코프 치환 원칙(Liskov Substitution Principle)
- 상위 타입의 객체를 하위 타입의 객체로 치환해도,
  상위 타입을 사용하는 프로그램은 정상적으로 동작해야 한다.

 

4. 인터페이스 분리 원칙(Interface Segregation Principle)
- 클라이언트의 목적과 용도에 적합한 인터페이스 만을 제공해야 한다.

 

5. 의존관계 역전 원칙(Dependency Inversion Principle)
- 고수준 모듈은 저수준 모듈의 구현에 의존해서는 안되고, 저수준 모듈은 고수준 모듈에 의존해야 한다.
> 고수준 모듈: 비즈니스와 관련된 추상화된 모듈
> 저수준 모듈: HTTP, 데이터베이스, 캐시 등과 관련된 구현 모듈
- 비즈니스와 관련된 부분이 세부 사항에는 의존하지 않는 설계 원칙


 

 절차지향 프로그래밍

- 프로그램을 기능중심으로 바라보는 방식으로 "무엇을 어떤 절차로 할 것인가?"가 핵심
- 어떤 기능을 어떤 순서로 처리하는가에 초점
- 장점 : 컴퓨터의 처리구조와 유사해 실행속도가 빠름
- 단점 : 실행 순서가 정해져 있어, 코드의 순서가 바뀌면 동일한 결과를 보장하기 어려움


 

Github

Link

 

'PHP > PHP_ex' 카테고리의 다른 글

Session, Cookie, Token  (0) 2023.05.11
try-catch  (0) 2023.04.04
fnc DB connect  (0) 2023.04.03
PDO  (0) 2023.04.03
prepared_statement  (0) 2023.04.03

목차


 예시

 

const url = "https://picsum.photos/v2/list?page=2&limit=5";

fetch( url )
.then( res => res.json() )
.then( data => makeList(data) )
.catch( console.log );

function makeList( data ) {
	data.forEach( item => {
		const tagImg = document.createElement( 'img' );
		tagImg.setAttribute( 'src', item.download_url );
		tagImg.style.width = 200 + 'px';
		tagImg.style.height = 200 + 'px';
		document.body.appendChild( tagImg );
	});
}

 

 예시를 사용해, 조건과 같이 출력

조건 :

     - url을 입력받아 버튼을 누르면 출력

     - 사진이 출력된 상태에서 버튼을 누르면 출력된 사진이 삭제

 

<!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.0">
    <title>Ajax</title>
    <link rel="stylesheet" href="./43_Ajax.css">
</head>
<body>
    <form action="43_Ajax.html">
        <input type="text" placeholder="url 입력" id="url_input">
        <button type="button" id="btn">API 실행</button>
    </form>
    <div id="div_img"></div>
    <script src="./43_Ajax.js"></script>
</body>
</html>

 

// https://picsum.photos

// const url = "https://picsum.photos/v2/list?page=1&limit=5";

const div = document.getElementById( "div_img" );
const btn = document.getElementById( "btn" );
const imgTag = document.getElementsByTagName( "img" );
let url = "";

function removeImg() {
    div.replaceChildren();
}

function getVal() {
    url = document.getElementById( "url_input" ).value;
    
    fetch( url )
    .then( res => res.json() )
    .then( data => makeList( data ) )
    .catch( console.log );
}

function makeList( data ) {
    data.forEach( item => {
        const tagImg = document.createElement( "img" );
        tagImg.setAttribute( "src", item.download_url );
        div.appendChild( tagImg );
    });
}

function toggle() {
    if( url === "" ) {
        getVal();
    } else {
        removeImg();
        url = "";
    }
}

btn.addEventListener( "click", () => toggle() );

 

Github

Link

 

'JavaScript > JavaScript_TEST' 카테고리의 다른 글

promise_TEST  (0) 2023.05.09
timer_TEST  (0) 2023.05.08
DOM_TEST  (0) 2023.05.05
date_TEST  (0) 2023.05.05
math_TEST  (0) 2023.05.05

+ Recent posts