Develop

35일차_SpringBoot: QueryDSL 적용, Boilerplate 마이그레이션, Thymeleaf 전환 본문

백엔드/KDT_Programmers

35일차_SpringBoot: QueryDSL 적용, Boilerplate 마이그레이션, Thymeleaf 전환

230801 2025. 4. 22. 01:41

안녕하세요.

오늘은 데브코스 35일차 (8주1일차) 입니다 .ᐟ .ᐟ 

 

오늘은 쿼리 DSL 적용, 스프링 mvc -> 스프링 부트로 마이그레이션하기, JSP -> Thymeleaf 전환 등을 학습했습니다.

공부하다가 궁금해서 QueryDSL 과 SQL, JPQL 의 차이를 알아봤습니다 .ᐟ

 

 


SQL / JPQL / QueryDSL 차이

SQL 쿼리

  • DB 전용 쿼리 문자열
  • 타입 안전하지 않음
  • 실행전에 오류를 확인하기 어려워, 런타임 에러가 자주 발생

JPQL

  • 객체 기반 쿼리 문자열 (ex. select m from Member m)
  • 문자열이라 타입안전하지 않음
  • 동적 쿼리 생성이 불편함

QueryDSL

 


QueryDSL

  • 개념
    • QueryDSL = 동적 조건 + 자동완성 + 컴파일 타임 체크까지 가능한 자바 기반 쿼리 빌더
    • 타입 안전하게 쿼리를 작성할 수 있도록 도와주는 프레임워크
    • Query, path, expression 3가지로 구성
  • 장점
    • JPQL 표준을 기반으로 자바코드 형식으로 작성가능하며, 타입 세이프 함
    • 컴파일 시에 타입체크를 가능하게 해 오류를 사전 예방 가능
    • IDE의 지원을 통해 필드명을 자동완성하고, 타이핑 오류를 줄여 생산성 향상
    • 강력한 도메인 특화언어(DSL)로 설계되어 단순하고 유창하게 쿼리 구성 가능
  • 단점
    • DTO 없이 ORM 만으로는 복잡한 VIEW 나 JSON 을 처리하기 어렵기 때문에 DTO 설정 필요
    • Entity 의 필드 변경은 테이블에서 모든 데이터를 재구성해야함
    • N + 1 문제 발생하면 성능저하 우려(해결 방법 : fetch join 사용 or DTO 활용해 필요한 데이터만 조회)
  • 기능
    • 복잡한 조건을 설정 할수 있으며, 정렬 기능으로 데이터 나열 가능
    • @Entity 가 붙은 클래스마다 대응되는 Q클래스가 자동으로 생성되며, 이 Q 클래스로 쿼리작성 가능
      • 생성 위치 : target/generated-sources/your-project
    • Q클래스(Q 타입) 란?
Q클래스(Q 타입) 란?

