라우트의 동작 - Laravel 라우팅 작동 원리

Laravel에서 라우팅이 실제로 어떻게 작동하는지, HTTP 메소드와 응답을 실습으로 학습

⚙️ 라우트의 동작 - Laravel 라우팅 작동 원리

목표: Laravel에서 라우팅이 어떻게 작동하는지 이해하고, 직접 만들어보기

🔄 Laravel 라우팅 작동 과정

🚚 택배 배송 시스템으로 이해하기

Laravel 라우팅은 택배 배송 시스템과 똑같아요:

📦 라우팅 = 택배 배송

1. 📤 주문 접수
   사용자: "mysite.com/products/123 페이지 주세요!"

2. 📋 주소 확인
   Laravel: "routes/web.php에서 /products/{id} 패턴 찾기"

3. 🚚 배달원 배정
   Laravel: "ProductController의 show 메소드 실행"

4. 📦 상품 준비
   Controller: "데이터베이스에서 123번 상품 정보 가져오기"

5. 🏠 배달 완료
   Laravel: "HTML 페이지로 만들어서 사용자에게 전송"

🌐 실제 Laravel 처리 과정

🔄 Laravel 라우팅 단계별 처리

사용자 요청: GET /products/123
      ↓
1. 🔍 Route Matching
   Laravel이 routes/web.php에서 매칭되는 패턴 찾기
      ↓
2. 🎯 Route 실행
   Route::get('/products/{id}', function($id) { ... })
      ↓
3. ⚙️ 비즈니스 로직
   데이터베이스 조회, 계산, 처리 등
      ↓
4. 📄 응답 생성
   HTML, JSON, 리다이렉트 등
      ↓
5. 📤 응답 전송
   브라우저에게 최종 결과 전달

📝 HTTP 메소드 이해하기

📚 HTTP 메소드 = 행동 명령어

HTTP 메소드는 서버에게 하는 명령어예요:

🗣️ HTTP 메소드 = 명령어

GET    → "보여줘!" (조회)
POST   → "저장해!" (생성)
PUT    → "바꿔!" (전체 수정)
PATCH  → "고쳐!" (부분 수정)
DELETE → "지워!" (삭제)

🏪 실생활 예시로 이해하기

카페에서 주문하기:

☕ 카페 방문 과정

GET    → "메뉴판 보여주세요" (메뉴 조회)
POST   → "아메리카노 하나 주문할게요" (주문 생성)
PUT    → "주문을 카페라떼로 바꿔주세요" (주문 변경)
DELETE → "주문 취소할게요" (주문 삭제)

🌐 웹사이트에서의 HTTP 메소드

// GET: 데이터 가져오기 (페이지 보기)
Route::get('/products', function () {
    return '상품 목록을 보여줍니다';
});

// POST: 데이터 저장하기 (폼 제출)
Route::post('/products', function () {
    return '새 상품을 저장했습니다';
});

// PUT: 데이터 전체 수정
Route::put('/products/{id}', function ($id) {
    return "{$id}번 상품을 수정했습니다";
});

// DELETE: 데이터 삭제
Route::delete('/products/{id}', function ($id) {
    return "{$id}번 상품을 삭제했습니다";
});

🎨 다양한 응답 방식

1. 📝 텍스트 응답

// 간단한 텍스트 반환
Route::get('/text', function () {
    return '안녕하세요! 간단한 텍스트입니다.';
});

결과: 브라우저에 단순 텍스트로 표시

2. 🎨 HTML 응답

// HTML 코드 반환
Route::get('/html', function () {
    return '<h1>🎉 환영합니다!</h1>
            <p>Laravel 라우팅 세계에 오신 것을 환영합니다!</p>
            <button style="padding:10px; background:#007bff; color:white; border:none;">
                다음 단계로!
            </button>';
});

결과: 브라우저에 꾸며진 HTML 페이지로 표시

3. 📄 뷰 파일 응답

