SpringBoot Test & Querydsl 테스트

devdo·2023년 1월 27일
0

TDD

목록 보기
5/6
post-thumbnail

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)
  • JPQL의 on 과 성능 최적화를 위한 fetch 조인 제공
profile
배운 것을 기록합니다.

0개의 댓글