본문 바로가기
Spring_inflearn/입문

[Spring] inflearn 스프링 입문 - 스프링 DB 접근 기술 6

by clolee 2022. 9. 15.

스프링 데이터 JPA

인터페이스만으로 개발 완료. 반복적으로 개발해온 CRUD 기능도 스프링 데이터 JPA가 제공. 코드 적을 게 없음. 그냥 쓰면 됨.

스프링부트 + JPA + 스프링 데이터 JPA 프레임워크.

관계형 데이터베이스 사용 시 스프링 데이터 JPA 필수

스프링 데이터 JPA는 JPA를 편리하게 사용하도록 도와주는 라이브러리. JPA 먼저 학습. 실제 운영시 문제들 해결할 수 없음

 

src/main/java/hello/hellospring/repository/SpringdataJpaMemberRepository.java

SpringdataJpaMemberRepository 인터페이스 생성

인터페이스가 인터페이스를 받을 때는 extends

JpaRepository<T, ID> T : Member ID: entity의 식별자 pk 타입

인터페이스는 다중 상속 가능. MemberRepository 도 상속 받음

 

package hello.hellospring.repository;

import hello.hellospring.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);
}

SpringdataJpaMemberRepository

인터페이스만 있음. 스프링 데이터 JPA가 JpaRepository를 받고 있으면

SpringdataJpaMemberRepository가 구현체를 자동으로 만들어줌. 스프링 데이터 JPA가 SpringdataJpaMemberRepository를 보고 구현체를 만들어 스프링 빈에 자동으로 등록. 우리는 가져다 씀

 

src/main/java/hello/hellospring/SpringConfig.java

injection 받으면 됨

스프링 컨테이너에서 MemberRepository 찾음

SpringdataJpaMemberRepository 인터페이스만 만들어 놓으면, 그리고 extends로 JpaRepository(스프링 데이터가 제공)만 등록해 놓으면 스프링 데이터 JPA가 인터페이스에 대한 구현체를 만들어냄. 그리고 스프링 빈에 등록. 우리는 injection 받을 수 있음.

injection 받아서 memberRepository 등록해줌.

package hello.hellospring;

import hello.hellospring.repository.MemberRepository;
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;

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


	@Bean
	public MemberService memberService() {
		return new MemberService(memberRepository);
	}

//	@Bean
//	public MemberRepository memberRepository() {
//        return new MemoryMemberRepository();
//        return new JdbcMemberRepository(dataSource);
//        return new JdbcTemplateMemberRepository(dataSource);
//        return new JpaMemberRepository(em);
//	}
}

 

스프링 통합 테스트 실행 결과

JPA 사용했을 때와 로그가 같음. 스프링 데이터 JPA가 JPA 기술 가져다 씀

스프링 데이터 JPA가 SpringdataJpaMemberRepository 인터페이스를 보고 스프링 빈을 자동으로 만들어 객체를 생성해(프록시 기술) 스프링 빈에 올림. 우리는 injection 해서 씀.

JpaRepository에 들어가 보면 기본 메소드 제공됨

PagingAndSortingRepository

페이지 처리, 조회

 

CrudRepository

CRUD. 기본적인 save, findOne, exists, count, delete 제공

 

기본적인 CRUD, 단순 조회들이 다 제공됨

 

못 만드는 것 : findByName()

JpaRepository는 공통 인터페이스

 

스프링 데이터 JPA가 JpaRepository에서 findAll, save 등 기본적인 것 제공

머릿속으로 상상할 수 있는 공통 할 수 있는 것들은 다 공통화해서 제공.

 

name, username, email로 찾기.. 등과 같은 것 => 비지니스가 각각 다르기 때문에 공통화하는 것 불가능. 공통클래스로 제공할 수 없음

그래서 스프링 데이터 JPA한테 findByName(String name) 해주면 

JPA가 select m from Member m where m.name = ? 과 같이 JPQL을 짜서 이것이 sql로 번역돼서 실행됨

규칙 - findByName(String name)   findByNameAndId(String name, Long id) and, or 등등

인터페이스 이름만으로도 개발이 끝남. 단순한 쿼리는 인터페이스만으로 끝낼 수 있음.

package hello.hellospring.repository;

import hello.hellospring.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);
}

 

스프링 데이터 JPA 정리

인터페이스를 통한 기본적인 CRUD 제공

findByName(), findByEmail() 과 같이 메서드 이름만으로 조회하는 기능 제공

페이징 기능도 자동으로 제공

 

실무에서는 - JPA와 스프링 데이터 JPA를 기본으로 사용.

복잡한 동적 쿼리는 해결이 쉽지 않음. Querydsl 라이브러리 사용. 

세가지 조합해서 사용

이 조합으로 해결하기 어려운 쿼리는 JPA도 순수한 sql쿼리 쓸 수 있도록 제공. 아니면 JdbcTemplate 사용

 

H2 데이터베이스 설치

순수 Jdbc 기술 사용 - 쿼리 복잡

이를 통한 스프링 통합 테스트 만들어보기

순수 Jdbc 를 스프링 JdbcTemplate으로 바꾸기 - 반복되는 코드가 줄어들지만 sql쿼리 직접 작성해야 함

JPA - 기본적인 CRUD 할 때 쿼리 직접 작성할 필요 없음. 일부 JPQL 필요

스프링 데이터 JPA - 구현 클래스 작성 할 필요 없이 인터페이스만으로 개발이 끝남

 

댓글