불리언빌더, 큐보드 뜻

Yeeun·2025년 4월 24일
0

SpringBoot

목록 보기
23/46

💡 1. BoardFilter가 뭐야?

사용자가 검색에 필요한 조건을 요청할 수 있도록 키워드페이지 정보를 담는 DTO(Data Transfer Object)예요.

class BoardFilter {
	private String key;       // 검색 조건 이름 (title, content, writer 중 하나)
	private String value;     // 검색할 값
	private Integer pageNum = 0;   // 페이지 번호 (기본값 0)
	private Integer pageSize = 5;  // 한 페이지에 보여줄 글 수 (기본값 5)
}

📌 이 필드는 사용자가 요청 URL에 파라미터로 넘길 수 있는 값이에요.
예:

http://localhost:8080/test/boardlist?key=title&value=1&pageNum=0&pageSize=10

💡 2. BooleanBuilder는 뭐야?

Querydsl에서 동적으로 조건문을 추가해주는 "조건 빌더"입니다.

예를 들어:

if (검색 조건 있음) {
    builder.and(조건 추가);
}

조건이 있을 때만 .and()로 붙여서 동적으로 where절을 만드는 역할을 해요.


💡 3. QBoard는 뭐야?

Querydsl이 Board 엔티티를 분석해서 만든 쿼리용 전용 클래스예요.

QBoard qboard = QBoard.board;

이걸 통해 title, content, writer 같은 필드에 타입 안전하게 접근할 수 있어요.

  • qboard.title.contains("abc") → JPQL로는 where b.title like '%abc%'
  • qboard.writer.eq("홍길동") → JPQL로는 where b.writer = '홍길동'

자동 생성되는 QBoard 클래스는 Board 엔티티에 대한 Querydsl 버전의 클래스예요.
보통 Gradle이나 Maven에서 Querydsl 플러그인이 컴파일 타임에 만들어줘요.


💡 4. 그럼 쿼리문은 어디 저장되는 건데?

사실 쿼리문은 직접 문자열로 저장되지 않고, BooleanBuilder에 조건을 담아 findAll(builder) 할 때 자동 생성돼요.

List<Board> boards = (List<Board>) boardRepo.findAll(builder);

이 시점에서 내부적으로 조건을 조합해서 SQL 쿼리를 만들어 실행하는 거예요.


✅ 흐름 요약

1. 클라이언트 → /test/boardlist?key=title&value=1&pageNum=0&pageSize=5

2. Spring → BoardFilter 객체 자동 바인딩 (요청 파라미터를 자바 객체에 넣어줌)

3. 컨트롤러에서 BooleanBuilder를 사용해 조건 쿼리를 동적으로 조립

4. DynamicBoardRepository.findAll(BooleanBuilder) 로 조건 쿼리 실행

5. 결과 리스트 리턴

큐보드랑 불리언빌더랑 비슷한거 아닌가?

좋은 질문이에요! 직관적으로 둘 다 “조건”에 관련된 걸 하니까 비슷해 보이는데, 역할이 완전히 달라요.


✨ 간단 요약:

이름역할비유
QBoard쿼리 대상 (엔티티의 필드를 안전하게 접근하기 위한 도구)"어떤 데이터에 대해 검색할지" 말하는 대상 설명서
BooleanBuilder조건 조합 도구 (where절을 조립함)조건들을 담는 장바구니 / 빌더

🔍 자세히 설명하면

1. QBoard란?

  • Board 엔티티의 각 필드를 쿼리 DSL용으로 쓸 수 있게 만든 클래스예요.
  • 대상 필드를 타입 안전하게 참조할 수 있게 도와줘요.
QBoard qboard = QBoard.board;

qboard.title.contains("abc"); // title 필드를 조건으로 사용
qboard.writer.eq("홍길동"); // writer 필드를 조건으로 사용

무엇을 기준으로 조건을 걸지 정의하는 “접근자 역할”이에요.


2. BooleanBuilder란?

  • Querydsl에서 동적으로 조건을 추가/조합할 수 있게 해주는 도구예요.
  • 조건이 있을 때만 .and()로 붙여주는 방식.
BooleanBuilder builder = new BooleanBuilder();

if (검색조건이 있으면) {
    builder.and(qboard.title.contains("abc"));
}

조건들을 누적시켜 하나의 where절로 만드는 빌더 역할이에요.


🔁 쉽게 말하면

