Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Feature] 이동봉사 공고 필터 검색 API 구현 #43

Merged
merged 4 commits into from
Nov 11, 2023

Conversation

kyeong-hyeok
Copy link
Member

@kyeong-hyeok kyeong-hyeok commented Nov 11, 2023

💡 연관된 이슈

close #42

📝 작업 내용

  • 이동봉사 공고 필터 검색 API 구현
  • Converter 추가
    스프링이 쿼리 매개변수를 객체로 변환할 때는 @ JsonCreator가 적용되지 않음 (URL에서 전달되는 값이기 때문에 JSON 형식이 아닌 단순한 문자열, 숫자)
    @ JsonCreator는 JSON 데이터를 객체로 변환할 때 사용되는데, URL 파라미터는 JSON 형식이 아니므로 적용되지 않는다!
    @ RequestParam을 사용할 때 열거형과 같은 특별한 타입에 대한 변환이 필요한 경우, 별도의 컨버터나 변환기를 등록해야 함
    -> Converter 등록, WebMvcConfigurer 구현함

궁금했던 점
@ RequestBody로 들어오는 Enum 타입에 @ JsonCreater와 Converter 둘다 거치게 된다면 이중 변환 돼서 Exception이 나갈까?
-> @ RequestParam과 @ RequestBody를 함께 사용하는 경우, @ RequestParam은 등록한 컨버터를 통해 문자열을 변환하고, @ RequestBody는 Jackson이 제공하는 기능에 따라 JSON을 객체로 변환됨. 서로 동시에 적용되지 않으며, 서로 다른 매커니즘을 통해 작동한다고 함!
(@ RequestBody를 통해 들어온 JSON 데이터는 스프링의 HttpMessageConverter들에 의해 객체로 변환, 이때 주로 Jackson 라이브러리를 사용하여 JSON 데이터를 Java 객체로 매핑하게 되며, @ JsonCreator 어노테이션은 Jackson에 의해 사용되어 JSON 데이터를 객체로 변환할 때 호출)

  • 이동봉사 공고 필터 검색 Controller 테스트 코드 추가

💬 리뷰 요구 사항

  1. Converter 적용에 있어서 문제가 될 부분이 있을지!
  2. 공고 필터 검색이 중요한 기능이라고 생각하는데 성능상 이점을 가져가기 위해서 캐싱 전략을 도입해야 할 것 같음!
    -> 이 부분에 있어서는 추후에 생각하더라도 현재 쿼리에 있어 수정할 부분 있는지 봐주시면 감사하겠습니다!

@kyeong-hyeok kyeong-hyeok added ✨ Feature 기능 개발 Priority: High 우선순위 높음 🐯 Koeyhk 담당자 labels Nov 11, 2023
@kyeong-hyeok kyeong-hyeok linked an issue Nov 11, 2023 that may be closed by this pull request
3 tasks
Copy link
Member

@hojeong2747 hojeong2747 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

지금도 성능상 잘 짜여진 쿼리라고 생각하고, 캐싱 전략도 같이 공부해 보면 좋을 것 같습니다. 컨버터 사용과 QueryDsl에서의 BooleanExpression 반환 메소드에 대한 인사이트를 얻어갑니다 👍

return new PostSearchRequest(
status, departureLoc, arrivalLoc,
startDate, endDate, size, isKennel, intermediaryName
);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PostStatus, DogSize에 대한 컨버터를 이미 정의해서 설정했는데 여기서 create로 호출을 꼭 해줘야 하나요? 아직 컨버터 개념이 익숙치 않아서 남겨봅니다!

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

지우고 올렸어야 했는데 들어갔네요! 지우고 다시 올리겠습니다~! 최고


// 상세 정보 - 이동봉사 중개명 필터
private BooleanExpression intermediaryNameContains(String intermediaryName) {
return StringUtils.hasText(intermediaryName) ? post.intermediary.name.contains(intermediaryName) : null;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

오, 이렇게 BooleanExpression을 각각 따로 정의해 주는 방식은 처음 보는데요, 저도 더 공부해 보고 좋다면 사용해 보겠습니다!

Copy link
Member

@hojeong2747 hojeong2747 Nov 11, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

BooleanBuilder 사용에 대해서 추가 코멘트 남깁니다!

builder를 사용할지, 직접 where절에 작성할지 결정할 때는 쿼리의 복잡성, 재사용성 및 가독성을 고려해야 하는데 동적 쿼리나 복잡한 조건이 필요한 경우에는 builder를 사용하면 좋다고 합니다.

동적인 검색 조건이나, 사용자 입력에 따라 쿼리 조작이 필요한 경우에 유용하다고 느꼈습니다.

  • 사용자가 입력한 조건에 따라 쿼리를 동적으로 구성해야 할 때 쿼리 작성이 수월했습니다.
  • 다양한 검색 조건이 조합되어 복잡한 쿼리를 생성해야 할 때, builder는 각각의 조건을 조합하고 효율적으로 쿼리 작성하는 데 도움을 준다고 합니다. and, or 연산자를 사용해 여러 검색 조건을 조합하고 필터링할 때 유용!
  • 쿼리 작성 코드가 가독성이 좋고 유지보수가 쉬워집니다. 검색 조건이 복잡하더라도!
  • 동일한 검색 조건을 여러 곳에서 사용해야 하는 경우에도 builder를 만들어서 코드 중복을 방지할 수도 있습니다.
  • 간단한 쿼리의 경우 혹은 고정 조건일 경우는 builder를 쓰지 않아도 무방합니다.

Service와 Repository의 역할

  • Service 계층: 비즈니스 로직을 처리하는 곳이며, QueryDSL의 builder를 사용하여 동적 쿼리를 작성하고 필요한 조건을 생성하는 것이 적합함. service에서 가공할 수 있는 데이터들은 service에서 가공하기
  • Repository 계층: 전달받은 QueryDSL 조건을 사용하여 실제 쿼리를 실행함

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

BooleanBuilder와 BooleanExpression 둘다 사용해 보면서 확인해 봐야겠다!
좋은 정보 감사합니다!!!

@kyeong-hyeok kyeong-hyeok merged commit 6f66f84 into develop Nov 11, 2023
1 check passed
@kyeong-hyeok kyeong-hyeok deleted the feat/42-posts-filter-search-api branch November 11, 2023 15:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
✨ Feature 기능 개발 🐯 Koeyhk 담당자 Priority: High 우선순위 높음
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[Feature] 이동봉사 공고 필터 검색 API 구현
2 participants