스프링 DB 접근 기술- 스프링 데이터 JPA

2022. 8. 6. 09:582022/Spring

스프링 부트와 JPA 기반 위에 스프링 데이터 JPA 프레임 워크 : JPA를 편리하게 사용하도록 도와주는 기술

스프링 부트와 JPA만 사용해도 개발 생산성이 많이 증가되고, 개발해야하는 코드도 확연히 줄어들게 된다.

여기에 스프링 데이터 JPA를 사용하면, 기존의 한계를 넘어서 리포지토리 구현 클래스 없이 인터페이스 안으로 개발을 완료할 수 있게된다. 또한 반복 개발해왔던 CRUD 기능도 스프링 데이터 JPA가 모두 제공한다.

* 실무에서 ERD를 사용한다면, 스프링 데이터 JPA는 필수이다.

CRUD 까지 공통화 할 수 있는 부분은 모두 공통화 해놓음

  • 인터페이스를 통한 기본적인 CRUD 기능 제공
  • findByName(), findByEmail() 처럼 메서드 이름만으로 조회 기능 제공
  • 페이징 기능 자동 제공

 

SpringDataJpaMemberRepository.java : interface
public interface SpringDataJpaMemberRepository extends JpaRepository<Member, Long>, MemberRepository{
    Optional<Member> findByName(String name);
}

JpaResitory가 있으면 스프링 데이터 JPA가 SpringDataJpaMemberRepository를 스프링 빈으로 등록한다.

 

* 메서드 이름만으로 조회 기능 제공 : 각 비즈니스마다 사용하는 객체가 모두 다르기 때문에 그런것까지 공통화 할 수는 없다.

그러나  findByName 이라고 메서드 네임을 정하면 JPQL (select m from Member m where m.name = ?) 쿼리로 짜줘서 실행된다.

 

SpringConfig.java : 스프링 설정
@Configuration
public class SpringConfig {

    private final MemberRepository memberRepository;
    
    @Autowired
    public SpringConfig(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }

    //Configuration을 읽고 스프링 Bean으로 등록하도록 인식
    @Bean
    public MemberService memberService(){
        return new MemberService(memberRepository);
    }
}

스프링 컨테이너에서 MemberRepository를 찾지만 만들어놓은게 없다. 하지만 스프링 빈에 등록된 SpringDataMemberRepository라는 JpaRepository 인터페이스가 존재하기 때문에 이를 찾아서 실행

 

그러나 공통 인터페이스(JpaRepository)는 자동으로 생성하지 못한다!! 

 

실무에서는 JPA와 스프링 데이터 JPA를 기본으로 사용하고, 복잡한 동적 쿼리는 Querydsl 이라는 라이브러리를 사용한다.

Querydsl을 사용하면 쿼리도 자바 코드로 안전하게 작성할 수 있고, 동적 쿼리도 편리하게 작성할 수 있다.

이 조합으로도 해결하기 어려운 쿼리는 JPA가 제공하는 네이티브 쿼리를 사용하거나, 스프링 Jdbc Template를 사용한다.