SpringDataJpaMemberRepository 인터페이스
package hello.hellospring.repository;
import hello.hellospring.domain.Member;
import java.util.Optional;
import org.springframework.data.jpa.repository.JpaRepository;
public interface SpringDataJpaMemberRepository extends JpaRepository<Member,Long>, MemberRepository {
//interface의 상속은 extends로 한다. 인터페이스는 다중 상속이 가능하다.
// jpaRepository를 상속받아야한다. (멤버와, 식별자PK의 타입을 받는다) ,
// jpaRepository를 상속받고있으면 Spring Data Jpa가 구현체를 자동으로 만들어 등록해준다. 그걸 가져다 쓰기만하면된다.
//그럼 SpringDataJpaMemberRepository라는 구현체가 생성되고 그 구현체는 MemberRepository를 상속하니까 MemberRepository의 구현체도 된다.
@Override
Optional<Member> findByName(String name);
}
interface를 생성할때
jpa에서 제공하는 JpaRepository<Member,Long>를 상속하면 알아서 구현체를 만들고 스프링빈에 등록해준다.
구현체를 따로 만들필요없이 그걸 사용해주기만 하면된다.
수정된 SpringConfig.java
@Configuration
public class SpringConfig {
// private final 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; //Spring Data Jpa가 구현체를 만들고 빈으로 등록해놓은것을
@Autowired
public SpringConfig(MemberRepository memberRepository) { // 주입해서 사용하면 된다.
this.memberRepository = memberRepository;
}
//그리고 인젝션받은것을 memberSerivce를 생성할때 넣어주면된다.
@Bean //@Bean 어노테이션 -> 스프링빈을 등록할거다 라는 의미
public MemberService memberService() {
return new MemberService(memberRepository);
}
// @Bean
// public MemberRepository memberRepository() {
// return new MemoryMemberRepository();
// return new JdbcTemplateMemberRepository(dataSource);
// return new jpaMemberRepository(em);
//
// }
}
메모리 리포지토리를 사용할때는 구현체로 만들어 사용하고
jdbcTemplate를 사용할때는 구현체도 만들고 datasource 주입받아 가져와 리포지토리를 만들어 주고
jpa를 사용할때도 구현체도 만들고 EntityManger도 주입받아가져와 리포지토리를 만들어 줬는데
Spring Data jpa를 사용하면
인터페이스만 작성해도 구현체가 생성되고 스프링빈에 등록되기때문에
SpringConfig에서
@Bean
public MemberRepository memberRepository() ~~
처럼 리포지토리를 등록시켜줄 필요가 없다. 그래서 주석처리했고
이미 등록된 리포지토리를 주입받아 필요한곳(멤버서비스를 생성할때)에 사용해주기만 하면된다.
TEST
테스트 결과는 jpa를 사용했을때와 같다.
jpa기반에다가 Spring Data Jpa라는 프레임워크를 추가했을뿐이므로
스프링 데이터 JPA 제공 클래스
인터페이스만 만들었더니 구현체를 만들어줬다.
이전시간까지 리포지토리 구현체를 만들때 save,find,findbyid 등등 구현해줬는데 어떻게 된것일까
public interface SpringDataJpaMemberRepository extends JpaRepository<Member,Long>, MemberRepository {
구현할때 이런식으로 상속을 했다.
그 중
JpaRepository<Member,Long>
내부를 확인해보자.
기본적인 메소드들이 있고
또 JpaRepository가 상속하는 PagingAndSortingRepository를 보면 메소드들이 더있고
PagingAndSortingRepository가 상속하는 CrudRepository를 보면 save,findbyid~~ 등등의 메소드들이 있다.
이런 수많은 기본적인 메소드들이 스프링 데이터 jpa가 구현해서 구현체를 만들어준다.
기본적인 메소드들은 있지만 (pk값으로 찾는건 존재)
멤버를 이름으로 찾는다던지, 이메일로 찾는다던지와 같이 필요한 메소드들이 더 있을것이다.
그래서
public interface SpringDataJpaMemberRepository extends JpaRepository<Member,Long>, MemberRepository {
@Override
Optional<Member> findByName(String name);
}
아까 이렇게 findByName을 적어둔것
적기만해도 스프링 데이터 JPA가
//JPQL select m from Member m where m.name = ?
@Override
Optional<Member> findByName(String name);
위의 JPQL문이 동작하는 방식대로 만들어준다.
'인프런 > 스프링 입문' 카테고리의 다른 글
끝) AOP (0) | 2022.11.30 |
---|---|
11) JPA (0) | 2022.11.28 |
10) 스프링 JdbcTemplate,RowMapper,lambda (0) | 2022.11.28 |
9)순수 JDBC, DI(dependency injection)과 다형성의 장점 , 스프링통합테스트 (0) | 2022.11.27 |
8)스프링 DB 접근기술(H2 데이터베이스 설치), 테이블생성,데이터생성,DDL SQL 관리 (0) | 2022.11.27 |
댓글