(인프런) 김영한님의 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술을 공부하고 리뷰한 글입니다.
스프링 DB 접근 기술 4가지 방식대로 차례로 진행할 예정이다.
4. 스프링 데이터 JPA
1. 스프링 데이터 JPA를 이용한 코드 작성
스프링 부트와 JPA만 사용해도 개발 생산성이 정말 많이 증가하고 개발해야할 코드도 확연히 줄어든다.
여기에 스프링 데이터 JPA를 사용하면 기존의 한계를 넘어 리포지토리에 구현 클래스 없이 인터페이스 만으로 개발을 완료할 수 있다. 그리고 반복 개발해온 기본 CRUD 기능도 스프링 데이터 JPA가 모두 제공한다. 스프링 부트와 JPA라는 기반 위에, 스프링 데이터 JPA라는 환상적인 프레임워크를 더하면 개발이 정말 즐거워진다. 지금까지 조금이라도 단순하고 반복이라 생각했던 개발 코드들이 확연하게 줄어든다. 따라서 개발자는 핵심 비즈니스 로직을 개발하는데, 집중할 수 있다. 실무에서 관계형 데이터베이스를 사용한다면 스프링 데이터 JPA는 이제 선택이 아니라 필수!
주의!) 스프링 데이터 JPA는 JPA를 편리하게 사용하도록 도와주는 기술이다. 따라서 JPA를 먼저 학습한 후에 스프링 데이터 JPA를 학습해야 한다.
1. JPA 설정
앞의 JPA 설정을 그대로 사용한다. 궁금하다면 상단의 3. JPA 글의 2-1,2 방법을 참고한다.
2. 스프링 데이터 JPA 회원 리포지토리
package hello.hellospring.repository;
import hello.hellospring.domain.Member;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.Optional;
// 1. JpaRepository를 extends 하는 인터페이스를 만들어 놓으면
// 2. 스프링 데이터 JPA가 인터페이스 구현체를 자동 생성하고 스프링 빈에 자동 등록함
public interface SpringDataJpaMemberRepository extends JpaRepository<Member, Long>, MemberRepository {
Optional<Member> findByName(String name);
}
Q. 해당 인터페이스에서 findByName()만 만들어 놓은 이유는?
기존 MemberRepository 인터페이스에서는 다음과 같이 save(), findById(), findByName(), findAll() 4가지를 구현체에서 구현하도록 강제하고 있다.
public interface MemberRepository {
Member save(Member member); // 회원 객체(id, name) 저장
Optional<Member> findById(Long id); // 회원 id 조회
Optional<Member> findByName(String name); // 회원 이름 조회
List<Member> findAll(); // 저장된 모든 회원 리스트 조회
}
다만 우리가 JPARepository를 extends 하여 만든 인터페이스(SpringDataJpaMemberRepository)에서는 JPARepository가 save(), findById(), findAll()에 대해서는 제공을 하고 있다. 그러므로 JPA가 제공하지 않는 findByName()에 대해서만 만들어 주면된다.
아래에서 JPARepository의 제공 기능에 대해서 확인할 수 있다.
3. 스프링 데이터 JPA 회원 리포지토리를 사용하도록 스프링 설정 변경
스프링 데이터 JPA가 SpringDataJpaMemberRepository를 스프링 빈으로 자동 등록해준다.
package hello.hellospring;
import hello.hellospring.repository.*;
import hello.hellospring.service.MemberService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class SpringConfig {
private final MemberRepository memberRepository;
// 스프링 데이터 JPA가 만든 인터페이스 구현체(memberRepository) 자동 주입
@Autowired
public SpringConfig(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
// memberService 스프링 빈 등록
@Bean
public MemberService memberService() {
return new MemberService(memberRepository); // memberService가 memberRepository 의존
}
}
2. 스프링 데이터 JPA
1. 스프링 데이터 JPA 제공 클래스
2. 스프링 데이터 JPA 제공 기능
1) 인터페이스를 통한 기본적인 CRUD
2) findByName(), findByEmail() 처럼 메서드 이름 만으로 조회 기능 제공
3) 페이징 기능 자동 제공
(참고) 실무에서는 JPA와 스프링 데이터 JPA를 기본으로 사용하고 복잡한 동적 쿼리는 Querydsl이라는 라이브러리를 사용하면 된다. Querydsl을 사용하면 쿼리도 자바 코드로 안전하게 작성할 수 있고 동적 쿼리도 편리하게 작성할 수 있다. 이 조합으로 해결하기 어려운 쿼리는 JPA가 제공하는 네이티브 쿼리를 사용하거나, 앞서 학습한 스프링 JdbcTemplate를 사용하면 된다.
'Spring > 스프링 입문' 카테고리의 다른 글
[스프링 입문] 07. AOP - AOP 적용 (0) | 2022.05.02 |
---|---|
[스프링 입문] 07. AOP - AOP가 필요한 상황 (0) | 2022.05.02 |
[스프링 입문] 06. 스프링 DB 접근 기술 - JPA (0) | 2022.04.29 |
[스프링 입문] 06. 스프링 DB 접근 기술 - 스프링 JdbcTemplate (0) | 2022.04.29 |
[스프링 입문] 06. 스프링 DB 접근 기술 - 스프링 통합 테스트 (0) | 2022.04.29 |