๐ ์์ JPA ๊ธฐ๋ฐ ๋ ํฌ์งํ ๋ฆฌ ๋ง๋ค๊ธฐ
โช ์์ jpa ๊ธฐ๋ฐ ๋ ํฌ์งํ ๋ฆฌ
@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);
}
}
โช test code
@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); //JPA ์ํฐํฐ ๋์ผ์ฑ ๋ณด์ฅ
}
@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);
}
}
๊ณตํต ์ธํฐํ์ด์ค ์ค์
์ธํฐํ์ด์ค ๊ตฌํ์ฒด๋ ๊ฐ๋ฐ์๊ฐ ๋ง๋๋๊ฒ ์๋๊ณ , ์คํ๋ง์ด ๋ง๋ค์ด์ ์ฃผ์ ํ๋ค.
public interface TeamRepository extends JpaRepository<Team, Long>{
}
→ JpaRepository๋ฅผ ์ฌ์ฉํ๋ฉด @Repository ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ์ง ์์๋ spring data jpa๊ฐ ์ธ์ํ์ฌ ๊ตฌํ์ฒด๋ฅผ ์ฃผ์ ํ๋ค.
๊ณตํต ์ธํฐํ์ด์ค ์ ์ฉ
โช spring data jpa ์ ์ฉ test code
@Test
public void testMember() {
Member member = new Member("memberA");
Member savedMember = memberRepository.save(member);
Member findMember = memberRepository.findById(savedMember.getId()).get();
Assertions.assertThat(findMember.getId()).isEqualTo(member.getId());
Assertions.assertThat(findMember.getUsername()).isEqualTo(member.getUsername());
Assertions.assertThat(findMember).isEqualTo(member);
}
@Test
public void basicCRUD() {
Member member1 = new Member("member1");
Member member2 = new Member("member2");
memberRepository.save(member1);
memberRepository.save(member2);
//๋จ๊ฑด ์กฐํ ๊ฒ์ฆ
Member findMember1 = memberRepository.findById(member1.getId()).get();
Member findMember2 = memberRepository.findById(member2.getId()).get();
assertThat(findMember1).isEqualTo(member1);
assertThat(findMember2).isEqualTo(member2);
//๋ฆฌ์คํธ ์กฐํ ๊ฒ์ฆ
List<Member> all = memberRepository.findAll();
assertThat(all.size()).isEqualTo(2);
//์นด์ดํธ ๊ฒ์ฆ
long count = memberRepository.count();
assertThat(count).isEqualTo(2);
//์ญ์ ๊ฒ์ฆ
memberRepository.delete(member1);
memberRepository.delete(member2);
long deletedCount = memberRepository.count();
assertThat(deletedCount).isEqualTo(0);
}
}
์ฐ์!
๊ณตํต ์ธํฐํ์ด์ค ๋ถ์
spring data jpa๊ฐ ์ ๊ณตํ๋ ๊ธฐ๋ฅ๋ค์ ๊ตฌํ์ฒด๊ฐ ์๊ณ ์ธํฐํ์ด์ค๋ง ์กด์ฌํ๋ค.
๊ฐ๋ฐ์๊ฐ ์๊ฐํ ์ ์๋ ๋ชจ๋ ๊ณตํต ๊ธฐ๋ฅ๋ค์ ์ ๊ณตํด์ค๋ค.
๊ทธ๋ฐ๋ฐ, ์๋ฅผ๋ค์ด List findByUsername(String username); ์ด๋ ๊ฒ Username์ด ๋ค์ด๊ฐ ์๊ฐ๋ถํฐ ๋๋ฉ์ธ์ ํนํ๋ ๊ธฐ๋ฅ์ด๋ผ ๊ณตํต์ผ๋ก ๋ง๋๋๊ฒ ๋ถ๊ฐ๋ฅํด์ง๋๋ฐ, ์ด๋ฐ ์กฐ๊ฑด๋ค์ ์ฟผ๋ฆฌ๋ฉ์๋๋ก ์ฒ๋ฆฌ ๊ฐ๋ฅํ๋ค.
[์ค๋ฌด ๊ฟํ]
โช ์ค๋ฌด์์๋ ๊ฐ๊ธ์ ์ํฐํฐ์ @Setter
๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค๊ณ ํ๋ค.
โช ํ ์ด๋ธ์ pk๋ฅผ _id๋ก ๋งคํํ๊ธฐ ์ํด ํ ์ด๋ธ๋ช _id๋ก ๋ง์ด ์ฌ์ฉํ๋ค.
โช mappedBy
๋ fk๊ฐ ์๋์ชฝ์ ๊ฑธ์ด์ฃผ๋ ๊ฒ์ด ์ข๋ค.
โช @ManyToOne(fetch = FetchType.LAZY)
→ ์ค๋ฌด์์๋ ๋๋ถ๋ถ LAZY ์ฒ๋ฆฌ๋ฅผ ํตํ ์ง์ฐ ๋ก๋ฉ์ ํตํด ์ฑ๋ฅ์ ์ต์ ํ ํ๋ค.
[์คํ๋ง ์ง์]
โช @NoArgsConstructor(access = AccessLevel.PROTECTED)
→ jpa๋ ๋ํดํธ ์์ฑ์๊ฐ ํ์ํ๋ฐ, access level์ protected๊น์ง ์ด์ด๋์ด์ผ ํ๋ค.
โช @ToString
์ ๊ฐ๊ธ์ ์ฐ๊ด๊ด๊ณ ์๋ ๋ด๋ถ ํ๋๋ง ์ฌ์ฉ
→ ๋ฌดํ๋ฃจํ์ ๋น ์ง ์ ์๊ธฐ ๋๋ฌธ