Spring DB 접근 기술 - Spring Data JPA
- 개요 - JPA를 편하게 사용할 수 있도록 한번 더 감싼 기술
- JPA를 편리하게 사용하도록 도와주는 기술
- 인터페이스만으로 개발을 완료할 수 있다.
- 반복 개발해온 기본CRUD기능도 스프링 데이터JPA가 모두 제공
- JPA를 먼저 학습 후에 스프링 데이터 JPA를 보는 것이 더 좋다
- 개발자는 핵심 비즈니스 로직을 개발하는데 집중할 수 있다.
- 인터페이스의 생성
- 인터페이스가 인터페이스를 상속할 때는 extends 사용
- 스프링데이터 JPA가
- Repository 인터페이스에 대한 구현체를 스프링 데이터 JPA 내부적으로 만들어냄.
- 그리고 자동으로 스프링 빈에 등록시킴.
- 개발자가 등록할 필요가 없음.
- Code
package net.linkednest.test.repository;
import net.linkednest.test.domain.Member;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.Optional;
public interface SpringDataJpaMemberRepository extends JpaRepository<Member, Long>, MemberRepository {
@Override
Optional<Member> findByName(String name);
}
- 일반적인 기본 CRUD는 스프링데이터 JPA가 제공하지만 임의의 테이블의 특정 컬럼을 조건으로 조회를 하려고 하면 메서드를 추가를 해줘야 한다.
- 위 코드에서 findByName이 있고, 다른 메서드들이 override되지 않은 이유.
- 페이징 기능 자동 제공한다고.
- 실무에서는 JPA와 Spring Data JPA를 기본으로 사용하지만
- 복잡한 동적 쿼리는 queryDsl이라는 라이브러리를 사용해서 처리해야 할 수도.
- 쿼리도 Java Code로 안전하게 작성 가능
- 동적쿼리도 편리하게(?) 작성가능하다고.
- JPA/Spring Data JPA/queryDsl로 해결하기 어려운 쿼리는
- JPA가 제공하는 네이티브 쿼리를 사용하거나
- jdbcTemplate을 사용하면 된다고 한다.
- JPA와 마이바티스 혼용도 가능하다고 함!!!
- SpringBean - Code
package net.linkednest.test;
import net.linkednest.test.repository.*;
import net.linkednest.test.service.MemberService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class SpringConfig {
private final MemberRepository memberRepository;
public SpringConfig(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
/*private DataSource dataSource;
@Autowired
public SpringConfig(DataSource dataSource) {
this.dataSource = dataSource;
}*/
/*private EntityManager em;
@Autowired
public SpringConfig(EntityManager em) {
this.em = em;
}*/
@Bean
public MemberService memberService() {
// return new MemberService(memberRepository());
return new MemberService(memberRepository);
}
/* @Bean
public MemberRepository memberRepository() {
return new JpaMemberRepository(em);
// return new JdbcTemplateMemberRepository(dataSource);
// return new JdbcMemberRepository(dataSource);
// return new MemoryMemberRepository();
}*/
}