Develop/Java

상시 게시글을 리스트의 상단으로 올리기

롱하 2024. 6. 20. 10:54

이걸 위해서 생각했던 방법 

 

1. html에서 작업한다

2. controller에서 애초에 불러오는 리스트에서 상시게시글을 상위로한 리스트롤 뽑아온다

 

2번을 해야한다고 생각했고,

그에 따른 방법이 두가지가 있었는데

1. controller에서 중요항목과 일반항목을 따로 List로 가져와서 중요항목에 일반항목을 addAll하는 방법

 

// 중요 항목을 먼저 가져옴
List<NoticeSubDto> importantItems = noticeSubListService.operate(pageable, modelMapper.map(paramDto, NoticeSubCondition.class))
        .stream()
        .filter(notice -> "Y".equals(notice.getImportance()))
        .map(notice -> modelMapper.map(notice, NoticeSubDto.class))
        .collect(Collectors.toList());

// 일반 항목을 가져옴
List<NoticeSubDto> normalItems = noticeSubListService.operate(pageable, modelMapper.map(paramDto, NoticeSubCondition.class))
        .stream()
        .filter(notice -> !"Y".equals(notice.getImportance()))
        .map(notice -> modelMapper.map(notice, NoticeSubDto.class))
        .collect(Collectors.toList());

// 중요 항목과 일반 항목을 합침
importantItems.addAll(normalItems);

model.addAttribute("items", importantItems);

 

2. Repo에서 쿼리를 추가해서 controller에서 쿼리 메소드를 사용하는 방법

@Repository
public interface NoticeSubRepository extends JpaRepository<NoticeSub, Long> {

	@Query("SELECT n FROM NoticeSub n WHERE n.routerId = :routerId AND n.branchId = :branchId AND n.lang = :lang ORDER BY n.importance DESC, n.createdAt DESC")
	List<NoticeSub> findAllByRouterIdAndBranchIdAndLangOrderByImportanceDescCreatedAtDesc(Long routerId, Long branchId, String lang);

}

 

 

// 커스텀 쿼리 메서드를 사용하여 데이터 가져오기
List<NoticeSub> noticeSubs = noticeSubRepository.findAllByRouterIdAndBranchIdAndLangOrderByImportanceDescCreatedAtDesc(noticeId, branch.getId(), LangType.ko.name());

// DTO로 변환
List<NoticeSubDto> items = noticeSubs.stream()
        .map(notice -> modelMapper.map(notice, NoticeSubDto.class))
        .collect(Collectors.toList());

model.addAttribute("items", items);

 

 

> 여기서 의문 

두가지 방법 다 뭔가 비효율적이라는 생각이 들었고, 불필요하게 코드가 길어지고 복잡해지는것 같다는 생각이 들었다.

그래서 애초에 Pageable 객체에 정렬을 할당할때, importance = 'Y'인것을 상위로 올리게 하는 페이징을 해주면 어떨까 했는데 바로 원하는 결과를 얻을 수 있었다.

 

 

Pageable pageable = PageRequest.of(0, (paramDto.getSize() == null ? 10 : paramDto.getSize())*((paramDto.getPage() == null ? 0 : paramDto.getPage())+1), Sort.by(Sort.Order.desc("importance"), Sort.Order.desc("createdAt")));

 

이렇게 하면 importance가 'Y'인 항목이 상위로 올라가고, importance가 동일한 항목들은 createdAt 기준으로 정렬된다

상시 게시글은 상단으로 가고, 일반 게시글은 그 안에서 페이징처리가 되어서 번호를 갖게 된다