// QBoard: "Board" 테이블의 필드에 접근하는 도구 (무엇을 쿼리할 건지)
QBoard qboard = QBoard.board;

// BooleanBuilder: 조건을 계속 추가해서 조합하는 도구 (쿼리를 어떻게 만들지)
BooleanBuilder builder = new BooleanBuilder();
builder.and(qboard.title.contains("1"));
builder.and(qboard.writer.eq("홍길동"));

→ 하나는 ‘필드에 접근’, 하나는 ‘조건을 누적’해주는 거예요.

좋아, 지금 이 코드:

BooleanBuilder builder = new BooleanBuilder();
builder.and(qboard.title.contains("1"));
builder.and(qboard.writer.eq("홍길동"));

이게 Querydsl에서 쿼리를 프로그래밍 방식으로 작성한 거고, 실제로는 다음과 같은 SQL 쿼리로 변환돼요:


🔍 실제 SQL로 변환되는 쿼리 예:

SELECT *
FROM board
WHERE title LIKE '%1%'
  AND writer = '홍길동';

✨ 각 부분 해석

  • qboard.title.contains("1")
    title LIKE '%1%'
    : "title" 컬럼에 '1'이라는 문자열이 포함된 레코드

  • qboard.writer.eq("홍길동")
    writer = '홍길동'
    : writer가 정확히 '홍길동'인 레코드

  • .and()
    → 조건을 AND로 조합해주는 함수


이렇게 Querydsl은 자바 코드로 SQL의 WHERE절을 조립하는 방식이에요.
Querydsl을 쓰면 동적 조건 추가, 컴파일 타임 오류 방지, IDE 자동완성 등의 장점이 있어서 복잡한 검색 조건에 특히 강력하죠.

좋은 질문이에요! 😊
Querydsl에서 자주 보게 되는 Predicate—이건 쉽게 말해서 "조건식" 이라고 보면 돼요.


🔹 Predicate란?

Predicate는 Java에서 "참/거짓을 판별하는 함수형 인터페이스"예요.
Querydsl에서는 이걸 SQL의 WHERE 조건에 해당하는 논리 표현식을 만들기 위해 사용해요.

public interface Predicate {
    boolean test(T t);
}

🔸 Querydsl에서 Predicate는?

Querydsl에서는 Predicate 타입을 다음처럼 사용해요:

Predicate predicate = qboard.title.contains("1").and(qboard.writer.eq("홍길동"));

이걸 사용하면 아래처럼 findAll() 안에 조건을 넘겨줄 수 있어요:

boardRepo.findAll(predicate);

즉, Predicate는 WHERE title LIKE '%1%' AND writer = '홍길동' 같은 "조건 그 자체"를 담는 객체예요.


🔍 예시 비교

// BooleanBuilder는 조건을 점점 쌓아나갈 때 주로 사용
BooleanBuilder builder = new BooleanBuilder();
if (조건) builder.and(qboard.title.contains("test"));

// Predicate는 조건이 이미 하나로 완성됐을 때 쓰기 좋음
Predicate predicate = qboard.title.contains("test").and(qboard.writer.eq("홍길동"));

✅ 정리하면

개념역할
QBoardBoard 엔티티를 Querydsl에서 쓰기 위한 클래스
BooleanBuilder여러 조건을 순차적으로 쌓는 빌더 도구
PredicateSQL의 WHERE 조건에 해당하는 논리식 표현

필요한 만큼 builder로 조건을 조립해서, 마지막엔 Predicate처럼 넘기는 거예요.
둘은 같은 "조건"을 표현하지만, 어떻게 만드느냐와 쓰임새가 조금 달라요.

맞아요! 완벽하게 이해하셨어요 👏

아까 예시로 만든 Querydsl 조건문:

Predicate predicate = qboard.title.contains("test").and(qboard.writer.eq("홍길동"));

이건 실제 SQL로 표현하면:

SELECT * FROM board
WHERE title LIKE '%test%'
  AND writer = '홍길동';

이렇게 됩니다!

qboard.title.contains("test")title LIKE '%test%'
qboard.writer.eq("홍길동")writer = '홍길동'

Querydsl이 이런 식으로 Java 코드 안에서 SQL 조건을 타입 안정성 있게 만들 수 있게 도와주는 거예요.

더 궁금한 조건 있으면 그것도 같이 쿼리로 바꿔줄게요! 😊

0개의 댓글