인프런 커뮤니티 질문&답변

terecal님의 프로필 이미지
terecal

작성한 질문수

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

주문 검색 기능 개발

findAllByString 함수의 조건문 설정이 잘 이해가 안되요

작성

·

773

0

public List<Order> findAllByString(OrderSearch orderSearch) {

    String jpql = "select o from Order o join o.member m";
    boolean isFirstCondition = true;

    //주문 상태 검색
    if (orderSearch.getOrderStatus() != null) {
        if (isFirstCondition) {
            jpql += " where";
            isFirstCondition = false;
        } else {
            jpql += " and";
        }
        jpql += " o.status = :status";
    }

    //회원 이름 검색
    if (StringUtils.hasText(orderSearch.getMemberName())) {
        if (isFirstCondition) {
            jpql += " where";
            isFirstCondition = false;
        } else {
            jpql += " and";
        }
        jpql += " m.name like :name";
    }

    TypedQuery<Order> query = em.createQuery(jpql, Order.class)
            .setMaxResults(1000);

    if (orderSearch.getOrderStatus() != null) {
        query = query.setParameter("status", orderSearch.getOrderStatus());
    }
    if (StringUtils.hasText(orderSearch.getMemberName())) {
        query = query.setParameter("name", orderSearch.getMemberName());
    }

    return query.getResultList();
}

 

질문:

위에서 isFirstCondition이 true 가 아니면 and 를 붙이는게 잘 이해가 안되요 
where 도 없는 상태에서 and를 붙이는건가요?

 

code)

    if (orderSearch.getOrderStatus() != null) {
        if (isFirstCondition) {
            jpql += " where";
            isFirstCondition = false;
        } else {
            jpql += " and";
        }
        jpql += " o.status = :status";
    }

 

 

https://okky.kr/articles/1347075

답변 3

0

terecal님의 프로필 이미지
terecal
질문자

엄청 친절한 답변 감사합니다. 근데 기본 강의인데도 너무 어렵게 느껴져서 제가 jpa를 실무에서 쓸수 있을 수준으로 배울수 있나 걱정이 많아요 ㅋㅋ;

 

말씀해주신데로 이후 조건 추가와 가독성을 고려해서 즉 형식적인 통일성을 위해 꼭 필요하지는 않지만 형식적으로 맞춘게 의도일수 있을것 같아요

 

근데 jpa 표준 스펙을 적용한 코드나 query dsl로 바꾼 코드를 봐도 동적 쿼리는 간단해 보이지가 않는데 좀더 간단하고 실무에서도 쓸수 있는 코드는 없나요?

 

 

querydsl정도면 criteria에 비하면 동적쿼리는 상당히 유지보수 및 개발 측면에서 편하다고 생각하는데요,

실무에서 복잡한 동적쿼리를 구현해야한다면, 복잡하거나 여타의 이유로 querydsl로는 방향이 안잡힌다 싶으면 mybatis라는 대안이 있을 수 있을 것 같습니다.

-

저는 사용해보진 않고 들어만 본 기술이지만 JOOQ라는 기술도 querydsl과 많이 비교 되더라구요

Jooq 관련해서 직접 사용하신 분의 후기를 보시면 질문자분에게 도움이 될 기술일지, 흥미가 가는지 안가는지 등 파악해볼 수 있을 것 같습니다.

https://zepinos.tistory.com/52

링크 글 참고하시고 관심이 간다면 한번 사용해보시는 것도 좋은 학습 방법이라 생각합니다.

추가로, 영한님도 모든 쿼리를 JPA 와 QueryDSL을 사용하여 구현하지 않습니다.

일부 복잡한 쿼리는 네이티브 쿼리를 다룬다고 하시니 참고해주세요.

https://www.inflearn.com/questions/75006

0

terecal님의 프로필 이미지
terecal
질문자

주문 상태 검색에서 o.status 는 항상 첫번째 조건이거나 아니면 없을텐데 and 조건을 고려할 필요가 없지 않나요?

 

//주문 상태 검색
if (orderSearch.getOrderStatus() != null) {
    if (isFirstCondition) {
        jpql += " where";
        isFirstCondition = false;
    } else {
        jpql += " and";
    }
    jpql += " o.status = :status";
}

말씀하신대로 첫번째 if 문 안의 else는 불필요해보이긴 하네요.

강의에서도 7분 50초 경에 "완전 처음이니까 안넣어도 될 것 같다"고 하시기도 하셨구요.

첫번째 if문(주문상태) 안쪽 else로 jpql += and는 무시하셔도 될 것 같습니다.

추가로 okky에 올리신 글도 확인하였는데

"코미"님이 남긴 답변과 동일한 생각을 하긴하였습니다.

조건이 추가되는 상황에서 코드를 아래에 작성하지 않고 위에다 추가할 경우도 발생할 수 있지 않을까?

라는 생각을 하였는데 이 부분은 추측이여서 따로 말씀드리진 않았고,

가독성과 통일성도 언급하셨는데 이 부분은 저는 고려하지 못하였지만 공감가는 내용이네요.

0

안녕하세요. terecal님, 공식 서포터즈 OMG입니다.
.

쿼리에서 where 문을 한번만 작성하기 위한 코드입니다.

isFirstCondition 을 메서드 시작에 true로 놓고,

처음 호출 될 때, where 을 추가하고 false로 바꿔놓습니다.

이후 false상태기 때문에 where 문이 추가되지 않습니다.

쿼리문에 where을 추가할지, and를 추가할지 분기 타는 코드로 이해하시면 됩니다.
.
감사합니다.

terecal님의 프로필 이미지
terecal

작성한 질문수

질문하기