“쎈 쿼리”는 일반적으로 개발자들이 직접 SQL을 작성하는 방식, 즉 순수 SQL(=Native SQL)을 사용할 때 쓰는 은어
JPA나 QueryDSL 같은 추상화된 ORM 도구를 사용하지 않고, 직접 SQL을 작성해서 DB에 날리는 쿼리
em.createQuery("SELECT m FROM Member m WHERE m.age > :age")
queryFactory.selectFrom(member)
.where(member.age.gt(30))
em.createNativeQuery("SELECT * FROM member WHERE age > 30", Member.class)
JPA, QueryDSL은 추상화 계층 위에서 동작하며, DB 종류에 따라 SQL이 자동 생성됨
반면, Native SQL은 추상화 없이 직접 DB에 날리는 강한 쿼리이기 때문에 "쎈 쿼리"라고 부름
쿼리 최적화, 복잡한 JOIN, 서브쿼리 등 성능이 중요한 경우에 자주 사용됨
| 항목 | 쎈 쿼리 (Native SQL) | JPQL/QueryDSL |
|---|---|---|
| 성능 제어 | ✅ 세밀한 튜닝 가능 | ❌ 제한적 |
| 복잡한 쿼리 | ✅ 자유롭게 작성 | ❌ 구조적 제약 |
| 유지보수성 | ❌ DB 종속적 | ✅ 추상화로 관리 |
| 타입 안정성 | ❌ 없음 (런타임 오류) | ✅ 컴파일 체크 가능 |
ORM으로 표현하기 힘든 복잡한 통계 쿼리, 서브쿼리, 집계 등을 처리할 때
성능 최적화가 중요한 상황 (ex. 대용량 데이터)
DB 벤더 특화 기능 사용 시 (e.g. Oracle의 CONNECT BY, PostgreSQL의 WITH RECURSIVE 등)
@Query(value = "SELECT * FROM member WHERE age > ?1", nativeQuery = true)
List<Member> findByNativeAgeGreaterThan(int age);