// Blade 템플릿 파일 반환
Route::get('/page', function () {
    return view('welcome');  // resources/views/welcome.blade.php
});

// 데이터와 함께 뷰 반환
Route::get('/user/{name}', function ($name) {
    return view('user.profile', ['name' => $name]);
});

4. 📊 JSON 응답 (API용)

// JSON 데이터 반환
Route::get('/api/user/{id}', function ($id) {
    return response()->json([
        'id' => $id,
        'name' => '김철수',
        'email' => 'kim@example.com',
        'created_at' => '2023-12-25'
    ]);
});

결과: {"id":"123","name":"김철수",...}

5. 🔄 리다이렉트 응답

// 다른 페이지로 이동
Route::get('/old-page', function () {
    return redirect('/new-page');
});

// 메시지와 함께 이동
Route::get('/success', function () {
    return redirect('/dashboard')->with('message', '성공적으로 처리되었습니다!');
});

🎯 동적 라우트 파라미터

📦 URL에서 값 받아오기

// 기본 파라미터
Route::get('/user/{id}', function ($id) {
    return "사용자 ID: {$id}";
});

// 여러 파라미터
Route::get('/posts/{postId}/comments/{commentId}', function ($postId, $commentId) {
    return "포스트 {$postId}의 댓글 {$commentId}";
});

// 선택적 파라미터
Route::get('/products/{category?}', function ($category = 'all') {
    return "카테고리: {$category}";
});

🔍 실제 사용 예시

📱 실제 URL 예시

/user/123                    → "사용자 ID: 123"
/user/456                    → "사용자 ID: 456"

/posts/15/comments/7         → "포스트 15의 댓글 7"
/posts/20/comments/3         → "포스트 20의 댓글 3"

/products                    → "카테고리: all" (기본값)
/products/smartphones        → "카테고리: smartphones"
/products/laptops            → "카테고리: laptops"

🛠️ 실습: 나만의 라우트 만들기

🎮 실습 미션 1: 자기소개 사이트

routes/web.php에 추가하세요:

// 홈페이지
Route::get('/', function () {
    return '<h1>🏠 홈페이지에 오신 것을 환영합니다!</h1>
            <p><a href="/about">소개</a> | <a href="/hobby">취미</a> | <a href="/contact">연락처</a></p>';
});

// 자기소개 페이지
Route::get('/about', function () {
    return '<h2>👋 안녕하세요!</h2>
            <p>저는 Laravel을 배우고 있는 개발자입니다.</p>
            <p>프로그래밍을 통해 세상을 더 좋게 만들고 싶어요!</p>
            <a href="/">홈으로 돌아가기</a>';
});

// 취미 페이지
Route::get('/hobby', function () {
    return '<h2>🎮 제 취미는...</h2>
            <ul>
                <li>🎵 음악 듣기</li>
                <li>📚 독서</li>
                <li>💻 코딩</li>
                <li>🎮 게임</li>
            </ul>
            <a href="/">홈으로 돌아가기</a>';
});

// 연락처 페이지
Route::get('/contact', function () {
    return '<h2>📞 연락처</h2>
            <p>이메일: myemail@example.com</p>
            <p>전화: 010-1234-5678</p>
            <a href="/">홈으로 돌아가기</a>';
});

🎮 실습 미션 2: 동적 메시지 시스템

// 개인 메시지 페이지
Route::get('/message/{name}', function ($name) {
    $messages = [
        '김철수' => '오늘도 화이팅! 💪',
        '이영희' => '공부 열심히 하고 있어요! 📚',
        '박민수' => '새로운 것을 배우는 중이에요! 🌟'
    ];

    $message = $messages[$name] ?? '안녕하세요! 환영합니다! 👋';

    return "<h2>안녕하세요, {$name}님!</h2>
            <p>{$message}</p>
            <p>현재 시간: " . date('Y-m-d H:i:s') . "</p>";
});

