Spring Boot

[ Spring Boot ] @Query 어노테이션, Querydsl

hanjuCoding 2024. 7. 30. 11:19

스테판 Query

@Query 어노테이션 사용 이유

JPA에서는쿼리메서드를 제공하는데, 이는 검색같은 간단한 기능을 작성할때는 편함.

But, 조인이나 복잡한 조건을 처리할때는 And,Or이 들어가서 불편함

따라서, 간단한 처리는 쿼리메서드를, 복잡한 처리는 @Query를 사용한다.

 

ex) JPQL & Native SQL

    //JPQL
    @Query("select m from Memo m where m.memoText like %:memo% order by m.mno desc")
    List<Memo> findByMemoTextLike(String memo);


    //Native SQL
    @Query(value = "select * from tbl_memo where memo_text like concat('%',?1,'%')" +
            " order by mno desc",nativeQuery = true)
    List<Memo> findByMemoTextLike2(String memo);

간단한 쿼리문은 JPQL처럼 작성해도 되지만,

복잡한 경우에는 Native SQL처럼 작성해도 된다.

 

JPQL의 작성법은 필요할때 검색해서 작성해봐라.

Native SQL은 JPA자체가 DB에 독립적으로 구현이 가능하다는 장점을 잃어버리기는 하지만 경우에 따라서는 JOIN같이 복잡한 구문을 처리하기 위해 어쩔 수 없이 사용해야된다는,,

 

결과는 JQPL, Native SQL 동일

Querydsl 

JPA의 쿼리메서드와 @Query는 선언할 때 고정된 형태의 값을 가지는 단점이 있음

Querydsl은 복잡한 조합을 이용할때 경우의 수가 많은 상황에서는 동적으로 쿼리를 생성하게 해준다.

Dependencies 추가

mavenRepository에서 querydsl검색

Querydsl JPA support, Querydsl APT support를 dependencies에 추가

를 해야하지만, 올해 초에 바뀌어서 아래와 같이 작성해야함

implementation 'com.querydsl:querydsl-jpa:5.1.0:jakarta'
annotationProcessor(
        "jakarta.persistence:jakarta.persistence-api",
        "jakarta.annotation:jakarta.annotation-api",
        'com.querydsl:querydsl-apt:5.1.0:jakarta'
)

 

입력하고 로드하기 Gradle -> Tasks -> build -> build -> run

(잘안되면 clean도 run해보기)

 

QMemo가 생성되었는지 확인한다.

 

//querydsl 테스트
    @Test
    public void testQuerydsl(){
        String SearchType = "t";
        String SearchWord = "9";

        //빌더객체
        BooleanBuilder builder = new BooleanBuilder();
        QMemo memo = QMemo.memo;

        //동적조건
        if("t".equals(SearchType)){
            builder.and(memo.memoText.like("%"+SearchWord+"%"));
        }
        Page<Memo> result = memoRepository.findAll(builder,
                PageRequest.of(0,10));
        result.get().forEach(e->System.out.println(e));
    }

 

ex) QGuestbook -> 클래스의 변수들이 마치 칼럼처럼 생성된 것을 볼 수 있다.