SpringBoot Querydsl
Spring Boot에서 Querydsl 적용하기
Spring Boot 프로젝트에서 Querydsl을 설정하고 활용하는 방법을 정리한다.
Querydsl을 사용하면 JPQL을 객체 지향적으로 작성할 수 있으며, 가독성이 뛰어난 코드로 데이터 조회를 할 수 있다.
환경 설정
1️⃣ Gradle 설정
Querydsl을 사용하기 위해 Gradle 설정을 추가한다.
plugins {
id 'org.springframework.boot' version '2.5.4'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id 'java'
id "com.ewerk.gradle.plugins.querydsl" version "1.0.10" // Querydsl 플러그인 추가
}
dependencies {
implementation "com.querydsl:querydsl-jpa:4.4.0"
implementation "com.querydsl:querydsl-apt:4.4.0"
compileOnly 'org.projectlombok:lombok:1.18.34'
annotationProcessor 'org.projectlombok:lombok:1.18.34'
}
// Querydsl에서 사용할 경로 설정
def querydslDir = "$buildDir/generated/querydsl"
// Querydsl 설정
querydsl {
jpa = true
querydslSourcesDir = querydslDir
}
// build 시 Querydsl 소스 포함 설정
sourceSets {
main.java.srcDir querydslDir
}
// Querydsl 컴파일 설정
compileQuerydsl {
options.annotationProcessorPath = configurations.querydsl
}
// Querydsl이 compileClassPath를 상속하도록 설정
configurations {
compileOnly {
extendsFrom annotationProcessor
}
querydsl.extendsFrom compileClasspath
}
2️⃣ JPA 설정 (JPAConfig
클래스 추가)
@Configuration
@EnableJpaAuditing
public class JPAConfig {
@PersistenceContext
private EntityManager em;
@Bean
public JPAQueryFactory jpaQueryFactory() {
return new JPAQueryFactory(em);
}
}
실습 예제
3️⃣ Querydsl을 적용할 테이블 (TB_USR
)
create table TB_USR
(
USR_SEQ bigint(38) auto_increment comment '고객 순번'
primary key,
USR_NM varchar(50) default '' not null comment '고객 명',
USR_RN varchar(13) default '' not null comment '고객 주민등록 번호'
)
comment '고객정보';
4️⃣ Entity 정의 (User
클래스)
@Entity
@Table(name = "TB_USR")
@Getter @Setter
@NoArgsConstructor
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "USR_SEQ")
private Long id;
@Column(name = "USR_NM", nullable = false, columnDefinition = "VARCHAR(50) DEFAULT ''")
private String name;
@Column(name = "USR_RN", nullable = false, columnDefinition = "VARCHAR(13) DEFAULT ''")
private String registrationNumber;
}
5️⃣ Repository 설정
public interface UserRepository extends JpaRepository<User, Long>, CustomUserRepository {
}
public interface CustomUserRepository {
}
public class UserRepositoryImpl extends RepositoryBase implements CustomUserRepository {
public UserRepositoryImpl(JPAQueryFactory queryFactory) {
super(queryFactory);
}
}
6️⃣ 단위 테스트
@SpringBootTest
@SpringJUnitConfig
class UserRepositoryTest {
@Autowired
private UserRepository userRepository;
@Test
public void testSaveAndFindById() {
User user = new User("홍길동", "010-1111-1111");
User savedUser = userRepository.save(user);
User foundUser = userRepository.findById(savedUser.getId()).orElse(null);
assertThat(foundUser).isNotNull();
assertThat(foundUser.getName()).isEqualTo("홍길동");
}
}
댓글남기기