코딩한걸음
728x90
반응형

Q. Django ORM의 장단점은 무엇입니까?


Django ORM의 장점은 생산성, 데이터베이스 독립성, 보안입니다.
생산성 : SQL 쿼리를 직접 작성하지 않아도 되므로 코드가 더욱 간결하고 가독성이 좋아집니다.
데이터베이스 독립성 : 다양한 데이터베이스 시스템에 독립적으로 동작하므로, 데이터베이스를 변경할 때 유용합니다.
보안 : 내부적으로 쿼리를 생성해 SQL Injection과 같은 보안 취약점을 줄일 수 있습니다.

단점은 성능 이슈가 있습니다.
성능 이슈 : N+1 문제, 불필요한 데이터 조회, 복잡한 쿼리의 ORM 사용 등

 

질문 의도

  • Django ORM에 대한 이해 : Django ORM을 사용하는 방법 뿐 아니라 그 장단점, 적절한 사용 시나리오에 대한 이해도를 가지고 있는지 확인
  • 성능 이슈 : ORM은 특정 상황에서 성능 이슈가 생길 수 있는데, 그 부분을 알고 있는지? 그리고 해결 방법을 알고 있는지

Django ORM 사용 시 발생할 수 있는 성능 이슈

  • N+1 문제 : 관계형 데이터베이스의 외래 키(FK)나 다대다 관계(ManyToMany)와 같은 관계를 조회할 때 발생
    • 한 모델에서 관련된 다른 모델을 참조할 때, 각각의 객체에 대해 별도의 쿼리가 실행될 수 있음. 이렇게 되면 N개의 관련 객체를 가져오기 위해 N+1개의 쿼리가 실행되게 된다.
    • 해결방법 : `select_related`와 `prefetch_related` 메서드를 사용하여 필요한 관계를 미리 조회하면, 추가 쿼리 없이 관련 객체에 접근 할 수 있다.
  • 불필요한 데이터 조회 : `.all()` 메서드를 사용해 전체 데이터셋을 조회하거나, `.values()` 메서드 없이 큰 데이터셋을 조회하는 경우, 불필요하게 많은 데이터를 불러오게 된다.
    • 해결방법 : 필요한 필드만 선택해 조회하거나, pagination을 사용하여 한 번에 적절한 양의 데이터만을 불러온다.
  • 복잡한 쿼리의 ORM 사용 : 매우 복잡한 쿼리의 경우 ORM보다는 직접 작성한 SQL이 더 효율적일 때가 있다.
    • 해결방법 : `django.db.connections`를 사용하여 직접 SQL 쿼리를 작성하거나, `annotate()`, `aggregate()` 등의 Django ORM 기능을 활용해 최적화한다.
      • `annotate()` : 개별 모델 인스턴스에 연산 결과를 주석으로 추가. 주로 그룹화된 쿼리셋에 대해 연산을 수행할 때 유용
      • `aggregate()` : 전체 쿼리셋에 대한 연산 결과를 반환. 데이터베이스 수준에서의 집계 연산에 사용

 

예상 꼬리 질문

  • 프로젝트를 진행하면서 Django ORM의 장단점을 경험했나요? 특히 성능 이슈는 어떻게 해결하셨나요?
  • 복잡한 쿼리를 작성해야 할 때는 어떻게 대처하셨나요? Django ORM만을 사용하셨나요? 아니면 다른방법을 선택하셨나요? 이유는 ?
  • Django ORM이 SQL Injection과 같은 보안 위협에서 어떻게 보호해주는 지 구체적으로 설명해주실 수 있나요?

 

728x90
반응형
profile

코딩한걸음

@Joonyeol_Yoon

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!