๊ฐœ๋ฐœ์ž HOON
๐Ÿ› HOON DEVLog
๊ฐœ๋ฐœ์ž HOON
์ „์ฒด ๋ฐฉ๋ฌธ์ž
์˜ค๋Š˜
์–ด์ œ
  • ๐Ÿ˜Ž ์ „์ฒด ์นดํ…Œ๊ณ ๋ฆฌ (137)
    • ๐Ÿ“ ์‹ ์ž… ์ธํ„ฐ๋ทฐ ์ค€๋น„ (7)
    • ๐Ÿฆ” ์ทจ์—…์ค€๋น„ ๊ธฐ๋ก (7)
    • โ˜• ์ž๋ฐ” : JAVA (5)
    • ๐Ÿ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ๋Œ€๋น„ : PS (80)
    • ๐ŸŒฑ ๋ฐฑ์—”๋“œ : Backend (13)
    • ๐Ÿงช ์ปดํ“จํ„ฐ๊ณผํ•™ : CS (11)
    • ๐Ÿ—‚ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค : DB (1)
    • ๐Ÿƒ‍โ™‚๏ธ DEVLOG (8)
    • โš™๏ธ Trouble Shooting (5)

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ํ™ˆ
  • GitHub
  • Resume

๊ณต์ง€์‚ฌํ•ญ

์ธ๊ธฐ ๊ธ€

์ตœ๊ทผ ๊ธ€

ํ‹ฐ์Šคํ† ๋ฆฌ

hELLO ยท Designed By ์ •์ƒ์šฐ.
๊ฐœ๋ฐœ์ž HOON

๐Ÿ› HOON DEVLog

[QueryDSL] QueryDSL-JPA : @ElementCollection VO์— ๋Œ€ํ•œ JOIN
๐ŸŒฑ ๋ฐฑ์—”๋“œ : Backend

[QueryDSL] QueryDSL-JPA : @ElementCollection VO์— ๋Œ€ํ•œ JOIN

2024. 4. 23. 00:40

๐Ÿ ํ™˜๊ฒฝ

- 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์„ ํ•˜๊ฒŒ ๋œ๋‹ค.

 

 

์ €์ž‘์žํ‘œ์‹œ ๋น„์˜๋ฆฌ ๋™์ผ์กฐ๊ฑด (์ƒˆ์ฐฝ์—ด๋ฆผ)

'๐ŸŒฑ ๋ฐฑ์—”๋“œ : Backend' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[QueryDSL] QueryDSL-JPA : DTO Projection๊ณผ Transform  (1) 2024.04.26
[QueryDSL] QueryDSL-JPA : JOIN ํ•˜๊ธฐ  (0) 2024.04.25
[Spring] Spring Security + OAuth2.0 + JWT Token์„ ํ™œ์šฉํ•œ ์†Œ์…œ๋กœ๊ทธ์ธ ์ด์ •๋ฆฌ - (1) ๋ฐฐ๊ฒฝ ์ง€์‹ ์ดํ•ดํ•˜๊ธฐ, ์ „์ฒด ๊ทธ๋ฆผ ์‚ดํŽด๋ณด๊ธฐ  (0) 2023.09.22
[Spring] API ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ Swagger ๋„์ž…ํ•˜๊ธฐ (gradle ๊ธฐ์ค€)  (0) 2023.03.24
[Spring] @Transactional๊ณผ DB Lock์— DeepDive - (1) DB ํŠธ๋žœ์žญ์…˜, ์‚ฌ์šฉ๋ฐฉ๋ฒ•, ๊ฒฉ๋ฆฌ์ˆ˜์ค€, ์ „ํŒŒ ๋‹จ๊ณ„ ํ›‘์–ด๋ณด๊ธฐ  (0) 2023.03.21
    '๐ŸŒฑ ๋ฐฑ์—”๋“œ : Backend' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
    • [QueryDSL] QueryDSL-JPA : DTO Projection๊ณผ Transform
    • [QueryDSL] QueryDSL-JPA : JOIN ํ•˜๊ธฐ
    • [Spring] Spring Security + OAuth2.0 + JWT Token์„ ํ™œ์šฉํ•œ ์†Œ์…œ๋กœ๊ทธ์ธ ์ด์ •๋ฆฌ - (1) ๋ฐฐ๊ฒฝ ์ง€์‹ ์ดํ•ดํ•˜๊ธฐ, ์ „์ฒด ๊ทธ๋ฆผ ์‚ดํŽด๋ณด๊ธฐ
    • [Spring] API ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ Swagger ๋„์ž…ํ•˜๊ธฐ (gradle ๊ธฐ์ค€)
    ๊ฐœ๋ฐœ์ž HOON
    ๊ฐœ๋ฐœ์ž HOON
    ์ข‹์€ ๋ฐฑ์—”๋“œ ์—”์ง€๋‹ˆ์–ด๊ฐ€ ๋˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋ก์„ ๋ชจ์•˜์Šต๋‹ˆ๋‹ค. # ์ฃผ๋‹ˆ์–ด # ๋ฐฑ์—”๋“œ # ๊ฐœ๋ฐœ์ž

    ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”