[Spring Boot] Spring Boot3 에서 QueryDSL 세팅(with.vscode)
1. 개요
오늘은 최신 Spring Boot 3.3.x 환경에서 vscode 에디터를 사용하여 querydsl 세팅하는 방법에 대해서 포스팅 하겠습니다.
이 방법은 mac, windows 동일하게 세팅이 가능합니다.
1.1 메이븐사용
저는 원래 빌드툴은 Gradle 을 더 선호하는 편이긴 한데 vscode 로 스프링부트를 개발 하다 보면 알 수 없는 에러들 때문에 (익스텐션 오류같음) 프로젝트를 재 세팅해야 하는 경우가 몇번 있었습니다.
그때마다 gradle 캐시를 전부 삭제하고 다시 세팅하면 되긴 됐지만 원인을 찾지 못해 고생 했던 기억이 있습니다.
같은 프로젝트를 인텔리제이 에서 세팅하면 아무문제 없이 잘 돌아 가긴 하더군요.
하지만 저는 vscode 환경이 너무 좋아서 스프링부트 개발환경으로 사용하는 입장이라 방법을 찾고 싶었고 maven으로 빌드툴을 바꾸니 그런 에러는 사라졌습니다.
그래서 vscode 로 스프링부트 를 개발 하려고 하시는 분들은 maven 을 사용 하시는것을 권장 합니다.
인텔리제이나 STS4 를 쓰는경우는 빌드툴의 영향은 없을듯 합니다.
2. 준비
2.1 샘플프로젝트 세팅
위와 같이 빌드툴 maven, jdk는 21을 선택해 줍니다.
2.2 application.yml 세팅
application.properties
파일을 application.yml
로 변경하고 h2 데이터 베이스에 대한 세팅을 우선 해줍니다.
server:
port: 8085
spring:
application:
name: demo
datasource:
url: jdbc:h2:mem:testdb
driver-class-name: org.h2.Driver
username: sa
password: ''
h2:
console:
enabled: true
jpa:
database-platform: org.hibernate.dialect.H2Dialect
hibernate:
ddl-auto: create-drop
show-sql: true
2.3 pom.xml 수정
<!-- QueryDSL Start -->
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-jpa</artifactId>
<version>${querydsl.version}</version>
<classifier>jakarta</classifier>
</dependency>
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-apt</artifactId>
<version>${querydsl.version}</version>
<classifier>jakarta</classifier>
</dependency>
<!-- QueryDSL End -->
pom.xml
파일에서 위 내용만 추가하면 querydsl 의 모든 세팅이 끝이납니다.
시시하게도 이게 끝입니다.
3. 테스트로직 작성
QueryDSL 에 대한 세팅이 끝났으니 테스트를 해봅시다.
테스트를 위한 간단한 로직들을 작성해봅시다.
3.1 엔티티, DTO 작성
우선 테스트를 위한 아주 간단한 엔티티를 작성합니다.
Todo.java
package com.codingjalhaja.demo.entity;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Entity
@Getter @Setter
@NoArgsConstructor
public class Todo {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String content;
}
TodoDto.java
package com.codingjalhaja.demo.dto;
import lombok.Data;
@Data
public class TodoDto {
private Long todoId;
private String todoContent;
}
3.2 리파지토리 작성
TodoRepository.java
package com.codingjalhaja.demo.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import com.codingjalhaja.demo.entity.Todo;
public interface TodoRepository extends JpaRepository<Todo, Long>, TodoRepositoryCustom {
}
TodoRepositoryCustom.java
package com.codingjalhaja.demo.repository;
import java.util.List;
import com.codingjalhaja.demo.dto.TodoDto;
public interface TodoRepositoryCustom {
List<TodoDto> getTodos();
}
TodoRepositoryImpl.java
package com.codingjalhaja.demo.repository;
import java.util.List;
import com.codingjalhaja.demo.dto.TodoDto;
import com.querydsl.core.types.Projections;
import com.querydsl.jpa.impl.JPAQueryFactory;
import jakarta.persistence.EntityManager;
import static com.codingjalhaja.demo.entity.QTodo.todo;
public class TodoRepositoryImpl implements TodoRepositoryCustom{
private final JPAQueryFactory queryFactory;
public TodoRepositoryImpl(EntityManager em) {
this.queryFactory = new JPAQueryFactory(em);
}
@Override
public List<TodoDto> getTodos() {
return queryFactory
.select(Projections.fields(TodoDto.class,
todo.id.as("todoId"),
todo.content.as("todoContent")
))
.from(todo)
.fetch();
}
}
3.3 컨트롤러 작성
컨트롤러는 간단히 테스트만을 위해서 등록과 조회 두가지만 만들겠습니다.
원래는 비지니스 로직은 서비스 빈을 만들어 처리하는게 맞지만 지금은 간단한 테스트만 하기 때문에 컨트롤러 에서 다 작성하겠습니다.
TodoController.java
package com.codingjalhaja.demo.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.codingjalhaja.demo.dto.TodoDto;
import com.codingjalhaja.demo.entity.Todo;
import com.codingjalhaja.demo.repository.TodoRepository;
import lombok.RequiredArgsConstructor;
import java.util.List;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
@RestController
@RequestMapping("/api")
@RequiredArgsConstructor
public class TodoController {
private final TodoRepository todoRepository;
@GetMapping("/todo")
public List<TodoDto> getTodos() {
return todoRepository.getTodos();
}
@PostMapping("/todo")
public void postTodo(@RequestBody TodoDto todoDto) {
Todo todo = new Todo();
todo.setContent(todoDto.getTodoContent());
todoRepository.save(todo);
return;
}
}
4. 테스트
이제 간단한 로직도 다 작성했고, QueryDSL이 잘동작 하는지 테스트를 해봅시다.
4.1 등록테스트
포스트맨으로 간단한 로직을 작성했으니 api 를 날려봅니다.
위와 같이 잘 등록이 된거 같습니다.
h2 데이터베이스도 확인해봅시다.
디비에도 잘 들어간걸로 확인이 됩니다.
4.2 조회테스트
데이터를 잘 등록했으니 조회를 해봐야겠죠.
조회로직은 QueryDSL 로 작성했으니 잘 되나 테스트해봅시다.
조회 로직 역시 위와 같이 잘 동작 하는걸 확인할 수 있습니다.
5. 결론
위와 같이 vscode 에서도 아주 간단하게 QueryDSL 을 설정 하고 활용 할 수가 있습니다.
이 방법은 windows, mac 동일하게 잘 동작합니다.
제가 두 환경다 vscode 로 개발하기 때문에 아무문제 없이 잘 사용하고 있습니다.
사실 처음에는 vscode 에서는 spring 개발을 하기 힘들었는데 갈수록 더 편해지는 방법이 나와서 좋은것 같습니다.
오늘의 포스팅은 여기서 마치겠습니다.
댓글남기기