Query 작성법 1. Native Query

Yennie·2024년 5월 10일

JPA

목록 보기
8/19

Spring Data JPA에서 Native Query란?

사용한 쿼리문을 순수하게 가져온 것을 의미, 우리가 사용하는 SQL을 사용할 수 있도록 해준다.
BUT 가급적 네이티브 쿼리는 어쩔 수 없는 상황에만 사용하자.

사용방법

@Query(value = "select * from article, nativeQuery = true)
List<Article> findAll();

파라미터 사용방법

@Query(value = "select m from Member mwhere m.id > ?1")
public List<Member> selectJPQLById1(int id);

nativeQuery 속성이 false 이면 JPQL이다.

@Query("SELECT m FROM Member M") // JPQL
@Query("SELECT m.* FROM Member m", nativeQuery = true) // SQL

select 구문이 아닌 DML(insert, update, delete) 구문 사용 시

  • @Modifying
    DDL 구문 사용 시에도 표기 필요
    영속성 컨텍스트에 오래된 데이터를 비워주고 새로운 데이터를 읽어주기 위함
  • @Transactional
    update, delete 시 표기를 해주어야 정상 실행이 되어짐
@Query(value = "update Member set name = :#{#paramMember.name}, price = :#{#paramMember.price} where id = :#{#paramMember.id}")
	@Modifying
	@Transactional
	public int updateJPQL(@Param(value = "paramMember") Member member);
	

장단점

장점

  • JPA에서 제공하지 않는 정보들을 조회할 수 있다.
  • 성능 문제를 해결할 수 있다.
    JpaRepository에서 update하기 위해서는 한번에 처리하는 것이 아니라 하나 하나 조회해서 save하도록 제공하고 있음. 만일 대량의 데이터에 대한 마이그레이션으로 실행한다면 속도의 저하를 가져오기 때문에 native query를 사용해서 한번의 쿼리로 실행할 수 있음

단점

  • entity 속성을 사용하지 못하기 때문에 쿼리의 from에는 테이블명이 들어가야한다
  • 추후 DB의 종류가 변경되면 코드의 변경도 피할 수 없다 (JPA의 장점인 DB 추상화가 사라지는 것)
  • 순수한 문자열이기 때문에 DB에 쿼리를 날려서 정상 결과를 받거나 SQL Exception 발생 전 까지는 문법이 제대로 작성되었는지 확인이 어렵다.

참고
https://velog.io/@betaa06/JPA%EC%97%90%EC%84%9C%EC%9D%98-Native-Query
https://imprint.tistory.com/149
https://jforj.tistory.com/90

profile
PM | Aspiring SWE | linkedin.com/in/emilyyeeun

0개의 댓글