개발자의 오르막
SpringBoot + JPA QueryDSL 연동 본문
# QueryDSL
- 타입 세이프한 쿼리 만들수 있게 도와주는 라이브러리
- JPA, SQL, MongoDB, JDO, Lucene, Collection 지원
# QuerydslPredicateExecutor 인터페이스
- Optional<T> findOne(predicate)
- List<T>Page<T>... findAll(Predicate)
- 위의 두가지 메소드가 있다고 생각할 수 있다. 이 두가지를 JPA랑 활용해서 쓰도록 함
보통 Pageable 을 사용함.
# Querydsl 의존성 및 플러그인 추가 (기본적으로 JPA, H2 는 의존성 추가하도록 한다.)
<!-- queryDSL -->
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-apt</artifactId>
<version>4.1.3</version><!--$NO-MVN-MAN-VER$ -->
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-jpa</artifactId>
<version>4.1.3</version><!--$NO-MVN-MAN-VER$ -->
</dependency>
<plugin>
<groupId>com.mysema.maven</groupId>
<artifactId>apt-maven-plugin</artifactId>
<version>1.1.3</version>
<executions>
<execution>
<goals>
<goal>process</goal>
</goals>
<configuration>
<outputDirectory>target/generated-sources/java</outputDirectory>
<processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
</configuration>
</execution>
</executions>
</plugin>
- Maven Update를 통해 위의 target 디렉터리 생성을 시켜준다.
- 생성된 디렉터리 확인
개발환경이 끝났으면 실습을 진행해보도록 하겠다.
Store 에 대한 정보를 게시판 리스트에 전시하는 실습을 진행해보자.
- Store 도메인 생성
@Getter
@Setter
@Entity
@Table(name = "tb_store")
@EqualsAndHashCode(of="storeNum")
@ToString(exclude="user")
public class Store {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long storeNum;
private String storeName;
private String storePhone;
private String storeAddress1;
private String storeAddress2;
private String businessTime;
private String storeHoliday;
private String sotreIntro;
@JsonIgnore
@ManyToOne(fetch=FetchType.LAZY)
private Member user;
}
- User 도메인 생성
@Getter
@Setter
@Entity
@Table(name = "tb_members")
@EqualsAndHashCode(of = "id")
@ToString(exclude="stores")
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false, unique = true)
private String uemail;
private String upw;
@OneToMany(mappedBy="user", fetch=FetchType.LAZY)
private List<Store> stores;
}
- 레파지토리 생성
public interface MypageStoreRepository extends JpaRepository<Store, Long>, QuerydslPredicateExecutor<Store>{
}
자 그럼 레파지토리와 도메인이 생겼으니, querydsl 을 통한 로직이 생성되는지 간단한 테스트를 만들어보자
@Test
public void crud() {
QStore store = QStore.store;
Predicate predicate = store.storeAddress1.containsIgnoreCase("서초구")
.and(store.storeAddress2.startsWith("개포"));
Optional<Store> one = querydslRepo.findOne(predicate);
assertThat(one).isEmpty();
}
- 서초구를 포함하고 있으면서, 개포로 시작하는 주소는 없으니까 Empty 로 테스트 통과
'ORM > JPA' 카테고리의 다른 글
[QueryDsl #1] 프로젝트 환경설정 (0) | 2020.10.25 |
---|---|
[# JPA] Pageable (0) | 2020.06.06 |
Spring Security + JPA 로그인 구현 (String 아이디로 로그인 하기) (0) | 2019.09.26 |
Spring Security Login 기능 구현 (0) | 2019.09.24 |
스프링 데이터 JPA 커스텀 인터페이스 만드는 방법 (0) | 2019.09.24 |
Comments