태초에 다른 회사에서 만든 EJB가 있었는데~~~ 너무 싫어서 스프링 만들었는데~~~...
오픈소스로써 직접 만든 하이버네이트가 공식이 되어 오픈소스 출신이라 현업에 아주 잘 맞는다는 특징. JPA가 공식으로 인수해감.
고전적인 데이터베이스와 신흥 데이터베이스들이 나왔지만 결국엔 어딘가에 데이터를 저장하고 가져오는게 전부다. 그럼 하나의 거대한 인터페이스로 추상화할 수 있지 않을까? 해서 나온게 Spring Data고 그걸 다루는게 Spring Data JPA(아마 맞을듯).
그럼 Spring Data만 알면 모든 DB 다 다룰수 있네? 몰라도 되겠네?? 가 아니다. 편리하게 해주는 도구일 뿐이지 내부가 어떻게 돌아가는지 모르는건 자바를 모르는 채로 스프링을 쓰는 거임.
작은데든 큰데는 왠만하면 다 이렇게 씀
도메인만 보게되서 핵심에 더 집중하기 쉬워진다.
모르고 쓰는 사람은 다시는 ORM 안쓴다!! mybatis로 돌아갈래~~ 하지만 깊이없이 이해가 부족한것이다.
가장 중요한 것은 JPA 자체를 이해하는 것
스프링 데이터는 DB하고만 소통하는 진짜 기능들, 뭐 find, select, save, update같은거.. 들을 모든 DB를 통트는 하나의 기초 같은거고 거기에 함수 기능들을 확장시키고 확장시키고.. 해서 정말 함수 이름만으로도 할 수 있을 만큼 매우 확장한 스프링 데이터 JPA라는게 있는거다.
인터페이스만 만들면 스프링에서 실제 인스턴스용 프록시 클래스를 사용해서 사용할 수 있다.
Spring Data JPA - Reference Documentation
Spring Data JPA - Reference Documentation
진짜 함수 이름만으로도 사용가능한데, 이름만으로는 안되는 더 복잡한 쿼리나 함수 이름이 너무 길어서 걍 직접 치는것들은 @Query로 감싸서 할 수 있고, 후에 나올 Querydsl을 사용해도 된다.
정의하는 방법은 extends로 인터페이스 확장에 객체, 그 객체 pk의 타입을 적어주면 된다. 이름만으로도 함수를 정의해서 사용할 수 있다. 규칙은 있지만 IDE에서 어느정도 자동완성 해준다. 다만 쿼리까지 지원해주지만 조인도 안되서 실무에서 이것만 사용하기엔 단순하기 때문에 querydsl을 사용한다. findAll같은 어디에나 당연히 있을법한 함수들은 직접 정의하지 않아도 JpaRepository로 이미 있다.
인터페이스로만 해도 바로 된다고 하지만 예외처리 때문에 서비스에 DB용 예외 처리를 넣으면 순수성이 사라지니 레퍼지토리용 클래스를 따로 만들거다.
@Repository
@Transactional
@RequiredArgsConstructor
public class JpaItemRepositoryV2 implements ItemRepository {
private final SpringDataJpaItemRepository repository;
@Override
public Item save(Item item) {
return repository.save(item);
}
@Override
public void update(Long itemId, ItemUpdateDto updateParam) {
Item findItem = repository.findById(itemId).orElseThrow();
findItem.setItemName(updateParam.getItemName());
findItem.setPrice(updateParam.getPrice());
findItem.setQuantity(updateParam.getQuantity());
}
@Override
public Optional<Item> findById(Long id) {
return repository.findById(id);
}
@Override
public List<Item> findAll(ItemSearchCond cond) {
String itemName = cond.getItemName();
Integer maxPrice = cond.getMaxPrice();
if (StringUtils.hasText(itemName) && maxPrice != null) {
return repository.findItems("%" + itemName + "%", maxPrice);
} else if (StringUtils.hasText(itemName)) {
return repository.findByItemNameLike("%" + itemName+ "%");
} else if (maxPrice != null) {
return repository.findByPriceLessThanEqual(maxPrice);
} else {
return repository.findAll();
}
}
}
그래서 구조는 이렇게 됨
이제 config만들고 main에서 이 설정을 쓴다고 하면 된다.
라이브러리 버전때문에 버그 뜨는건 gradle.build에서 버전도 맞출 수 있음. 저렇게 하고 새로고침만 하면 버전 설정 가능하다.
스프링 데이터 JPA는 페이지같은것 까지 실무에서 당연히 쓰일만한 것들까지 그냥 지원한다.
'CS > 김영한 스프링 강의' 카테고리의 다른 글
스프링 DB 2편 - 데이터 접근 핵심 원리 - 섹션8. 데이터 접근 기술 - 활용 방안 (0) | 2023.08.28 |
---|---|
스프링 DB 2편 - 데이터 접근 핵심 원리 - 섹션7. 데이터 접근 기술 - Querydsl (0) | 2023.08.25 |
스프링 DB 2편 - 데이터 접근 핵심 원리 - 섹션5. 데이터 접근 기술 - JPA (0) | 2023.08.22 |
스프링 DB 2편 - 데이터 접근 핵심 원리 - 섹션4. 데이터 접근 기술 - MyBatis (0) | 2023.08.20 |
스프링 DB 2편 - 데이터 접근 핵심 원리 - 섹션3. 데이터 접근 기술 - 테스트 (0) | 2023.08.20 |