Spring Data JPA에서는 @QueryProjection이라는 어노테이션을 사용하여 Dto를 Q객체로 만들 수 있습니다.
Q객체란?
Q객체는 Querydsl에서 사용되는 객체입니다. Querydsl은 JPA, SQL, MongoDB와 같은 데이터베이스에 대한 타입 안전한 쿼리를 작성할 수 있도록 지원하는 라이브러리입니다. Q객체는 Querydsl에서 사용되는 도메인 객체입니다. Q객체를 사용하여 도메인 객체의 필드명과 타입을 안전하게 사용할 수 있습니다.
@QueryProjection이란?
@QueryProjection은 Querydsl에서 Dto를 Q객체로 변환하기 위한 어노테이션입니다. @QueryProjection 어노테이션을 사용하면 Dto 클래스에 맞는 Q객체를 생성하여 사용할 수 있습니다.
사용 방법
- 먼저, Gradle이나 Maven을 사용하여 Querydsl을 의존성으로 추가합니다.
- Dto 클래스를 생성합니다.
public class MemberDto {
private Long id;
private String username;
public MemberDto(Long id, String username) {
this.id = id;
this.username = username;
}
// getter, setter
}
3. Q객체를 생성합니다.
import static {패키지 경로}.QMember.*;
public class MemberRepositoryImpl extends QuerydslRepositorySupport implements MemberRepositoryCustom {
public MemberRepositoryImpl() {
super(Member.class);
}
public List<MemberDto> findAllMemberDto() {
QMember member = QMember.member;
return from(member)
.select(new QMemberDto(member.id, member.username))
.fetch();
}
public List<MemberDto> findMemberDtoByUsername(String username) {
QMember member = QMember.member;
return from(member)
.select(new QMemberDto(member.id, member.username))
.where(member.username.eq(username))
.fetch();
}
}
4. Dto 클래스에 @QueryProjection 어노테이션을 추가합니다.
import lombok.Getter;
@Getter
public class QMemberDto extends QueryProjection {
private Long id;
private String username;
public QMemberDto(Long id, String username) {
this.id = id;
this.username = username;
}
}
5. QuerydslPredicateExecutor를 상속받는 인터페이스를 만듭니다.
public interface MemberRepository extends JpaRepository<Member, Long>, MemberRepositoryCustom, QuerydslPredicateExecutor<Member> {
}
6. 사용할 곳에서 Dto를 호출합니다.
@Autowired
MemberRepository memberRepository;
public void test() {
List<MemberDto> memberDtoList = memberRepository.findAllMemberDto();
List<MemberDto> memberDtoListByUsername = memberRepository.findMemberDtoByUsername("username");
}
이렇게 @QueryProjection을 사용하여 Dto를 Q객체로 만들면 도메인 객체의 필드명과 타입을 안전하게 사용할 수 있습니다.
정리
이번 포스팅에서는 Spring Data JPA에서 @QueryProjection을 사용하여 Dto를 Q객체로 만드는 방법에 대해 알아보았습니다.
Q객체를 사용하면 도메인 객체의 필드명과 타입을 안전하게 사용할 수 있으며, @QueryProjection을 사용하면 Dto 클래스에 맞는 Q객체를 생성하여 사용할 수 있습니다.
이렇게 Dto를 Q객체로 만들면 데이터베이스에 대한 타입 안전한 쿼리를 작성할 수 있으며, 코드의 가독성과 유지보수성을 높일 수 있습니다.
'JPA' 카테고리의 다른 글
[JPA] 컬럼 default 값으로 insert (0) | 2022.04.18 |
---|
댓글