JPA

JPQL - JPQL 소개(2)

방구석 대학생 2020. 11. 13. 21:37

"인프런 - 자바 ORM 표준 JPA 프로그래밍 강의를 듣고 작성한 글 입니다."

www.inflearn.com/course/ORM-JPA-Basic#

 

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런

JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다. 초급 웹 개발 프로그

www.inflearn.com

 

 

QueryDSL

- 보통 SQL 이랑 문법이 비슷하게 생겼다.

- 그런데 이걸 사용하려면 어느정도 설정을 해놓아야 한다.(이 설정에 대한 부분은 후에 QueryDSL 을 자세하게 배우게 되면 정리하자.)

- 문자가 아닌 자바 코드로 JPQL 을 작성하는 것이 가능하다.

- JPQL 빌더 역할을 하며, 컴파일 시점에 문법 오류를 찾아 낼 수 있다.

- 동적 쿼리의 작성이 편리하며, 단순하고 쉽다.

- 실무에서 사용하는 것을 권장한다.

 

* 중요한 점?

일단 그냥 JPQL 만 잘하면 된다. QueryDSL 은 reference document 에 가면 라이브러리 세팅, gradle 세팅, 예시 코드 등등 참고해서 볼 것들이 다 나와있다.

중요한건 JPQL 문법을 아는 것이다. JPQL 문법만 잘 알고 있으면 자연스럽게 QueryDSL 또한 자연스럽게 잘 알게 된다.

 

QueryDSL 예시 코드

// JPQL : select m from Member m where m.age > 18
JPAFactoryQuery query = new JPAQueryFactory(em);
QMember m = QMember.member;

List<Member> list = query.selectFrom(m)
			.where(m.age.gt(18))
			.orderBy(m.name.desc())
			.fetch();

 

 

네이티브 SQL

- JPA 가 제공하는 SQL 을 직접 사용하는 기능으로 JPQL 로 해결할 수 없는 특정 데이터베이스에 의존적인 기능이다.

예시 : 오라클 CONNECT BY, 특정 DB 만 사용하는 SQL 힌트

참고로 특정 DB 만 사용하는 SQL 힌트 같은 경우 꼭 네이티브 SQL 이 아니어도 Hibernate 가 방언 같은곳에서 세팅해서 할 수 있도록 지원한다.

 

활용 예시

// 아예 SQL 쿼리를 직접 작성해서
String sql = "SELECT ID, AGE, TEAM_ID, NAME FROM MEMBER WHERE NAME = 'kim'";
// createNativeQuery() 메소드의 파라미터로 넘긴다.
List<Member> resultList = em.createNativeQuery(sql, Member.class)
			.getResultList();

 

- JpaMain.java

em.createNativeQuery("select MEMBER_ID, city, street, zipcode, USERNAME from MEMBER")
		.getResultList();

- Hibernate SQL

Hibernate: 
    /* dynamic native SQL query */ select
        MEMBER_ID,
        city,
        street,
        zipcode,
        USERNAME 
    from
        MEMBER

 

 

JDBC 직접 사용, SpringJdbcTemplate 등

- JPA 를 사용하면서 JDBC 커넥션을 직접 사용하거나, 스프링 JdbcTemplate, MyBatis 등을 함께 사용 가능하다.

- 단, 영속성 컨텍스트를 적절한 시점에 강제로 flush 하는 것이 필요하다.

예시 : JPA 를 우회해서 SQL 을 실행하기 직전에 영속성 컨텍스트 수동 flush

 

* 조심해야 할 것?

영속성 컨텍스트는 flush 가 되어야 DB 에 데이터가 들어간다.

flush 는 커밋 되었을 때, 쿼리가 DB 로 전달될 때 발생한다.

즉, 네이티브 SQL 을 사용할 때 createNativeQuery() 메소드를 통해 SQL query 를 DB 로 보내면 기본적으로 flush 가 동작한다.

 

아래와 같은 코드를 보자.

- JpaMain.java

Member member = new Member();
member.setUsername("member1");
em.persist(member);

List<Member> resultList = 
		em.createNativeQuery("select MEMBER_ID, city, street, zipcode, USERNAME from MEMBER")
					.getResultList();
// 이 시점에 flush 된다. DB 에 뭔가 있어야 쿼리가 전달되었을 때 데이터를 얻어올 수 있기 때문이다.

 

 

다음 글에서부터 본격적으로 JPQL 에 대해 알아보자.