Laravel 신입 성능 최적화 면접

Laravel 신입 · 취준 (0~1년) 성능 최적화 5문항 조회수 24 · 2026-08-13 (목) 12:10:56
1 N+1 쿼리 문제
Easy

Q. Laravel에서 게시글 목록과 각 게시글의 작성자 정보를 함께 보여주는 페이지를 만들었는데, 게시글이 100개일 때 쿼리가 101번 실행됩니다. 이런 현상을 무엇이라고 하며, Laravel에서는 어떻게 해결할 수 있나요?

관계된 데이터를 미리 함께 가져오는 방법을 생각해보세요.

A. 모범답안

이것은 N+1 쿼리 문제입니다. 게시글 목록을 가져오는 1번의 쿼리와, 각 게시글마다 작성자를 조회하는 N번의 쿼리가 발생하는 현상입니다. Laravel에서는 Eager Loading을 사용하여 해결할 수 있으며, with() 메서드를 사용해 관계된 데이터를 미리 함께 조회합니다. 예를 들어 Post::with('user')->get()처럼 작성하면 2번의 쿼리로 모든 데이터를 가져올 수 있습니다. 이를 통해 데이터베이스 부하를 크게 줄이고 응답 속도를 개선할 수 있습니다.

핵심 포인트
  • • N+1 쿼리 문제의 정의와 발생 원인
  • • Eager Loading(with 메서드) 사용
  • • 쿼리 횟수 감소를 통한 성능 개선
답변에 넣으면 좋은 키워드
N+1 쿼리 Eager Loading with 관계 쿼리 최적화
실무에서는

게시판, 상품 목록 등 관계된 데이터를 함께 표시하는 모든 목록 페이지에서 필수적으로 고려해야 하는 최적화입니다.

Follow-up 질문

lazy loading과 eager loading의 차이점과 각각 언제 사용하는 것이 적절한가요?

2 캐싱
Easy

Q. Laravel 애플리케이션에서 자주 조회되지만 거의 변경되지 않는 카테고리 목록 데이터가 있습니다. 매번 데이터베이스를 조회하면 성능이 떨어질 것 같은데, Laravel에서 제공하는 캐싱 기능을 어떻게 활용할 수 있나요?

Cache 파사드의 remember 메서드를 활용하면 조회와 저장을 한 번에 처리할 수 있습니다.

A. 모범답안

Laravel의 Cache 파사드를 사용하여 데이터를 캐싱할 수 있습니다. Cache::remember() 메서드를 사용하면 캐시에 데이터가 없을 때만 데이터베이스를 조회하고, 있으면 캐시된 데이터를 반환합니다. 첫 번째 인자로 캐시 키, 두 번째 인자로 유효 시간, 세 번째 인자로 데이터를 가져오는 클로저를 전달합니다. 카테고리가 변경되면 Cache::forget()으로 해당 캐시를 삭제하거나, 모델 이벤트를 활용해 자동으로 캐시를 갱신할 수 있습니다. 이를 통해 데이터베이스 부하를 줄이고 응답 속도를 크게 향상시킬 수 있습니다.

핵심 포인트
  • • Cache 파사드의 remember 메서드 활용
  • • 캐시 키, 유효 시간, 클로저 구조 이해
  • • 데이터 변경 시 캐시 무효화 전략
답변에 넣으면 좋은 키워드
Cache remember 캐시 무효화 Cache::forget 성능 최적화
실무에서는

메뉴, 카테고리, 설정값 등 자주 조회되지만 변경이 드문 데이터를 캐싱하여 데이터베이스 부하를 줄입니다.

Follow-up 질문

Laravel에서 사용할 수 있는 캐시 드라이버에는 어떤 것들이 있으며, 각각의 특징은 무엇인가요?

3 쿼리 최적화
Medium

Q. 대량의 데이터를 처리하는 배치 작업에서 User 모델 10만 건을 조회하여 처리해야 합니다. User::all()을 사용했더니 메모리 부족 오류가 발생했습니다. 이 문제를 어떻게 해결할 수 있나요?

한 번에 모든 데이터를 메모리에 로드하지 않고, 일정 단위로 나누어 처리하는 방법을 고려해보세요.

A. 모범답안

대량의 데이터를 처리할 때는 chunk() 또는 chunkById() 메서드를 사용해야 합니다. chunk() 메서드는 지정한 개수만큼 데이터를 나누어 가져와 처리하므로, 한 번에 모든 데이터를 메모리에 로드하지 않습니다. 예를 들어 User::chunk(1000, function($users) {})처럼 사용하면 1000개씩 나누어 처리합니다. 또는 lazy() 메서드를 사용하면 Laravel이 자동으로 청크 단위로 데이터를 가져오면서 하나의 컬렉션처럼 사용할 수 있습니다. 데이터 처리 중 삭제나 수정이 발생한다면 chunkById()를 사용하는 것이 안전합니다.

