강의 방식

순수 JPA → 스프링 데이터 JPA로 변환

순수 JPA 기반 CRUD 기능

기본 repository 기능을 만들어 보자.

@Repository
public class MemberJpaRepository {

	@PersistenceContext
	private EntityManager em;

	public 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);
	}
}
@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();
	}
}

두 repository를 보면 중복되는 부분이 많다.

테스트

@Test
public void basicCRUD() {
	Member member1 = new Member("member1");
	Member member2 = new Member("member2");

	memberJpaRepository.save(member1);
	memberJpaRepository.save(member2);

	// 단건 조회 검증
	Member findMember1 = memberJpaRepository.findById(member1.getId()).get();
	Member findMember2 = memberJpaRepository.findById(member2.getId()).get();

	assertThat(findMember1).isEqualTo(member1);
	assertThat(findMember2).isEqualTo(member2);

	// 리스트 조회 검증
	List<Member> all = memberJpaRepository.findAll();
	assertThat(all.size()).isEqualTo(2);

	// 카운트 검증
	long count = memberJpaRepository.count();
	assertThat(count).isEqualTo(2);

	// 삭제 검증
	memberJpaRepository.delete(member2);
	Optional<Member> findDeletedMember = memberJpaRepository.findById(member2.getId());
	assertThat(findDeletedMember.isEmpty()).isTrue();
}

반복을 제거할 수 있을까?