1.
Page<EventListResponseDto> eventListResponseDtos = events.map(e ->
EventListResponseDto.builder()
.eventNumber(e.getId())
.eventName(e.getEventName())
.eventCategory(e.getEventCategory())
.eventStartDate(e.getEventStartDate())
.eventEndDate(e.getEventEndDate())
.eventImageUrls(e.getEventImages().stream()
.map(i -> i.getEventImageUrl())
.collect(Collectors.toList()))
.build());
2.
Page<EventListResponseDto> reponseDto = events.map(events
-> new EventListResponseDto(events));
3.
Page<EventListResponseDto> reponseDto = events.map(EventListResponseDto :: new):
Entity 반환 페이징
# Entity 반환
// 전체 이벤트 목록
public Page<Event> getEventList(String keyword, EventCategory eventCategory, Pageable pageable) {
int page = (pageable.getPageNumber() == 0) ? 0 : (pageable.getPageNumber() -1);
pageable = PageRequest.of(page, 10);
Page<Event> events = null;
if (eventCategory == null) {
events = eventRepository.findByEventNameContaining(keyword, pageable);
} else {
events = eventRepository.findByEventNameContainingAndEventCategory(keyword, eventCategory, pageable);
}
return events;
}
Dto 반환 페이징
Page<Event> events
를 전달받음Page<EventListResponseDto>
로 반환 받음# Dto 반환
// 전체 이벤트 목록
public Page<EventListResponseDto> toDtoList(String keyword, EventCategory eventCategory, Pageable pageable) {
int page = (pageable.getPageNumber() == 0) ? 0 : (pageable.getPageNumber() -1);
pageable = PageRequest.of(page, 10);
Page<Event> events = null;
if (eventCategory == null) {
events = eventRepository.findByEventNameContaining(keyword, pageable);
} else {
events = eventRepository.findByEventNameContainingAndEventCategory(keyword, eventCategory, pageable);
}
Page<EventListResponseDto> eventListResponseDtos = events.map(e ->
EventListResponseDto.builder()
.eventNumber(e.getId())
.eventName(e.getEventName())
.eventCategory(e.getEventCategory())
.eventStartDate(e.getEventStartDate())
.eventEndDate(e.getEventEndDate())
.eventImageUrls(e.getEventImages().stream()
.map(i -> i.getEventImageUrl())
.collect(Collectors.toList()))
.build());
return eventListResponseDtos;
}
Page<EventListResponseDto>
를 반환받음// 이벤트 리스트 보기
@GetMapping("/events")
public String getEventList(@PageableDefault Pageable pageable,
@RequestParam(required = false, defaultValue = "", value = "keyword") String keyword,
@RequestParam(required = false, value = "eventCategory") EventCategory eventCategory,
User loginUser, Model model) {
if (loginUser != null) {
model.addAttribute("userNick", loginUser.getUserNickname());
model.addAttribute("userId", loginUser.getId());
}
Page<EventListResponseDto> eventListResponseDtos = eventService.toDtoList(keyword, eventCategory, pageable);
model.addAttribute("eventListResponseDtos", eventListResponseDtos);
return "event/eventList";
}
람다식 활용
(all.map(Dto::new))
형식# 람다식 사용하여 Dto 반환
// 전체 이벤트 목록
public Page<EventListResponseDto> toDtoList(String keyword, EventCategory eventCategory, Pageable pageable) {
int page = (pageable.getPageNumber() == 0) ? 0 : (pageable.getPageNumber() -1);
pageable = PageRequest.of(page, 10);
Page<Event> events = null;
if (eventCategory == null) {
events = eventRepository.findByEventNameContaining(keyword, pageable);
} else {
events = eventRepository.findByEventNameContainingAndEventCategory(keyword, eventCategory, pageable);
}
Page<EventListResponseDto> eventListResponseDtos = events.map(EventListResponseDto::new);
return eventListResponseDtos;
}
# html
<nav class="page">
<ul class="pagination" id="event-pagination"
th:with="start=${T(java.lang.Math).floor(eventListResponseDtos.number/10)*10 + 1},
last=(${start + 9 < eventListResponseDtos.totalPages ? start + 9 : eventListResponseDtos.totalPages})">
<li>
<a aria-label="First" class="page-number"
th:href="@{/events(page=1)}">
<span aria-hidden="true"><<</span>
</a>
</li>
<li th:class="${eventListResponseDtos.first} ? 'disabled'">
<a aria-label="Previous" class="page-number"
th:href="${eventListResponseDtos.first} ? '#' : @{/events(page=${eventListResponseDtos.number})}">
<span aria-hidden="true"><</span>
</a>
</li>
<li th:class="${page == eventListResponseDtos.number + 1} ? 'active'"
th:each="page: ${#numbers.sequence(start, last)}">
<a class="page-number" th:href="@{/events(page=${page})}"
th:text="${page}"></a>
</li>
<li th:class="${eventListResponseDtos.last} ? 'disabled'">
<a aria-label="Next" class="page-number"
th:href="${eventListResponseDtos.last} ? '#' : @{/events(page=${eventListResponseDtos.number + 2})}">
<span aria-hidden="true">></span>
</a>
</li>
<li>
<a aria-label="Last" class="page-number"
th:href="@{/events(page=${eventListResponseDtos.totalPages})}">
<span aria-hidden="true">>></span>
</a>
</li>
</ul>
<br>
</nav>
주석에 따른 설명
<!-- 페이징 -->
<div th:if="${!blogDetails.isEmpty()}">
<!-- 전역 변수 선언 -->
<nav
th:with="
pageNumber = ${blogDetails.pageable.pageNumber},
pageSize = ${blogDetails.pageable.pageSize},
totalPages = ${blogDetails.totalPages},
startPage = ${T(Math).floor(pageNumber / pageSize) * pageSize + 1},
tempEndPage = ${startPage + pageSize - 1},
endPage = (${tempEndPage < totalPages ? tempEndPage : totalPages})"
aria-label="Page navigation"
>
<ul class="pagination ">
<!-- 처음으로 이동 -->
<li th:classappend="${pageNumber < pageSize} ? 'disabled'" class="page-item">
<a class="page-link" th:href="@{/(page=0)}">
<span>«</span>
<span class="sr-only">First</span>
</a>
</li>
<!-- 이전으로 이동 -->
<li th:classappend="${blogDetails.first} ? 'disabled'" class="page-item">
<a class="page-link" th:href="${blogDetails.first} ? '#' : @{/(page=${pageNumber - 1})}" aria-label="Previous">
<span aria-hidden="true"><</span>
<span class="sr-only">Previous</span>
</a>
</li>
<!-- 특정 페이지로 이동 -->
<li th:each="page: ${#numbers.sequence(startPage, endPage)}" th:classappend="${page == pageNumber + 1} ? 'active'" class="page-item">
<a th:text="${page}" class="page-link" th:href="@{/(page=${page - 1})}"></a>
</li>
<!-- 다음으로 이동 -->
<li th:classappend="${blogDetails.last} ? 'disabled'" class="page-item">
<a class="page-link" th:href="${blogDetails.last} ? '#' : @{/(page=${pageNumber + 1})}" aria-label="Next">
<span aria-hidden="true">></span>
<span class="sr-only">Next</span>
</a>
</li>
<!-- 마지막으로 이동 -->
<li th:classappend=" ${T(Math).floor(totalPages / pageSize) * pageSize - 1 <= startPage} ? 'disabled'" class="page-item">
<a class="page-link" th:href="@{/(page=${totalPages - 1})}">
<span>»</span>
<span class="sr-only">Last</span>
</a>
</li>
</ul>
</nav>
</div> <!-- /container -->
처음으로 이동
이전으로 이동
특정 페이지로 이동
다음으로 이동
마지막으로 이동
소스 코드 보다가 궁금해서 남겨요
controller의 getEventList 메서드에서
eventList는 회원이 아니어도 볼 수 있는 페이지 인가요??
그리고 start, last는 무슨 역할을 하는지 궁금해요~