ORM

ORM이란 Object Relation Mapper의 줄임말이다. 객체와 관계형 데이터베이스의 데이터를 자동으로 매핑 해주는 것을 말한다. 객체를 통해 간접적으로 데이터베이스 데이터를 다룬다.

 

N+1 문제란?

1개의 쿼리로 데이터를 조회하고 싶지만 N+1개의 쿼리를 사용하여 조회하는 문제

 

Django의 ORM은 *Lazy-Loading을 기본값으로 사용하고 있어 자체적으로 이를 최적화하여 최소한의 쿼리만 날린다. 하지만 DB 설계에따라 N번 쿼리를 더 날리는 N+1 문제가 종종 발생한다.

 

*Lazy-Loading : ORM에서 명령을 실행할 때마다 데이터베이스에서 데이터를 가져오는 것이 아니라 모든 명령 처리가 끝나고 실제로 데이터를 불러와야 할 시점이 왔을 때 데이터베이스에 쿼리를 실행하는 방식

 

user = User.objects.all()
tim = user.filter(first_name='tim')  # 아직 DB에서 데이터를 가져오지않음
order_tim = tim.order_by('id')       # 아직 DB에서 데이터를 가져오지않음
timha = user.get(id=1)

email = timha.email.name           # timha에서 참조 되는 것이아니라
					# email 를 가져오는 쿼리를 더 보냄

 

N+1 Problem은 쿼리 1번으로 N건의 데이터를 가져왔는데 원하는 데이터를 얻기 위해 이 N건의 데이터를 데이터 수 만큼 반복해서 2차적으로 쿼리를 수행한다.

 

 

해결법

Eager-Loading 방식은 사전에 쓸 데이터를 포함하여 쿼리를 날리기 때문에 비효율적으로 늘어나는 쿼리 요청을 방지할 수 있다.

 

user = User.objects.all()
email = user.prefetch_related('email')  # email 가져오는 쿼리를 사전에 날림
  • select_related : foreign-key , one-to-one 처럼 single-valued relationships에서만 사용이 가능하다. SQL의 JOIN을 사용하는 방법이다. 
  • prefetch_related : foreign-key , one-to-one 뿐만 아니라 many-to-many , many-to-one 등 모든 relationships에서 사용 가능하다. SQL의 WHERE … IN 구문을 사용하는 방법이다

'python > django' 카테고리의 다른 글

[DRF] Authentication 종류와 특징  (0) 2023.09.06

1.BasicAuthentication
기본인증. username 및 password에 대해 서명된 HTTP 기본 인증을 사용한다. 매번 유저 정보(이름,비번)를 넘겨야하기 때문에 보안상 위험하다. 테스트 용으로 사용하기엔 용이하지만 실제 인증으로 사용하기엔 부적절

 

 

 

2.TokenAuthentication
토큰인증. 간단한 토큰 기반 HTTP 인증 체계를 사용한다. 기본 데스크톱 및 모바일 클라이언트와 같은 client-server 관계에 적합하다.   토큰 헤더를 사용하여 인증한다 .

Authorization: Token 9944b09199c62bcf9418ad846dd0e4bbdfc6ee4b
  • 유저가 로그인을 요청하고 id, pw 정보가 유효하다면 서버에서 Secret Key를 사용해서 유저에게 토큰을 발급한다.
  • 클라이언트는 발급 받은 토큰을 저장하고, 서버에서 요청 할 때 마다, 해당 토큰을 함께 서버에 전달한다.
  • 서버는 토큰을 검증 하고, 요청에 응답한다.

 

 장점

  • 클라이언트에 토큰이 저장되어 있기 때문에 서버의 메모리에 부담이 되지 않으며 Scale에 있어 대비책을 고려할 필요가 없다.
  • 멀티 디바이스 환경에 대한 부담이 없다. (어느 디바이스던 토큰이 올바르다면 토큰인증을 통해 인증 가능)

 단점

  • 암호화가 풀릴 가능성을 배제할 수 없다.
    => 암호화가 풀리더라도 토큰을 사용할 수 없도록 만료기간을 설정해준다.

 

3.SessionAuthentication
세션 인증. Session에 저장되는 정보를 통해 인증한다. 외부 서비스서는 사용할 수 없고, 웹 사이트와 동일한 session context에서 실행 중인 AJAX 클라이언트에 적합하다.

  • 유저가 로그인을 하면 서버 메모리 상에 세션이 저장된다.
    (이 때 세션을 구분하기 위해 Seesion Id를 기준으로 정보를 저장한다.)
  • 클라이언트의 브라우저에 쿠키로 Session Id가 저장된다
  • 쿠키에 정보가 담겨있기 때문에 브라우저는 해당 사이트에 대한 모든 Request에 Session Id를 쿠키에 담아 전송한다.
  • 서버는 클라이언트가 보낸 Session Id와 서버 메모리를 관리하고 있는 Session Id를 비교해서 일치하면 인증 

 

 

 

 

 

'python > django' 카테고리의 다른 글

Django ORM N+1 문제  (0) 2023.09.06

+ Recent posts