ORM을 사용하면 쿼리가 복잡해지는 경우가 종종 있다. 아무래도 내가 쿼리문을 직접 작성한 게 아니라서 다소 비효율적으로 나올 수도 있다.
- 원인 파악: ORM이 복잡한 쿼리를 생성하는 원인을 정확히 파악하세요. 쿼리의 복잡성은 연관 관계, 조인, 서브쿼리 등의 다양한 요소에 의해 발생할 수 있습니다.
- Raw SQL 사용: ORM이 생성하는 쿼리가 너무 비효율적인 경우, 직접 SQL을 작성하여 사용할 수 있습니다. 대부분의 ORM 도구는 Raw SQL 쿼리를 지원합니다.
- 쿼리 최적화: ORM 도구에서 제공하는 쿼리 최적화 기능을 활용하거나, 데이터베이스 엔진의 쿼리 플랜을 확인하여 쿼리를 개선할 수 있습니다.
- Fetch 전략 변경: ORM에서 제공하는 다양한 fetch 전략(Eager Fetch, Lazy Fetch 등)을 잘 활용하여 필요한 데이터만 가져오도록 최적화하세요.
- DTO (Data Transfer Object) 사용: 직접적으로 Entity 객체를 사용하는 대신에 필요한 필드만을 포함하는 DTO를 사용하여 쿼리를 간소화할 수 있습니다.
- 인덱싱: 데이터베이스 테이블의 적절한 인덱싱은 쿼리의 성능을 크게 향상시킬 수 있습니다. ORM이 생성하는 쿼리에 맞는 인덱스를 생성하세요.
- ORM 설정 및 최적화: ORM 도구 자체에서 제공하는 설정을 통해 쿼리 성능을 최적화할 수 있습니다. 예를 들어, Hibernate의 경우 batch size, cache 설정 등을 통해 성능을 향상시킬 수 있습니다.
- 리팩토링: 때로는 코드의 구조나 로직 자체를 변경하여 더 효율적인 쿼리를 생성하도록 리팩토링하는 것이 좋습니다.
이렇게 해결할 수 있는 방법들이 있는데 인덱싱이 무엇인지 의문이 들었다.
ORM에서 기본키로 사용되는 id를 부여하지 하는데 인덱싱을 따로 해야하나?
인덱싱은 조금 다른 것이었다.
- 기본키 (Primary Key, PK):
- 데이터베이스 테이블에서 각 행(row)을 고유하게 식별하는 역할을 합니다.
- 기본키는 중복되거나 NULL 값이 될 수 없습니다.
- id는 많은 데이터베이스 테이블에서 기본키로 사용되는 컬럼 이름입니다. 하지만 이름이 반드시 id일 필요는 없습니다.
- 기본키는 자동으로 인덱스가 생성되므로 검색 성능이 향상됩니다.
- 인덱싱 (Indexing):
- 데이터베이스에서 데이터 검색 속도를 향상시키기 위한 자료구조입니다.
- 테이블의 컬럼에 인덱스를 생성하면, 해당 컬럼의 데이터를 빠르게 조회하거나 정렬할 수 있습니다.
- 인덱스는 트리 구조나 해시 구조 등 다양한 자료구조를 사용할 수 있습니다.
- 인덱스는 데이터의 검색 속도를 높이지만, 삽입, 수정, 삭제 연산의 속도는 느려질 수 있습니다. (인덱스를 유지하기 위한 추가 작업이 필요하기 때문입니다.)
- 기본키는 자동으로 인덱스가 생성되지만, 기본키 외에도 성능 향상을 위해 다른 컬럼에도 인덱스를 생성할 수 있습니다.
인덱싱은 id처럼 숫자를 부여하는 게 아니라 데이터 베이스 내부에서 설정되어 작동하는 내부 구조로 일반적인 데이터 조회에는 보이지 않으며, 특정 시스템 카탈로그나 명령어를 사용하면 인덱스 정보를 확인할 수 있다. 그리고 인덱싱을 통해 조회는 빠르게 할 수 있지만 인덱스 자체도 내부에 공간을 차지하고 데이터를 삽입, 수정, 삭제할 때마다 인덱스도 갱신되야 하기에 오버헤드가 발생한다.
결론은 ORM을 사용한 것도 편의성이나 확장성에선 좋을 수 있지만 ORM을 통해 DB와 연결되는 것이기에 성능이 중요하다면 ORM에서 지원하는 로우 쿼리 기능도 아닌 ORM 없는 쿼리를 작성하는 게 성능적으론 더 빠르다.
'오늘 뭐했냐 > 개발에 대한 주저리' 카테고리의 다른 글
23.10.10 ci/cd 다시 정리 (0) | 2023.10.14 |
---|---|
23.10.09 CORS 재정리 (0) | 2023.10.14 |
23.10.06 REST API (0) | 2023.10.11 |
23.10.05 콜백헬 (0) | 2023.10.11 |
23.10.04 프레임워크 라이브러리 (0) | 2023.10.10 |