24강(스프링 데이터 JPA)
스프링 부트와 JPA만 사용해도 개발 생산성이 정말 많이 증가한다. 개발해야 할 코드도 확 줄어든다. 그런데 여기에 스프링 데이터 JPA를 사용하면 '이것까진 안 되겠지' 라는 한계를 넘어서 마법처럼 인터페이스만으로 개발을 완료할 수 있게 된다. 반복적으로 개발해온 CRUD 기능도 스프링 데이터 JPA가 제공을 해준다. 스프링부트와 JPA라는 기반 위에 스프링 데이터 JPA라는 환상적인 프레임워크가 더하면 개발이 정말 즐거워진다(?). 지금까지 조금이라도 단순하고 반복이라고 생각했던 코드들이 확 줄어든다. 따라서 개발자는 핵심 비즈니스 로직을 개발하는데 집중 할 수 있다.
실무에서 관계형 데이터베이스를 사용한다면 스프링 데이터 JPA는 선택이 아니라 필수다.
주의할 사항: 스프링 데이터 JPA는 JPA를 편리하게 사용하도록 도와주는 기술이다. 따라서 JPA를 먼저 학습한 후에 스프링 데이터 JPA를 학습해야함.
리포지토리에 SpringDataJpaMemberRepository 인터페이스를 만들어준다.
인터페이스는 인터페이스를 받을 때 extends. T는 Member, 두 번째 id는 엔티티에서 식별자 PK 지금은 Type이고 Long으로 되어 있으니 Long. 그리고 인터페이스는 다중상속이 가능하니 MemberRepository도 상속. 그리고 저 findByName만 넣어주면 끝이다.
??????
스프링 데이터 JPA가 JpaRepository를 받고 있으면 구현체를 자동으로 만들어준다. 스프링 빈에 자동으로 등록. 내가 직접 만드는게 아니라 스프링 데이터 JPA가 보고 어 이게 있네 하고 자동으로 만들어줌. 그리고 그걸 가져가 쓰면 되는데 위 사진과 같이 쓴다. 저렇게 하면 스프링 데이터 JPA가 구현체로 만들어 놓은게 등록이 된다. 그리고 memberService에 의존관계 세팅 해주기.
요런 경우에는 스프링 컨테이너에서 멤버리포지토리를 찾는다. 근데 등록한게 없네? 가 아니라 하나가 있다. 인터페이스로 만든 SpringDataJpaMemberRepsitory!
인터페이스를 만들어 놓고 JpaRepository를 상속시켜 놓으면 스프링 데이터 JPA가 인터페이스에 대한 구현체를 스스로 어떤 기술을 가지고 만들어낸다. 그러고 스프링 빈에 등록을 함. 기술력 쩐다. 그래서 우리는 위 사진처럼 인잭션만 받으면 된다.
JpaRepository를 까보면 이전에 만들었던 기본 메소드들이 다 들어있다. save, findById 뭐 이런 것들이 다 있다.
그런데 불가능한거 한 개가 있다. 그게 findByName이다. 이름은 인터페이스로 공통화가 불가능하다.
그래서 findByName을 넣어주면 규칙에 따라 저 JPQL 쿼리문이 등록되게 된다.
이렇게 하면 저렇게 인터페이스 하나 만으로 여태 만들었던 것들이 압축이 된다.. 와..