JPA(Java Persistence API)๋
๐ ์๋ฐ์์ ๊ฐ์ฒด๋ฅผ DB์ ์ฝ๊ฒ ๊ด๋ฆฌํ๋๋ก ๋ง๋ ORM(Object Relational Mapping) ํ์ค์ด๋ค.
๐ฌ ์ฝ๊ฒ ๋งํ๋ฉด
์๋ฐ ๊ฐ์ฒด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ
์ด๋ธ์ ์๋์ผ๋ก ์ฐ๊ฒฐํด์ฃผ๋ ๊ธฐ์ .
๐ ์คํ๋ง ๋ถํธ์์ ์ฐ๋ฆฌ๊ฐ ์ค์ ๋ก ์ฌ์ฉํ๋ ๊ฑด ๋๋ถ๋ถ Hibernate.
JPA ์์ผ๋ฉด ๊ฐ๋ฐ์๋ ์ด๋ ๊ฒ ํด์ผ ํ๋ค:
JPA ์์ผ๋ฉด?
@Entity ๋ถ์ด๋ฉด JPA๊ฐ ๊ด๋ฆฌ@Entity
public class Member {
@Id @GeneratedValue
private Long id;
private String name;
}
Hibernate๊ฐ DB์ ์ํตํ๋ ํต์ฌ ๊ฐ์ฒด
(์คํ๋ง์์๋ EntityManager๋ฅผ ์ง์ ์ฐ์ง ์๊ณ Repository๊ฐ ๋์ ์ฌ์ฉ)
์ํฐํฐ๋ฅผ 1์ฐจ ์บ์์ ์ ์ฅํ๊ณ ๊ด๋ฆฌํ๋ ๊ณต๊ฐ.
์ด๊ฒ ์ ์ค์?
๐ JPA๋ ์์์ฑ ์ปจํ ์คํธ ๋๋ถ์ '๊ฐ์ฒด ์ค์ฌ ๊ฐ๋ฐ'์ด ๊ฐ๋ฅํ๋ค.
ํธ๋์ญ์
์์์ ์ํฐํฐ ๊ฐ์ ๋ณ๊ฒฝํ๋ฉด ๋ณ๋ update ์ฝ๋ ์์ด๋ DB์ ์๋ ๋ฐ์.
member.setName("ํ๊ธธ๋");
// commit ์ ์๋ UPDATE
์ฐ๊ด๋ ์ํฐํฐ๋ฅผ ํ์ํ ๋(DB์์) ๋ถ๋ฌ์ค๋ ๊ธฐ๋ฅ.
@OneToMany, @ManyToOne ๊ธฐ๋ณธ์ด LazyTeam team = member.getTeam(); // ์์ง DB์์ ์กฐํ ์ ํจ
team.getName(); // ์ด๋ SQL ์คํ๋จ
์ํฐํฐ ์กฐํ ์ ์ฆ์ ๊ด๋ จ ์ํฐํฐ๊น์ง ๋ชจ๋ ๊ฐ์ ธ์ด โ N+1 ๋ฌธ์ ์ ๋ฐ
๐ ๋ฉด์ ๋จ๊ณจ ์ง๋ฌธ:
์ ์ฆ์ ๋ก๋ฉ(EAGER)์ด ๋ฌธ์ ์ธ๊ฐ?
๋ต: "์ํ์ง ์๋ ์์ ์ SQL์ด ๋๋ฌด ๋ง์ด ๋๊ฐ๊ธฐ ๋๋ฌธ, N+1 ๋ฌธ์ ์ ๋ฐ"
์ํฐํฐ๋ 4๋จ๊ณ๋ฅผ ๊ฐ์ง๋ค:
em.persist() ๋๋ ์ ์ฅem.detach(), clear()em.remove()Member m = new Member("ํ๊ธธ๋");
em.persist(m); // INSERT SQL์ ํธ๋์ญ์
commit ์ ๋๊ฐ
Member m = em.find(Member.class, id);
m.setName("ํ๊ธธ๋2"); // dirty checking ์ฌ์ฉ โ ์๋ UPDATE
em.remove(m);
JPA ์์ ๋ง๋ ๋ ํ๋์ ์ถ์ํ ๊ณ์ธต.
์ฅ์ :
์:
public interface MemberRepository extends JpaRepository<Member, Long> {
List<Member> findByName(String name);
}
๐ฌ ํ์ง๋ง ์ ์ฐ๋ฉด ์์ฐ์ฑ & ์ ์ง๋ณด์์ฑ์ด ์๋์ ์ผ๋ก ์ข์์ง๋ค.
mappedBy ํ์