질문, 피드백 등 모든 댓글 환영합니다.
메인 페이지에 출력될 todo를 마감일과 생성일을 기준으로 정렬하는 기능을 개발하겠습니다.
createdDate의 타입을 LocalDate에서 LocalDateTime으로 바꾸어 생성일을 기준으로 정렬 시 보다 정확하게 정렬할 수 있도록 해주겠습니다.
ToDo (ToDoDto)
private LocalDateTime createdDateTime;
public static ToDo createToDo(String title, String description, LocalDate dueDate, Member member) {
toDo.createdDateTime = LocalDateTime.now();
}
LocalDate -> LocalDateTime으로 수정
ToDoDto도 같은 부분 수정
ToDoController
private List<ToDoDto> getToDoDtos(Member loginMember, Boolean isCompleted) {
List<ToDo> list = toDoService.findToDoListByMemberIdAndIsCompleted(loginMember.getId(), isCompleted);
return list.stream().map(toDo ->
new ToDoDto(toDo.getId(), toDo.getTitle(), toDo.getDescription(),
toDo.getIsCompleted(), toDo.getCreatedDateTime(), toDo.getDueDate()))
.collect(Collectors.toList());
}
main.html
<td>
<input type="date" readonly name="createdDateTime" class="form-control-plaintext"
th:value="${#temporals.format(todo.getCreatedDateTime, 'yyyy-MM-dd')}">
<td>
<tr th:each="todo : ${toDoDtos}">
부분과 <tr th:each="todo : ${completedDtos}">
부분 안의 영역을 모두 수정
#temporals.format()을 이용하여 LocalDateTime의 출력되는 방식을 변경 가능
edit.html #추가#
<div class="col">
<label class="form-label" th:for="*{dueDate}">마감일</label>
<input type="date" class="w-100 form-control" name="dueDate" th:value="*{dueDate}">
<div th:errors="*{dueDate}"></div>
</div>
수정폼으로 이동 시 dueDate가 유지되지 않던 부분 수정
th:field="*{dueDate}"가 제대로 작동하지 않았기에 name 속성과 value 속성으로 분리
메인 페이지에서 todo 출력 시 마감일 기준으로 오름차순, 같을 경우 생성일 기준으로 오름차순 정렬하고 마감일이 없을 경우 가장 아래에 생성일 오름차순 정렬합니다.(null last)
ToDoRepostiory
public interface ToDoRepository extends JpaRepository<ToDo, Long> {
List<ToDo> findSortByMemberIdAndIsCompleted(Long memberId, Boolean isCompleted, Sort sort); // 추가
}
기존의 memberId와 isCompleted 여부로 조회하던 메서드에서 Sort 파라미터 추가
ToDoServiceImpl (ToDoService)
public class ToDoServiceImpl implements ToDoService {
@Override
public List<ToDo> findSortByMemberIdAndIsCompleted(Long id, Boolean isCompleted) {
return repository.findSortByMemberIdAndIsCompleted(id, isCompleted,
Sort.by(Sort.Direction.ASC, "dueDate", "createdDateTime"));
}
}
처음에 Sort.by(Sort.Order.asc("dueDate").nullsLast(), Sort.Order.asc("createdDateTime")) 로 null last 를 적용하려했지만 실행 시 적용되지 않았음!
때문에 위처럼 바꾸고 application.yml 에서 글로벌 옵션으로 null last 설정
application.yml 스택오버플로우 참조
spring:
jpa:
properties:
hibernate:
order_by.default_null_ordering: last
ToDoController
private List<ToDoDto> getToDoDtos(Member loginMember, Boolean isCompleted) {
List<ToDo> list = toDoService.findSortByMemberIdAndIsCompleted(loginMember.getId(), isCompleted);
return list.stream().map(toDo ->
new ToDoDto(toDo.getId(), toDo.getTitle(), toDo.getDescription(),
toDo.getIsCompleted(), toDo.getCreatedDateTime(), toDo.getDueDate()))
.collect(Collectors.toList());
}
새로 정의한 메서드로 변경
지금까지 구현 요구사항을 따라 모든 기능을 개발 완료하였습니다. 다음 시간에는 전체코드를 돌아보며 추가하거나 수정할 사항이 있다면 추가하고 끝으로 전체 코드를 정리하겠습니다.