Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
| 29 | 30 | 31 |
Tags
- 네트워킹데이
- spring boot
- 이진탐색
- Less
- zsh
- 오일러 경로
- 데이크스트라
- 스터디2기
- 맥
- zsh theme
- mysql 표
- 인프런워밍업클럽
- 순차탐색
- cs
- 오블완
- VI
- oh-my-zsh
- 터미널
- CS스터디
- 동적 프로그래밍 방법
- 인프런
- 욕심쟁이 방법
- 분할정복 방법
- 티스토리챌린지
- MySQL
- 알고리즘
- Pager
- table status
- mysql 표 출력
- mycli
Archives
- Today
- Total
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
- 자바코드로 쿼리 작성 (ex. QMember.member.age.gt(20))
- 설정 필요, 러닝커브 있음
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
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시간 이상 모니터만 보고 있어서 그런가...ㅠ-ㅠ
암튼 오늘도 고생하셨습니다.... .ᐟ
'백엔드 > KDT_Programmers' 카테고리의 다른 글
| 37~40일차_1차 팀 프로젝트 진행 (상품 주문 관리 프로젝트) (0) | 2025.05.03 |
|---|---|
| 36일차_공공데이터 (Open API) + Spring Cloud (OpenFeign) 연동 실습 (0) | 2025.04.29 |
| 34일차_Spring-JPA(영속성 컨텍스트, Entity 연관관계 매핑, N+1문제, CRUD), Spring-data(JPA 설정 및 사용, QueryDSL 사용준비) (0) | 2025.04.21 |
| 33일차_Spring Boot, Thymeleaf, JPA, JPQL (0) | 2025.04.21 |
| 32일차_Spring-security 인증/인가 실습 (0) | 2025.04.17 |