본문 바로가기
데이터베이스 & ORM

Q DTO

by DoRightting 2024. 7. 21.

querydsl의 q dto는 @queryInjection 으로 연결되어 있는 dto가 변경되었을 때 직접 변경하는 것이 아니라 빌드시 변경이 된다.

  1. DTO 클래스 수정

기존의 UserDTO 클래스에 LocalTime 타입의 sendTime 필드를 추가하고, 빌더 패턴을 적용

import com.querydsl.core.annotations.QueryProjection;
import java.time.LocalTime;

public class UserDTO {
    private Long id;
    private String username;
    private String email;
    private LocalTime sendTime;// 새로운 필드

    @QueryProjection
    public UserDTO(Long id, String username, String email, LocalTime sendTime) {
        this.id = id;
        this.username = username;
        this.email = email;
        this.sendTime = sendTime;
    }

    private UserDTO() {}

// Getter 메서드들...

    public static Builder builder() {
        return new Builder();
    }

    public static class Builder {
        private Long id;
        private String username;
        private String email;
        private LocalTime sendTime;

        public Builder id(Long id) {
            this.id = id;
            return this;
        }

        public Builder username(String username) {
            this.username = username;
            return this;
        }

        public Builder email(String email) {
            this.email = email;
            return this;
        }

        public Builder sendTime(LocalTime sendTime) {
            this.sendTime = sendTime;
            return this;
        }

        public UserDTO build() {
            UserDTO userDTO = new UserDTO();
            userDTO.id = this.id;
            userDTO.username = this.username;
            userDTO.email = this.email;
            userDTO.sendTime = this.sendTime;
            return userDTO;
        }
    }
}
  1. 프로젝트 재컴파일

DTO 클래스를 수정한 후, 프로젝트를 재컴파일하여 QDTO 클래스를 자동으로 업데이트함(나는 직접 수정해서 page 객체를 활용해서 pagination 할 때 sorting이 안됨). 재컴파일 방법은 개발 환경에 따라 다름

  • IDE 사용 시:
    • IntelliJ IDEA: Build -> Rebuild Project 또는 Ctrl + F9 (Windows/Linux) / Cmd + F9 (Mac)
    • Eclipse: Project -> Clean...
  • 빌드 도구 사용 시:
    • Maven: mvn clean compile
    • Gradle: ./gradlew clean build 또는 gradlew.bat clean build (Windows)
  • Querydsl 특화 태스크 (Gradle): ./gradlew compileQuerydsl
  1. 쿼리 메서드 수정

UserRepository 클래스의 쿼리 메서드를 수정하여 새로운 sendTime 필드를 포함

import com.querydsl.jpa.impl.JPAQueryFactory;
import java.time.LocalTime;

public class UserRepository {

    private final JPAQueryFactory queryFactory;

    public UserRepository(JPAQueryFactory queryFactory) {
        this.queryFactory = queryFactory;
    }

    public List<UserDTO> getUserDTOs() {
        return queryFactory
            .select(new QUserDTO(
                qUser.id,
                qUser.username,
                qUser.email,
                qUser.sendTime))// sendTime 필드 추가
            .from(qUser)
            .fetch();
    }
}
  1. 빌더를 사용한 DTO 생성 예제
UserDTO userDTO = UserDTO.builder()
    .id(1L)
    .username("john_doe")
    .email("john@example.com")
    .sendTime(LocalTime.of(14, 30))// 예: 오후 2시 30분
    .build();

주의사항:

  • @QueryProjection 어노테이션과 빌더 패턴을 함께 사용하여 Querydsl 쿼리와 일반 객체 생성 모두에 대응
  • LocalTime 타입 사용 시 데이터베이스의 시간 타입과 Java의 LocalTime이 올바르게 매핑되는지 확인필요.
  • 데이터베이스에 sendTime 필드가 추가되었는지 확인하고, 필요시 쿼리에서 적절한 변환이나 기본값 설정을 고려해야 됨.
  • 재컴파일 후 IDE의 import 문이 자동으로 업데이트되지 않을 수 있으므로, 필요시 수동으로 조정.

'데이터베이스 & ORM' 카테고리의 다른 글

VACUUM ANALYZE  (1) 2024.11.11
PostgreSQL GIN  (5) 2024.11.10
QueryDSL 개요  (0) 2024.07.25
JPA에서의 엔티티 참조 조회 방식  (1) 2024.07.24
Entity, Repository, DTO, domain, service의 연관성과 개념  (0) 2024.07.20