공통 인터페이스 기능
- 순수 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가 구현 클래스를 만들어서 인젝션을 해준것이다.
@Repository
는 생략 가능하다. 컴포넌트 스캔을 스프링 데이터 JPA가 자동으로 해준다.- JPA의 예외를 스프링의 예외로 변환시켜서 처리해준다.
공통 인터페이스 분석
- JpaRepository : CRUD 제공
- <엔티티 타입, 식별자 타입> 설정
공통 인터페이스 구성

스프링 데이터 공통 부분은 하부의 jpa, redis, mongoDB 등 여러 기술들이 공통으로 사용할 수 있는 부분이고, 스프링 데이터 JPA 는 JPA에 특화된 기능들만 제공한다.
Reference
- 자바 ORM 표준 JPA 프로그래밍
'웹 > Spring Data' 카테고리의 다른 글
[스프링 데이터 JPA] 6. Auditing (0) | 2020.12.21 |
---|---|
[스프링 데이터 JPA] 5. EntityGraph (0) | 2020.12.17 |
[스프링 데이터 JPA] 4. 벌크성 수정 쿼리 (0) | 2020.12.17 |
[스프링 데이터 JPA] 3. 페이징과 정렬 (0) | 2020.12.17 |
[스프링 데이터 JPA] 2. 쿼리 메소드 기능 (0) | 2020.12.16 |
댓글