๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Spring-study๐ŸŒฑ/SpringData-JPA

Section 7-3. Projections

by ๊ธฐ๋ฉฐ๋ˆ… 2023. 1. 29.

์—”ํ‹ฐํ‹ฐ ๋Œ€์‹ ์— DTO๋ฅผ ํŽธ๋ฆฌํ•˜๊ฒŒ ์กฐํšŒํ•  ๋•Œ ์‚ฌ์šฉ
์ „์ฒด ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์•„๋‹ˆ๋ผ ๋งŒ์•ฝ ํšŒ์› ์ด๋ฆ„๋งŒ ๋”ฑ ์กฐํšŒํ•˜๊ณ  ์‹ถ์œผ๋ฉด?

 

์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ค์–ด์ค€๋‹ค.

public interface UsernameOnly {
 String getUsername();
}
public interface MemberRepository ... { 
	List<UsernameOnly> findProjectionsByUsername(String username);
}

ํ…Œ์ŠคํŠธ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

 

์ธํ„ฐํŽ˜์ด์Šค ๊ธฐ๋ฐ˜ Open Proejctions

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์Šคํ”„๋ง์˜ SpEL ๋ฌธ๋ฒ•๋„ ์ง€์›ํ•œ๋‹ค.

public interface UsernameOnly {
     @Value("#{target.username + ' ' + target.age + ' ' + target.team.name}")
     String getUsername();
}

๋‹จ! ์ด๋ ‡๊ฒŒ SpEL๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด, DB์—์„œ ์—”ํ‹ฐํ‹ฐ ํ•„๋“œ๋ฅผ ๋‹ค ์กฐํšŒํ•ด์˜จ ๋‹ค์Œ์— ๊ณ„์‚ฐํ•œ๋‹ค! ๋”ฐ๋ผ์„œ JPQL SELECT ์ ˆ ์ตœ์ ํ™”๊ฐ€ ์•ˆ๋œ๋‹ค.

 

ํด๋ž˜์Šค ๊ธฐ๋ฐ˜ Projection

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์•„๋‹Œ ๊ตฌ์ฒด์ ์ธ DTO ํ˜•์‹๋„ ๊ฐ€๋Šฅ
์ƒ์„ฑ์ž์˜ ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„์œผ๋กœ ๋งค์นญ

package study.datajpa.repository;

public class UsernameOnlyDto {
    private final String username;
    
    public UsernameOnlyDto(String username) {
        this.username = username;
    }
    public String getUsername() {
        return username;
    }
}

 

๋™์  Projections
๋‹ค์Œ๊ณผ ๊ฐ™์ด Generic type์„ ์ฃผ๋ฉด, ๋™์ ์œผ๋กœ ํ”„๋กœ์ ์…˜ ๋ฐ์ดํ„ฐ ๋ฒˆ๊ฒฝ ๊ฐ€๋Šฅ

<T> List<T> findProjectionsByUsername(String username, Class<T> type);

 

์ค‘์ฒฉ ๊ตฌ์กฐ ์ฒ˜๋ฆฌ

public interface NestedClosedProjection {
    
    String getUsername();
    TeamInfo getTeam();
    interface TeamInfo {
        String getName();
    }
}

 

์ฃผ์˜

  • ํ”„๋กœ์ ์…˜ ๋Œ€์ƒ์ด root ์—”ํ‹ฐํ‹ฐ๋ฉด, JPQL SELECT ์ ˆ ์ตœ์ ํ™” ๊ฐ€๋Šฅ
  • ํ”„๋กœ์ ์…˜ ๋Œ€์ƒ์ด ROOT๊ฐ€ ์•„๋‹ˆ๋ฉด
    • LEFT OUTER JOIN ์ฒ˜๋ฆฌ
    • ๋ชจ๋“  ํ•„๋“œ๋ฅผ SELECTํ•ด์„œ ์—”ํ‹ฐํ‹ฐ๋กœ ์กฐํšŒํ•œ ๋‹ค์Œ์— ๊ณ„์‚ฐ

 

์ •๋ฆฌ

  • ํ”„๋กœ์ ์…˜ ๋Œ€์ƒ์ด root ์—”ํ‹ฐํ‹ฐ๋ฉด ์œ ์šฉํ•˜๋‹ค.
  • ํ”„๋กœ์ ์…˜ ๋Œ€์ƒ์ด root ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋„˜์–ด๊ฐ€๋ฉด JPQL SELECT ์ตœ์ ํ™”๊ฐ€ ์•ˆ๋œ๋‹ค!
  • ์‹ค๋ฌด์˜ ๋ณต์žกํ•œ ์ฟผ๋ฆฌ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ์—๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ๋‹ค.
  • ์‹ค๋ฌด์—์„œ๋Š” ๋‹จ์ˆœํ•  ๋•Œ๋งŒ ์‚ฌ์šฉํ•˜๊ณ , ์กฐ๊ธˆ๋งŒ ๋ณต์žกํ•ด์ง€๋ฉด QueryDSL์„ ์‚ฌ์šฉํ•˜์ž