๐ ํ๊ฒฝ
- QueryDSL 5.0.0
- Spring Data JPA 3.1.2
๐ค ์ฌ์ฉ๋ ๋๋ฉ์ธ ์ฝ๋
๐ StarPage Aggregate Root
@Entity
@Getter
@Table(name = "neo_starpage")
public class StarPage {
@EmbeddedId
@AttributeOverride(name = "value", column = @Column(name = "star_page_id"))
private StarPageId starPageId;
@Embedded
private StarPageInfo information;
@ElementCollection
@CollectionTable(name = "neo_starpage_admin", joinColumns = @JoinColumn(name = "star_page_id"))
private Set<NEOMember> admins = new HashSet<>();
@OneToMany(cascade = {CascadeType.PERSIST, CascadeType.REMOVE}, orphanRemoval = true)
@JoinColumn(name = "star_page_id")
@OrderColumn(name = "layout_order")
private List<StarPageLayoutLine> layoutLines = new ArrayList<>();
// ... ์๋ต
}
๐ StarPageInfo VO
@Embeddable
@EqualsAndHashCode
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class StarPageInfo {
@Embedded
@AttributeOverride(name = "url", column = @Column(name = "profile_image_url"))
private Image profileImage;
@Embedded
@AttributeOverride(name = "url", column = @Column(name = "top_representative_image_url"))
private Image topRepresentativeImage;
@Embedded
private StarPageHost host;
@Embedded
@AttributeOverride(name = "value", column = @Column(name = "introduction"))
private StarPageIntroduction introduction;
// .. ์๋ต
}
๐ StarPageHost VO
@Getter
@Embeddable
@EqualsAndHashCode
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class StarPageHost {
@Column(name = "host_nickname")
private String starNickName;
@Column(name = "host_email")
private String email;
@ElementCollection
@CollectionTable(name = "neo_starpage_star_type", joinColumns = @JoinColumn(name = "star_page_id"))
@Enumerated(value = EnumType.STRING)
private Set<StarType> starTypes;
@ElementCollection
@CollectionTable(name = "neo_starpage_sns_line", joinColumns = @JoinColumn(name = "star_page_id"))
@OrderColumn(name = "sns_line_idx")
private List<SNSLine> snsLines;
// .. ์๋ต
}
์์ ๊ฐ์ ์ฝ๋์์, ์คํํ์ด์ง ์ํฐํฐ๋ฅผ Spring Data JPA์ findByStarPageId๋ฅผ ํตํด ์ป๋๋ค๋ฉด @ElementCollection์ ๊ธฐ๋ณธ FetchType์ด Lazy์ด๊ธฐ ๋๋ฌธ์ ์ง์ฐ ๋ก๋ฉ์ ํตํด ์ป์ด์ค๊ฒ ๋๋ค.
ํด๋น ํ๋๋ฅผ ์ฌ์ฉํ๋ ค๋ ์์ ์ ํ๋ก์ ๊ฐ์ฒด์ ์๋์ ์ํด ์ฟผ๋ฆฌ๊ฐ ๋ฐ์ํ๊ณ , ๋ด๋ถ ์กฐ์์ ๊ฐ๋ฅ์ผ ํ๋ค.
์์ ์์์์, ์คํํ์ด์ง์ ์ฃผ์ธ์ ์คํ ์ ํ์ ์ถ๊ฐํ๋ ค๋ ๊ฒฝ์ฐ๋ ํน์ํ ๊ฒฝ์ฐ์ด๋ค. ํญ์ ๋ฐ์ํ๋ ์ผ์ด ์๋๊ธฐ ๋๋ฌธ์ ์ผ๋ฐ์ ์ผ๋ก ์ํฐํฐ๋ฅผ ์ป์ด์ฌ ๋๋ ์คํ ์ ํ์ LAZY ๋ก๋ฉ์ ํ๋ ๊ฒ์ด ์ ๋ฆฌํ๋ค. ์ฆ, ์ํฐํฐ์ ๋ํ ๋ณ๊ฒฝ์ ๋ํด์๋ ์คํ ์ ํ์ LAZY ๋ก๋ฉ์ ํ๋ ๊ฒ์ด ๋ ์ข์ ๋ณด์ธ๋ค.
๊ทธ๋ฌ๋ ์ฌ์ฉ์์๊ฒ ํ๋ฉด ์๋จ์ ๋ณด์ฌ์ค ์คํํ์ด์ง ๋ฐ์ดํฐ์ ์คํ ์ ํ์ด ํฌํจ๋๋ค๋ฉด ์ด๋จ๊น.
์กฐํ๋ฅผ ํ๋ ๊ฒฝ์ฐ์๋ ๋ณ๋ค๋ฅธ JOIN ์์ด LAZY ๋ก๋ฉ์ ์ฌ์ฉํ๊ฒ ๋๋ค๋ฉด, StarPage๋ฅผ Selectํ๋ ์ฟผ๋ฆฌ์ ์คํ ์ ํ์ ์ป์ด์ค๋ ์ฟผ๋ฆฌ๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค.
๋ฐ๋ผ์ ์ด๋ฌํ ๊ฒฝ์ฐ์๋ JOIN์ ํตํด ํ ๋ฒ์ ์ํฐํฐ๋ฅผ ์ป์ด์ค๋ ๊ฒ์ด ์ ๋ฆฌํ๋ค.
@ElementCollection์ ๋ถ์ธ ์ปฌ๋ ์ VO์ ๋ํด์๋ QueryDSL์์ ๋ค์๊ณผ ๊ฐ์ด JOINํ ์ ์๋ค.
@Override
public Optional<StarPage> findStarPageWithInformation(StarPageId starPageId) {
return Optional.ofNullable(queryFactory.
selectFrom(starPage)
.innerJoin(starPage.information.host.starTypes).fetchJoin()
.innerJoin(starPage.information.host.snsLines).fetchJoin()
.where(starPage.starPageId.eq(starPageId))
.fetchOne());
}
๋ณ๋ค๋ฅธ .on() ๋ฉ์๋ ์์ด๋, ํด๋น Qํ์ ๊ฐ์ฒด์์ ์ปฌ๋ ์ VO๋ฅผ ์ ํํ๋ฉด ์๋์ ๊ฐ์ด ์๋์ผ๋ก ์์ด๋๋ฅผ ๊ธฐ์ค์ผ๋ก JOIN์ ํ๊ฒ ๋๋ค.