본문 바로가기

매일 TIL

[내일배움캠프 11-1일] django 이해도 테스트 오답노트, ORM 최적화, 캐싱 전략

이해도 테스트 오답노트

Django에서 사용자가 로그인할 수 있는 간단한 로그인 뷰를 작성하세요.

  • 사용자가 로그인 폼을 제출했을 때, 해당 사용자를 인증하고, 성공적으로 로그인할 경우 'home' 페이지로 리디렉션합니다.
  • 로그인 실패 시 다시 로그인 페이지로 리디렉션하며, 실패 메시지를 출력하세요.
from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, login

def login_view(request):
    if request.method == 'POST':
        username = request.POST['username']
        password = request.POST['password']
        user = authenticate(request, username=username, password=password)
        if user is not None:
            login(request, user)
            return redirect('home')
        else:
            messages.error(request, 'Invalid username or password')
            return redirect('login')
    return render(request, 'login.html')

authenticate 함수는 username과 password를 사용하여 사용자 인증을 시도.

사용자가 유효하다면 해당 User 객체를 반환, 그렇지 않다면 None 반환

조건문을 통해 None이 아닌 경우 login상태로 전환 후 home으로 redirect.

그렇지 않다면 Invalid username or password라는 에러 메시지 표시.

login으로 redirect 하여 다시 로그인 할 수 있도록 구성.


N+1 Problem

django의 ORM은 작성하자마자 SQL로 변환되어 쿼리되는 것이 아님.

최대한 쿼리를 미루고 데이터가 실제로 사용될 때 쿼리가 진행됨.

이를 지연 로딩(Lazy Loading)이라고 한다.

이 과정에서 N개의 추가 쿼리가 발생 및 실행되어 많은 부하 및 응답시간이 소모됨.

이를 N+1 Problem이라고 하는 것.

 

이를 즉시로딩(Eager Loading)으로 해결할 수 있다.

  • select_related
    one-to-many 또는 one-to-one 관계 시 사용.
    정방향 참조일 때 사용한다고 생각하면 됨.
  • prefetch_related
    many-to-many 시 사용
    역방향 참조 관계에서 사용. 하지만 정방향 참조도 가능

 

Look Aside 패턴

가장 기본이 되는 캐시 읽기 전략.

캐시와 DB가 분산되어 운용되기 때문에 redis가 죽어도 서비스 정상 작동.

최초에 캐시로 데이터를 넣는 작업이 필요.


Write Around 패턴

 

모든 데이터는 DB에 바로 저장.

cache miss가 발생했을 때만 캐시와 DB에 저장.

cache miss가 발생하지 않는다면 DB에서 내용이 수정된다 하더라도 서비스에 반영되지 않음.

그렇기 때문에 cache miss가 발생할 수 있도록 만료시간을 짧게 잡고 사용.


오늘의 회고

목표였던 13까지 완료.

월요일이라 그런가 졸리다...

 

내일의 목표는 15강까지 수강 완료하기.