프레임 워크를 통해서 DB에 쉽게 접근할 수 있는 통로 ( 인터페이스 )
기존의 마이바티스와 같은 ORM이랑 근본적인 차이는 한번 데이터가 바인딩된 이후 추가적인 쿼리 부분이 없더라도 테이블 데이터에 접근이 가능하다는 점이다.
JPA는 성능 이슈 때문에 필요한 데이터를 효과적으로 가져오는 것이 필요하다.
ㅇ JPA의 구현체 Hibernate
장점
단점
ㅇ JPA의 구현체 OpenJPA
장점
단점
ㅇ JPA 인터페이스의 계층 구조

ㅇ findAll() : 해당 엔티티 테이블에 있는 모든 데이터를 조회
ㅇ save() : 대상 엔티티를 DB에 저장
ㅇ saveAll() : Iterable 가능한 객체를 저장
ㅇ delete() : 데이터베이스에서 대상 엔티티 삭제
JPA Repository는 위와 같은 다양한 기능이 정의된 인터페이스를 상속 받게 된다. 이 인터페이스를 통해 우리는 단순 CRUD 외에 다양한 기능을 수행할 수 있으며 Paging 이나 Sorting 같은 역할도 수행할 수 있다.
ㅇ JPA 관련 어노테이션
1, @Modifying
벌크연산이란?
단건 Update, Delete 연산을 제외한 다건의 Update, Delete 연산을 하나의 쿼리로 하는 것을 의미
2, @Query
3, @Repository
4, @Enumerated
5, @Builder
6, @Data
7, @Entity
8, @Transactional
9, @EnableJpaRepositories
10, @Configuration
11, @PersistenceContext
Hibernate는 JPA 구현체이며 Spring Data JPA는 사용하기 편리하게 한 모듈이라고 생각하면 편하다.
ㅇ Spring Data JPA의 쿼리 메서드
public interface ReviewJPARepository extends JpaRepository<Review, String>{
List<Review> findByTitle(String title);
}
위의 findByTitle은 sql "select u from Review u where u.title =?" 와 같은 문법이라고 보면 된다.
이렇게 JPA 쿼리 메서드는 규칙이 존재하는데 이 규직은 공식문서 또는 검색을 하면 쉽게 찾아볼 수 있다.

ㅇ JPQL
String jpql = "select c from review c";
List<Review> result = em.cretaeQuery(jpql, Review.class).getResultList();
c)은 필수이다. 즉 review와 Review는 다른 것으로 판단한다. select, from 같은 예약어는 구별하지 않는다.ㅇ TypedQuery
public static void typedQuery(EntityManager em) {
String jpql = "SELECT b FROM Book b ";
TypedQuery<Book> query = em.createQuery(jpql, Book.class);
List<Book> bookList = query.getResultList();
for( Book book : bookList) {
System.out.println(book.getTitle());
}
}
모든 책 리스트를 조회하는 쿼리이다. EntityManager 객체에서 createQuery() 메서드를 호출하면 쿼리가 생성된다.
ㅇ QueryDsl
기존에 쿼리들은 문자열이기 때문에 문법 오류를 발견하기가 쉽지 않다는 단점이 있었다. 하지만 Query DSL은 컴파일 시점에서 문법 오류가 발견이 가능하며 코드는 JPQL과 많이 유사하다, 또한 동적 쿼리를 작성 가능하다.
implementation "com.querydsl:querydsl-jpa:${queryDslVersion}"
annotationProcessor "com.querydsl:querydsl-apt:${queryDslVersion}"
JPAFactoryQuery query = new JPAQueryFactory(em);
QReview m - QReview.review;
List<Review> list = query.selectFrom(m)
.where(m.cnt.gt(10))
.orderBy(m.cnt.desc())
.fetch()l
위의 Query DSL 쿼리는 select m from Review m where cnt > 10 이랑 동일한 코드이다.
ㅇ JPA 쿼리에 대한 성능 최적화에 대해서
1, 느린 쿼리 개선
ㅇ API
프로토콜 집합을 사용하여 두 소프트웨어 구성 요소가 서로 통신할 수 있게 하는 메커니즘
ㅇ API 문서를 만드는 이유?
ㅇ Spring REST Docs
장점
ㅇ Swagger
ㅇ OpenAPI Spec