Spring Example: ToDo List #7 정렬 기능 추가

함형주·2022년 10월 6일
0

Spring Example: ToDo

목록 보기
8/16

질문, 피드백 등 모든 댓글 환영합니다.

메인 페이지에 출력될 todo를 마감일과 생성일을 기준으로 정렬하는 기능을 개발하겠습니다.

createdDate -> createdDateTime

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 정렬

메인 페이지에서 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());
    }

새로 정의한 메서드로 변경

다음으로

지금까지 구현 요구사항을 따라 모든 기능을 개발 완료하였습니다. 다음 시간에는 전체코드를 돌아보며 추가하거나 수정할 사항이 있다면 추가하고 끝으로 전체 코드를 정리하겠습니다.


github , 배포 URL (첫 접속 시 로딩이 걸릴 수 있습니다.)

profile
평범한 대학생의 공부 일기?

0개의 댓글