이걸 위해서 생각했던 방법
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 기준으로 정렬된다
상시 게시글은 상단으로 가고, 일반 게시글은 그 안에서 페이징처리가 되어서 번호를 갖게 된다
'Develop > Java' 카테고리의 다른 글
게시판 상세페이지에서 이전글, 다음글 구현하기 (0) | 2024.07.02 |
---|---|
[Thymeleaf] temporals.format 으로 날짜 설정하기 (0) | 2024.06.28 |
@Valid 어노테이션에 대해서 (0) | 2024.06.17 |
JAVA에서 메모리 주소를 직접 확인하는게 가능할까? (0) | 2024.06.17 |
String 값을 equals를 사용하여 비교하기 ('=='를 쓰지 않는 이유) (0) | 2024.06.17 |