- QueryDSL 이 엔티티를 기반으로 자동 생성한 클래스
    
    ex) [Member.java](http://Member.java) → QMember.java
    
- queryFactory.selectFrom(QMember.member) 처럼 **타입 안전하고 자동완성 가능한 쿼리**를 만들기 위해서 사용

 

// "이름이 '김'으로 시작하고, 나이가 20세에서 30세 사이인 회원"을 검색하는 쿼리 작성

javaQMember m = QMember.member; 

List members = queryFactory.selectFrom(m)
				.where(m.name.startsWith("김"), m.age.between(20, 30))
				.orderBy(m.age.desc())
				.fetch();

 

  • 페이징 처리와 함께 특정 개수의 결과만 가져오는 limit 기능 지원
  • where() 절 안에 조건문을 넣고싶을때 BooleanBuilder() 사용
  • JPA, JDO, MongoDB 등 다양한 저장소를 추상화하여 데이터 조회기능 통합
  • 메서드 체인 방식으로 복잡한 쿼리를 쉽게 작성하고, 특정조건에 맞는 데이터를 효과적으로 가져올 수 있음

 

설정

  • pom.xml에 QueryDSL 관련 의존성 추가
<dependency>
  <groupId>com.querydsl</groupId>
  <artifactId>querydsl-jpa</artifactId>
</dependency>

<dependency>
  <groupId>com.querydsl</groupId>
  <artifactId>querydsl-apt</artifactId>
  <scope>provided</scope>
</dependency>
  • DBConfig : JPAQueryFactory 빈 등록 (@Configuration 및 @RequiredArgsConstructor로 주입)
  • 쿼리 작성 : Repository 커스텀 인터페이스 + 구현체 생성 (CustomRepository, CustomRepositoryImpl)

 

출처 : https://www.youtube.com/watch?v=9Zu5SThOFKw

Type-safe querying using Querydsl - 김영한

 


 

Spring MVC Boilerplate→ Spring Boot Boilerplate 마이그레이션

  • 목적
    • 설정 파일 단순화, 내장 톰캠 및 자동 구성(AutoConfiguration) 활용
    • 전통적인 XML 기반 설정 → JavaConfig 기반 스프링부트 표준 구조로 변환

 

1. 진입점 클래스 추가

  • main 에 작성
  • @SpringBootApplication: 컴포넌트 스캔 + 설정 자동 등록
  • @EnableJpaAuditing: @CreatedDate, @LastModifiedDate 등 엔티티 필드에 자동 시간 기록

 

2. JSP 관련 태그 제거 → Thymeleaf로 전환 준비

  • .jsp 태그 제거 → .html로 전환
  • ViewResolver 관련 설정 생략 가능 (부트에서 자동 설정)

 

3. DTO 명명 규칙

  • 요청/응답 용 객체는 Request, Response 또는 ~Dto 접미사 사용
  • 엔터티와 구분을 위해 dto 는 파일명에 Dto 붙여주기

 

4. Repository 커스텀 구현 구조 도입

  • Repository 커스텀 인터페이스 + 구현체 생성 (CustomRepository, CustomRepositoryImpl)

 

5. ModelMapper 디펜던시 추가 (자동완성 기능)

https://modelmapper.org/getting-started/

  • DTO ↔ Entity 자동 변환용 라이브러리
  • pom.xml에 의존성 추가 후, ModelMapperConfig 등록
    
      org.modelmapper
      modelmapper
      3.2.2
    
  • ModelMapperConfig 를 빈으로 올려서 씀 
@Configuration
public class ModelMapperConfig {
    @Bean
    public ModelMapper modelMapper() {
        return new ModelMapper();
    }
}

 


 

JSP → Thymeleaf 전환

  • 목적
    • Spring Boot와의 호환성 향상
    • 템플릿 문법을 더 직관적으로 사용하기 위함

 

  • 템플릿 구조변경
    JSP (변경 전)  Thymeleaf (변경 후)
    <c:forEach> th:each
    ${user.name} th:text="${user.name}"
    <c:if> th:if, th:unless
    • 기존 .jsp 파일을 .html로 변경하면서 th:text, th:if, th:each 등 Thymeleaf 문법으로 변경
    • 공통 템플릿 분리 (레이아웃 분리 전략)
templates/
├── layout.html
├── fragments.html
├── include/
│   ├── header.html
│   ├── footer.html
├── member/
│   ├── signin.html
│   ├── signup.html
├── book/
│   ├── book-list.html
│   ├── book-regist.html

 

 

  • pom.xml 에 Thymeleaf 의존성 추가
<!-- 보통 이 디펜던시 하나만 추가하면 Thymeleaf 엔진, 뷰 리졸버 등 기본설정 포함됨 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>


<!-- 
Spring Security 와 Thymeleaf 연결해주는 확장 모듈 

(sec: 네임스페이스 쓰려면 
xmlns:sec="http://www.thymeleaf.org/extras/spring-security" 선언 필요!)
-->
<dependency>
  <groupId>org.thymeleaf.extras</groupId>
  <artifactId>thymeleaf-extras-springsecurity6</artifactId>
</dependency>


<!--  
	HTML 레이아웃 템플릿 기능 제공
-->
<dependency>
  <groupId>nz.net.ultraq.thymeleaf</groupId>
  <artifactId>thymeleaf-layout-dialect</artifactId>
  <version>3.4.0</version>
</dependency>
  • 실제 화면에 보여질 HTML View 작성
    • product-list.html, product-regist.html, signin.html, signup.html
  • ViewResolver 관련 설정 변경 (Spring Boot에서는 자동 설정됨)

 

 

 

 

순 공부일로만 35일차인데.. 눈이 점점 안보여요...하루 12시간 이상 모니터만 보고 있어서 그런가...ㅠ-ㅠ

 

암튼 오늘도 고생하셨습니다.... .ᐟ