Jpa Data Repository 사용시, @DataJpaTest
를 사용하여 입베디드 모드로 h2 DB를 사용할 수 있지만 현존 사용하는 운영 DB로 사용시 @SpringBootTest
를 사용할 수 있다. 이 블로그에서는
SpringBoot Test 로 테스트하는 방식을 설명할려고 한다.
그와 함께 JPAQueryFactory를 활요한 Querydsl 테스트를 어떻게 구현하는지 정리해 보고자 한다.
@DataJpaTest
// default h2 임베디드 모드 설정이 변경될 수 있으니 사용
runtimeOnly 'com.h2database:h2'
@SpringBootTest
// h2 임베디드 모드 설정 말고 운영 DB 사용하겠다는 뜻
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
@PersistenceContext
: EntityManager를 빈으로 주입할 때 사용하는 어노테이션
: QueryDsl을 테스트하기 위해서는 필수적!(테스트하고는 상관없음)
@Slf4j
@SpringBootTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
class ItemRepositoryTest {
@PersistenceContext
EntityManager em;
@Autowired
private ItemRepository itemRepository;
private Item item;
@BeforeEach
void setup() {
item = Item.builder()
.name("test 상품")
.price(1000)
.description("테스트 상품 상세 설명")
.stock(100)
.build();
itemRepository.save(item);
}
@Test
@DisplayName("상품 명 조회 테스트")
public void findByNameTest() {
List<Item> byName = itemRepository.findByName("test 상품");
for (Item item : byName) {
log.info("item: {}", item);
}
}
@Test
@DisplayName("Querydsl 조회 테스트1")
public void queryDslTest(){
JPAQueryFactory queryFactory = new JPAQueryFactory(em);
QItem qItem = QItem.item;
JPAQuery<Item> query = queryFactory.selectFrom(qItem)
.where(qItem.status.eq(ItemSellStatus.SELL))
.where(qItem.description.like("%" + "테스트 상품 상세 설명" + "%"))
.orderBy(qItem.price.desc());
List<Item> itemList = query.fetch();
log.info("itemList: {}", itemList);
for(Item item : itemList){
System.out.println(item.toString());
}
}
@Test
@DisplayName("Querydsl 조회 테스트2")
public void querydslTest2() {
BooleanBuilder booleanBuilder = new BooleanBuilder();
QItem qItem = QItem.item;
String description = "test_상품_상세_설명10";
int price = 10009;
String itemSellStatus = "SELL";
booleanBuilder.and(qItem.description.like("%" + description + "%"));
booleanBuilder.and(qItem.price.gt(price));
if (StringUtils.equals(itemSellStatus, ItemSellStatus.SELL)) {
booleanBuilder.and(qItem.status.eq(ItemSellStatus.SELL));
}
Pageable pageable = PageRequest.of(0, 5);
Page<Item> itemPageResult = itemRepository.findAll(booleanBuilder, pageable);
log.info("total elements : {}", itemPageResult.getTotalElements());
itemPageResult.getContent().forEach( item -> {
log.info("resultItem: {}", item);
});
}
}
/**
* 팀 A에 소속된 모든 회원
*/
@Test
public void join() throws Exception {
QMember member = QMember.member;
QTeam team = QTeam.team;
List<Member> result = queryFactory
.selectFrom(member)
.join(member.team, team)
.where(team.name.eq("teamA"))
.fetch();
assertThat(result)
.extracting("username")
.containsExactly("member1", "member2");
}
join()
, innerJoin()
: 내부 조인(inner join)leftJoin()
: left 외부 조인(left outer join)rightJoin()
: rigth 외부 조인(rigth outer join)on
과 성능 최적화를 위한 fetch 조인 제공