본문 바로가기
스프링과 JPA 기반 웹 어플리케이션 개발/8부 검색 및 첫 페이지

82. 로그인 하지 않은 사용자를 위한 첫 화면

by Backchus 2020. 5. 18.
  • 최근 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 기반 웹 애플리케이션 개발 - 인프런

이 강좌에서 여러분은 실제로 운영 중인 서비스를 스프링, JPA 그리고 타임리프를 비롯한 여러 자바 기반의 여러 오픈 소스 기술을 사용하여 웹 애플리케이션을 개발하는 과정을 학습할 수 있습�

www.inflearn.com