백기선 강사님의 '스프링과 JPA 기반 웹 애플리케이션 개발' 강의를 수강 후 공부하며 작성한 포스팅입니다.
😁 목표
이번 포스팅에서는 검색 기능을 구현해보려고 한다!
( QueryDSL을 사용해서 검색 기능을 구현할 예정 )
정말 간단하게 keyword만 입력했을 때
공개된 study만 검색 되어야하고, keyword가 study 제목에 있거나
tag나 zone에 겹치는 단어가 있을 때 결과로 출력되도록 만들어주면 된다!
그리고 화면에 보여줄 study의 정보는
- 스터디 이름
- 짧은 소개
- 태그
- 지역
- 멤버 수
- 스터디 공개 일시
이렇게만 보여주면 된다.
이제 하나씩 단계별로 구현해보자!
👻 검색 기능 구현 (Server)
검색 기능은 Repository에 메소드를 만들어 Query를 검색하는 방법 말고,
QueryDSL을 사용해서 기능을 구현하려고 한다.
저번 포스티에서 이용했던 Predicate를 만들어 사용하는 방법 말고,
이번에는 확장 구현체를 만드는 방법으로 QueryDSL을 적용시켜보려고 한다.
1. StudyRepositoryExtension
✔ QueryDSL을 사용하기 위해서 새로운 Study의 Repository인 StudyRepositoryExtension 인터페이스를 만들어준다.
( 인터페이스의 이름은 StudyRepository + 아무 단어나 상관없음 )
✔ 'keyword'로 search를 할 수 있는 추상 메서드를 만들어준다.
2. StudyRepository
✔ StudyRepository에 위에서 만든 StudyRepositoryExtension을 상속받아준다.
이렇게 상속받는다고 findByKeyword를 사용할 수 있을까?
-> 없음. StudyRepositoryExtension 인터페이스의 구현체를 따로 또 만들어줘야 한다.
3. StudyRepositoryExtensionImpl
✔ 이 구현체의 이름은 꼭 구현해야 할 인터페이스의 이름 + Impl 이어야 한다.
✔ StudyRepositoryExtension을 상속받았기 때문에 findByKeyword 메서드를 override 해야 한다.
✔ QueryDSL을 편리하게 사용하기 위해서 QuerydslRepositorySupport를 상속받아준다.
3-1. 컴파일 에러 발생
✔ QuerydslRepositorySupport을 상속받았더니 컴파일 에러가 발생한다.
발생하는 이유는 뭘까??
-> StudyRepositoryExtensionImpl의 인스턴스를 만들려고 하면 기본 생성자 밖에 없기 때문에 기본 생성자가 실행된다. (명시적 생서자가 존재하지 않으므로 JAVA에서 자동으로 기본 생성자를 만들어줌)
근데 이때 QuerydslREpositorySupport를 상속받고 있기 때문에 부모 클래스(QuerydslREpositorySupport)의 기본 생성자를 먼저 호출하고 StudyRepositoryExtensionImpl의 기본 생성자를 실행해줘야 한다.
근데 부모 클래스의 기본 생성자가 존재하지 않기 때문에 에러가 발생하는 것이다.
부모 클래스엔 기본 생성자가 아닌 class 타입을 입력받는 명시적 생성자만 존재한다. (아래 그림 참조)
따라서 에러를 해결하기 위해선 StudyRepositoryExtensionImpl에 부모 클래스의 명시적 생성자에 사용될 도메인 타입을 지정해주면 된다.
* 우리는 어떤 도메인 타입을 다루는 Repository인지 알고 있기 때문에 우리가 사용할 Study타입으로 super(부모 클래스 생성자)에서 사용될 class를 지정해주면 된다.
3-2. QueryDSL 사용해서 조회하기
✔ QueryDSL을 사용해서 검색 기능 쿼리를 만들어준다.
✔ QStudy.study == study로 static import 함.
✔ study가 공개 상태일 때 && (study 제목에 keyword가 들어가거나 OR study 지역에 keyword가 들어가거나 OR study 주제에 keyword가 들어간 경우) 일 때의 결과를 조회하도록 만들어 준다.
4. MainController
✔ 위에서 만들어준 findByKeyword를 통해서 검색 결과를 받아와서 model에 담아준다
✔ keyword도 view 화면에서 사용해 주기 위해서 함께 model에 담아 view로 보내준다
👻 검색 기능 구현 View
- search.html
✔ controller에서 받은 studyList의 사이즈에 따라 검색 결과 개수를 보여준다.
✔ Study에 들어있는 정보들로 search 결과 화면을 구성해준다.
⚡ SecurityConfig
✔ 구현해준 검색 기능을 로그인하지 않은 사용자도 사용할 수 있도록 SecurityConfig에 "/search/study" 경로를 추가해준다.
😎 마무리
검색창에 원하는 keyword를 검색해서 title, tag, zone에 keyword가 있으면 검색 결과에 출력되면 된다!
'💖 Java > Spring Data JPA' 카테고리의 다른 글
[ StudyOlle ] 검색(3) - 페이징 적용 (0) | 2022.04.12 |
---|---|
[ StudyOlle ] 검색(2) - N + 1 문제 해결 (0) | 2022.04.11 |
[ StudyOlle ] 알림(7) - 모임 관련 알림 (0) | 2022.04.10 |
[ StudyOlle ] 알림(6) - 스터디 변경 알림 (0) | 2022.04.10 |
[ StudyOlle ] 알림(5) - 알림 조회 및 삭제 (0) | 2022.04.09 |