221228 Spring JPA
스프링 데이터 JPA
옛날 옛적.. ejb 쉽다고 함…
ejb가 너무 어렵고 코드가 더러워져서 POJO(원래의 자바 plain old java object)…라는 용어도 생김
jpa가 널리 사용되는 이유는 오픈소스 기반으로 표준이 나와 잘 다듬어진 느낌 실용적
———————————— Spring Data
rdb, mongodb, redis 등등… 수 많은 데이터베이스들 하지만 사실 CRUD는 비슷하다. 추상화가 가능할 것.. Spring Data JPA,Mongo,Redis 등등 통합하는 기술
통합 그 이상 기능들
- CRUD + 쿼리
- 동일한 인터페이스
- 페이징 처리
- 메서드 이름으로 쿼리 생성
- 스프링 MVC에서 id 값만 넘겨도 도메인 클래스로 바인딩
 인터패이스만 만들면 됨,
메서드 이름으로 쿼리 생성 기능 
@Query사용 시 인터페이스에 쿼리 작성 가능..

JPA 장점 : 코딩량 감소 도메인 클래스를 중요하게 다룸 비즈니스 로직 이해 쉬움 더 많은 테스트 케이스 작성 가능 너무 복잡할 땐 SQL 사용
Spring Data JPA 주의 !! : JPA(하이버네이트) 이해 필요 본인 먼저 JPA 이해 데이터베이스 설계 이해 Spring Data JPA는 단지 거들 뿐.. 대부분의 문제는 JPA를 모르고 사용해서 발생..
가장 중요한 것은 JPA 자체를 이해하는 것!!
—————————————— 스프링 데이터 JPA 주요 기능
 스프링 데이터 : save, findById(ID), exists(ID), count, delete(T) findAll(Sort), findAll(Pageable)
 스프링 데이터 JPA : findAll(), saveAndFlush(T), flush(), deleteInBatch(),getOne().. 등등
많이 있다.. 인터페이스를 통해서 기본적인 CRUD 기능 제공한다. 공통화 가능한 거의 모두 포함되어 있다. crudRepository에서 fineOne >> findById로 변경됨
 JpaRepository 인터페이스를 상속 받고, 제네릭에 관리할 <엔티티, 엔티티id>를 주면 됨
 인터페이스만 만드면 기본 CRUD기능을 사용할 수 있다….
- 쿼리 메서드 기능 스프링 데이터 JPA는 인터페이스에 메서드만 적어두면, 메서드 이름을 분석해서 쿼리를 자동으로 만들고 실행해주는 기능 제공  적절한 규칙을 지켜서 만들면 자동으로 쿼리를 만들어주고 실행한다… 스프링 데이터 JPA는 메서드 이름을 분석해서 필요한 JPQL을 만들고 실행

@Query를 사용해서 직접 JPQL를 작성하고 실행할수도 있다! 참고로 JPQL뿐만 아니라 SQL을 직접 작성할 수도 있다.
———————————— 적용
 interface에 extends로 상속 JpaRepository를 <엔티티, 엔티티 ID(PK)>
@Query 문에서 인자값 받을 때 @Param을 불러올 떄 springframework.repository.query로 해야함.(Mybatis에도 있음 )  이렇게 이름으로 검색하거나 가격으로 ㄱ머색하는 기능은 공통제공이 아님 따라서 아래와 같이 쿼리를 직접 실행할수도 있음 이 문제는 이후에 동적 쿼리는 Querydsl로 깔끔하게 해결할 수 있다!
 이런식으로 Repository를 꾸며줌
 ItemService는 ItemRepository에 의존하기 때문에 ItemService에서 SpringDataJpaItemRepository를 그대로 사용할 수 없다. 그러면 소스 코드를 전부 다 바꿔야함;; 물론 사용하도록 고치면 되지만.. 코드 변경없이 의존을 유지하면서 DI를 통해 구현기술을 변경하는 것이 핵심

https://bkjeon1614.tistory.com/197 바인딩 에러… @Query를 사용할 떄는 띄어쓰기에 주의하자..
 다운그레이드함 하이버네이트..
스프링 데이터 JPA도 스프링 예외 추상화를 지원해서 @Repository와 상관 없이 예외가 변환된다.
페이징 기능도 기본으로 제공하기 때문에 매우 좋다..