[면접 준비] ORM을 사용하면서 쿼리가 복잡해지는 경우에는 어떻게 해결하는게 좋을까요? (24/04/01)

2024. 4. 1. 09:49공부/면접 준비

ORM

데이터베이스와 객체 지향 프로그래밍 언어 간의 호환되지 않는 데이터를 변환하는 프로그래밍 기법으로, db와의 작업을 보다 객체지향적으로 처리할 수 있지만, 쿼리가 복잡해질 경우 성능 문제가 발생할 수 있습니다.

 

대응 방법

  1. 쿼리 최적화
    • ORM으로 생성된 쿼리를 분석하고, 필요한 경우 최적화를 진행합니다. 
    • 불필요한 join, 서브쿼리를 제거하고, 인덱스를 활용하는 등의 작업을 수행할 수 있습니다.
  2. 로우 쿼리 사용
    • 로우 레벨 쿼리(SQL문)를 사용하는 것이 더육 효율적일 수 있다.
    • 복잡한 쿼리의 경우 ORM을 통한 처리보다 로우 쿼리를 작성하는 것이 성능적으로 더 좋을 수 있습니다,
  3. 배치 처리
    • 여러개의 DB작업을 한 번에 처리하여 네트워크 오버헤드를 줄일 수 있습니다.
  4. 캐싱
    • 자주 사용되는 데이터나 쿼리 결과를 캐시에 저장하여 빠르게 접근할 수 있도록 합니다.
  5.  커넥션 풀링
    • DB커넥션을 재사용하여 커넥션 생성/소멸시 오버헤드를 줄입니다.
  6.  N+1쿼리 문제 해결
    • 연관 관계에서 발생하는 이슈로 연관 관계가 설정된 엔티티를 조회할 경우에 조회된 데이터 갯수(n) 만큼 연관관계의 조회 쿼리가 추가로 발생하여 데이터를 읽어오는 문제를 N+1 쿼리 문제라 합니다.
    • 즉시 로딩/지연 로딩을 사용하여 해결할 수 있습니다.
  7. 프로젝션
    • 필요한 필드만 선택하여 데이터를 조회하는 프로젝션 기능을 사용하여 데이터 전송량을 줄입니다.
  8. 페이지네이션
    • 한 번에 많은 양의 데이터를 불러오는 대신, 필요한 만큼만 데이터를 불러오도록 페이지네이션을 사용합니다.

 

 

답변

가장 간단한 방법으로 로우쿼리를 작성하는 방법이 있습니다. 복잡한 쿼리는 ORM으로 처리하기 보다 로우레벨에서 처리하는 것이 성능적으로 더 좋을 수 있기 때문입니다.

그 외에도, 쿼리를 최적화 하거나 데이터나 쿼리 결과를 캐시에 캐싱하는 방법, 즉시 로딩/지연 로딩을 사용하여 N+1 쿼리 문제를 해결하거나 선택한 필드만 조회하는 프로젝션, 필요한 만큼만 데이터를 불러오는 페이지네이션 등의 방법을 사용하여 복잡한 쿼리를 쓰지 않고 데이터를 조회할 수 있습니다.