๐ŸŒฑย ๊ณตํ†ต ์ธํ„ฐํŽ˜์ด์Šค ๊ธฐ๋Šฅ

์ˆœ์ˆ˜ JPA ๊ธฐ๋ฐ˜ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๋งŒ๋“ค๊ธฐ

์ฐธ๊ณ : JPA์—์„œ ์ˆ˜์ •์€ ๋ณ€๊ฒฝ๊ฐ์ง€ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค. ํŠธ๋žœ์žญ์…˜ ์•ˆ์—์„œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์กฐํšŒํ•œ ๋‹ค์Œ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด, ํŠธ๋žœ์žญ์…˜ ์ข…๋ฃŒ ์‹œ์ ์— ๋ณ€๊ฒฝ๊ฐ์ง€ ๊ธฐ๋Šฅ์ด ์ž‘๋™ํ•ด์„œ ๋ณ€๊ฒฝ๋œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  UPDATE SQL์„ ์‹คํ–‰ํ•œ๋‹ค.

์ˆœ์ˆ˜ JPA ๊ธฐ๋ฐ˜ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ - ํšŒ์› : MemberJpaRepository.java

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

์ˆœ์ˆ˜ JPA ๊ธฐ๋ฐ˜ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ - ํŒ€ : TeamJpaRepository.java

@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 ๊ธฐ๋ฐ˜ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ํ…Œ์ŠคํŠธ : MemberJpaRepositoryTest.java

@SpringBootTest
@Transactional
@Rollback(value = false)
class MemberJpaRepositoryTest {

    @Autowired MemberJpaRepository memberJpaRepository;

    @Test
    public void testMember() {
        Member member = new Member("memberA");
        Member savedMember = memberJpaRepository.save(member);

        Member findMember = memberJpaRepository.find(savedMember.getId());

        assertThat(findMember.getId()).isEqualTo(member.getId());
        assertThat(findMember.getUsername()).isEqualTo(member.getUsername());
        assertThat(findMember).isEqualTo(member);
    }

    @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(member1);
        memberJpaRepository.delete(member2);

        long deletedCount = memberJpaRepository.count();
        assertThat(deletedCount).isEqualTo(0);
    }
}

๊ณตํ†ต ์ธํ„ฐํŽ˜์ด์Šค ์„ค์ •