REST API 쿼리 최적화

Metronon·2025년 1월 6일

REST-API

목록 보기
12/12
post-thumbnail

hikariCP

hikariCP (hikari Connection Pool)란 고성능 JDBC 커넥션 풀 라이브러리이다.
Connection Pool : 초기에 여러개의 연결을 미리 하고, 요청에 따라 연결 사용, 반환을 지원

hikariCP의 특징

  1. 메모리 최적화 : 메모리 사용량이 적어, 서버 리소스를 효율적으로 사용할 수 있음
  2. 성능 우수 : 매우 빠른 커넥션 획득 및 릴리즈 시간을 가짐
  3. 안정성 : 다양한 환경에서 안정적으로 동작, 여러 최적화 옵션을 제공해 데이터베이스 커넥션을 안정적으로 관리
  4. 유연성 : 개발자가 환경에 알맞게 설정을 조정할 수 있음

DBCP (Database Connection Pool)

기존 JDBC 연결은 요청시마다 다음과 같은 과정을 거친다.

드라이버 로드 - 커넥션 객체 생성 - 커넥션 객체 연결 - 커넥션 객체 종료

이러한 과정은 모든 요청에 각각의 커넥션을 만들기 때문에 자원 소모도 심하고, 응답 시간도 오래 걸리게 된다.
단점을 보완하기 위해 hikariCP와 같은 DBCP를 사용하게 된다.

// 애플리케이션 구동시 [초기 1]
커넥션 객체 다수 생성

// 이후 요청
커넥션 제공 - 커넥션 반환

비유로 표현하자면 다음과 같다.
산과 산 사이를 사람이 건너고자 하는 상황이다.
기존 JDBC 연결 : 건너고자 하는 사람이 관계자에게 열기구를 요청해 타고 넘어감
DBCP : 건너고 싶은 사람이 생기자, 케이블카를 여러 라인 설치해 운영함

쿼리 최적화

hikariCP에는 auto-commit이라는 설정이 있다.
이 설정탓에 쿼리문이 기하급수적으로 늘어나는 경우, 성능에 악영향을 끼칠 수 있다.

auto-commit

auto-commit의 기본값은 true로, 각 쿼리가 자동으로 커밋될 수 있게 해주는 설정이다.

spring:
  datasource:
    hikari:
      auto-commit: false

다음과 같이 application 설정파일에서 변경할 수 있다.
auto-commit이 true/false인 상황의 쿼리문을 비교해보겠다.

# auto-commit : true
SELECT * FROM users WHERE id = 1;
SELECT * FROM orders WHERE user_id = 1; -- Lazy loading

# auto-commit : false
BEGIN;
SELECT * FROM users WHERE id = 1;
SELECT * FROM orders WHERE user_id = 1; -- Lazy loading
COMMIT;

true인 경우 각각의 쿼리가 자동으로 커밋이 이루어진다.
false인 경우 쿼리문 전체의 시작과 끝을 묶어 한번에 쿼리를 커밋한다.

위 예시와 같이 쿼리문이 2, 3줄 등 적을경우 차이가 없을 수 있지만, 검색 매커니즘등 쿼리가 많이 일어나는 경우
유의미한 차이를 보일 수 있다.

OSIV (Open Session In View)

OSIV의 기본값은 true로, 트랜잭션이 뷰 렌더링까지 확장되어, Lazy loading을 뷰에서 처리할 수 있게 해준다.
하지만 데이터베이스 커넥션이 오래 열려있을 수 있어, 서버 응답시간에 영향을 끼친다.

spring:
  jpa:
    open-in-view: false

auto-commit이 false인 상황에서 OSIV가 true/false일때의 쿼리문을 비교해보겠다.

# auto-commit : false, open-in-view: true
BEGIN;
SELECT * FROM users WHERE id = 1;
SELECT * FROM orders WHERE user_id = 1; -- Lazy loading
COMMIT;

# auto-commit : false, open-in-view: false
BEGIN;
SELECT * FROM users WHERE id = 1;
COMMIT;

SELECT * FROM orders WHERE user_id = 1; 가 Lazy loading 방식이기 때문에 시행되지 않는다.
이럴땐 @Transactional 어노테이션을 이용해 Lazy loading을 초기화해주면 된다.

profile
비전공 개발 지망생의 벨로그입니다!

0개의 댓글