Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

엘라의 개발 스케치 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:21

To-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 및 어노테이션 적용 공부 -> 스터디 발표 자료 정리

 

Comments