Laravel 미드레벨 기술면접

Laravel 미드레벨 (3~7년) 종합 5문항 조회수 62 · 2026-05-31 (일) 03:10:54
1 Laravel Collection
Medium

Q. Laravel Collection의 lazy() 메서드와 일반 Collection의 차이점을 설명하고, 대용량 데이터 처리 시 lazy collection을 사용해야 하는 이유와 주의사항을 설명해주세요. 또한 cursor()와 chunk()의 차이점도 함께 비교해주세요.

A. 모범답안

lazy()는 Generator를 사용하여 데이터를 필요할 때마다 하나씩 처리하므로 메모리 효율적입니다. 일반 Collection은 모든 데이터를 메모리에 로드하지만, Lazy Collection은 스트림 방식으로 처리합니다. cursor()는 단일 쿼리로 결과를 가져와 하나씩 처리하고, chunk()는 여러 쿼리로 나눠 배치 단위로 처리합니다. 대용량 데이터 처리 시 lazy collection을 사용하면 메모리 부족을 방지할 수 있지만, 데이터베이스 커넥션이 오래 유지되므로 타임아웃에 주의해야 합니다.

핵심 포인트
  • • Generator 기반으로 메모리 효율적 처리
  • • cursor()는 단일 쿼리, chunk()는 다중 쿼리
  • • DB 커넥션 유지 시간 고려 필요
  • • 대용량 데이터 처리 시 메모리 부족 방지
Follow-up 질문

10만 건의 사용자 데이터를 처리하여 CSV 파일로 내보내야 할 때, cursor(), chunk(), lazy() 중 어떤 것을 선택하시겠습니까? 그 이유는 무엇인가요?

2 Laravel Eloquent Scope
Medium

Q. Laravel Eloquent에서 Local Scope와 Global Scope의 차이점을 설명하고, 각각의 사용 사례를 제시해주세요. 또한 Global Scope를 제거해야 하는 상황과 withoutGlobalScope() 메서드의 활용 방법을 설명해주세요.

A. 모범답안

Local Scope는 scope 접두사를 붙인 메서드로 필요할 때 명시적으로 호출하며, 재사용 가능한 쿼리 조건을 정의합니다. Global Scope는 모델의 모든 쿼리에 자동으로 적용되며, boot 메서드에서 등록합니다. Soft Delete가 대표적인 Global Scope 예시입니다. Global Scope는 다중 테넌시, 활성 상태 필터링 등에 사용되며, 관리자 페이지에서 삭제된 데이터를 조회할 때는 withoutGlobalScope()로 제거할 수 있습니다. 특정 상황에서만 Global Scope를 해제해야 할 때는 성능과 데이터 무결성을 함께 고려해야 합니다.

핵심 포인트
  • • Local Scope는 명시적 호출, Global Scope는 자동 적용
  • • Global Scope는 boot 메서드에서 등록
  • • withoutGlobalScope()로 선택적 제거 가능
  • • 다중 테넌시와 Soft Delete가 대표적 사용 사례
Follow-up 질문

SaaS 애플리케이션에서 tenant_id 기반 데이터 격리를 Global Scope로 구현할 때, 성능 최적화를 위해 어떤 점들을 고려해야 하나요?

3 Laravel Testing
Hard

Q. Laravel에서 Feature Test와 Unit Test의 차이점을 설명하고, Database Transaction을 사용한 테스트와 RefreshDatabase 트레이트의 차이점을 비교해주세요. 또한 외부 API를 호출하는 코드를 테스트할 때 HTTP Fake를 사용하는 방법과 주의사항을 설명해주세요.

A. 모범답안

Feature Test는 HTTP 요청부터 응답까지 전체 플로우를 테스트하고, Unit Test는 개별 클래스나 메서드의 로직만 검증합니다. DatabaseTransactions는 각 테스트 후 롤백하여 빠르지만 트랜잭션 관련 버그를 놓칠 수 있고, RefreshDatabase는 매번 마이그레이션을 실행하여 느리지만 정확합니다. HTTP Fake는 Http::fake()로 외부 API 응답을 모킹하여 실제 API 호출 없이 테스트할 수 있으며, assertSent()로 요청 검증이 가능합니다. 주의할 점은 실제 API 응답 구조와 일치하도록 Fake 데이터를 구성해야 하며, 중요한 통합 테스트는 별도로 실제 API를 호출하는 테스트도 필요합니다.

