본문으로 바로가기

목차

    0. 환경

    • m1 macbook
    • IntelliJ IDEA(m1) - 202102
    • java 11(AdoptOpenJDK-11.0.11)

    1. 스프링 데이터 JPA

    • 스프링 부트 + JPA + 스프링 데이터 JPA를 사용하면 기존의 한계를 넘어 마치 마법처럼, 리포지토리에 구현 클래스 없이 인터페이스 만으로 개발을 완료할 수 있습니다. 
    • 주요 기능
      • 기본 CRUD 기능도 스프링 데이터 JPA가 모두 제공합니다. (반복 개발 필요 없게 됨)
      • 페이징 기능 자동 제공
      • findByName() , findByEmail()처럼 메서드 이름 만으로 조회 기능 제공 (네이밍 규칙으로 사용 가능합니다, 쿼리 메소드)
    • 조금이라도 단순하고 반복이라 생각했던 개발 코드들이 확연하게 줄어듭니다. 따라서 개발자는 핵심 비즈니스 로직을 개발하는데, 집중할 수 있습니다.
    • 실무에서 관계형 데이터베이스를 사용한다면 스프링 데이터 JPA는 이제 선택이 아니라 필수입니다.
    • 우아한 형제들 기술 기본 Stack = {Spring boot, JPA, Spring Data JPA}
    • 스프링 데이터 JPA는 JPA를 도와주는 도구입니다. (JPA 기술을 모르고 사용할 수는 없습니다.)
    • 실무에서는 JPA와 스프링 데이터 JPA를 기본으로 사용하고, ORM으로 100퍼센트 모든 처리는 불가능합니다. 따라서 JdbcTemplate나 Mybatis와 조합해서 사용하거나 JPA의 nativeQuery를 사용하거나 복잡한 동적 쿼리는 Querydsl이라는 라이브러리를 사용하는 형태로 조합해서 사용하면 문제가 없습니다.
      • 제작자도 100퍼센트 ORM으로 처리하려고 만든 것이 아니다고 합니다.

    2. 스프링 데이터 JPA 리포지토리

    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{
    
        Optional<Member> findByName(String name);
    }
    • hello/hellospring/repository/SpringDataJpaMemberRepository.java

     

    [JpaRepository]

    public interface SpringDataJpaMemberRepository extends JpaRepository<Member, Long>, MemberRepository
    • JpaRepository를 상속받으면 스프링 데이터 JPA를 사용 가능합니다.
    • 인터페이스에서 인터페이스를 받을 때 extends 사용합니다.
    • 인터페이스는 다중 상속이 됩니다.
    • JpaRepository<Member, Long>
      • Entity 타입과 PK 타입을 지정해 줍니다.

     

    [Query creation from method names]

    Optional<Member> findByName(String name);
    • (select * from member where name = ?) 형태로 조회가 필요한 메소드 입니다.
    • 스프링 데이터 JPA는 빠른 개발을 도와주는 쿼리 메소드를 이용하면 쿼리를 생성해 줍니다.
    • 그러나 스프링 데이터 JPA를 사용하기 위해 상속받는 JpaRepository, PagingAndSortingRepository, CrudRepository 인터페이스를 참조해보면 없는 메소드명(공통 메소드 X)입니다.
      • 비슷한 메소드로는 CrudRepository 인터페이스에 findById()만 존재하는 상황
    • 비즈니스마다 다 컬럼명은 다를 것이므로 공통 메소드로 없는 것은 당연한 것입니다.
    • 따라서 스프링 데이터 JPA는 메소드 명(쿼리 메소드 규칙)을 변경하면 쿼리를 생성해주는 규칙을 가진 쿼리 메소드를 지원합니다. 
      • findById() -> findByName()

     

    [스프링 데이터 JPA 사용을 위해 상속받게 되는 인터페이스]

    @NoRepositoryBean
    public interface JpaRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {
    
    	@Override
    	List<T> findAll();
    
    	@Override
    	List<T> findAll(Sort sort);
    
    	@Override
    	List<T> findAllById(Iterable<ID> ids);
    
    	// ( ... )
    }
    @NoRepositoryBean
    public interface PagingAndSortingRepository<T, ID> extends CrudRepository<T, ID> {
    
    	Iterable<T> findAll(Sort sort);
    
    	Page<T> findAll(Pageable pageable);
    }
    @NoRepositoryBean
    public interface CrudRepository<T, ID> extends Repository<T, ID> {
    
        <S extends T> S save(S entity);
        
        <S extends T> Iterable<S> saveAll(Iterable<S> entities);
        
        Optional<T> findById(ID id);
        
        boolean existsById(ID id);
        
        // ( ... )
    }

     

    [쿼리 메소드]

     

    findByName (String name)로 작성 시 아래와 같은 JPQL로 변환 후 SQL로 처리를 해줍니다.

    = select m from Member m where m.name = ? (JPQL)

     

    findByNameAndId (String name, long id) 이런 식으로도 사용할 수 있습니다.

    = select m from Member m where m.name = ? and m.id = ? (JPQL)

     

    더 다양한 쿼리 메소드 규칙은 아래의 링크를 참조해주세요.

    https://docs.spring.io/spring-data/jpa/docs/2.5.5/reference/html/#jpa.query-methods.query-creation

     

    3. 설정 파일 변경

    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;
    
    import javax.persistence.EntityManager;
    import javax.persistence.PersistenceContext;
    import javax.sql.DataSource;
    
    //자바 코드로 직접 스프링 빈 등록하기
    @Configuration
    public class SpringConfig {
    
        private final MemberRepository memberRepository;
    
        public SpringConfig(MemberRepository memberRepository) {
            this.memberRepository = memberRepository;
        }
    
        @Bean
        public MemberService memberService() {
    //        return new MemberService(memberRepository());
            return new MemberService(memberRepository);
        }
    }​
    • hello/hellospring/SpringConfig.java
    • 스프링 데이터 JPA가 SpringDataJpaMemberRepository를 스프링 빈으로 자동 등록해줍니다. 이 것을 주입해서 사용하면 됩니다.

    4. 스프링 데이터 JPA 제공 클래스

    JpaRepository

    • 스프링 데이터 JPA를 사용 시 상속받는 JpaRepository는 다음과 같은 형태로 상속되어 있습니다. 따라서 다양한 메소드를 이용해 쿼리를 생성할 수 있습니다. 
    • JpaRepository, PagingAndSortingRepository, CrudRepository 인터페이스를 확인해보면 다양한 기본 쿼리 메소드를 제공하고 페이징 처리도 가능합니다.