1. 동적 쿼리

동적쿼리란?

COOKLE 서비스의 동적쿼리

2. 동적 쿼리 & Querydsl

BooleanExpression

@RequiredArgsConstructor
public class BoardRepositoryCustomImpl implements BoardRepositoryCustom {
	private final JPAQueryFactory queryFactory;

	@Override
	public List<BoardResponse.Summary> searchBoards(BoardRequest.Summary request) {
		return queryFactory
			.select(Projections.constructor(BoardResponse.Summary.class,
				board.id,
				users.nickname,
				board.createdAt,
				ExpressionUtils.as(
					JPAExpressions
						.select(boardImage.url).from(boardImage)
						.where(
							boardImage.board.id.eq(board.id),
							boardImage.imageType.eq(ImageType.THUMBNAIL),
							boardImage.deletedAt.isNull()), "url"
				),
				board.likeCount,
				board.replyCount
			))
			.from(board)
			.join(board.users, users)
			.where(
				searchTag(request),
				dateLoe(request),
				dateGoe(request),
				board.deletedAt.isNull()
			)
			.orderBy(sort(request))
			.distinct().fetch();
	}

	private BooleanExpression searchTag(BoardRequest.Summary request) {
		if (StringUtil.isNullOrEmpty(request.getTag())) {
			return null;
		}
		return board.tag.like("%" + request.getTag() + "%");
	}

	private BooleanExpression dateLoe(BoardRequest.Summary request) {
		if (request.getDateLoe().isEmpty()) {
			return null;
		}
		return board.createdAt.after(request.getDateLoe().get());
	}

	private BooleanExpression dateGoe(BoardRequest.Summary request) {
		if (request.getDateGoe().isEmpty()) {
			return null;
		}
		return board.createdAt.before(request.getDateGoe().get());
	}

	private OrderSpecifier<?> sort(BoardRequest.Summary request) {
		if (request.getSortTarget().equals(SortConditions.CREATED_AT_DESC)) {
			return board.createdAt.desc();
		} else if (request.getSortTarget().equals(SortConditions.CREATED_AT_ASC)) {
			return board.createdAt.asc();
		} else if (request.getSortTarget().equals(SortConditions.LIKE_COUNT_DESC)) {
			return board.likeCount.desc();
		} else {
			return board.replyCount.desc();
		}
	}
}

StringUtil