스프링부트 강의를 쭈우우욱 듣다 보니 점점 개념이 많아지고 머릿속에서 정리가 안되기 시작했다. (라고 하기엔 한참 오래됐다.)
그래서 검색을 해보았고 이해되는 게시물을 찾아 정리를 해보았다. 감사합니다.
JPA
: Java Persistence API
자바 애플리케이션에서 관계형 데이터베이스를 사용하는 방식 을 정의한 인터페이스
특정 기능을 하는 라이브러리가 아니다.
단지, '관계형 데이터베이스를 어떻게 사용해야 하는지'를 정의하는 한 방법일 뿐.
인터페이스. 즉 구현이 없다.
그럼 구현체는?
JPA는 다양한 쿼리 방법을 지원한다.
JPQL은 Java Persistence Query Language로 가장 단순한 조회 방법이다.
JPQL
은 엔티티 객체를 대상으로 쿼리하고 SQL
은 데이터베이스 테이블을 대상으로 쿼리한다.
Hibernate
: JPA라는 명세의 구현체
EntityManager와 같은 인터페이스를 직접 구현한 라이브러리를 뜻한다.
(즉, 다른 JPA 구현체를 사용해도 되고 가능하다면 직접 JPA를 구현해 사용할 수도 있음. 하지만 하이버네이트는 이미 성숙한 라이브러리이기 때문에 이를 사용할 뿐)
JPA와 Hibernate는 마치 자바의 인터페이스와 해당 인터페이스를 구현한 class와 같은 관계
SpringDataJPA
: 스프링에서 제공하는 모듈 중 하나
JPA를 더 쉽고, 편하게 사용할 수 있도록 도와주는 역할을 수행
JPA를 한 단계 추상화시킨 Repository
라는 인터페이스를 제공함 (이는 SpringDataJPA의 핵심)
Repository 인터페이스에 정해진 규칙대로 메소드를 입력하면 스프링이 자동으로 해당 메소드 이름에 적합한 쿼리를 날리는 구현체를 만들어 빈으로 등록해준다.
"SpringDataJPA가 JPA를 추상화하다." = "SpringDataJPA의 Repository의 구현에서 JPA를 사용하고 있다"
: SQL, JPQL을 자바 코드로 작성할 수 있도록 도와주는 빌더 API.
JPA criteria에 비해 편리하고 실용적.
SQL, JPQL은 문자열인 반면 QueryDSL은 문자가 아닌 코드로 컴파일 시점에 문법 오류를 발견할 수 있다는 큰 장점이 있다.
참고로, 내가 듣는 강의 강사님 말씀으로 실무에서는
SpringBoot
+JPA
+QueryDSL
을 기본으로 사용한다고 한다. 🙃