엘라의 개발 스케치 Note
[TIL] 내일배움캠프 74일차(23.07.27.) - Query DSL 작성 중 query.where 절 and 조건을 or 조건으로 만들기(BooleanExpression) / Map 에서 value를 한 번에 List에 담기, Map에서 Value를 통해 Key를 가져오기 본문
내일배움캠프/TIL
[TIL] 내일배움캠프 74일차(23.07.27.) - Query DSL 작성 중 query.where 절 and 조건을 or 조건으로 만들기(BooleanExpression) / Map 에서 value를 한 번에 List에 담기, Map에서 Value를 통해 Key를 가져오기
엘라랑이 2023. 7. 27. 23:21To-do
- 플러스 주차 복습 과제 재작성: 회원가입, 로그인 API 재작성
- 알고리즘 문제 풀기
- 플러스 주차 복습 과제 작성: 전체 게시글 목록 조회 API
- 스프링 심화 개선 과제 작성: QueryDSL 을 사용하여 검색 기능 만들기
TIL
- Query DSL 작성 중 query.where 절 and 조건을 or 조건으로 만들기
- ? 게시글 제목, 내용을 Keyword 로 검색하는 기능을 구현하고자 했으나 게시글이 반환되지 않는 문제 발생
@Component
@RequiredArgsConstructor
public class PostRepositoryQueryImpl implements PostRepositoryQuery {
private final JPAQueryFactory jpaQueryFactory;
@Override
public List<Post> search(PostSearchCond cond) {
QPost post = QPost.post;
var query = jpaQueryFactory.select(post)
.from(post)
.where(
post.title.contains(cond.getKeyword()),
post.content.contains(cond.getKeyword())
);
var posts = query.fetch();
return posts;
}
}
- Try
- Try 1. Keyword 를 Controller 에서 Param으로 받아왔는데 Param에서 Keyword를 잘못 가져온 문제인가 싶어 디버깅으로 확인해봤으나 제대로 가져왔음
- Try 2. PostSearchCond 에서 .getKeyword를 가져오지 못하는 것인가 생각이 되어 PostSearchCond 클래스에 @Getter 확인 및 디버깅으로 체크해봤으나 잘 가져옴
- Try 3. 쿼리문 자체에 문제가 있나 싶어 where 절을 모두 주석 처리해보니 모든 게시글이 조회되는 것으로 where 절에 문제가 있다는 것을 알게 됨-> 게시글의 키워드를 제목에 하나 / 내용에 하나 넣어 게시글을 각각 작성해뒀는데, 제목과 내용에 모두 담긴 게시글을 작성하니 해당 게시글은 조회가 된다는 것을 알게 됨! -> where 절에서 ',' 는 And 로 묶인 다는 것을 깨닫고 or 로 적용할 수 있는 방법을 구글링하여 해결함
public List<Post> search(PostSearchCond cond) {
QPost post = QPost.post;
// 제목 또는 내용 중에서 키워드를 포함하는 게시글을 검색 (OR 연산)
BooleanExpression titleContainsKeyword = post.title.contains(cond.getKeyword());
BooleanExpression contentContainsKeyword = post.content.contains(cond.getKeyword());
var query = jpaQueryFactory.select(post)
.from(post)
.where(titleContainsKeyword.or(contentContainsKeyword));
var posts = query.fetch();
return posts;
}
- BooleanExpression?
* BooleanExpression은 Querydsl에서 조건절을 구성하는 데 사용되는 인터페이스입니다.
cf) QueryDSL은 간결하고 가독성이 좋은 쿼리 작성을 위해 자바 코드로 쿼리를 작성할 수 있도록 도와주는 라이브러리
* BooleanExpression은 논리적인 조건을 표현하는 데 사용되며, Predicate, 즉 쿼리에서 WHERE 절에 해당하는 부분을 표현하는 데에도 사용
* BooleanExpression은 여러 조건들을 조합하여 하나의 논리적인 조건으로 만들 수 있으며, 복잡한 조건을 쉽게 조합하여 쿼리를 작성할 수 있습니다.
- Map 에서 value를 한 번에 List에 담기, Map에서 Value를 통해 Key를 가져오기
Map<String, Character> stringChar = new LinkedHashMap<>();
...
// value를 한번에 List에 담는 방법
List<Character> valueList = new ArrayList<>(stringChar.values());
...
String answer = getKeyByValue(stringChar, valueList.get(0));
...
// Map에서 Value를 통해 Key를 가져오는 메소드
public static String getKeyByValue(Map<String, Character> map, Character value) {
for (Map.Entry<String, Character> entry : map.entrySet()) {
if (entry.getValue().equals(value)) {
return entry.getKey();
}
}
return null;
}
Next...
- JPA 강의 듣기
- 플러스 주차 복습 과제, 스프링 심화 개선 과제 작성
- 알고리즘 스터디 및 공부
- AOP 및 어노테이션 적용 공부 -> 스터디 발표 자료 정리
'내일배움캠프 > TIL' 카테고리의 다른 글
Comments