JpaMemberRepository.java
❔ Q. jpa를 사용하여 데이터를 가져올 때 findById와 다르게 Name을 가져올 때는 쿼리(JPQL)를 사용하는 이유가 잘 이해가 되지 않습니다.
❕ A. JPA에서 id는 필수값(PK)이며 영속성 컨텍스트에서도 식별을 위해 반드시 필요한값입니다. 그리하여 객체 조회 시 id로 조회가 가능하지만 name필드는 가능하지 않아 쿼리를 사용하여 확인하는 것 으로 이해하시면 될 것 같습니다.
📌 SpringCofig.java에서 db와 연결시켰던 dataSource관련 코드들은 주석 처리했고 EntityManger를 생성했다. 이 경우 스프링부트가 알아서 db와 연결을 해준다.
👨🏻🏫 스프링 부트와 JPA만 사용해도 개발 생산성이 정말 많이 증가하고, 개발해야할 코드도 확연히 줄어듭니다.
여기에 스프링 데이터 JPA를 사용하면, 기존의 한계를 넘어 마치 마법처럼, 리포지토리에 구현 클래스 없이 인터페이스 만으로 개발을 완료할 수 있습니다. 그리고 반복 개발해온 기본 CRUD 기능도 스프링 데이터JPA가 모두 제공합니다.
스프링 부트와 JPA라는 기반 위에, 스프링 데이터 JPA라는 환상적인 프레임워크를 더하면 개발이 정말 즐거워집니다. 지금까지 조금이라도 단순하고 반복이라 생각했던 개발 코드들이 확연하게 줄어듭니다.
따라서 개발자는 핵심 비즈니스 로직을 개발하는데, 집중할 수 있습니다.
실무에서 관계형 데이터베이스를 사용한다면 스프링 데이터 JPA는 이제 선택이 아니라 필수 입니다
스프링 데이터 JPA가 SpringDataJpaMemberRepository 를 스프링 빈으로 자동 등록해준다.
스프링 jpa가 인터페이스(SpringDataJpaMemberRepository)에 대한 구현체를 자동으로 만들어내서 스프링빈에 등록을 해둔다.
public interface SpringDataJpaMemberRepository extends JpaRepository<Member, Long>, MemberRepository {
@Override
Optional<Member> findByName(String name);
}
JpaRepository 인터페이스에 공통의 메소드들이 이미 다 구현돼있다.
그 외의 메소드는 findByName
처럼 규칙을 가진 이름으로 만들면 알아서 JPQL 쿼리로 만들어준다. 👉🏻 인터페이스 이름만으로 개발이 끝난다.
스프링 데이터 JPA 제공 기능
- 인터페이스를 통한 기본적인 CRUD
- findByName() , findByEmail() 처럼 메서드 이름 만으로 조회 기능 제공
- 페이징 기능 자동 제공
참고: 실무에서는 JPA와 스프링 데이터 JPA를 기본으로 사용하고, 복잡한 동적 쿼리는 Querydsl이라는
라이브러리를 사용하면 된다. Querydsl을 사용하면 쿼리도 자바 코드로 안전하게 작성할 수 있고, 동적
쿼리도 편리하게 작성할 수 있다. 이 조합으로 해결하기 어려운 쿼리는 JPA가 제공하는 네이티브 쿼리를
사용하거나, 앞서 학습한 스프링 JdbcTemplate를 사용하면 된다.
##AOP
AOP가 필요한 상황
문제
해결
프록시 = '가짜'
😎 스프링 입문 완강