querydsl의 q dto는 @queryInjection 으로 연결되어 있는 dto가 변경되었을 때 직접 변경하는 것이 아니라 빌드시 변경이 된다.
- 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;
}
}
}
- 프로젝트 재컴파일
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
- 쿼리 메서드 수정
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();
}
}
- 빌더를 사용한 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 |