카테고리별 게시글 가져오기(2)

이소연's avatar
Aug 05, 2024
카테고리별 게시글 가져오기(2)
 
 

1. URL 받아오기

  1. 커뮤니티 사연보기 >>일반고민을 눌렀을 때
@GetMapping("comm/comm/category") public String communityByCategory(@RequestParam("category") CommCategory category, Model model) { System.out.println("category = " + category); // List<Comm> comms = commService.getCommsByCategory(category); return "/comm/comm-main-German"; }
<a class="nav-link {{#categoryHelper.isActiveCategory}}GENERAL_CONCERNS{{/categoryHelper.isActiveCategory}}" href="comm/comm/category?category=GENERAL_CONCERNS">일반고민</a>
notion image
값 받기 성공
 

2. 컨트롤러에서 다른 카테고리도 받아오기

⇒ 같은 방식으로 머스테치에 URL 적용
⇒ 값 받기 성공
notion image
 
⇒ 주석 해제

서비스에서 값 받기

@GetMapping("comm/comm/category") public String communityByCategory(@RequestParam("category") CommCategory category, Model model) { List<Comm> comms = commService.getCommsByCategory(category); return "/comm/comm-main-German"; }
//서비스 public List<Comm> getCommsByCategory(CommCategory category) { commRepository.findByCategory(CommCategory.GENERAL_CONCERNS); return null; }
notion image
실행이 잘 되었다. 서비스도 값을 잘 받았다.
클릭했을 때 반응이 없다? 왜 반응이 없는지 확인.
 

리포 테스트 만들기

notion image
notion image

결과 보기 예상한 결과 확인

다른 카테고리도 넣어서 예상한 결과 확인 다 확인

notion image
다른 카테고리도 조회 ok
 
notion image
 

DTO 만들어서 화면에 뿌리자

@GetMapping("/comm") public String community(HttpServletRequest request) { List<CommResponse.ALLCommWithRepliesDTO> allCommsWithReplyList = commService.findAllCommWithReply(); request.setAttribute("allCommsWithReplyList", allCommsWithReplyList); return "/comm/comm-main"; } @GetMapping("comm/category") public String communityByCategory(@RequestParam("category") CommCategory category, Model model) { List<CommResponse.CommMainByCategory> allCommsWithReplyList = commService.getCommMainByCategory(category); model.addAttribute("allCommsWithReplyList", allCommsWithReplyList); return "/comm/comm-main"; } //한 화면이니까 같은 것으로 뿌려야 혼동이 없겠지! 그래서 같은 이름으로 뿌림 //하지만 같은 dto는 아님 , 다음에 수정해야 할 수도 있으니!!!-v
 

DTO가 필요한 이유

필요한 것을 한 번에 뿌리기 위해
그리고 꼭 붙어있어야하는 로직들이 있는데 이것들을 여러 개를 한 번에 리턴을 못하니까 담아서 리턴함.
예를 들어 아래와 같은 로직들은 꼭 붙어 있어야 함. @Transactional public CommResponse.CommDetailDTO getCommDetail(int id) { // 주어진 ID로 게시글을 가져옵니다. Comm comm = commRepository.findById(id) .orElseThrow(() -> new Exception404("게시물을 찾을 수 없습니다")); // 주어진 게시글의 댓글을 가져옵니다. List<Reply> replies = replyRepository.findByCommId(comm.getId()); // 같은 카테고리의 다른 글들과 해당 글들의 댓글을 가져옵니다. List<Comm> relatedComms = commRepository.findByCategoryWithRepliesAndExcludeId(comm.getCategory(), comm.getId()); // CommDetailDTO 생성 및 timeAgo 계산 CommResponse.CommDetailDTO commDetailDTO = new CommResponse.CommDetailDTO(comm, replies, relatedComms); commDetailDTO.getCommDTO().calculateTimeAgo(); // timeAgo 계산 return commDetailDTO; }
 

서비스는 왜 필요한가?

DTO에 담아서 뿌리려고.
application.yml
서비스에서 레이지로딩을 끝내고 컨트롤러에 보낸다. 뭘로? DTO로 open-in-view: false
 

레이지로딩은 필요할 때에 로딩, eager는 한꺼번에 다 조회.

 
 
💡
ctrl + shift + z : 앞으로 당기기
Share article

Coding's note