핵심 포인트
  • • Feature Test는 통합 테스트, Unit Test는 단위 테스트
  • • DatabaseTransactions는 빠르고 RefreshDatabase는 정확함
  • • Http::fake()로 외부 API 모킹 가능
  • • 실제 API 구조와 일치하는 Fake 데이터 필요
Follow-up 질문

결제 게이트웨이 통합 테스트를 작성할 때, 테스트 환경에서 실제 결제가 발생하지 않도록 하면서도 신뢰할 수 있는 테스트를 구성하려면 어떤 전략을 사용하시겠습니까?

4 Laravel Routing & Performance
Hard

Q. Laravel에서 라우트 캐싱(Route Caching)의 동작 원리와 장단점을 설명하고, 클로저 기반 라우트를 사용할 때 발생하는 문제점을 설명해주세요. 또한 대규모 애플리케이션에서 수천 개의 라우트를 효율적으로 관리하기 위한 전략을 제시해주세요.

A. 모범답안

Route Caching은 route:cache 명령어로 라우트를 직렬화하여 캐시 파일로 저장하므로 라우팅 속도가 크게 향상됩니다. 하지만 클로저는 직렬화할 수 없어 캐싱 시 오류가 발생하므로 모든 라우트를 컨트롤러 기반으로 작성해야 합니다. 대규모 애플리케이션에서는 도메인별로 라우트 파일을 분리하고, RouteServiceProvider에서 조건부로 로드하며, API 버저닝을 디렉토리 구조로 관리하고, 사용하지 않는 라우트는 제거해야 합니다. 또한 라우트 그룹을 활용한 미들웨어와 네임스페이스 공유로 중복을 최소화해야 합니다.

핵심 포인트
  • • route:cache로 라우팅 성능 향상
  • • 클로저 라우트는 캐싱 불가
  • • 도메인별 라우트 파일 분리 필요
  • • RouteServiceProvider에서 조건부 로드
Follow-up 질문

마이크로서비스 아키텍처로 전환을 고려 중인 모놀리식 Laravel 애플리케이션에서, 라우트 구조를 어떻게 리팩토링하여 향후 분리를 용이하게 만들 수 있을까요?

5 Laravel Security & Validation
Medium

Q. Laravel에서 Mass Assignment 취약점이 무엇인지 설명하고, fillable과 guarded 속성의 차이점을 설명해주세요. 또한 forceFill() 메서드가 필요한 상황과, 사용자 입력 데이터를 모델에 저장할 때 반드시 고려해야 할 보안 사항들을 제시해주세요.

A. 모범답안

Mass Assignment는 사용자가 의도하지 않은 필드(예: is_admin)를 요청에 포함시켜 권한을 상승시키는 보안 취약점입니다. fillable은 할당 가능한 필드를 화이트리스트로 지정하고, guarded는 보호할 필드를 블랙리스트로 지정합니다. 일반적으로 fillable 사용이 더 안전합니다. forceFill()은 Mass Assignment 보호를 우회하여 시스템 레벨에서 필드를 업데이트할 때 사용하며, 관리자 기능이나 시드 데이터 생성 시 필요합니다. 보안을 위해 Form Request로 검증된 데이터만 사용하고, 민감한 필드는 별도로 처리하며, 사용자 역할에 따라 수정 가능한 필드를 제한해야 합니다.

핵심 포인트
  • • Mass Assignment는 권한 상승 취약점
  • • fillable은 화이트리스트, guarded는 블랙리스트
  • • forceFill()은 보호 우회 시 사용
  • • Form Request로 검증된 데이터만 사용
Follow-up 질문

사용자 프로필 업데이트 API에서 일반 사용자는 name과 email만 수정 가능하고, 관리자는 role과 status도 수정 가능하도록 구현하려면 어떤 방식으로 설계하시겠습니까?

댓글 0

로그인 후 댓글을 작성할 수 있습니다.

아직 댓글이 없습니다. 첫 번째 댓글을 남겨보세요!