본문 바로가기
웹/Spring Data

[스프링 데이터 JPA] 1. 공통 인터페이스 기능

by 두잇베스트 2020. 12. 14.

공통 인터페이스 기능

  • 순수 JPA 기반 리포지토리 만들기
  • 공통 인터페이스 설정
  • 공통 인터페이스 적용
  • 공통 인터페이스 분석

 

순수 JPA 기반 리포지토리

 

—회원

package study.datajpa.repository;

import org.springframework.stereotype.Repository;
import study.datajpa.entity.Member;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import java.util.List;
import java.util.Optional;

@Repository
public class MemberJpaRepository {
        @PersistenceContext
        private EntityManager em;

        pubilc Member save(Member member) {
            em.persist(member);
            return member;
        }

        public void delete(Member member) {
            em.remove(member);
        }

        public List<Member> findAll() {
                return em.createQuery("select m from Member m", Member.class).getResultList();
        }

        public Optional<Member> findById(Long id) {
            Member member = em.find(Member.class, id);
            return Optional.ofNullable(member);
        }

        public long count() {
            return em.createQuery("select count(m) from Member m", Long.class).getSingleResult();
        }

        public Member find(Long id) {
            return em.find(Member.class, id);
        }
}

 

—팀

package study.datajpa.repository;

import org.springframework.stereotype.Repository;
import study.datajpa.entity.Team;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import java.util.List;
import java.util.Optional;

@Repository
public class TeamJpaRepository {

    @PersistenceContext
    private EntityManager em;

    public Team save(Team team) {
        em.persist(team);
        return team;
    }

    public void delete(Team team) {
        em.remove(team);
    }

    public List<Team> findAll() {
        return em.createQuery("select t from Team t",Team.class).getResultList();
    }

    public Optional<Team> findById(Long id) {
        Team team = em.find(Team.class, id);
        return Optional.ofNullable(team);
    }

    public Long count() {
        return em.createQuery("select count(t) from Team t",Long.class).getSingleResult();
    }
}

 

공통 인터페이스 설정

스프링 데이터 jpa를 사용하기 위해서는 설정을 해줘야 하는데, @SpringBootApplication  해당하는 패키지와 하위 패키지를 모두 구현할 수 있다. 만약 다른 위치에 적용하고 싶다면 @EnableJpaRepositories(basePackages = "study.datajpa.repository") 로 해주면 된다.

위의 순수 JPA로 구성한 리포지토리를 단순하게 스프링 데이터 JPA를 이용한다면 아래와 같이 간단하게 코드를 줄인다.

 

공통 인터페이스 적용

 

스프링 데이터 JPA기반 MemberRepository

public interface MemberRepository extends JpaRepository<Member, Long> {

}

위에서 보다시피 MemberRepository도 인터페이스며, 상속 하는 JpaRepository도 인터페이스다. 구현한것이 없는데 어떻게 동작할까? 그 이유는 바로 스프링 데이터 JPA가 구현 클래스를 만들어서 인젝션을 해준것이다.

  1. @Repository 는 생략 가능하다. 컴포넌트 스캔을 스프링 데이터 JPA가 자동으로 해준다.
  2. JPA의 예외를 스프링의 예외로 변환시켜서 처리해준다.

 

공통 인터페이스 분석

  • JpaRepository : CRUD 제공
  • <엔티티 타입, 식별자 타입> 설정

 

공통 인터페이스 구성

 

스프링 데이터 공통 부분은 하부의 jpa, redis, mongoDB 등 여러 기술들이 공통으로 사용할 수 있는 부분이고, 스프링 데이터 JPA 는 JPA에 특화된 기능들만 제공한다.

 

 

 

Reference

  • 자바 ORM 표준 JPA 프로그래밍

댓글