[μλ° ORM νμ€ JPA νλ‘κ·Έλλ°] 15μ₯ κ³ κΈ μ£Όμ μ μ±λ₯ μ΅μ ν
π15.1 μμΈ μ²λ¦¬
15.1.1 JPA νμ€ μμΈ μ 리
JPA νμ€ μμΈ
- νΈλμμ λ‘€λ°±μ νμνλ μμΈ
- νΈλμμ λ‘€λ°±μ νμνμ§ μλ μμΈ
νΈλμμ λ‘€λ°±μ νμνλ μμΈλ μ¬κ°ν μμΈμ΄λ―λ‘ λ³΅κ΅¬ν΄μλ μ λ¨.
15.1.2 μ€νλ§ νλ μμν¬μ JPA μμΈ λ³ν
μλΉμ€ κ³μΈ΅μμ λ°μ΄ν° μ κ·Ό κ³μΈ΅μ ꡬν κΈ°μ μ μ§μ μμ‘΄νλ κ²μ΄ μ’μ μ€κ³κ° μλ κ²μ²λΌ
μλΉμ€ κ³μΈ΅μμ JPAμ μμΈλ₯Ό μ§μ μ¬μ©νλ©΄ μλ¨.
μ΄λ° λ¬Έμ ν΄κ²°μ μν΄ μ€νλ§ νλ μμν¬λ λ°μ΄ν° μ κ·Ό κ³μΈ΅μ λν μμΈλ₯Ό μΆμνν΄μ κ°λ°μμκ² μ 곡ν¨.
15.1.3 μ€νλ§ νλ μμν¬μ JPA μμΈ λ³νκΈ° μ μ©
JPA μμΈλ₯Ό μ€νλ§ νλ μμν¬κ° μ 곡νλ μΆμνλ μμΈλ‘ λ³κ²½νλ €λ©΄
μ€νλ§ λΉμΌλ‘ PersistenceExceptionTranslationPostProcessorλ₯Ό λ±λ‘νλ©΄ λ¨.
15.1.4 νΈλμμ λ‘€λ°± μ μ£Όμμ¬ν
νΈλμμ μ λ‘€λ°±νλ κ²μ λ°μ΄ν°λ² μ΄μ€μ λ°μμ¬νλ§ λ‘€λ°±νλ κ²μ΄μ§
μμ ν μλ° κ°μ²΄κΉμ§ μμνλ‘ λ³΅κ΅¬ν΄μ£Όμ§λ μμ.
κΈ°λ³Έ μ λ΅μΈ νΈλμμ λΉ μμμ± μ»¨ν μ€νΈ μ λ΅μ λ¬Έμ κ° λ°μνλ©΄ νΈλμμ AOP μ’ λ£ μμ μ νΈλμμ μ λ‘€λ°±νλ©΄μ μμμ± μ»¨ν μ€νΈλ ν¨κ» μ’ λ£νλ―λ‘ λ¬Έμ κ° λ°μνμ§ μλλ€.
OSIVμ²λΌ μμμ± μ»¨ν μ€νΈ λ²μλ₯Ό νΈλμμ λ²μλ³΄λ€ λκ² μ¬μ©ν λ.
μ€νλ§ νλ μμν¬λ μμμ± μ»¨ν μ€νΈμ λ²μλ₯Ό νΈλμμ μ λ²μλ³΄λ€ λκ² μ€μ νλ©΄ νΈλμμ λ‘€λ°±μ μμμ± μ»¨ν μ€νΈλ₯Ό μ΄κΈ°νν΄μ μλͺ»λ μμμ± μ»¨ν μ€νΈλ₯Ό μ¬μ©νλ λ¬Έμ λ₯Ό μλ°©ν¨.
π15.2 μν°ν° λΉκ΅
15.2.1 μμμ± μ»¨ν μ€νΈκ° κ°μ λ μν°ν° λΉκ΅
memberμ findMemberκ° μμ ν κ°μ μΈμ€ν΄μ€. κ°μ νΈλμμ λ²μμ μμΌλ―λ‘ κ°μ μμμ± μ»¨ν μ€νΈλ₯Ό μ¬μ©νκΈ° λλ¬Έ.
λμΌμ±: == λΉκ΅κ° κ°μ.
λλ±μ±: equals() λΉκ΅κ° κ°μ.
λ°μ΄ν°λ² μ΄μ€ λλ±μ±: @Id μΈ λ°μ΄ν°λ² μ΄μ€ μλ³μκ° κ°μ.
15.2.2 μμμ± μ»¨ν μ€νΈκ° λ€λ₯Ό λ μν°ν° λΉκ΅
memberμ findMemberλ κ°κ° λ€λ₯Έ μμμ± μ»¨ν μ€νΈμμ κ΄λ¦¬λμκΈ° λλ¬Έμ λμ λ€λ₯Έ μΈμ€ν΄μ€μ.
λμΌμ±(identical): == λΉκ΅κ° μ€ν¨ν¨.
λλ±μ±(equivalent): equals() λΉκ΅κ° λ§μ‘±ν¨.
λ°μ΄ν°λ² μ΄μ€ λλ±μ±: @IdμΈ λ°μ΄ν°λ² μ΄μ€ μλ³μκ° κ°μ.
λμΌμ± λΉκ΅λ κ°μ μμμ± μ»¨ν μ€νΈμ κ΄λ¦¬λ₯Ό λ°λ μμ μνμ μν°ν°μλ§ μ μ©ν μ μλ€.
κ·Έλ μ§ μμ λλ λΉμ¦λμ€ ν€λ₯Ό μ¬μ©ν λλ±μ± λΉκ΅λ₯Ό ν΄μΌ νλ€.
π15.3 νλ‘μ μ¬ν μ£Όμ
15.3.1 μμμ± μ»¨ν μ€νΈμ νλ‘μ
μμμ± μ»¨ν μ€νΈλ νλ‘μλ‘ μ‘°νλ μν°ν°μ λν΄μ κ°μ μν°ν°λ₯Ό μ°Ύλ μμ²μ΄ λ€μ΄μ€λ©΄ μλ³Έ μν°ν°κ° μλ μ²μ μ‘°νλ νλ‘μλ₯Ό λ°νν¨.
λ°λΌμ νλ‘μλ‘ μ‘°νν΄λ μμμ± μ»¨ν μ€νΈλ μμ μν°ν°μ λμΌμ±μ 보μ₯ν¨.
μλ³Έ μν°ν°λ₯Ό λ¨Όμ μ‘°ννλ κ²½μ°, μμμ± μ»¨ν μ€νΈλ μλ³Έ μν°ν°λ₯Ό μ΄λ―Έ λ°λ² μμ μ‘°ννμΌλ―λ‘ νλ‘μλ₯Ό λ°νν μ΄μ κ° μμ. λ°λΌμ em.getReference()λ₯Ό νΈμΆν΄λ νλ‘μκ° μλ μλ³Έμ λ°ννκ³ , μμ μν°ν°μ λμΌμ±μ 보μ₯ν¨.
15.3.2 νλ‘μ νμ λΉκ΅
νλ‘μλ μλ³Έ μν°ν°λ₯Ό μμ λ°μμ λ§λ€μ΄μ§λ―λ‘ νλ‘μλ‘ μ‘°νν μν°ν°μ νμ μ λΉκ΅ν λλ == λΉκ΅λ₯Ό νλ©΄ μ λκ³ instanceofλ₯Ό μ¬μ©ν΄μΌ ν¨.
@Test
public void νλ‘μ_νμ
λΉκ΅() {
Member newMember = new Member("member1", "νμ1");
em.persist(newMember);
em.flush();
em.clear();
Member refMember = em.getReference(Member.class, "member1");
System.out.println("refMember Type = " + refMember.getClass());
Assert.assertFalse(Member.class == refMember.getClass()); //false
Assert.assertTrue(refMember instanceof Member); //true
}
15.3.3 νλ‘μ λλ±μ± λΉκ΅
νλ‘μμ equals() λΉκ΅λ₯Ό ν λμ μ£Όμμ
- νλ‘μλ μλ³Έμ μμλ°μ μμ νμ μ΄λ―λ‘ νλ‘μμ νμ λΉκ΅λ == λΉκ΅ λμ μ instanceofλ₯Ό μ¬μ©ν΄μΌ νλ€.
- νλ‘μλ μ€μ λ°μ΄ν°λ₯Ό κ°μ§κ³ μμ§ μμΌλ―λ‘ νλ‘μμ λ©€λ²λ³μμ μ§μ μ κ·Όνλ©΄ μ λκ³ λμ μ μ κ·Όμ λ©μλλ₯Ό μ¬μ©ν΄μΌ νλ€.
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (!(obj instanceof Member)) return false;
Member member = (Member) obj;
if (name != null ? !name.equals(member.getName()) :
member.getName() != null)
return false;
return true;
}
15.3.4 μμκ΄κ³μ νλ‘μ
νλ‘μλ₯Ό λΆλͺ¨ νμ μΌλ‘ μ‘°ννλ©΄ λΆλͺ¨μ νμ μ κΈ°λ°μΌλ‘ νλ‘μκ° μμ±λλ λ¬Έμ κ° μμ.
- instanceof μ°μ°μ μ¬μ©ν μ μμ.
- νμ νμ μΌλ‘ λ€μ΄μΊμ€ν μ ν μ μμ.
@Test
public void μμκ΄κ³μ_νλ‘μ_λλ©μΈλͺ¨λΈ() {
//ν
μ€νΈ λ°μ΄ν° μ€λΉ
Book book = new Book();
book.setName("jpabook");
book.setAuthor("kim");
em.persist(book);
OrderItem saveOrderItem = new OrderItem();
saveOrderItem.setItem(book);
em.persist(saveOrderItem);
em.flush();
em.clear();
//ν
μ€νΈ μμ
OrderItem orderItem = em.find(OrderItem.class, saveOrderItem.getId());
Item item = orderItem.getItem();
System.out.println("item = " + item.getClass());
//κ²°κ³Ό κ²μ¦
Assert.assertFalse(item.getClass() == Book.class);
Assert.assertFalse(item instanceof Book);
Assert.assertTrue(item instanceof Item);
λ¬Έμ ν΄κ²° λ°©λ²
JPQLλ‘ λμ μ§μ μ‘°ν
μ²μλΆν° μμ νμ μ μ§μ μ‘°νν΄μ νμν μ°μ°μ νλ©΄ λ¨. νμ§λ§ λ€νμ±μ νμ©ν μ μμ.
Book jpqlBook = em.createQuery
("select b from Book b where b.id=:bookId", Book.class)
.setParameter("bookId", item.getId())
.getSingleResult();
νλ‘μ λ²κΈ°κΈ°
//νμ΄λ²λ€μ΄νΈκ° μ 곡νλ νλ‘μμμ μλ³Έ μν°ν°λ₯Ό μ°Ύλ κΈ°λ₯μ μ¬μ©νλ λ©μλ
public static <T> T unProxy(Object entity) {
if(entity instanceof HibernateProxy) {
entity = ((HibernateProxy) entity)
.getHibernateLazyInitializer()
.getImplementation();
}
return (T) entity;
}
ν λ² νλ‘μλ‘ λ ΈμΆν μν°ν°λ κ³μ νλ‘μλ‘ λ ΈμΆν΄μ μμμ± μ»¨ν μ€νΈκ° μμ μν°ν°μ λμΌμ±μ 보μ₯νλ€κ³ νλλ°
μ΄ λ°©λ²μ νλ‘μμμ μλ³Έ λ°μ΄ν°λ₯Ό μ§μ κΊΌλ΄κΈ° λλ¬Έμ νλ‘μμ μλ³Έ μν°ν°μ λμΌμ± λΉκ΅κ° μ€ν¨νλ€λ λ¬Έμ μ μ΄ μμ. (item == unProxyItemμ κ²°κ³Όλ falseλΌλ λ¬Έμ .)
κΈ°λ₯μ μν λ³λμ μΈν°νμ΄μ€ μ 곡
μΈν°νμ΄μ€λ₯Ό μ 곡νκ³ κ°κ°μ ν΄λμ€κ° μμ μ λ§λ κΈ°λ₯μ ꡬνννλ κ²μ λ€νμ±μ νμ©νλ μ’μ λ°©λ².
ν΄λΌμ΄μΈνΈ μ μ₯μμ λμ κ°μ²΄κ° νλ‘μμΈμ§ μλμ§λ₯Ό κ³ λ―Όνμ§ μμλ λλ μ₯μ μ΄ μμ.
λΉμ§ν° ν¨ν΄ μ¬μ©
Visitorμ Visitorλ₯Ό λ°μλ€μ΄λ λμ ν΄λμ€λ‘ ꡬμ±λ¨. Itemμ΄ accept λ©μλλ‘ Visitorλ₯Ό λ°μλ€μ΄κΈ°λ§ νκ³ μ€μ λ‘μ§μ Visitorκ° μ²λ¦¬ν¨.
//Visitor μΈν°νμ΄μ€
public interface Visitor {
void visit(Book book);
void visit(Album album);
void visit(Movie movie);
}
//λΉμ§ν° ꡬν
public class PrintVisitor implements Visitor {
@Override
public void visit(Book book) {
//λμ΄μ€λ bookμ Proxyκ° μλ μλ³Έ μν°ν°λ€.
System.out.println("book.class = " + book.getClass());
System.out.println("[PrintVisitor]
[μ λͺ©:" + book.getName() + "μ μ:" + book.getAuthor() + "]");
}
@Override
public void visit(Album album) {...}
@Override
public void visit(Movie movie) {...}
}
public class TitleVisitor implements Visitor {
private String title;
public String getTitle() {
return title;
}
@Override
public void visit(Book book) {
title = "[μ λͺ©:" + book.getName() + "μ μ:" +
book.getAuthor() + "]";
}
@Override
public void visit(Album album) {...}
@Override
public void visit(Movie movie) {...}
}
//λΉμ§ν° λμ ν΄λμ€
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "DTYPE")
public abstract class Item {
@Id@GeneratedValue
@Column(name = "ITEM_ID")
private Long id;
private String name;
...
public abstract void accept(Visitor visitor);
}
@Entity
@DiscriminatorValue("B")
public class Book extends Item {
private String author;
private String isbn;
//Getter, Setter
public String getAuthor() {
return author;
}
}
@Entity
@DiscriminatorValue("M")
public class Movie extends Item {
...
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
}
@Entity
@DiscriminatorValue("A")
public class Album extends Item {
...
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
}
λΉμ§ν° ν¨ν΄μ μ¬μ©νλ©΄ νλ‘μμ λν κ±±μ μμ΄ μμ νκ² μλ³Έ μν°ν°μ μ κ·Όν μ μκ³ instanceofλ νμ μΊμ€ν μμ΄ μ½λλ₯Ό ꡬνν μ μλ μ₯μ μ΄ μλ€.
λΉμ§ν° ν¨ν΄μ μ₯μ
- νλ‘μμ λν κ±±μ μμ΄ μμ νκ² μλ³Έ μν°ν°μ μ κ·Όν μ μλ€.
- instnaceofμ νμ μΊμ€ν μμ΄ μ½λλ₯Ό ꡬνν μ μλ€.
- μκ³ λ¦¬μ¦κ³Ό κ°μ²΄ ꡬ쑰λ₯Ό λΆλ¦¬ν΄μ ꡬ쑰λ₯Ό μμ νμ§ μκ³ μλ‘μ΄ λμμ μΆκ°ν μ μλ€.
λΉμ§ν° ν¨ν΄μ λ¨μ
- λ무 볡μ‘νκ³ λλΈ λμ€ν¨μΉλ₯Ό μ¬μ©νκΈ° λλ¬Έμ μ΄ν΄νκΈ° μ΄λ ΅λ€.
- κ°μ²΄ κ΅¬μ‘°κ° λ³κ²½λλ©΄ λͺ¨λ Visitorλ₯Ό μμ ν΄μΌ νλ€.
π15.4 μ±λ₯ μ΅μ ν
15.4.1 N+1 λ¬Έμ
μ¦μ λ‘λ©κ³Ό N+1
νΉμ νμμ em.find() λ©μλλ‘ μ‘°ννλ©΄ μ¦μ λ‘λ©μΌλ‘ μ€μ ν μ£Όλ¬Έμ 보λ ν¨κ» μ‘°ννλ€.
em.find(Member.class, id);
-> μ€νλλ SQL:
SELECT M.*, O.*
FROM
MEMBER M
OUTER JOIN ORDERS O ON M.ID=O.MEMBER_ID
SQLμ λ λ² μ€ννλ κ²μ΄ μλλΌ μ‘°μΈμ μ¬μ©ν΄μ ν λ²μ SQLλ‘ νμκ³Ό μ£Όλ¬Έμ 보λ₯Ό ν¨κ» μ‘°νν¨.
λ¬Έμ λ JPQLμ μ¬μ©ν λ λ°μν¨.
List<Member> members =
em.createQuery("select m from Member m", Member.class)
.getResultList();
JPQLμ μ€ννλ©΄ JPAλ μ΄κ²μ λΆμν΄μ SQLμ μμ±ν¨. μ΄λλ μ¦μ λ‘λ© μ§μ° λ‘λ©μ λν΄ μ ν μ κ²½ μ°μ§ μκ³ JPQLλ§ μ¬μ©ν΄μ SQLμ μμ±ν΄μ λ€μκ³Ό κ°μ SQLμ΄ μ€νλ¨.
SELECT * FROM MEMBER
SELECT * FROM ORDERS WHERE MEMBER_ID=1
SELECT * FROM ORDERS WHERE MEMBER_ID=2
...
SELECT * FROM ORDERS WHERE MEMBER_ID=N
μ΄μ²λΌ μ²μ μ€νν SQLμ κ²°κ³Ό μλ§νΌ μΆκ°λ‘ SQLμ μ€ννλ κ²μ N+1 λ¬Έμ λΌ νλ€.
μ§μ° λ‘λ©κ³Ό N+1
λ€μμ²λΌ λͺ¨λ νμμ λν΄ μ°κ΄λ μ£Όλ¬Έ 컬λ μ μ μ¬μ©ν λ N+1 λ¬Έμ κ° λ°μν¨.
for (Member member : members) {
//μ§μ° λ‘λ© μ΄κΈ°ν
System.out.println("member = " + member.getOrders().size());
}
μ£Όλ¬Έ 컬λ μ μ μ΄κΈ°ννλ μλ§νΌ SQLμ΄ μ€νλ¨. νμμ΄ 5λͺ μ΄λ©΄ νμμ λ°λ₯Έ μ£Όλ¬Έλ 5λ² μ‘°νλ¨.
νμΉ μ‘°μΈ μ¬μ©
νμΉ μ‘°μΈμ SQL μ‘°μΈμ μ¬μ©ν΄μ μ°κ΄λ μν°ν°λ₯Ό ν¨κ» μ‘°ννλ―λ‘ N+1 λ¬Έμ κ° λ°μνμ§ μμ.
νμΉ μ‘°μΈμ μ¬μ©νλ JPQL select m from Member m join fetch m.orders λ₯Ό μ¬μ©νλ©΄
SELECT M.*, O.* FROM MEMBERS M
INNER JOIN ORDERS O ON M.ID=O.MEMBER_ID κ° μ€νλ¨.
νμ΄λ²λ€μ΄νΈ @BatchSize
νμ΄λ²λ€μ΄νΈκ° μ 곡νλ BatchSize μ΄λ Έν μ΄μ μ μ¬μ©νλ©΄ μ°κ΄λ μν°ν°λ₯Ό μ‘°νν λ μ§μ ν sizeλ§νΌ SQLμ INμ μ μ¬μ©ν΄μ μ‘°νν¨. μ‘°νν νμμ΄ 10λͺ μΈλ° size=5λ‘ μ§μ νλ©΄ 2λ²μ SQLλ§ μΆκ°λ‘ μ€νν¨.
νμ΄λ²λ€μ΄νΈ @Fetch(FetchMode.SUBSELECT)
μ°κ΄λ λ°μ΄ν°λ₯Ό μ‘°νν λ μλΈ μΏΌλ¦¬λ₯Ό μ¬μ©ν΄μ N+1λ¬Έμ λ₯Ό ν΄κ²°ν¨.
select m from Member m where m.id > 10
SELECT O FROM ORDERS O
WHERE O.MEMBER_ID IN (
SELECT
M.ID
FROM
MEMBER M
WHERE M.ID > 10
)
15.4.2 μ½κΈ° μ μ© μΏΌλ¦¬μ μ±λ₯ μ΅μ ν
μμμ± μ»¨ν μ€νΈλ λ³κ²½ κ°μ§λ₯Ό μν΄ μ€λ μ· μΈμ€ν΄μ€λ₯Ό 보κ΄νλ―λ‘ λ λ§μ λ©λͺ¨λ¦¬λ₯Ό μ¬μ©νλ€λ λ¨μ μ΄ μμ.
μν°ν°λ₯Ό λ± ν λ²λ§ μ½μ΄μ νλ©΄μ μΆλ ₯νκ³ λ€μ μ‘°ννκ±°λ μμ ν μΌμ΄ μλ€λ©΄ μ½κΈ° μ μ©μΌλ‘ μν°ν°λ₯Ό μ‘°ννλ©΄ λ©λͺ¨λ¦¬ μ¬μ©λμ μ΅μ νν μ μλ€.
μ€μΉΌλΌ νμ μΌλ‘ μ‘°ν
select o.id, o.name, o.price from Order p
μ€μΉΌλΌ νμ μ μμμ± μ»¨ν μ€νΈκ° κ²°κ³Όλ₯Ό κ΄λ¦¬νμ§ μμΌλ―λ‘ κ°μ₯ νμ€ν λ°©λ²μ μν°ν°κ° μλ μ€μΉΌλΌ νμ μΌλ‘ λͺ¨λ νλλ₯Ό μ‘°ννλ κ².
μ½κΈ° μ μ© μΏΌλ¦¬ ννΈ μ¬μ©
νμ΄λ²λ€μ΄νΈ μ μ© ννΈμΈ org.hibernate.readOnlyλ₯Ό μ¬μ©νλ©΄ μν°ν°λ₯Ό μ½κΈ° μ μ©μΌλ‘ μ‘°νν μ μμ.
μ½κΈ° μ μ© νΈλμμ μ¬μ©
μ€νλ§ νλ μμν¬λ₯Ό μ¬μ©νλ©΄ νΈλμμ μ μ½κΈ° μ μ© λͺ¨λλ‘ μ€μ ν μ μμ.
@Transactional(readOnly = true)
νΈλμμ μ 컀λ°ν΄λ μμμ± μ»¨ν μ€νΈλ₯Ό νλ¬μνμ§ μμΌλ―λ‘ μν°ν°μ λ±λ‘, μμ , μμ λ λΉμ°ν λμνμ§ μκ³ , μ€λ μ· λΉκ΅μ κ°μ λ¬΄κ±°μ΄ λ‘μ§λ€μ μννμ§ μμ μ±λ₯μ΄ ν₯μλ¨.
νΈλμμ λ°μμ μ½κΈ°
νΈλμμ μμ΄ μν°ν°λ₯Ό μ‘°ννλ λ°©λ².
μ€νλ§ νλ μμν¬μμλ
@Transactional(propagation = Propagation.NOT_SUPPORTED)
λ‘ μ€μ ν¨.
15.4.3 λ°°μΉ μ²λ¦¬
μλ°±λ§ κ±΄μ λ°μ΄ν°λ₯Ό λ°°μΉ μ²λ¦¬ν΄μΌ νλ€κ³ κ°μ νλ©΄
μΌλ°μ μΈ λ°©μμΌλ‘ μ‘°ννλ©΄ μμμ± μ»¨ν μ€νΈμ λ§μ μν°ν°κ° μμ¬ λ©λͺ¨λ¦¬ λΆμ‘± μ€λ₯κ° λ°μν¨.
JPA λ±λ‘ λ°°μΉ
λ§μ μν°ν°λ₯Ό ν λ²μ λ±λ‘ν λλ
μμμ± μ»¨ν μ€νΈμ μν°ν°κ° κ³μ μμ΄μ§ μλλ‘ μΌμ λ¨μλ§λ€ μμμ± μ»¨ν μ€νΈμ μν°ν°λ₯Ό λ°μ΄ν°λ² μ΄μ€μ νλ¬μνκ³ μμμ± μ»¨ν μ€νΈλ₯Ό μ΄κΈ°νν΄μΌ ν¨.
EntityManager em = entityManagerFactory.createEntityManager();
EntityTranssaction tx = em.getTransaction();
tx.begin();
for (int i = 0; i < 10000; i++) {
Product product = new Product("item" + i, 10000);
em.persist(product);
//100건λ§λ€ νλ¬μμ μμμ± μ»¨ν
μ€νΈ μ΄κΈ°ν
if(i % 100 == 0) {
em.flush();
em.clear();
}
}
tx.commit();
em.close();
λ€μμΌλ‘ μμ λ°°μΉ μ²λ¦¬λ₯Ό ν λλ νμ΄μ§ μ²λ¦¬ λλ 컀μ λ°©λ²μ μ¬μ©ν¨.
JPA νμ΄μ§ μ²λ¦¬
100κ±΄μ© νμ΄μ§ μΏΌλ¦¬λ‘ μ‘°ννλ©΄μ μνμ κ°κ²©μ 100μμ© μ¦κ°νκ³ , νμ΄μ§ λ¨μλ§λ€ μμμ± μ»¨ν μ€νΈλ₯Ό νλ¬μνκ³ μ‘°κΈ°νν¨.
νμ΄λ²λ€μ΄νΈ scroll μ¬μ©
JPAλ JDBC 컀μλ₯Ό μ§μνμ§ μμ 컀μλ₯Ό μ¬μ©νλ €λ©΄ νμ΄λ²λ€μ΄νΈ μΈμ μ μ¬μ©ν΄μΌ ν¨.
em.unwrap() λ©μλλ₯Ό μ¬μ©ν΄μ νμ΄λ²λ€μ΄νΈ μΈμ μ ꡬν¨. λ€μμΌλ‘ 쿼리λ₯Ό μ‘°ννλ©΄μ scroll() λ©μλλ‘ ScrollableResults κ°μ²΄λ₯Ό λ°νλ°μ. μ΄ κ°μ²΄μ next() λ©μλλ₯Ό νΈμΆνλ©΄ μν°ν°λ₯Ό νλμ© μ‘°νν μ μμ.
νμ΄λ²λ€μ΄νΈ 무μν μΈμ μ¬μ©
무μν μΈμ μ μμμ± μ»¨ν μ€νΈλ₯Ό λ§λ€μ§ μκ³ 2μ°¨ μΊμλ μ¬μ©νμ§ μμ. λ°λΌμ μμμ± μ»¨ν μ€νΈλ₯Ό νλ¬μνκ±°λ μ΄κΈ°ννμ§ μμλ λ¨.
μν°ν°λ₯Ό μμ νλ €λ©΄ 무μν μΈμ μ΄ μ 곡νλ update() λ©μλλ₯Ό μ§μ νΈμΆν΄μΌ ν¨.
15.4.4 SQL 쿼리 ννΈ μ¬μ©
JPQλ λ°μ΄ν°λ² μ΄μ€ SQL ννΈ κΈ°λ₯μ μ 곡νμ§ μμ SQL ννΈλ₯Ό μ¬μ©νλ €λ©΄ νμ΄λ²λ€μ΄νΈλ₯Ό μ§μ μ¬μ©ν΄μΌ ν¨.
Session session = em.unwrap(Session.class); //νμ΄λ²λ€μ΄νΈ μ§μ μ¬μ©
List<Member> list = session.createQuery("select m from Member m")
.addQueryHint("FULL (MEMBER)") //SQL HINT μΆκ°
.list();
select
/* + FULL (MEMBER) */ m.id, m.name
from
Member m
15.4.5 νΈλμμ μ μ§μνλ μ°κΈ° μ§μ°κ³Ό μ±λ₯ μ΅μ ν
νΈλμμ μ μ§μνλ μ°κΈ° μ§μ°κ³Ό JDBC λ°°μΉ
JDBCκ° μ 곡νλ SQL λ°°μΉ κΈ°λ₯μ μ¬μ©νλ©΄ SQLμ λͺ¨μμ λ°μ΄ν°λ² μ΄μ€μ νλ²μ λ³΄λΌ μ μμ.
SQL λ°°μΉλ κ°μ SQLμΌ λλ§ μ ν¨ν΄μ μ€κ°μ λ€λ₯Έ μ²λ¦¬κ° λ€μ΄κ°λ©΄ SQL λ°°μΉλ₯Ό λ€μ μμν¨.
νΈλμμ μ μ§μνλ μ°κΈ° μ§μ°κ³Ό μ ν리μΌμ΄μ νμ₯μ±
νΈλμμ μ μ§μνλ μ°κΈ° μ§μ°κ³Ό λ³κ²½ κ°μ§ κΈ°λ₯μ μ₯μ μ λ°μ΄ν°λ² μ΄μ€ ν μ΄λΈ λ‘μ°μ λ½μ΄ 걸리λ μκ°μ μ΅μννλ€λ μ μ΄λ€.
update(memberA); //UPDATE SQL A
λΉμ¦λμ€λ‘μ§A(); //UPDATE SQL ...
λΉμ¦λμ€λ‘μ§B(); //UPDATE SQL ...
commit();
JPQλ 컀λ°μ ν΄μΌ νλ¬μλ₯Ό νΈμΆνκ³ λ°μ΄ν°λ² μ΄μ€μ μμ 쿼리λ₯Ό 보λ. 쿼리λ₯Ό 보λ΄κ³ λ°λ‘ νΈλμμ μ 컀λ°νλ―λ‘ κ²°κ³Όμ μΌλ‘ λ°μ΄ν°λ² μ΄μ€μ λ½μ΄ 걸리λ μκ°μ μ΅μννλ€.