"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > Laravel의 코드 최적화 및 성능 개선을 위한 팁

Laravel의 코드 최적화 및 성능 개선을 위한 팁

2024-11-02에 게시됨
검색:452

Tips for Code Optimization and Performance Improvement in Laravel

Laravel은 강력하고 우아한 프레임워크이지만 애플리케이션이 성장함에 따라 성능 최적화가 필수적이 됩니다. 다음은 성능을 향상하고 Laravel 애플리케이션을 최적화하는 데 도움이 되는 팁과 예제가 포함된 포괄적인 가이드입니다.

1. Eager 로딩과 Lazy 로딩

문제: 기본적으로 Laravel은 지연 로딩을 사용하므로 여러 데이터베이스 쿼리가 불필요하게 실행되는 "N 1 쿼리 문제"가 발생할 수 있습니다.

최적화: eager loading을 사용하여 하나의 쿼리로 관련 데이터를 로드하면 관계 작업 시 성능이 크게 향상됩니다.

이전(지연 로딩):

// This runs multiple queries (N 1 Problem)
$users = User::all();

foreach ($users as $user) {
    $posts = $user->posts;
}

이후(즉시 로딩):

// This loads users and their posts in just two queries
$users = User::with('posts')->get();

주요 사항: 관련 모델이 필요하다는 것을 알면 항상 즉시 로딩을 사용하세요.


2. 비용이 많이 드는 쿼리에 캐싱 사용

문제: 동일한 데이터(예: 사용자 목록, 설정, 제품 카탈로그)를 자주 가져오면 성능 병목 현상이 발생할 수 있습니다.

최적화: 비용이 많이 드는 쿼리 및 계산 결과를 캐시하여 로드 시간과 데이터베이스 쿼리를 줄입니다.

이전(캐싱 없음):

// Querying the database every time
$users = User::all();

이후(캐시 사용):

// Caching the user data for 60 minutes
$users = Cache::remember('users', 60, function () {
    return User::all();
});

주요 사항: Laravel의 캐싱 시스템(Redis, Memcached)을 사용하여 불필요한 데이터베이스 쿼리를 줄이세요.


3. 데이터베이스 쿼리 최적화

문제: 쿼리가 비효율적이고 적절한 인덱싱이 부족하면 성능이 크게 저하될 수 있습니다.

최적화: 자주 쿼리되는 열에는 항상 색인을 추가하고, 필요한 데이터만 사용하세요.

전에:

// Fetching all columns (bad practice)
$orders = Order::all();

후에:

// Only fetching necessary columns and applying conditions
$orders = Order::select('id', 'status', 'created_at')
    ->where('status', 'shipped')
    ->get();

주요 사항: 항상 필요한 열을 지정하고 데이터베이스가 자주 쿼리되는 필드에 대해 적절한 색인을 생성하는지 확인하세요.


4. 미들웨어 사용 최소화

문제: 미들웨어를 모든 경로에 전체적으로 적용하면 불필요한 오버헤드가 추가될 수 있습니다.

최적화: 필요한 경우에만 선택적으로 미들웨어를 적용합니다.

이전(글로벌 미들웨어 사용):

// Applying middleware to all routes
Route::middleware('logRouteAccess')->group(function () {
    Route::get('/profile', 'UserProfileController@show');
    Route::get('/settings', 'UserSettingsController@index');
});

이후(선택적 미들웨어 사용):

// Apply middleware only to specific routes
Route::get('/profile', 'UserProfileController@show')->middleware('logRouteAccess');

주요 사항: 미들웨어는 성능 저하를 방지하기 위해 필요한 경우에만 적용해야 합니다.


5. 대규모 데이터 세트에 대한 페이지 매김 최적화

문제: 대규모 데이터 세트를 한 번에 가져오고 표시하면 메모리 사용량이 늘어나고 응답이 느려질 수 있습니다.

최적화: 페이지 매김을 사용하여 요청당 가져오는 레코드 수를 제한합니다.

이전(모든 기록 가져오기):

// Fetching all users (potentially too much data)
$users = User::all();

이후(페이지 매김 사용):

// Fetching users in chunks of 10 records per page
$users = User::paginate(10);

주요 사항: 대규모 데이터세트에 페이지를 매겨 데이터베이스 과부하를 방지하고 메모리 사용량을 줄입니다.


6. 장기 실행 작업 대기열에 넣기

문제: 이메일 보내기, 보고서 생성 등 장기 실행 작업으로 인해 요청 응답 시간이 느려집니다.

최적화: 대기열을 사용하여 작업을 오프로드하고 백그라운드에서 비동기적으로 처리합니다.

