개발자의 오르막

SpringBoot + JPA QueryDSL 연동 본문

ORM/JPA

SpringBoot + JPA QueryDSL 연동

계단 2019. 10. 8. 16:25

 

# QueryDSL

- http://www.querydsl.com

 

Querydsl - Unified Queries for Java

Unified Queries for Java. Querydsl is compact, safe and easy to learn.

- 타입 세이프한 쿼리 만들수 있게 도와주는 라이브러리

- 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 로 테스트 통과

 

 

 


Comments