Search
Duplicate
📒

[스프링 JPA] 06. 나머지 기능들

상태
완료
수업
JPA
주제
JPA
4 more properties
참고

참고!

NOTE
지금 서술하는 기술들은 잘 쓰이지않거나, 쓰는걸 권장하지 않는다!
물론 특정상황에서 사용할수는 있지만, 왠만해서는 자제할것
Specifications, Query By ExampleQueryDSL로 대처되므로 설명생략

Projections

NOTE
엔티티 대신 DTO를 편리하게 조회할 때 사용한다!
전체 엔티티 대신 회원 이름만 조회하고 싶은 경우를 가정해보자.

회원 이름만 조회하고 싶은 경우

public interface UsernameOnly { String getUsername(); }
Java
복사
조회할 엔티티의 필드를 getter 형식으로 지정하면 해당 필드만 선택해서 조회한다!
public interface MemberRepositry ... { List<UsernameOnly> findProjectionsByUsername(@Param("username") String username); }
Java
복사
반환 타입을 잘 지정하자.

인터페이스 기반 Open Projection

public interface UsernameOnly { @Value("#{target.username + ' ' + target.age}") String getUsername(); }
Java
복사
스프링의 SpEL문법을 제공한다 (단 DB에서 필드를 모두 조회하기 때문에 JPQL SELECT 최적화가 안된다,)

클래스 기반 Projection

public class UsernameOnlyDto { private final String username; public UsernameOnlyDto(String username) { this.username = username; } public String getUsername() { return username; } }
Java
복사
생성자의 파라미터 이름으로 매칭한다. (DTO 형식)

동적 Projections

<T> List<T> findProjectionsByUsername(@Param("username") String username, Class<T> type);
Java
복사
제네릭 타입을 지정해줄 수 있음

중첩 구조 처리

public interface NestedClosedProjection { String getUsername(); TeamInfo getTeam(); interface TeamInfo { String getName(); } }
Java
복사
루트 엔티티만 최적화가되고, 2번째는 최적화가 안됨
결론 : 간단한거만 쓰고 복잡해지면 QueryDSL을 사용하자..

네이티브 쿼리

NOTE
가급적 네이티브 쿼리를 사용하지 않는 것이 좋다.
public interface MemberRepository extends JpaRepository<Member, Long> { @Query(value = "select * from member where username = ?", nativeQuery = true) Member findByNativeQuery(String username); }
Java
복사
에시 코드