JPA๋ฅผ ์ฌ์ฉํ๋ค ๋ณด๋ฉด LAZY ํจ์นํ์ ์ผ๋ก relation์ด ๋ฌ๋ ค ์๋ ์ํฐํฐ๋ฅผ ์กฐํํ ๋ n+1 ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
์ด๋ด ๋๋ @EntityGrapth๋ง ๋ฌ์์ฃผ๋ฉด joinํ์ฌ ํ๋ฒ์ selectํ ์ ์๋ค.
์๋๋ ์์์ด๋ค.
Product ํ ์ด๋ธ๊ณผ Sample ํ ์ด๋ธ์ 1:N ๊ด๊ณ์ด๋ค.
๋ฐ๋ผ์ sampleList์ @OneToMany ์ด๋ ธํ ์ด์ ์ ์ค์ ํด์ฃผ์๋ค.
(๋ฐ๋๋ก Sample ์ํฐํฐ์ Product๋ฅผ @ManyToOne ์ค์ ํด์ฃผ์ด๋ ๋๋ค)
@Entity
@ToString
@Table(name = "PRODUCT")
public class Product{
@Id
@Column(name = "PRODUCT_ID", columnDefinition ="VARCHAR(36)")
private String productId;
//์๋ต
@OneToMany
@JoinColumns({
@JoinColumn(name = "SAMPLE_ID", referencedColumnName = "SAMPLE_ID", columnDefinition ="VARCHAR(36)", nullable = false, insertable = false, updatable = false),
})
@OnDelete(action= OnDeleteAction.CASCADE)
private List<Sample> sampleList;
}
@OneToMany ์์ฑ์๋ ์๋์ ๊ฐ์ ๊ฒ๋ค์ด ์๋ค.
- targetEntity
- cascade
- fetch
- mappedBy
- orphanRemoval
์ฌ๊ธฐ์ fetch๋ ๊ด๊ณ Entity์ ๋ฐ์ดํฐ ์ฝ๊ธฐ ์ ๋ต์ ๊ฒฐ์ ํ๋ฉฐ EAGER, LAZY๊ฐ ์์ผ๋ฉฐ, ๋ฐ๋ก ์ค์ ํ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ์ LAZY์ด๋ค.
EAGER๋ก ์ค์ ํ ๊ฒฝ์ฐ ๊ด๊ณ๋ Entity์ ๋ฐ์ดํฐ๋ฅผ ๋ฏธ๋ฆฌ ์ฝ์ด์ค๊ณ , LAZY๋ก ์ค์ ํ ๊ฒฝ์ฐ ์ค์ ๋ก ์์ฒญํ๋ ์๊ฐ์ ๊ฐ์ ธ์จ๋ค.
๋ฐ๋ผ์ ์ํฐํฐ์ EAGER ํน์ LAZY ๋ ์ค ํ๋๋ก ์ ํํ์ฌ ์ธํ ํด์ผ ํ๋๋ฐ ๋ณธ์ธ์ ์ํฉ์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ์กฐํํ๊ณ ์ถ์๋ค.
(ํ์ํ์ง ์์๋ฐ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ค๋ ๊ฒ์ ํจ์จ์ด ๋จ์ด์ง๊ธฐ ๋๋ฌธ์..)
ํด๊ฒฐ๋ฐฉ๋ฒ
๋จผ์ @OneToMany(fetch = FetchType.LAZY) ๋ก ์ค์ ํ์ฌ ์์ฒญํ๋ ์๊ฐ์ ๊ฐ์ ธ์ค๋๋ก ํ์๋ค.
Product Repository์์ findAllById ๋ฅผ ํ๊ฒ ๋๋ฉด Sample์ ์ ์ธํ๊ณ Product์์๋ง ์กฐํํ๋ค.
ํ์ง๋ง ์ด๋ ๊ฒ ์ค์ ํ๋ฉด ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค. ์กฐํ๋ Product ๋ฐ์ดํฐ์์ Sample์ ์ ๊ทผํ๋ฉด ๋ฌ๋ ค์๋ Sample ๊ฐ์ ๋งํผ select ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ฆฐ๋ค. (n+1๋ฌธ์ ๋ฐ์)
Repository๋ฅผ ์์ฑํ ๋ ์๋์ ๊ฐ์ด @EntityGraph ์ด๋ ธํ ์ด์ ์ ์ค์ ํ๋ฉด join ์ฟผ๋ฆฌ๊ฐ ์คํ๋๋ค.
@EntityGraph(attributePaths = {"sampleList"})
List<Product> findAllById(String product_id);
FetchType.LAZY๋ก ์ค์ ํ๊ณ , repository์์ ์ด๋ ๊ฒ ํ์ํ ๊ฒฝ์ฐ์๋ง @EntityGraph ์ด๋ ธํ ์ด์ ์ ์ค์ ํ์ฌ join ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ฉด ์ํฉ์ ๋ง๊ฒ ์์ ์ํฐํฐ๋ฅผ ์กฐํํ๊ฑฐ๋ ์กฐํํ์ง ์์ ์ ์๋ค.
๋๊ธ