더이상 사용하지 않는 ORDER BY

Gihongg·2024년 4월 18일

Spring Boot

목록 보기
20/24

간단한 게시판 만들기 강의를 보던 중 또다시 버전과 관련된 에러에 직면했다.

현재 상황은 아래와 같다.

  1. 게시판 1을 보려고 한다.

  2. 게시글들을 불러와서 보여준다.

  3. 게시글들이 ID 기준 오름차순(ASC)정렬이 되어서 나온다.

  4. ID를 내림차순(DESC)정렬로 만들어서 보여줘야 한다.
    최근의 글을 위로 보여줘야 하기 때문

그래서
Entity에 @OrderBy 어노테이션을 붙여주려고 하니 에러가 떴다.

org.hibernate.annotations.OrderBy' is deprecated since version 6.3 and marked for removal

6.3버전 이후 이 어노테이션은 사용할 수 없다는 설명이 나온다.

그래서 Spring Boot개발자들에게 물어보았더니 몇가지 팁을 주었다.

1. 묵시적인 OrderBy는 지양해라

정렬과 같은 작업은 리소스를 먹는다.

정렬은 인덱스가 없을 경우 많은 메모리와 시간을 필요로 하는 작업이어서 저렇게 묵시적으로 수행되게 만드는 건 위험하다.

나도 모르는 사이에 스리슬쩍 자꾸 정렬시키는 것은 자원의 낭비이다.

2. 필요할 때만 Order by 명시적으로 써라

그렇기 때문에 우리는 Order by를 필요할 때만 사용해야 한다.
위와 같은 상황에선 언제든지 OrderBy를 사용하기 때문에 좀 더 명확하게 언제 정렬해야 하는지 알려주어야 한다.

시행착오

처음에는 내가 JPA를 배우며 가장 생소했던 방식인 쿼리 메서드를 사용했다.
Repository에 아래의 쿼리 메서드를 만들고, 사용해서 정렬시키려 했다.

    BoardEntity findByIdOrderByIdDesc(Long id);

하지만 정렬이 잘 되지 않아 무엇을 놓쳤을지 생각해보던 중..

생각해보니 Board를 정렬시키는게 아닌 Board 하위의 PostList를 정렬시키는 것 이었다.

결론

Dto로 변환시켜 반환하기 위해 만든 BoardConverter클래스에서 postList를 Convert하는 작업이 있었다.

그리고 이 때 Convert와 sort를 동시에 작업하는게 좋을 것 같다는 생각이 들었다.

@Service
@RequiredArgsConstructor
public class BoardConverter {
    private final PostConverter postConverter;

    public BoardDto toDto(BoardEntity boardEntity){

        List<PostDto> postList = Optional.ofNullable(boardEntity.getPostList())
                .orElseGet(Collections::emptyList)  // 빈 리스트 반환
                .stream()
                .map(postConverter::toDto)
                .sorted(Comparator.comparing(PostDto::getId).reversed())  // 생성 날짜 기준 내림차순 정렬
                .collect(Collectors.toList());


        return BoardDto
                .builder()
                .id(boardEntity.getId())
                .boardName(boardEntity.getBoardName())
                .status(boardEntity.getStatus())
                .postList(postList)
                .build();
    }

}

그리고 다시 실행시켰더니 정렬이 내림차순으로 잘 되어서 나와졌다.

profile
전천후 개발자

0개의 댓글