- 최근 9개의 스터디를 조회해서 화면에 보여줄 것.(공개했고, 아직 종료하지 않은 스터디 중에서)
- 페이징 없고 List<Study>로 조회
- 쿼리 만들기 않고 스프링 데이너 JPA 쿼리 메소드로 만들어 볼 것.
- 뷰 코드는 최대한 재사용 할 것.
이전 코드 리팩토링
화면에 Study Entity의 memberCount로 멤버수를 표시하기 때문에 members를 조인하는 부분을 삭제(시간이 많이 걸리기 때문)
package me.weekbelt.studyolle.modules.study;
public class StudyRepositoryExtensionImpl extends QuerydslRepositorySupport implements StudyRepositoryExtension{
public StudyRepositoryExtensionImpl() {
super(Study.class);
}
@Override
public Page<Study> findByKeyword(String keyword, Pageable pageable) {
QStudy study = QStudy.study;
JPQLQuery<Study> query = from(study).where(study.published.isTrue()
.and(study.title.containsIgnoreCase(keyword))
.or(study.tags.any().title.containsIgnoreCase(keyword))
.or(study.zones.any().localNameOfCity.containsIgnoreCase(keyword)))
.leftJoin(study.tags, QTag.tag).fetchJoin()
.leftJoin(study.zones, QZone.zone).fetchJoin()
// .leftJoin(study.members, QAccount.account).fetchJoin() 삭제
.distinct();
JPQLQuery<Study> pageableQuery = getQuerydsl().applyPagination(pageable, query);
QueryResults<Study> fetchResults = pageableQuery.fetchResults();
return new PageImpl<>(fetchResults.getResults(), pageable, fetchResults.getTotal());
}
}
열려있는 스터디중에 처음부터 9개의 스터디를 연 시간에 역순으로 가져오는 쿼리 메소드 생성
package me.weekbelt.studyolle.modules.study;
@Transactional(readOnly = true)
public interface StudyRepository extends JpaRepository<Study, Long>, StudyRepositoryExtension {
// ......
@EntityGraph(attributePaths = {"zones", "tags"})
List<Study> findFirst9ByPublishedAndClosedOrderByPublishedDateTimeDesc(boolean published, boolean closed);
}
model에 가져온 스터디 리스트를 Model에 추가
package me.weekbelt.studyolle.modules.main;
@RequiredArgsConstructor
@Controller
public class MainController {
private final StudyRepository studyRepository;
@GetMapping("/")
public String home(@CurrentAccount Account account, Model model) {
if (account != null) {
model.addAttribute(account);
}
List<Study> studyList = studyRepository.findFirst9ByPublishedAndClosedOrderByPublishedDateTimeDesc(true, false); // 추가
model.addAttribute("studyList", studyList); // 추가
return "index";
}
// ..........
}
메인화면페이지 index.html 수정
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head th:replace="fragments.html :: head"></head>
<body class="bg-light">
<div th:replace="fragments.html :: main-nav"></div>
<section class="jumbotron text-center">
<div class="container">
<h1>스터디올래</h1>
<p class="lead text-muted">
태그와 지역 기반으로 스터디를 찾고 참여하세요.<br/>
스터디 모임 관리 기능을 제공합니다.
</p>
<p>
<a th:href="@{/sign-up}" class="btn btn-primary my-2">회원 가입</a>
</p>
</div>
</section>
<div class="container">
<div class="row justify-content-center pt-3">
<div th:replace="fragments.html :: study-list (studyList=${studyList})"></div>
</div>
</div>
<div th:replace="fragments.html :: footer"></div>
<div th:replace="fragments.html :: date-time"></div>
</body>
</html>
참고: https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-JPA-%EC%9B%B9%EC%95%B1#
'스프링과 JPA 기반 웹 어플리케이션 개발 > 8부 검색 및 첫 페이지' 카테고리의 다른 글
83. 로그인 한 사용자를 위한 첫 화면 (0) | 2020.05.18 |
---|---|
81. 페이징 뷰 개선 (0) | 2020.05.18 |
80. 페이징 적용 (0) | 2020.05.17 |
79. N+1 Select 문제 해결 (0) | 2020.05.17 |
78. 검색 기능 구현 (0) | 2020.05.17 |