VillageSQL is a drop-in replacement for MySQL with extensions.
All examples on this page work on VillageSQL. Install Now →
.env의 활성 DB_CONNECTION 줄 바로 아래에 주석 처리된 MySQL 연결 블록이 기본으로 들어 있으며, 모든 MySQL 클라이언트가 기대하는 것과 같은 호스트, 포트, 데이터베이스, 사용자 이름, 비밀번호 형태를 사용합니다. 주석을 해제하고 실제 값을 채우는 것이 통합의 전부입니다. 이 가이드는 그 설정을 처음부터 끝까지 안내합니다: 연결하기, 마이그레이션 실행하기, 그리고 Eloquent를 통해 읽고 쓰기입니다.
프로젝트 만들기
brew install php composer가 둘 다 설치합니다. Homebrew의 PHP 8.5 빌드에는 pdo_mysql과 mysqli가 기본으로 포함되어 있으므로, MySQL을 위한 추가 확장 설정이 필요하지 않습니다.
데이터베이스와 사용자 만들기
애플리케이션을root로 향하게 하지 말고, 전용 데이터베이스와 범위가 제한된 사용자를 만드세요:
연결 구성하기
.env를 열고 DB_CONNECTION을 sqlite에서 mysql로 바꾼 다음, 연결 세부 정보를 채우세요:
127.0.0.1에 연결하는데, 위의 CREATE USER 문이 권한을 부여한 것과 같은 호스트입니다. VillageSQL은 MySQL의 드롭인 대체품이므로, config/database.php나 .env 키에서 바뀌는 것은 없습니다.
config/database.php는 mysql 연결에 기본으로 'strict' => true를 설정합니다. 이것은 세션을 MySQL의 표준 strict SQL 모드로 둡니다:
마이그레이션 실행하기
Laravel의 기본 마이그레이션은users, cache, jobs 테이블을 만듭니다. 구성된 연결을 대상으로 실행하세요:
posts 테이블을 위한 자체 마이그레이션과 함께 모델을 생성하세요:
title과 body 열을 추가하세요:
Eloquent와 대량 할당 보호
Laravel의 Eloquent 모델은 필드가$fillable에 나열되지 않는 한 기본적으로 대량 할당을 차단합니다:
id, created_at, updated_at은 의도적으로 제외되어 있습니다. create()에 id를 전달해도 오류가 나지 않고 값을 덮어쓰지도 않습니다. Eloquent는 $fillable에 없는 키를 조용히 버립니다:
999가 아니라 다음 자동 증가 값을 받았습니다. 이것은 store() 메서드가 요청 본문을 직접 받을 때 중요합니다: $fillable이 열의 범위를 정하지 않으면, 클라이언트가 id나 타임스탬프 필드를 전달해서 그대로 받아들여지게 할 수 있습니다. $fillable은 모델을 보호하고, 요청 검증은 들어오는 데이터의 형태를 검사하는 별개의 관심사입니다.
라우트와 컨트롤러
Laravel 12의 기본 뼈대는 라우팅을 최소한으로 유지합니다:routes/web.php가 라우트를 담고, bootstrap/app.php가 옛 Http/Kernel.php 파일 없이 미들웨어와 예외 처리를 연결합니다. 컨트롤러를 생성하세요:
routes/web.php는 Laravel의 세션 기반 CSRF 미들웨어 뒤에서 실행되는데, 요청에 CSRF 토큰이 없으므로 평범한 curl -X POST를 419 Page Expired로 거부합니다. 브라우저를 향한 폼 라우트에서는 이것이 정상입니다. 실제 폼은 숨겨진 필드로 토큰을 전송합니다. 폼이나 토큰 없이 직접 호출되도록 만든 라우트는 bootstrap/app.php에서 제외하세요:
처음부터 끝까지 검증하기
내장 서버를 시작하고 두 라우트를 모두 실행해 보세요. 테이블에는 위의$fillable 데모에서 만든 행이 이미 있으므로, 인덱스 라우트가 그것을 반환합니다:
자주 묻는 질문
Laravel은 왜 MySQL 대신 SQLite를 기본으로 하나요?
최근 Laravel 버전은php artisan serve가 설정 없이 즉시 동작하도록 새 프로젝트의 기본값을 SQLite로 둡니다. .env 파일은 여전히 활성 DB_CONNECTION 줄 바로 아래에 MySQL 연결 키를 주석 처리된 채로 담고 있습니다. MySQL로 전환하는 것은 새 설정 섹션이 아니라, 주석을 해제하고 다섯 개의 값을 채우는 문제입니다.
Eloquent가 VillageSQL과 동작하려면 특별한 설정이 필요한가요?
아니요. VillageSQL은 MySQL의 드롭인 대체품이고 같은 와이어 프로토콜을 사용하므로, Laravel의mysql 드라이버, strict SQL 모드 설정, 쿼리 문법 모두 변경 없이 동작합니다.
$fillable과 요청 검증의 차이는 무엇인가요?
$request->validate()는 들어오는 요청에서 어떤 필드를 받아들일지 결정하고 잘못된 형식의 입력을 422 응답으로 거부합니다. 모델의 $fillable은 create()나 fill()에 전달한 필드 중 어떤 것이 실제로 데이터베이스에 기록되는지 결정합니다. $request->validate()만 사용하면 다른 곳의 컨트롤러가 Post::create($request->all())을 호출할 경우 모델이 여전히 대량 할당에 열려 있습니다. $fillable은 어느 컨트롤러가 호출하든 모델을 보호합니다.
문제 해결
함께 보기
- ORM과 함께 MySQL 사용하기: Django, Rails, Prisma — ORM에 구애받지 않는 관점에서 본 같은 연결 수준 설정과 N+1 패턴
- MySQL의 스키마 마이그레이션 — Laravel의 마이그레이션 파일이
ALTER TABLE이면에서 테이블에 하는 일 - MySQL 연결 풀링 — 실제 트래픽 아래의 Laravel 앱을 위한 영구 연결 구성