02강: 라라벨 13 디렉터리 구조 해부 & 도서 서점 환경 설정 (.env)
실습 프로젝트: 지니샵(JinyShop) 온라인 도서 쇼핑몰
주제: 라라벨 13의 슬림 아키텍처 디렉터리 구조 정복,.env환경 파일 및config/설정
등장인물: 🐱 지니(시니어 멘토), 👧 도로시(주니어 개발자), 🐶 토토(개발 보조견)
공식 문서 연계: 디렉터리 구조 (Directory Structure), 환경 설정 (Configuration)
💬 1. 지니와 도로시의 티키타카 회의
👧 도로시: “지니! jinyshop 폴더를 VS Code 에디터로 열어봤는데, 폴더가 너무 많아서 머리가 어지러워요! app/, bootstrap/, config/, routes/, resources/… 도대체 우리가 판매할 책 목록과 컨트롤러 코드는 어디에 넣어야 해요?”
🐱 지니: “후후, 처음 보면 지도 없는 미로처럼 보이지? 하지만 라라벨 13은 과거 버전보다 폴더 구조가 엄청나게 슬림(Slim)해졌단다! 불필요한 보일러플레이트 파일 수십 개가 사라지고, 오직 핵심적인 파일만 남아있지. 책(Book) 모델은 app/Models/에, 도서 화면 라우트는 routes/web.php에, HTML 화면은 resources/views/에 위치한단다. 그리고 서점의 비밀번호와 DB 주소는 .env라는 비밀 금고에 적어두는 거지!”
🐶 토토: “멍멍! 이전 라라벨 책을 보면 app/Http/Kernel.php를 찾으라고 하는데, 라라벨 11~13에서는 그 파일이 사라지고 bootstrap/app.php에서 모든 미들웨어와 예외 처리를 한 방에 끝낸다멍! 옛날 책 보고 헷갈리지 말라멍!”
🎯 2. 실습 목표 및 서점 시나리오
- 라라벨 13 프로젝트의 주요 디렉터리 역할과 명명 규칙(Convention)을 완벽히 이해합니다.
bootstrap/app.php가 라라벨의 요청 진입점을 어떻게 관장하는지 확인합니다..env파일을 열어 지니샵(JinyShop)에 맞게 애플리케이션 이름, 시간대, 데이터베이스 설정을 조정합니다.php artisan config:cache와config:clear의 차이와 환경 변수 캐싱 원리를 배웁니다.
📂 3. 라라벨 13 디렉터리 맵 (Directory Map)
jinyshop/
├── app/ # 🧠 서점의 핵심 비즈니스 로직
│ ├── Http/
│ │ └── Controllers/ # BookController 등 웹 요청 처리자
│ ├── Models/ # Book, Author, Order 등 Eloquent 데이터 모델
│ └── Providers/ # AppServiceProvider 등 시스템 등록소
├── bootstrap/
│ ├── app.php # 🚀 라라벨 13의 통합 관제소 (라우트, 미들웨어, 예외)
│ └── providers.php # 로드할 서비스 프로바이더 목록
├── config/ # ⚙️ 프레임워크 및 서점 전역 설정 파일들
│ ├── app.php, database.php, session.php, filesystems.php ...
├── database/
│ ├── factories/ # BookFactory 등 가짜 도서 데이터 생성 공장
│ ├── migrations/ # books, orders 테이블 생성 스키마
│ └── seeders/ # 초기 카테고리 데이터 적재
├── public/ # 🌐 웹 브라우저가 직접 접근하는 공개 웹 루트
│ └── index.php # 모든 HTTP 요청이 맨 처음 도착하는 관문
├── resources/ # 🎨 화면과 프론트엔드 원본 소스
│ ├── views/ # Blade 도서 상세 페이지 템플릿
│ ├── css/ # Tailwind CSS 스타일
│ └── js/ # Alpine.js / Vue / React 스크립트
├── routes/ # 🗺️ 서점 URL 길잡이
│ ├── web.php # 일반 웹 브라우저 라우트 (/books, /cart)
│ └── console.php # 아티산 스케줄러 및 CLI 명령어
├── storage/ # 📦 로그, 업로드된 도서 표지 이미지, 세션 파일
│ ├── app/public/books/ # 고객에게 공개 서빙될 책 표지 이미지
│ └── logs/laravel.log # 시스템 에러 및 결제 감사 로그
└── .env # 🔑 로컬 환경 비밀 설정 (Git에 커밋 금지!)
🛠️ 4. 단계별 실습 절차 (Step-by-Step)
[Step 1] .env 서점 환경 변수 커스터마이징
프로젝트 루트의 .env 파일을 텍스트 에디터로 엽니다. 서점의 기본 정보와 한국 표준시(KST) 설정을 반영합니다.
# 1. 서점 애플리케이션 명칭 및 로컬 URL
APP_NAME="JinyShop"
APP_ENV=local
APP_KEY=base64:... # artisan key:generate로 생성된 고유 키
APP_DEBUG=true
APP_TIMEZONE=Asia/Seoul
APP_URL=http://127.0.0.1:8000
# 2. 로케일 설정 (다국어 및 날짜 표시용)
APP_LOCALE=ko
APP_FALLBACK_LOCALE=en
APP_FAKER_LOCALE=ko_KR
# 3. 데이터베이스 연결 (기본 SQLite 또는 MySQL 선택)
DB_CONNECTION=sqlite
# MySQL을 사용하는 경우:
# DB_CONNECTION=mysql
# DB_HOST=127.0.0.1
# DB_PORT=3306
# DB_DATABASE=jinyshop
# DB_USERNAME=root
# DB_PASSWORD=secret
⚠️ 주의:
.env파일은 데이터베이스 비밀번호나 결제 API 키 등 민감 정보가 포함되므로 절대로 깃 저장소에 커밋하지 않습니다. (.gitignore에 기본 포함되어 있습니다.)
[Step 2] bootstrap/app.php 라라벨 13 통합 관제탑 확인
라라벨 13에서는 과거의 복잡했던 설정들이 bootstrap/app.php 단 하나의 플루언트(Fluent) 체이닝 코드로 통합되었습니다.
<?php
use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;
return Application::configure(basePath: dirname(__DIR__))
->withRouting(
web: __DIR__.'/../routes/web.php',
commands: __DIR__.'/../routes/console.php',
health: '/up', // 서버 헬스체크 엔드포인트
)
->withMiddleware(function (Middleware $middleware) {
// 향후 관리자 전용 미들웨어나 장바구니 미들웨어를 여기에 등록합니다
})
->withExceptions(function (Exceptions $exceptions) {
// 결제 실패나 품절 도서 예외 처리를 여기에 등록합니다
})->create();
[Step 3] 아티산으로 환경 설정 조회 & 테스트
터미널에서 방금 변경한 환경 변수가 라라벨 프레임워크에 정상적으로 인식되는지 확인합니다.
# 1. 현재 앱 환경 상태 확인
php artisan env
# 2. config 헬퍼를 통한 애플리케이션 이름 출력 테스트
php artisan tinker --execute="echo config('app.name');"
# 출력: JinyShop
# 3. 시간대 출력 테스트
php artisan tinker --execute="echo config('app.timezone');"
# 출력: Asia/Seoul
🔍 5. 라라벨 공식 문서 원리 심층 분석 (Deep Dive)
환경 설정 캐싱 메커니즘 (config:cache)
- 로컬 개발 환경에서는
.env파일을 수정하면 즉시 반영되지만, 실제 운영(Production) 서버에서는 요청마다 수십 개의 설정 파일을 읽으면 디스크 I/O 병목이 발생합니다. - 따라서 운영 환경에서는 반드시 다음 명령을 실행하여 모든 설정을 단일 PHP 파일로 병합 캐싱해야 합니다:
php artisan config:cache - 치명적 주의사항:
config:cache가 실행된 이후에는 코드 내부에서env('APP_NAME')을 직접 호출하면null을 반환합니다! 반드시config('app.name')처럼config()헬퍼를 통해 읽어야 합니다.
🐶 6. 토토의 트러블슈팅 & 주의사항
🐶 토토의 멍멍 가이드!
.env파일을 수정했는데 반영이 안 돼요!
이전에 실수로config:cache를 실행했기 때문일 가능성이 99%다멍! 터미널에php artisan config:clear를 입력하여 캐시를 지우면 즉시 새 값이 반영된다멍!
No application encryption key has been specified.에러가 나요!
.env파일의APP_KEY가 비어 있어서 생기는 에러다멍.php artisan key:generate를 실행하면 32바이트 AES 암호화 키가 자동으로 쏙 채워진다멍!
💡 7. 2강 자가진단 과제
.env파일의APP_NAME을"JinyShop (지니의 온라인 서점)"으로 바꾸고, 브라우저 타이틀이나 tinker에서 올바르게 출력되는지 확인해 보세요.routes/web.php파일을 열어 기본/라우트 클로저에서config('app.timezone')값을dd()(Dump and Die) 함수로 화면에 찍어보세요.