도담도담

쿼리메서드 본문

IT 공부/KH 정보교육원

쿼리메서드

Zinisang 2021. 7. 10. 13:58

쿼리메서드 작성 방법

주로 findBy~~ deleteBy~~ getBy~~ 와 같은 이름으로 시작하고, 필요한 필드 조건이나 AND, OR 와 같은 키워드를 조합하여 메서드의 이름만으로도 쿼리조건을 만들어 낼 수 있다.

메서드의 파라미터(매개변수) 는 키워드에 따라서 객수가 결정된다.


예) Between의 경우 범위를 지정하는 두가지 값이 필요하기 때문에 findByStartDateBetween 과 같은 메서드 이름을 작성할 수 있다.
실제 SQL은 select ~~~ where startDate between ? and ? 와 같은 형식으로 실행된다.


메서드의 리턴 타입

select를 하는 작업일 경우 List 또는 배열을 이용할 수 있다.
파라미터네 Pageable 타입을 전달하는 경우에는 반드시 Page<T> 타입으로 지정

*참조 : IntelliJ 일 경우 쿼리 메서드 작성 기능을 제공.

 

쿼리메서드 (deleteBy)

deleteBy를 이용하여 조건에 맞는 객체를 삭제하는 쿼리 메서드

실제 사용할 때는 해당 메서드에
     @Commit
     @Transaction
을 사용해야 한다.

 

@Commit : 사용하지 않았을 경우에는 Rollback
@Transaction : 이 없을 경우에는 예외 발생 

          (javsx.persistence.TransactionRequiredException)

이유: deleteBy~~ 를 실행할때,
1. select문으로 해당 엔티티객체 조회
2. 각 엔티티 객체들을 한번에 삭제 하는게 아니라 하나씩 삭제하기 때문에.

 


@Query 어노테이션

기존 SQL을 이용하여 메서드 생성 가능


Spring Data JPA 가 제공하는 쿼리 메서드는 일반적으로 간단한 처리를 할 때 많이 사용된다.

만약, 2개 이상의 테이블을 사용할때는 (복잡한 조건을 처리할때

=> join 등등을 사용해야 하는데

=> @Query를 사용할 수 있다.

@Query("SQL 구문")
메서드 이름과 무관하게 메서드에 추가한 어노테이션을 통하여 원하는 작업을 처리
(즉, 메서드명은 개발자가 임의의 명명할 수 있다)


@Query를 이용하여 할 수 있는 작업

  1. 필요한 데이터만 선별적으로 추출 가능
  2. 데이터베이스에 맞는 순수한 SQL을 사용 가능
  3. insert, update, delete 와 같이 select가 아닌 DML등을 처리 가능 (단, @Modifying 과 함께 사용)

JPQL(객체 지향 쿼리) 

테이블 대신 엔티티 클래스를 이용한다.
테이블에 컬럼 대신, 엔티티 클래스의 멤버변수(필드)를 이용하여 작성.

예) mno 역순으로 정렬하는 메서드 선언 시,
@Query("select m from Memo m order by m.mno desc")
List<Memo> getListDesc();

실제 SQL 에서 사용되는 함수들도 동일하게 사용 가능!
(avg() / sum() / max() / count() / group by / order by 등등)

 

 

JPQL : Entity class 기준
SQL : Table 기준

JPA 에서는
SQL -> "select * from tbl_memo m order by m.mno desc"
JPQL -> "select m from Memo m order by m.mno desc"

JPA는 기존 SQL과 JPQL를 매핑하는 역할을 담당하는 거라고 이해해도 된다.

 


@Query 의 파라미터 바인딩 방법


1. 파라미터명을 활용하는 방식
2. 여러개의 파라미터를 전달 : #{    }  ( 객체를 이용 )

*참조 update/delete 등 데이터가 수정이 되는 경우에는 
@Transactional 을 사용한다.
특히 update를 사용할 경우에는 @Modifying 까지 사용해야 한다.

예)

no를 이용하여 해당 memoText를 변경하는 @Query를 이용한 쿼리메서드 (객체로 전달)
@Transactional
@Modifying
@Query("update Memo m set m.memoText = :#{#param.memoText} where m.mno = :#{#param.mno}")
    int updateMemoText(@Param("param") Memo memo);

 


쿼리메서드 참조 URL

https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods.query-creation

'IT 공부 > KH 정보교육원' 카테고리의 다른 글

게시글에 이미지 저장시켜서 올리기  (0) 2021.07.31
파이널 프로젝트 시작  (0) 2021.07.14
Thymeleaf 레이아웃  (0) 2021.07.09
thymeleaf 내용정리  (0) 2021.07.08
Spring Data JPA 개념  (0) 2021.07.07
Comments