Springboot

[Spring Boot] @Query 어노테이션을 이용한 Spring JPA 예제

Jenny376 2023. 6. 13. 23:13
안녕하세요. hia의 개발 story입니다.

 

장점이 많은 Spring JPA이지만 복잡한 쿼리를 사용할 때에는 사용이 불편해집니다. 

이런 불편함을 감소시키기 위해 @Query 어노테이션을 이용하여 JPQL문을 실행합니다. 

JPQL은 일반 SQL처럼 사용가능하기 때문에 좀 더 복잡한 구문을 사용할 수 있습니다. 

 

@Query를 이용한 select 구문 테스트

 

간단하게 select하는 예제를 보도록 하겠습니다.

아래와 같이 Repository 인터페이스에 @Query("쿼리문") 어노테이션을 이용하여 select 하는 함수를 만들어줍니다. 

 

public interface SampleRepository extends JpaRepository<Sample, Long> {

    @Query("select s from Sample s order by s.id")
    List<Sample> getSampleList();

}

 

이제 만들어진 getSampleList를 테스트하는 테스트 구문을 작성합니다. 

 

@SpringBootTest
public class SampleRepositoryTests {

    @Autowired
    SampleRepository sampleRepository;

    @Test
    public void testQuery(){
        List<Sample> sample = sampleRepository.getSampleList();

        sample.forEach(sample1 -> System.out.println(sample1));
    }
}

 

그러면 이렇게 아래와 같이 결과가 나오게 됩니다. 

 

 

@Qurey를 이용한 update 구문 테스트

 

이제 쿼리문에 where문을 이용하여 조건을 걸어보도록 하겠습니다. 

쿼리에 파라미터로 값을 전달할때는 여러 가지 방식을 사용할 수 있습니다. 

  • ?1, ?2 와 같이 파라미터 순서를 이용하는 방법 
  • :파라미터명 와 같이 파라미터의 이름을 이용하는 방법 
  • #{} 와 같이 자바 빈 스타일을 이용하는 방법 

 

여러 방법 중 상황에 맞게 편한 것을 골라서 사용하변 됩니다. 

아직 저도 공부 중이라 :파라미터명 을 사용하여 테스트하였습니다. 

public interface SampleRepository extends JpaRepository<Sample, Long> {

    @Transactional
    @Modifying
    @Query("update Sample s set s.value = :value where s.id = :id")
    int updateSampleValue(@Param("id") Long id, @Param("value") String value);

}
@SpringBootTest
public class SampleRepositoryTests {

    @Autowired
    SampleRepository sampleRepository;

    @Test
    public void testQuery(){
       sampleRepository.updateSampleValue(10L, "SampleUpdate");
       Optional<Sample> result  = sampleRepository.findById(10L);

       if(result.isPresent()){
           Sample sample = result.get();
           System.out.println(sample);
       }
    }
}

 

update 구문이 잘 작동하여 id 10의 value 값이 SampleUpdate로 잘 변경됨을 볼 수 있습니다. 

 

이외에도 페이징처리 join을 이용할 시 Object로 리턴받는 방식 등 여러 가지 복잡한 구문들을 처리할 수 있습니다.

따로 JPA를 더 공부할 것이기 때문에 그건 별도로 정리하도록 하겠습니다.