핵심 포인트
  • • chunk 또는 chunkById 메서드로 분할 처리
  • • 메모리 효율적인 대량 데이터 처리
  • • lazy 메서드를 통한 지연 로딩
답변에 넣으면 좋은 키워드
chunk chunkById lazy 메모리 최적화 배치 처리
실무에서는

대량의 사용자 데이터 처리, 일괄 이메일 발송, 데이터 마이그레이션 등의 배치 작업에서 필수적으로 사용됩니다.

Follow-up 질문

chunk와 chunkById의 차이점은 무엇이며, 각각 어떤 상황에서 사용해야 하나요?

4 데이터베이스 인덱스
Medium

Q. 사용자 검색 기능에서 email 컬럼으로 자주 조회하는데 응답이 느립니다. Laravel 마이그레이션에서 인덱스를 추가하면 성능이 개선된다고 들었는데, 인덱스란 무엇이며 어떻게 추가할 수 있나요?

데이터베이스가 특정 컬럼의 값을 빠르게 찾을 수 있도록 도와주는 구조를 생각해보세요.

A. 모범답안

인덱스는 데이터베이스에서 특정 컬럼의 데이터를 빠르게 검색할 수 있도록 만든 별도의 자료구조입니다. 책의 색인처럼 동작하여 전체 테이블을 스캔하지 않고 원하는 데이터를 빠르게 찾을 수 있습니다. Laravel 마이그레이션에서는 $table->index('email') 또는 $table->string('email')->index()처럼 추가할 수 있습니다. unique 제약조건이 필요하다면 $table->unique('email')을 사용합니다. 다만 인덱스는 조회 성능은 향상시키지만 데이터 입력, 수정, 삭제 시에는 인덱스도 함께 업데이트해야 하므로 쓰기 성능이 다소 저하될 수 있습니다.

핵심 포인트
  • • 인덱스의 개념과 동작 원리
  • • 마이그레이션에서 index 메서드 사용
  • • 조회 성능 향상과 쓰기 성능 트레이드오프
답변에 넣으면 좋은 키워드
인덱스 index unique 마이그레이션 조회 성능
실무에서는

로그인(email 검색), 상품 검색(카테고리, 가격 필터), 주문 조회(사용자별, 날짜별) 등에서 필수적으로 사용됩니다.

Follow-up 질문

복합 인덱스(composite index)는 무엇이며 어떤 경우에 사용하나요?

5 쿼리 성능 분석
Easy

Q. Laravel 애플리케이션의 특정 페이지가 느리게 로딩되는데, 어떤 쿼리가 실행되고 있는지 확인하고 싶습니다. Laravel에서 실행되는 SQL 쿼리를 확인할 수 있는 방법에는 어떤 것들이 있나요?

개발 도구나 Laravel이 제공하는 디버깅 기능을 생각해보세요.

A. 모범답안

Laravel에서 실행되는 쿼리를 확인하는 방법은 여러 가지가 있습니다. 가장 간단한 방법은 Laravel Debugbar 패키지를 설치하는 것으로, 페이지 하단에 실행된 모든 쿼리와 실행 시간을 표시해줍니다. DB::enableQueryLog()를 호출한 후 DB::getQueryLog()로 쿼리 로그를 직접 확인할 수도 있습니다. 또한 Telescope 패키지를 사용하면 쿼리뿐만 아니라 요청, 예외, 작업 등 애플리케이션의 전반적인 동작을 모니터링할 수 있습니다. 프로덕션 환경에서는 Laravel의 로그 기능이나 APM 도구를 사용하는 것이 적절합니다.

핵심 포인트
  • • Laravel Debugbar를 통한 쿼리 모니터링
  • • DB::enableQueryLog와 getQueryLog 사용
  • • Telescope를 통한 종합적인 성능 분석
답변에 넣으면 좋은 키워드
Debugbar Telescope QueryLog enableQueryLog 성능 분석
실무에서는

성능 이슈 발생 시 병목 지점을 찾고, 불필요한 쿼리나 N+1 문제를 식별하여 최적화하는 첫 단계입니다.

Follow-up 질문

쿼리 로그를 확인했을 때 느린 쿼리를 발견했다면, 어떤 순서로 최적화를 진행하시겠습니까?

댓글 0

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

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