// 랜덤 명언 페이지
Route::get('/quote', function () {
    $quotes = [
        '포기하지 마세요. 시작이 반입니다!',
        '오늘 배운 것은 내일의 힘이 됩니다!',
        '실패는 성공의 어머니입니다!',
        '꿈을 포기하지 마세요!'
    ];

    $randomQuote = $quotes[array_rand($quotes)];

    return "<h2>🌟 오늘의 명언</h2>
            <blockquote style='font-size:18px; color:#007bff; font-style:italic;'>
                \"{$randomQuote}\"
            </blockquote>
            <p><a href='/quote'>새로운 명언 보기</a></p>";
});

🎮 실습 미션 3: 간단한 계산기

// 더하기 계산
Route::get('/add/{a}/{b}', function ($a, $b) {
    $result = $a + $b;
    return "<h2>🔢 계산기</h2>
            <p>{$a} + {$b} = <strong>{$result}</strong></p>
            <p>다른 계산도 해보세요!</p>";
})->where(['a' => '[0-9]+', 'b' => '[0-9]+']);

// 현재 시간
Route::get('/time', function () {
    return "<h2>⏰ 현재 시간</h2>
            <p>지금은 " . date('Y년 m월 d일 H시 i분 s초') . " 입니다!</p>
            <p><a href='/time'>시간 새로고침</a></p>";
});

🔍 실습 확인하기

브라우저에서 다음 URL들을 확인해보세요:

✅ 기본 페이지들

  • http://localhost:8000/ → 홈페이지
  • http://localhost:8000/about → 소개 페이지
  • http://localhost:8000/hobby → 취미 페이지
  • http://localhost:8000/contact → 연락처 페이지

✅ 동적 페이지들

  • http://localhost:8000/message/김철수 → 김철수 메시지
  • http://localhost:8000/message/이영희 → 이영희 메시지
  • http://localhost:8000/quote → 랜덤 명언
  • http://localhost:8000/add/10/20 → 계산 결과
  • http://localhost:8000/time → 현재 시간

🚀 라우트 파일 위치와 구조

📁 Laravel 라우트 구조

project/
├── routes/
│   ├── web.php      ← 🌐 웹 페이지용 라우트 (우리가 주로 사용)
│   ├── api.php      ← 📱 API용 라우트
│   ├── console.php  ← 💻 콘솔 명령용
│   └── channels.php ← 📡 브로드캐스팅용

📝 web.php 기본 구조

<?php

use Illuminate\Support\Facades\Route;

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| 여기에 웹 애플리케이션의 라우트를 등록합니다.
| 이 라우트들은 RouteServiceProvider에 의해 "web" 미들웨어 그룹에 할당됩니다.
|
*/

// 홈페이지
Route::get('/', function () {
    return view('welcome');
});

// 여기에 여러분의 라우트를 추가하세요!

🎉 라우트 동작 원리 정리

⚙️ Laravel 라우팅의 핵심:

  1. 🔍 패턴 매칭: URL 패턴을 찾아서 매칭
  2. 📦 파라미터 추출: URL에서 동적 값들을 추출
  3. ⚙️ 로직 실행: 정의된 함수나 컨트롤러 실행
  4. 📤 응답 반환: HTML, JSON 등 다양한 형태로 응답

🌟 라우팅의 장점:

  • 🎯 직관적: URL만 봐도 무슨 기능인지 알 수 있음
  • 🔧 유연함: 동적 파라미터로 다양한 요청 처리
  • 📱 다양한 응답: 텍스트, HTML, JSON, 리다이렉트 등
  • 🛡️ 안전함: 라라벨이 자동으로 보안 처리

🚀 다음 단계: 이제 라우팅의 기본을 완전히 이해했으니, 컨트롤러를 배워서 더 체계적인 웹 애플리케이션을 만들어보세요!


💡 축하합니다! 🎉 라우팅의 동작 원리를 완전히 마스터했습니다! 이제 초급 라우팅으로 더 깊이 배워보세요!