#1. Spring Data JPA
Java 애플리케이션에서 관계형 데이터베이스 (RDBMS)를 관리하는데 사용되고
Spring Framework 모듈은 JPA라는 ORM 표준 위에 추상화 계층을 제공한다.
Spring Data JPA는 특정 인터페이스를 확장하여 Repository 인터페이스를 생성한다.
Runtime 시 Spring Data JPA는 이러한 인터페이스의 구현을 자동으로 생성한다.
장점
네이밍 컨벤션에 맞춰서 메서드 이름만 작성하면 내부적으로 자동으로 SQL을 구성해준다.
이는 코드 생산성, 코드의 간결함, 가독성을 높일 수 있다.
< 네이밍 컨벤션 >
A. 메서드명을 find, get, count, delete 로 시작
B. By(검색 조건을 지정하며, 주로 And 또는 Or로 결합된다.)
C. OrderBy (정렬을 추가하며, And와 결합된다.)
D. 엔티티의 속성 이름. = 카멜 케이스 형식.
<Ex>
대상 엔티티에서 아래와 같이 필드를 가지고 있다면
@ManyToOne
@JoinColumn(name = "memberId")
private Member member;
@ManyToOne
@JoinColumn(name = "libraryId")
private Library library;
Spring Data JPA의 자동 메서드는 아래와 같이 구성되어야 한다.
List<LibraryMember> findByLibrary_IdAndMember_Id (Long libraryId, Long memberId);
하지만 대상 엔티티에서 아래와 같이 Id를 필드로 가지고 있다면,
private Long memberId;
private Long libraryId;
Spring Data JPA의 자동 메서드는 아래와 같이 구성되어야 한다.
List<LibraryMember> findByLibraryIdAndMemberId (Long libraryId, Long memberId);
단점
데이터 호출의 요구사항이 복잡해지면 메서드 이름이 너무 길어진다.
public book findBooksByTitleAndAuthorAndGenreAndPublicationYear (String bookTitle, String author,
String genre, String publicationYear);
#2. JPA - JPQL
JPA는 다양한 쿼리 방법을 지원한다.
- JPQL
- JPA Criteria
- QueryDSL
- 네이티브 SQL
- JDBC API 직접 사용, MyBatis, SpringJDBC Template
JPQL은 Java 애플리케이션에서 보다 복잡한 관계형 데이터베이스(RDBMS) 작업을 관리하기 위해 사용됨.
JPA 사양의 일부이며 DB 테이블 및 Column 대신 Java 클래스 및 속성을 사용해 SQL과 유사한 쿼리를 작성
장점
1. Spring Data JPA의 메서드 명명 규칙으로 쉽게 표현할 수 있는 것보다 복잡한 쿼리를 허용한다.
2. JPQL을 사용함으로써 SQL을 이해하고 관계형 DB에서 데이터를 어떻게 다루는지 경험할 수 있다.
3. JPQL을 사용하면 쿼리 논리가 더 명확해진다.
코드의 가독성이 좋아지고 요구 사항이 변경될 때 더 쉽게 유지 관리하고 수정할 수 있다.
<사용>
@Query 애너테이션을 사용하여 Spring Data JPA Repository 인터페이스에서 작성
public interface BookRepository extends JpaRepository<Book, Long> {
@Query("SELECT b FROM Book b WHERE b.title = :title AND b.author = :author")
List<Book> findBooks(@Param("title") String title, @Param("author") String author);
}
단점
1. 복잡성 증가
단순한 메서드 이름 쿼리보다 작성하고 이해하기가 복잡하다.
2. 자동화가 아니다.
JPQL은 Spring Data JPA의 처럼 자동 메서드 이름 쿼리가 아니라 개발자가 직접 작성해야한다.
3. JPQL 문법이 String 으로 작성되므로 컴파일 단계에서 문법 오류를 확인할 수 없다.
#3. QueryDsl
실제 서비스에서 데이터 호출할 떄 필요한 요구사항들이 고정되어 있지않고 가변적인 경우가 많다.
이런 가변적인 조건들을 대처하기 위해 사용될 수 있는 프레임 워크.
장점
1. JPQL처럼 String 이 아닌 코드로 쿼리를 작성하므로, 컴파일 단계에서 문법 오류 확인 가능.
2. 코드 작성이므로 IDE의 자동 완성 기능을 활용할 수 있다.
3. 복잡한 쿼리나 동적 쿼리 작성이 편리하다.
4. JPQL 문법과 유사한 형태로 작성하므로 난이도가 낮다.
단점
1. 복잡한 쿼리를 작성할 때 QueryDsl 고유한 문법을 숙지하고 있어야 한다.
2. JPQL 방식과 비교해보면 가독성이 떨어진다.
[정리]
#1. Spring Data JPA
[장점]
네이밍 컨벤션에 맞춰서 메서드 이름만 작성하면 내부적으로 자동으로 SQL을 구성해준다.
[단점]
데이터 호출 조건이 다양해지면 메서드의 이름이 너무 길어진다.
#2. JPA - JPQL
[장점]
1. Spring Data JPA의 메서드 명명 규칙으로 쉽게 표현할 수 있는 것보다 복잡한 쿼리를 허용한다.
2. JPQL을 사용함으로써 SQL을 이해하고 관계형 DB에서 데이터를 어떻게 다루는지 경험할 수 있다.
3. JPQL을 사용하면 코드의 가독성이 좋아지고 요구 사항이 변경될 때 더 쉽게 유지 관리하고 수정 가능.
[단점]
1. 복잡성 증가 - 단순한 메서드 이름 쿼리보다 작성하고 이해하기가 복잡하다.
2. 자동화가 아님 - JPQL은 개발자가 모든 요구 사항을 직접 작성해야한다.
3. JPQL 문법이 String 으로 작성되므로 컴파일 단계에서 문법 오류를 확인할 수 없다.
#3. QueryDsl
[장점]
1. 코드로 쿼리를 작성하므로, 컴파일 단계에서 문법 오류 확인 가능.
2. 코드 작성이므로 IDE의 자동 완성 기능을 활용할 수 있다.
3. 복잡한 쿼리나 동적 쿼리 작성이 편리하다.
4. JPQL 문법과 유사한 형태로 작성하므로 난이도가 낮다.
[단점]
1. 복잡한 쿼리를 작성할 때 QueryDsl 고유한 문법을 숙지하고 있어야 한다.
2. JPQL 방식과 비교해보면 가독성이 떨어진다.
[결론]
Spring Data JPA, JPA - JPQL, QueryDsl 은 모두
Java 애플리케이션에서 RDBMS를 관리하는데 유용한 도구이다.
각 스택들의 장, 단점을 이해하고, 상황에 맞추어 적절히 사용하는 것이 중요하다.
'Tips' 카테고리의 다른 글
QueryDsl 메서드 모음 (0) | 2023.05.23 |
---|---|
JUnit Test 코드 TIP (0) | 2023.05.16 |
Mapstruct @Mapping(target = , source = ) (0) | 2023.05.13 |
Spring Data JPA - 자동 완성 메서드 규칙 (0) | 2023.05.12 |
JPQL 예시 (0) | 2023.05.12 |