Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

Skipalong's tistory

231222 TIL - JPQL 과 QueryDSL 본문

TIL

231222 TIL - JPQL 과 QueryDSL

Skipalong 2023. 12. 23. 00:57

오늘은 JPQL 과 QueryDSL 에 대해 정리해보겠다.

 

JPQL 

 

1. EntityManager.createQuery()
쿼리 문자열과 Entity를 직접 넣어서 쿼리를 작성한다. 

@Test
	public void testEmCreateQuery() {
		String qlString = "select u from User u " +
							"where u.username = :username";

		Member findUser = em.createQuery(qlString, User.class)
				.setParameter("username", "teasun")
				.getSingleResult();

		assertThat(findUser.getUsername()).isEqualTo("teasun");
	}

 

2. @Query

쿼리의 인자값으로 쿼리를 작성한다.(쿼리를 작성할 때 테이블명이 아니라 Entity명으로 조회한다.)

public interface UserRepository extends JpaRepository<User, Long> {

  @Query("SELECT u, u.password AS customField FROM User u WHERE u.username = ?1")
  List<User> findByUsernameWithCustomField(String username, Sort sort);


  @Query("SELECT u FROM User u WHERE u.username = ?1")
  List<User> findByUsername(String username, Sort sort);
}
public interface UserRepository extends JpaRepository<User, Long> {

  @Query("SELECT u, u.password AS customField FROM User u WHERE u.username = :username")
  List<User> findByUsernameWithCustomField(String username, Sort sort);


  @Query("SELECT u FROM User u WHERE u.username = :username")
  List<User> findByUsername(String username, Sort sort);
}

 

위의 두 가지 예시처럼 메서드의 파라미터 순번으로 정해줄 수 있고 변수명으로 정해줄 수도 있다.

 

JPQL의 단점은 코드에 문자열(쿼리문)이 들어간다는 것이다. 

코드에 문자열이 들어가게 되면 오타가 발생할 확률이 높고, 유지보수성이 떨어진다. 또 컴파일시점에 오류를 잡지 못하고 런타임 시점에 오류가 잡힌다. 이런 이유로 JPQL보다는 QueryDSL(JPAQueryFactory)를 사용하는 방법을 공부해야겠다.

 

 

QueryDSL(JPAQueryFactory)

 

QueryDSL이란 Entity의 매핑정보를 활용하여 쿼리에 적합하도록 쿼리 전용 클래스(Q클래스)로 재구성해주는 기술이다.

Q클래스를 활용하기 위해서는 JPAQueryFactory를 통해야 한다.

JPAQueryFactory란 재구성한 Q클래스를 통해 문자열이 아닌 객체 또는 함수로 쿼리를 작성하고 실행하게 해주는 기술이다.

 

@PersistenceContext
EntityManager em;
 
public List<User> selectUserByUsernameAndPassword(String username, String password){
	JPAQueryFactory jqf = new JPAQueryFactory(em);
	QUser user = QUser.user;
  
	List<Person> userList = jpf
							.selectFrom(user)
							.where(person.username.eq(username)
							.and(person.password.eq(password))
							.fetch();
                                
	return userList;
}

이렇게 JPAQueryFactory에 EntityManager를 넣어서 만들어준 뒤 builder를 사용하는 것 처럼 쿼리를 만들어주는 방식이다 이 방식으로 하면 문자열을 사용하지 않고 메서드(?)생성자(?)같이 쿼리를 생성해주기 때문에 훨씬 효율적으로 사용할 수 있다.

 

JPA심화과정에서 배우는 것들이 아직 많이 생소하고 어렵지만 언젠가는 자유자재로 사용할 수 있게 되면 좋겠다. 이제 쭉 프로젝트이고 정말 오랜만에 과제 없는 주말이라 배운것들을 정리하고 푹 쉬는 주말이 되야 할 것 같다.

 

'TIL' 카테고리의 다른 글

231227 TIL - Docker  (0) 2023.12.28
231226 TIL - Trello  (0) 2023.12.27
231221 TIL - @DynamicInsert, @DynamicUpdate  (1) 2023.12.21
231220 TIL - CI/CD  (0) 2023.12.21
231219 TIL - JpaRepository  (1) 2023.12.19