Develop/JPA
JPA를 통해 간단히 코드 몇줄로 쿼리 없이 카테고리별로 리스트 가져오기
롱하
2024. 6. 13. 13:36
- 전제 -
관리자에서 여러 타입의 문의 타입의 게시글을 하나의 게시판에서 볼 수 있게 하였다.
<td class="text-left align-middle border-top e-w-30" th:text="${T(rong.ha.core.config.enums.EtcapplicationType).valueOf(dto.etcapplicationType).desc}"></td>
* Enums를 사용해서 문의 타입을 다르게 띄움
기존에 관리자에서 게시판 목록에 데이터를 불러오기 위해 구현해두었던 ListService를 사용하려다 보니 카테고리 상관없이 전체 리스트 전체를 불러왔었다.
> 그걸 하나의 list.html에서 카테고리 별로 나눠주기 위해 parameter로 해당 ${qnaType}을 넘겨주고 그걸 html에서 조건 비교를 해서 리스트를 뽑아오려고 했는데, 그렇게 되면 리스트가 로드 될때마다 모든 데이터를 findAll 해와야하기 때문에 서버가 느려질 수 있다는 단점이 있다는 생각을 하게 되었다.
public class QnaResultController {
private final QnaListService qnaListService;
private final ModelMapper modelMapper;
private final SessionUtil sessionUtil;
@GetMapping(path = "/branch/application/qna/{qnaType}/result")
String operate(@PathVariable(required = true) @ModelAttribute String etcType,
Model model, @ModelAttribute("paramDto") QnaConditionDto paramDto
, HttpServletRequest request) {
Pageable pageable = PageRequest.of(0, 999, Sort.by(Sort.Order.desc("createdAt")));
MemberDto memberDto = sessionUtil.getSession();
paramDto.setSearchMemberId(memberDto.getMemberId());
paramDto.setPage(pageable.getPageSize());
paramDto.setSearchLang(LangType.ko.name());
paramDto.setSearchQnaType(qnaType);
model.addAttribute("items",
qnaListService
.operate(pageable, modelMapper.map(paramDto, QnaCondition.class))
.map(etcapplication -> modelMapper.map(qna, QnaDto.class)));
return "branch/application/qna/result/list";
}
}
@Repository
@RequiredArgsConstructor
public class QnaDaoImpl implements QnaListDao {
private final QnaRepo qnaapplicationRepo;
private final ModelMapper modelMapper;
private final DateUtil dateUtil;
@Transactional
@Override
public Page<Qna> operate(Pageable pageable, QnaCondition qnaCondition) {
Specification<QnaEntity> spec = (root, query, criteriaBuilder) -> null;
if(!StringUtils.isEmpty(qnaCondition.getSearchQnaType())) {
spec = spec.and(
(root, query, builder) -> builder.equal(root.get("qnaType"), String.valueOf(qnaCondition.getSearchQnaType()))
);
}
return qnaRepo.findAll(spec, pageable).map(item -> modelMapper.map(item, Qna.class));
}
}
> 그래서 Controller에 있는 model인 qnaConditonDto에 searchQnaType을 추가해주고 searchQnaType에 파라미터에서 받아온 qnaType을 set 해주어서 daoImpl에서 비어있지 않으면 DB에 있는 qnaType과 equals 비교를 해줘서 uri에 있는 파라미터의 해당 타입 리스트만 가져올 수 있게 하였다.
불필요하게 모든 리스트 데이터를 불러온 다음에 controller에서 처리해줄 필요없이 필요한 해당 데이터만 불러올 수 있게 하여서 원하는 데이터만 불러오고, 리스트가 로드될때마다 모든 데이터를 불러오지 않을 수 있게 하였다.