# PHP Laravel 개발자 면접 질문 2026: 완벽 준비 가이드 > 2026년 Laravel 13 대응 면접 가이드입니다. Eloquent ORM, 서비스 컨테이너, 인증 패턴, 큐 처리, 테스트 전략 등 Laravel 엔지니어 면접에서 자주 묻는 핵심 주제를 상세히 다룹니다. - Published: 2026-09-07 - Updated: 2026-09-07 - Author: Anthony Fillion-Maillet - Reading time: 5 min --- PHP Laravel 개발자 면접에서는 프레임워크 지식과 소프트웨어 설계 원칙을 함께 평가합니다. 2026년 3월에 출시된 Laravel 13에서는 AI SDK, PHP Attributes, Passkey 인증이 도입되었으며, 면접관들은 최신 기능에 대한 이해와 핵심 기초 지식을 모두 기대합니다. > **면접 핵심 영역** > > Laravel 면접은 일반적으로 다섯 가지 핵심 영역을 다룹니다: Eloquent ORM 관계 및 성능, 서비스 컨테이너와 의존성 주입, 인증 및 권한 부여 패턴, 큐와 작업 처리, 테스트 전략입니다. 시니어 포지션의 경우 아키텍처 결정과 패키지 생태계 지식도 추가됩니다. ## Eloquent ORM 및 데이터베이스 관련 질문 Eloquent는 Laravel 면접에서 가장 많이 논의되는 주제입니다. 면접관은 지연 로딩과 즉시 로딩, 관계 유형, 쿼리 최적화에 대한 이해도를 평가합니다. **Q: N+1 문제란 무엇이며 Laravel은 어떻게 해결합니까?** N+1 문제는 코드가 컬렉션을 가져오기 위해 하나의 쿼리를 실행한 후, 각 항목의 관련 데이터를 로드하기 위해 N개의 추가 쿼리를 실행할 때 발생합니다. Laravel은 `with()`를 통한 즉시 로딩으로 이 문제를 해결합니다. ```php // app/Http/Controllers/PostController.php // N+1 문제: 게시물용 1개 쿼리 + 작성자용 N개 쿼리 $posts = Post::all(); foreach ($posts as $post) { echo $post->author->name; // 게시물당 쿼리 발생 } // 해결책: with()로 즉시 로딩 $posts = Post::with('author')->get(); // 총 2개 쿼리 foreach ($posts as $post) { echo $post->author->name; // 추가 쿼리 없음 } ``` Laravel 13은 개발 환경에서 strict 모드를 유지하여 지연 로딩 발생 시 예외를 던지므로 N+1 문제를 조기에 발견할 수 있습니다. **Q: `hasOne`, `hasMany`, `belongsTo`, `belongsToMany`의 차이점을 설명하십시오.** | 관계 | 외래 키 위치 | 예시 | |--------------|---------------------|----------| | hasOne | 관련 모델 | User hasOne Profile (profiles.user_id) | | hasMany | 관련 모델 | User hasMany Posts (posts.user_id) | | belongsTo | 현재 모델 | Post belongsTo User (posts.user_id) | | belongsToMany | 피벗 테이블 | User belongsToMany Roles (role_user 테이블) | **Q: 소프트 삭제 처리 방법과 그 영향에 대해 설명하십시오.** ```php // app/Models/Post.php use Illuminate\Database\Eloquent\SoftDeletes; class Post extends Model { use SoftDeletes; // 소프트 삭제된 레코드는 기본적으로 제외됨 // 포함하려면: // Post::withTrashed()->get(); // 삭제된 것만 가져오려면: // Post::onlyTrashed()->get(); } ``` 소프트 삭제는 `deleted_at` 컬럼을 추가합니다. 명시적으로 요청하지 않는 한 쿼리는 소프트 삭제된 레코드를 자동으로 제외합니다. 이는 유니크 제약 조건에 영향을 미치며 최적의 성능을 위해 `deleted_at`를 포함하는 복합 인덱스가 필요합니다. ## 서비스 컨테이너와 의존성 주입 [서비스 컨테이너](https://laravel.com/docs/13.x/container)는 Laravel의 핵심입니다. 바인딩, 해결, 컨텍스트 주입에 대한 이해가 주니어와 시니어 지원자를 구분합니다. **Q: 서비스 컨테이너란 무엇이며 왜 중요합니까?** 서비스 컨테이너는 클래스 의존성을 관리하고 의존성 주입을 수행합니다. 클래스를 자동으로 해결하여 느슨한 결합과 테스트 용이성을 제공합니다. ```php // app/Providers/AppServiceProvider.php public function register(): void { // 인터페이스 바인딩 $this->app->bind( PaymentGatewayInterface::class, StripePaymentGateway::class ); // 싱글톤: 매번 동일한 인스턴스 $this->app->singleton(ReportGenerator::class, function ($app) { return new ReportGenerator($app->make(Cache::class)); }); } ``` **Q: `bind()`, `singleton()`, `instance()`의 차이점은 무엇입니까?** - `bind()`: 클래스가 해결될 때마다 새 인스턴스 생성 - `singleton()`: 하나의 인스턴스를 생성하고 이후 해결 시 동일한 인스턴스 반환 - `instance()`: 기존 객체 인스턴스를 컨테이너에 바인딩 ```php // app/Providers/AppServiceProvider.php // bind: 매번 새 인스턴스 $this->app->bind(Service::class, fn() => new Service()); // singleton: 전체 요청 생명주기 동안 하나의 인스턴스 $this->app->singleton(Cache::class, fn() => new RedisCache()); // instance: 이미 인스턴스화된 객체 바인딩 $config = new Config(['debug' => true]); $this->app->instance(Config::class, $config); ``` 서비스 컨테이너 개념에 대한 연습은 [서비스 컨테이너 & DI 모듈](/technologies/laravel/interview-questions/service-container-di)에서 확인할 수 있습니다. ## 인증 및 권한 부여 패턴 Laravel 13에서는 기존 방법과 함께 Passkey 인증이 도입되었습니다. 면접관은 Sanctum, Passport, 정책, 게이트에 대한 지식을 기대합니다. **Q: Sanctum과 Passport는 언제 사용합니까?** | 기능 | Sanctum | Passport | |---------|---------|----------| | 사용 사례 | SPA, 모바일 앱, 간단한 API 토큰 | OAuth2 서버, 서드파티 접근 | | 토큰 유형 | 간단한 API 토큰, 세션 기반 | OAuth2 액세스 토큰, 리프레시 토큰 | | 복잡도 | 최소한의 설정 | 완전한 OAuth2 구현 | | 토큰 스코프 | 어빌리티(더 간단함) | OAuth 스코프 | Sanctum은 대부분의 애플리케이션에 적합합니다. Passport는 애플리케이션이 서드파티 클라이언트를 위한 OAuth2 제공자 역할을 해야 할 때 필요합니다. 자세한 비교는 [Laravel Sanctum vs Passport](/blog/laravel/laravel-sanctum-vs-passport-api-authentication)를 참조하십시오. **Q: 정책(Policy)과 게이트(Gate)의 차이점은 무엇입니까?** 게이트는 클로저 기반 권한 부여 확인입니다. 정책은 특정 모델의 권한 부여 로직을 그룹화하는 클래스입니다. ```php // app/Policies/PostPolicy.php class PostPolicy { public function update(User $user, Post $post): bool { return $user->id === $post->user_id; } public function delete(User $user, Post $post): bool { return $user->id === $post->user_id || $user->hasRole('admin'); } } // 컨트롤러에서 사용 public function update(Request $request, Post $post) { $this->authorize('update', $post); // PostPolicy 사용 // ... 업데이트 로직 } ``` [권한 부여 & 정책 모듈](/technologies/laravel/interview-questions/authorization-policies)에서 고급 권한 부여 패턴을 다룹니다. ## 큐와 작업 처리 큐는 확장 가능한 Laravel 애플리케이션에 필수적입니다. 면접관은 작업 설계, 실패 처리, 큐 드라이버에 대한 이해도를 평가합니다. **Q: Laravel에서 실패한 작업을 어떻게 처리합니까?** ```php // app/Jobs/ProcessPodcast.php class ProcessPodcast implements ShouldQueue { use Queueable; public int $tries = 3; public int $backoff = 60; // 재시도 간격(초) public int $timeout = 120; public function handle(): void { // 작업 로직 } public function failed(Throwable $exception): void { // 관리자에게 알림, 외부 서비스에 로그 Log::error('팟캐스트 처리 실패', [ 'podcast_id' => $this->podcast->id, 'error' => $exception->getMessage() ]); } } ``` 실패한 작업은 `failed_jobs` 테이블에 저장됩니다. `php artisan queue:retry`로 특정 작업을 재시도하거나 `queue:retry all`로 일괄 재시도할 수 있습니다. **Q: `dispatch()`와 `dispatchSync()`의 차이점은 무엇입니까?** - `dispatch()`: 비동기 처리를 위해 큐에 작업 추가 - `dispatchSync()`: 큐를 우회하여 현재 프로세스에서 즉시 작업 실행 `dispatchSync()`는 테스트나 결과가 즉시 필요한 경우에 유용합니다. 프로덕션 환경에서는 요청을 차단하지 않도록 대부분의 작업에 `dispatch()`를 사용해야 합니다. ## Pest를 사용한 Laravel 테스트 Laravel 13은 기본 테스트 프레임워크로 [Pest](https://pestphp.com/)를 포함합니다. 면접관은 기능 테스트, 단위 테스트, 모킹, 데이터베이스 테스트 전략에 대한 이해도를 평가합니다. **Q: 외부 API에 의존하는 컨트롤러를 어떻게 테스트합니까?** ```php // tests/Feature/PaymentTest.php use App\Services\PaymentGateway; use App\Services\FakePaymentGateway; test('결제가 성공적으로 처리됨', function () { // 테스트용 페이크 구현 바인딩 $this->app->bind( PaymentGateway::class, FakePaymentGateway::class ); $response = $this->postJson('/api/payments', [ 'amount' => 1000, 'currency' => 'usd' ]); $response->assertStatus(200) ->assertJson(['status' => 'completed']); }); test('결제가 게이트웨이 오류를 처리함', function () { $mock = Mockery::mock(PaymentGateway::class); $mock->shouldReceive('charge') ->once() ->andThrow(new PaymentFailedException('카드 거부')); $this->app->instance(PaymentGateway::class, $mock); $response = $this->postJson('/api/payments', [ 'amount' => 1000, 'currency' => 'usd' ]); $response->assertStatus(422); }); ``` **Q: `RefreshDatabase`와 `DatabaseTransactions`의 차이점은 무엇입니까?** - `RefreshDatabase`: 테스트 클래스당 한 번 데이터베이스를 마이그레이션하고 각 테스트를 트랜잭션으로 래핑 - `DatabaseTransactions`: 데이터베이스가 이미 마이그레이션되었다고 가정하고 각 테스트를 트랜잭션으로 래핑 `RefreshDatabase`는 CI/CD 파이프라인에서 더 안전합니다. `DatabaseTransactions`는 스키마가 안정적일 때 로컬 개발에서 더 빠릅니다. 테스트 모범 사례는 [Pest를 사용한 Laravel 테스트](/blog/laravel/laravel-testing-pest-mocking-best-practices)를 참조하십시오. ## Laravel 13 관련 질문 면접관들은 [Laracon EU 2026](https://laraveldaily.com/post/laravel-13-laracon-eu-taylor-otwell)에서 발표된 Laravel 13 기능에 대해 점점 더 많이 질문하고 있습니다. **Q: Laravel AI SDK란 무엇이며 언제 사용합니까?** [Laravel AI SDK](https://laravel.com/docs/13.x/ai)는 AI 작업을 위한 통합 API를 제공합니다: 텍스트 생성, 임베딩, 도구 호출 에이전트, 오디오, 이미지 생성. OpenAI, Anthropic 및 기타 제공자 간의 차이를 추상화합니다. ```php // config/ai.php에서 기본 제공자 정의 // 애플리케이션 코드에서 사용 use Illuminate\Support\Facades\AI; $response = AI::text('이 기사를 개발자 대상으로 요약') ->withContext($articleContent) ->generate(); // 시맨틱 검색용 임베딩 $embedding = AI::embeddings($searchQuery)->generate(); $results = Post::query() ->nearestNeighbors('embedding', $embedding, 10) ->get(); ``` SDK는 여러 제공자 SDK를 관리하지 않고 AI 기능이 필요한 애플리케이션에 적합합니다. **Q: Laravel 13에서 PHP Attributes는 어떻게 작동합니까?** Laravel 13에서는 컴포넌트 구성을 위한 클래스 프로퍼티의 대안으로 PHP 8 Attributes가 도입되었습니다. 이는 호환성을 유지하는 변경이며 프로퍼티 기반 구성은 계속 작동합니다. ```php // 기존 접근 방식 class SendWelcomeEmail implements ShouldQueue { public $queue = 'emails'; public $tries = 3; } // Attributes를 사용한 Laravel 13 use Illuminate\Contracts\Queue\Attributes\Queue; use Illuminate\Contracts\Queue\Attributes\Tries; #[Queue('emails')] #[Tries(3)] class SendWelcomeEmail implements ShouldQueue { // 더 깔끔한 클래스 본문 } ``` Attributes는 IDE 지원이 향상되고 구성을 클래스 정의 수준에서 확인할 수 있습니다. ## 2026년 Laravel 면접 핵심 포인트 - `with()`를 사용한 즉시 로딩을 마스터하고 개발 환경에서 N+1 쿼리를 감지하는 strict 모드를 이해합니다 - 서비스 컨테이너 바인딩을 설명할 수 있어야 합니다: 일시적인 것에는 `bind()`, 공유 인스턴스에는 `singleton()`, 인터페이스 해결에는 컨텍스트 바인딩 - Sanctum과 Passport 사용 시기를 파악합니다: 퍼스트파티 앱에는 Sanctum, OAuth2 제공자 시나리오에는 Passport - `$tries`, `$backoff`, `failed()` 메서드를 통한 큐 실패 처리를 시연할 수 있어야 합니다 - Pest로 테스트를 작성하고 외부 의존성에는 모킹을 사용하며 `RefreshDatabase`와 `DatabaseTransactions`의 차이점을 이해합니다 - Laravel 13 기능에 익숙해집니다: 통합 AI 작업을 위한 AI SDK, 더 깔끔한 컴포넌트 구성을 위한 PHP Attributes, Passkey 인증 - 구현뿐만 아니라 트레이드오프를 설명하는 연습을 합니다: 면접관은 암기보다 추론을 중요시합니다 --- Source: SharpSkill (https://sharpskill.dev), tech interview preparation for your real stack. HTML version of this page: https://sharpskill.dev/ko/blog/laravel/php-laravel-developer-interview-questions-2026