목차
개요
SQLP 자격증 준비중에 하드/소프트 파싱에 대해서 나왔고 대용량 트래픽이 몰리는 상황에서 로그인 시에 db에서 회원 정보를 받아오는 것을 예시로 들어 순회시에 바인딩 변수를 이용하면 db엔진에 SQL 이 N개가 수행되는것이 아니라 1개만 수행되고 이후엔 소프트파싱을 이용해 최적화를 한다고 명시되어 있었다.
따라서 Spring 에서는 바인딩 변수를 어떻게 이용되고 있는지 찾아보고 작성하게 되었다.
결론적으로는 Spring에는 @RequestParam 등 Data binding 을 도와주고 있는 어노테이션들이 존재하였는데 오늘 살펴볼 SQL과의 Data binging 에서는 = :{속성} 의 JPQL 쿼리에 해당 속성을 @Param 어노테이션을 이용하여 지정해주는 방식을 이용하고 있었다.
https://docs.spring.io/spring-data/jpa/reference/jpa/query-methods.html#jpa.named-parameters
하드 파싱과 소프트 파싱
하드 파싱(Hard Parsing)
하드 파싱은 데이터베이스가 새로운 SQL 쿼리를 처음으로 처리할 때 수행되는 과정이다. 아래와 같이 하드 파싱은 자원 사용량이 많고 시간이 오래 걸린다.
1. SQL 텍스트 분석
2. 최적화: 최적의 실행 계획을 수립하기 위해 쿼리 최적화를 수행 (옵티마이저)
3. 실행 계획 생성: 쿼리 실행에 필요한 단계를 계획
4. 캐시에 저장: 생성된 실행 계획을 라이브러리 캐시에 저장하여 이후 사용 가능하게 한다.
DBMS 에서의 과도한 부하는 대부분 I/O 과정에서 일어나는데 서론부에서 설명했던 하드파싱이 여러번 발생하는 상황에서는 이에 못지 않게 CPU 사용률의 급격한 증가와 라이브러리 캐시 내에서의 경합으로 인해서 제대로 Select 가 처리되지 않는 상황이 발생할 수 있다.
소프트 파싱(Soft Parsing)
소프트 파싱은 하드 파싱의 비용을 줄이기 위해 동일한 SQL 쿼리를 재사용할 때 수행되는 과정으로 라이브러리 캐시에 저장된 실행 계획을 재사용함으로써 성능을 최적화한다.
1. 캐시 검색: 라이브러리 캐시에서 동일한 SQL 텍스트의 실행 계획을 검색
2. 실행 계획 재사용: 캐시된 실행 계획이 존재하면 이를 재사용하여 쿼리를 실행
title 없는 SQL와 파라미터 Driven 방식
DB에서 프로시저, 트리거 등은 생성 시에 이름을 가지고 해당 이름으로 호출, 삭제가 가능하다. SQL 의 경우에는 따로 이름을 가지고 있지 않고 들어온 SQL 텍스트가 곧 이름의 역할을 한다. 따라서 모든 파라미터를 하드 파싱하게 된다면 라이브러리 캐시에 캐싱을 해두어도 검색순회 하는데에만 오랜 시간이 걸려서 성능상 문제가 생길수 있다.
따라서 파라미터 부분을 바인딩 변수로 대체하여 하드파싱은 최초 1회에 한해서 발생하게 하고 이후에는 소프트 파싱을 이용해 자원 사용의 이점을 가져올 수 있다.
스프링에서 @Param 을 이용한 파라미터 Driven 쿼리
실제 운영중인 코드 조각을 가져와 봤다.
public interface ProductRepository extends JpaRepository<Product, Long> {
@Query("SELECT p.id FROM Product p WHERE p.subCategory.category.name = :categoryName")
List<Long> findIdsByCategoryName(@Param("categoryName") String categoryName);
}
• @Query 어노테이션은 JPQL(Java Persistence Query Language) 쿼리를 정의
• :categoryName은 바인딩 변수로, 실행 시점에 @Param 어노테이션을 통해 값을 전달받는다.
마무리
Spring 내에서 @Param을 사용하여 동적으로 쿼리 작성이 가능하다 라는 사실만 알고 있었지만 JPQL 작성시 := 등의 표현법으로 파라미터 Driven 방식의 SQL 을 통해 데이터 베이스 내에서 하드/소프트 파싱 전략을 사용하게 된다는 개념을 확실히 잡게 된것 같다.
'SQLP' 카테고리의 다른 글
데이터베이스의 물리적 구조(Oracle/MySQL) (0) | 2024.06.06 |
---|