[Spring] 입문 6-6. 스프링 데이터 JPA

강우엉·2023년 7월 10일

Spring

목록 보기
20/359

스프링 부트와 JPA만 사용해도 개발 생선성이 증가하고, 코드가 간결해진다. 여기에 스프링 데이터 JPA를 사용하면, 더욱더 큰 효과를 낼 수 있다. 리포지토리에 구현 클래스 없이 인터페이스만으로 개발을 할 수 있고, 반복 개발해온 CRUD 기능도 스프링 데이터 JPA가 모두 제공한다.

스프링 부트와 JPA라는 기반 위에, 스프링 데이터 JPA라는 프레임워크를 더하면 개발이 훨씬 편하고 즐거워진다. 따라서 개발자들은 핵심 비즈니스 로직을 개발하는데 집중할 수 있다. 실무에서도 관계형 데이터베이스를 사용한다면 스프링 데이터 JPA는 필수이다!!

하지만 스프링 데이터 JPA는 JPA를 편리하게 사용하도록 도와주는 기술이기 때문에 꼭 JPA를 먼저 학습해야한다.

이제 본격적으로 스프링 데이터 JPA를 사용해보자!

설정은 앞에서 설정했던 JPA설정을 그대로 사용하면 된다.

아래와 같이 SpringDataJpaMemberRepository 인터페이스를 생성한다.
인터페이스가 인터페이스를 상속할때는 extends를 사용한다.
JpaRepository와 MemberRepository를 상속 받는다.


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

SpringConfig를 수정한다.
인터페이스만 있어도 스프링 데이터 JPA가 구현체를 직접 만들어서 스프링빈에 등록해준다.

@Configuration
public class SpringConfig {

   private final MemberRepository memberRepository;
   
   @Autowired
   public SpringConfig(MemberRepository memberRepository) {
   this.memberRepository = memberRepository;
   
 }
 
   @Bean
   public MemberService memberService() {
      return new MemberService(memberRepository);
   }
}

MemberServiceIntegrationTest를 통해 테스트해보면 다 성공한다.
원리를 알아보자.

스프링 데이터 JPA가 SpringDataJpaMemberRepository를 스프링 빈으로 자동 등록해준다. save같은 기본적인 메서드들의 코드는 다 생략이 되었다. JpaRepository를 들어가보면 기본적인 메서드들을 다 제공해주기 때문이다.

우리가 생각할 수 있는 공통화되는 메서드들이 만들어져있다.
하지만 Member 엔티티처럼 이름이 달라질 수 있는것은 공통화 될 수 없다.

따라서 findByName 코드를 적어주면 아래 쿼리를 짜준다.
select m from Member m where m.name = ?
인터페이스 이름만으로 개발이 끝났다.

스프링 데이터 JPA 제공 기능

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

-참고-
실무에서는 JPA와 스프링 데이터 JPA를 기본적으로 사용하고, 복잡한 동적 쿼리는 Querydsl이라는 라이브러리를 사용하면 된다. Querydsl을 사용하면 쿼리도 자바 코드로 안전하게 작성할 수 있고, 동적쿼리도 편리하게 작성할 수 있다. 이 조합으로 해결하기 어려운 쿼리는 JPA가 제공하는 네이티브 쿼리를 사용하거나, 앞서 학습한 스프링 JdbcTemplate를 사용하면 된다.

여기까지 스피링 DB접근 기술이였다.

profile
우엉이의 코딩 성장일기💻

0개의 댓글