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에서 처리해줄 필요없이 필요한 해당 데이터만 불러올 수 있게 하여서 원하는 데이터만 불러오고, 리스트가 로드될때마다 모든 데이터를 불러오지 않을 수 있게 하였다.