민우의 코딩일지
article thumbnail

 

 

 

 

 

네이티브 쿼리(Native Query)

 

JPQL을 사용하지않고,  순수 SQL 문법으로  쿼리를 직접 작성해서 사용하는 것을 네이티브 쿼리라고 부른다.

단점 : 실무에서 쓰이지 않는 편 💦

 

 

 

 

 

 

 


 

 

 

 

 

사용하는 방법

 

 

사용하는 방법은 매- 우 간단하다.

다음과 같이,  레파지토리에서 @Query(nativeQuery=true, value="쿼리내용") 을 사용하면 된다.

 

// public interface 레파지토리명Repository extends JpaRepository<엔티티클래스명, 대표키 래퍼클래스> {
public interface UserRepository extends JpaRepository<User, Long> {


	/* 
    	@Query(nativeQuery=true, value="쿼리내용")
        리턴타입 메소드명(@Param("매개변수명") 타입 매개변수명)
        
        *. 참고로 쿼리내용에서 매개변수 쓰고싶으면  이름 앞에 :(콜론)을 붙여주면 된다.
        
	*/ 
    
    
    @Query(nativeQuery=true, value = "SELECT * FROM user WHERE age > :condition")
    List<User> moreThenByAgeCheck(@Param("condition") String condition);
    //=> 매개변수로 받은 숫자보다 나이가 많은 회원을 조회하고, 리턴하는 쿼리문
    
}

 

 

 

 

서비스, 혹은 컨트롤러에서 매개변수를 넘겨주는 방법 또한 간단하다.

일반 메소드 사용하듯이 넘겨주면 된다.

 

@Service
@RequiredArgsConstructor
public class UserService {

    private final UserRepository userRepository;

	// 컨트롤러로부터 숫자를 넘겨받았다는 가정하에 작성 .. 
    public List<UserDTO> moreThenByAgeCheck(int param) {
    
  
        List<User> userEntities = userRepository.moreThenByAgeCheck(param);
        return userEntities.stream()
                           .map(entity -> entity.toDTO()) // toDTO()는 User 엔티티 클래스에 존재하는 메소드로 가정 ..
                           .collect(Collectors.toList());
                           
    }
}

 

 

 

 

 

 

 

 

 

 


 

 

 

 

 

왜 사용되지않는걸까?

 

기본적으로 JPA는 엔티티 클래스를 기반으로 쿼리가 동작하는 JPQL (Java Persistence Query Language)를 사용한다.

 

하지만, 네이티브 쿼리의 경우 엔티티가 아닌 SQL 자체를 기반으로 작동하기때문에 JPQL 사용을 못하기 때문이다.

그렇다보니 사실상 엔티티와 관계가 없게되고,   따라서 JPA를 사용해야할 메리트가 떨어지기때문이다.

 

이 외 성능적인 부분도 있고,  컴파일 하기전까지 오류를 잡기도 어려운 부분이 있다.

그래서,  실무에선 NativeQuery보단  QueryDsl을 사용하는 경우가  많다고한다 👀