지난시간 JPQL에 이어서 오늘은 Querydsl를 사용하여 사용자 정보의 삭제여부 Flag를 업데이트 해보려고 한다.
우선 JPQL과 Querydsl에 차이에 대해 간단하게 알아보자!
앞서 JPQL은 SQL를 추상화하여 객체지향(Entity 객체) 쿼리라고 정리하였다.
따라서 테이블 중심의 개발이 아닌 엔터티 중심의 개발이고 특징으로는 대소문자 구분, 별칭을 필수적으로 사용해야하는 부분이 있다.
JPQL은 Compile 단
계가 아닌 Runtime 단계에서 오류가 발생하기 때문에 장애의 리스크가 Quertdsl보다 높다.
그리고 개인적으로 쿼리문(문자열)을 작성 - > 옮기고 JPQL에 맞게끔 수정하는 과정에서 오기입을 찾기가 쉽지 않았던 것 같다.
Querydsl은 문자열 형태를 펑션화(?)한 느낌이다. 쿼리문을 작성한다기보다 정의된 메소드들을 활용해서 동적쿼리를 만들 수 있고 DB와 통신할 수 있다. 그리고 Compile단계에서 오류를 체크하기 때문에 위에서 말한 오류의 위험을 조금 덜어낼 수 있다.
Springboot 3버전 이상에서의 설정과 활용하여 Delete 예제를 작성해 본다.
build.gradle
// querydsl 버전설정
buildscript {
ext {
queryDslVersion = "5.0.0"
}
}
dependencies {
.....
//querydsl -> spring 3버전 이상은 jakarta로 변경해줘야한다.
implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta"
annotationProcessor "jakarta.annotation:jakarta.annotation-api"
annotationProcessor "jakarta.persistence:jakarta.persistence-api"
}
//querydsl 추가 시작
//빌드시 Q테이블 생성되는 위치
def querydslDir = "$buildDir/generated/querydsl"
querydsl {
jpa = true
querydslSourcesDir = querydslDir
}
sourceSets {
main.java.srcDir querydslDir
}
compileQuerydsl {
options.annotationProcessorPath = configurations.querydsl
}
configurations {
compileOnly {
extendsFrom annotationProcessor
}
querydsl.extendsFrom compileClasspath
}
clean {
delete file(querydslDir)
}
//querydsl 추가 끝
Querydsl.java
Bean 정의
@Configuration
@RequiredArgsConstructor
public class QuerydslConfig {
private final EntityManager entityManager;
@Bean
public JPAQueryFactory jpaQueryFactory() {
return new JPAQueryFactory(entityManager);
}
}
사용자 테이블에 del_yn 컬럼추가
ALTER TABLE TBL_USER_M ADD COLUMN DEL_YN CHAR(1) DEFAULT 'N'
UserController.java
@DeleteMapping(value = "/user")
public ResponseEntity<APIResponse> delUser(@Valid @RequestParam(name = "userId") String userId){
return ResponseEntity.status(HttpStatus.OK).body(APIResponse.of(userService.delUser(userId)));
}
UserService.java
@Transactional
public boolean delUser(String userId) {
userQuerydsl.delUser(userId);
return true;
}
UserQuerydsl.java
@Repository
@RequiredArgsConstructor
public class UserQuerydsl {
private final JPAQueryFactory jpaQueryFactory;
public Long delUser(String userId){
return jpaQueryFactory.update(userEntity)
.set(userEntity.delYn,"Y")
.where(userEntity.userId.eq(userId))
.execute();
}
업데이트 확인 완료.
Querydsl 활용 Flag 업데이트 구현을 진행해보았다.
다음시간에는 AOP 활용하여 로그(입력param / 출력 값)을 찍어보려 한다!
다음시간도 기대해주세요:)
*추가적으로 Q테이블 생성된 경로 캡처(참고)
*메인(base패키지설정)
@EntityScan(basePackages = {"com.kevin.testproj.domain.entity"})
@EnableJpaRepositories(basePackages = {"com.kevin.testproj.domain.repository"})
@ComponentScan(basePackages={"com.kevin.testproj"})
@SpringBootApplication
public class TestprojApplication {
public static void main(String[] args) {
SpringApplication.run(TestprojApplication.class, args);
}
}
'JAVA' 카테고리의 다른 글
땅꼬마의 JPQL 사용하기! (0) | 2023.07.31 |
---|---|
땅꼬마의 Springboot3 + JPA 구현하기! (0) | 2023.07.25 |
땅꼬마의 JPA 개념정리!! (0) | 2023.07.24 |
땅꼬마의 Springboot 3.X 버전에 Swagger 연동하기 (0) | 2023.04.24 |
땅꼬마의 While문 만들기! (0) | 2022.10.11 |