이전(동기 작업):

// Sending email directly (slows down response)
Mail::to($user->email)->send(new OrderShipped($order));

이후(대기 중인 작업):

// Queuing the email for background processing
Mail::to($user->email)->queue(new OrderShipped($order));

주요 사항: 시간에 민감하지 않은 작업에 대기열을 사용하여 응답 시간을 개선하세요.


7. 라우팅, 구성 및 보기 캐싱 사용

문제: 경로, 구성 또는 보기를 캐싱하지 않으면 특히 프로덕션 환경에서 성능이 저하될 수 있습니다.

최적화: 프로덕션 성능 향상을 위해 경로, 구성 파일 및 보기를 캐시합니다.

예제 명령:

# Cache routes
php artisan route:cache

# Cache configuration files
php artisan config:cache

# Cache compiled views
php artisan view:cache

주요 사항: 더 빠른 애플리케이션 성능을 위해 프로덕션 환경에서 구성, 경로 및 보기를 항상 캐시하세요.


8. 코드를 정리하려면 Compact()를 사용하세요.

문제: 여러 변수를 뷰에 수동으로 전달하면 코드가 장황하고 관리하기 어려울 수 있습니다.

최적화: compact()를 사용하여 여러 변수를 뷰에 전달하는 프로세스를 단순화합니다.

전에:

return view('profile', [
    'user' => $user,
    'posts' => $posts,
    'comments' => $comments,
]);

후에:

return view('profile', compact('user', 'posts', 'comments'));

주요 사항: Compact()를 사용하면 코드가 더 간결해지고 유지 관리가 쉬워집니다.


9. 세션 및 캐시 저장을 위해 Redis 또는 Memcached를 사용하세요

문제: 파일 시스템에 세션과 캐시 데이터를 저장하면 트래픽이 많은 환경에서 애플리케이션 속도가 느려집니다.

최적화: 더 나은 성능을 위해 Redis 또는 Memcached와 같은 빠른 인메모리 스토리지 솔루션을 사용하세요.

Redis 구성 예시:

// In config/cache.php
'default' => env('CACHE_DRIVER', 'redis'),

// In config/session.php
'driver' => env('SESSION_DRIVER', 'redis'),

주요 사항: 특히 트래픽이 많은 애플리케이션에서는 프로덕션 환경에서 세션 및 캐싱에 파일 드라이버를 사용하지 마세요.


10. 필요하지 않은 한 원시 쿼리 사용을 피하세요

문제: 원시 SQL 쿼리를 사용하면 코드 읽기가 어려워지고 유지 관리가 어려워질 수 있습니다.

최적화: 가능할 때마다 Laravel의 Eloquent ORM 또는 쿼리 빌더를 사용하세요. 하지만 원시 쿼리가 필요한 경우 최적화되었는지 확인하세요.

이전(원시 쿼리):

// Using raw query directly
$users = DB::select('SELECT * FROM users WHERE status = ?', ['active']);

이후(Eloquent 또는 쿼리 빌더 사용):

// Using Eloquent ORM for better readability and maintainability
$users = User::where('status', 'active')->get();

주요 사항: 꼭 필요한 경우가 아니면 원시 쿼리보다 Eloquent ORM을 선호하세요.


11. 효율적인 로깅 수준 사용

문제: 모든 것을 항상 기록하면 성능 저하가 발생하고 저장 공간이 가득 찰 수 있습니다.

최적화: 프로덕션에서 적절한 로그 수준을 설정하여 필요한 것(예: 오류 및 중요한 메시지)만 캡처합니다.

예:

// In .env file, set log level to 'error' in production
LOG_LEVEL=error

주요 사항: 불필요한 스토리지 사용 및 성능 저하를 방지하기 위해 프로덕션에 필요한 것만 기록합니다.


최종 생각

Laravel 성능 최적화는 확장 가능하고 효율적인 애플리케이션에 매우 중요합니다. 이러한 모범 사례를 구현하면 Laravel 앱이 더 빠르게 실행되고, 더 많은 트래픽을 처리하며, 더 나은 사용자 경험을 제공할 수 있습니다.

당신의 생각을 알려주세요. 또는 Laravel 애플리케이션을 최적화하기 위한 팁과 요령을 자유롭게 공유해 주세요!

즐거운 코딩하세요! ?

릴리스 선언문 이 기사는 https://dev.to/harish_kumars_9c58df6fcc/10-tips-for-code-optimization-and-performance-improvement-in-laravel-1e99?1에 재현되어 있습니다. 침해 사항이 있는 경우 Study_golang@163으로 문의해 주세요. .com에서 삭제하세요
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3