스프링 데이터 JPA는 JPA를 편리하게 사용하도록 도와주는 기술.
// 인터페이스가 인터페이스 받을때는 extends
// 구현체 없어도 됨
// 인터페이스만 있음 -> 스프링 데이터 jpa가 JpaRepository 받고 있으면 구현체 자동으로 만들고
// 자동으로 스프링 빈에 등록.
// config에서 그냥 가져다 쓰면 됨.
public interface SpringDataJpaMemberRepository extends JpaRepository<Member, Long>, MemberRepository { // <T, id(식별자 pk)>, 다중 상속
Optional<Member> findByName(String name);
}
// 컴포넌트 스캔, 자동 의존관계 설정(어노테이션) 대신 직접 코드로 스프링 빈 등록
// 실무에서는 주로 정형화된 컨트롤러, 서비스, 리포지토리 같은 코드는 컴포넌트 스캔 사용.
// 정형화 되지 않거나 상황에 따라 구현 클래스 변경해야 한다면 설정 통해 스프링 빈 등록
@Configuration
public class SpringConfig {
// private DataSource dataSource;
//
// @Autowired
// public SpringConfig(DataSource dataSource) {
// this.dataSource = dataSource;
// }
// private EntityManager em;
//
// @Autowired
// public SpringConfig(EntityManager em) {
// this.em = em;
// }
private final MemberRepository memberRepository;
@Autowired // 스프링 컨테이너에서 MemberRepository 찾음. 자동 등록된 SpringDataJpaMemberRepository 구현체
public SpringConfig(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
@Bean // 내가 스프링 빈 등록할것이라는 뜻
public MemberService memberService() {
return new MemberService(memberRepository); // ctrl+p 무엇을 넣어야 할 지
}
// @Bean
// public MemberRepository memberRepository() {
// //return new MemoryMemberRepository(); // MemberRepository는 인터페이스. 인터페이스는 new가 안됨
// //return new JdbcMemberRepository(dataSource);
// //return new JdbcTemplateMemberRepository(dataSource);
// //return new JpaMemberRepository(em);
// }
}
스프링 데이터 JPA가 SpringDataJpaMemberRepository 를 스프링 빈으로 자동 등록해준다.
findByName -> findBy 뒤에 Name이 온다면 JPQL: select m from Member m where m.name = ? 만들어서 실행.
findByNameAndId 도 비슷한 식으로 다 규칙 존재.
인터페이스 이름만으로도 알아서.