[토이 투표] 22.07.08 일지

재호·2022년 7월 8일
0

22.07.08 개발일지

인기 글 수정

	//가장 투표수가 많은 글 조회
	@Query(value="select b.*, "
			+ "sum(i.count) c from board as b left join voteitem as i "
			+ "on b.bno=i.board_num "
			+ "where b.dead = false "
			+ "group by i.board_num order by c desc limit 3", nativeQuery = true)
	List<Board> findTop3();

기존에는 마감이 된 투표까지 포함해서 검색했었지만 마감된 투표는 제외하도록 where절을 추가했다.

작성한 글 조회

-------------------------------Member Controller-----------------------------
	//작성한 글
	@GetMapping("/myboard")
	public void myBoard(PageRequestBoardDTO dto, HttpSession session, Model model) {
		log.info("작성한 글 요청");
		int page = dto.getPage()-1;
		int size = dto.getSize();
		
		Sort sort = Sort.by("bno").descending();
		
		Pageable pageable = PageRequest.of(page, size, sort);
		Long mno = (Long)session.getAttribute("userNum");
		
		PageResponseBoardDTO res = boardService.getListByMember(mno, pageable);
		model.addAttribute("result", res);
	}
    
-------------------------------Board Service-----------------------------
	@Override //특정 멤버의 전체 글 가져오기
	public PageResponseBoardDTO getListByMember(Long mno, Pageable pageable) {
		Member findMember = Member.builder().mno(mno).build();
		Page<Board> page = boardRepository.findByMember(findMember, pageable);
		
		PageResponseBoardDTO result = new PageResponseBoardDTO();
		result.setTotalPage(page.getTotalPages());
		result.makePageList(pageable);
		List<BoardDTO> list = new ArrayList<>();
		page.get().forEach(item -> {
			list.add(entityToDto(item, 3));
		});
		result.setBoardList(list);
		
		return result;
	}

세션에 저장해놓은 회원의 기본키값으로 작성한 글을 페이징해서 찾아오도록 했다.

참여한 투표글


앞선 작성한 글의 폼과 똑같지만 본인이 작성한 글이 아니기 때문에 작성자 열을 하나 추가하였다. 글의 제목을 클릭하면 해당 글의 상세 페이지로 이동할 수 있다.

-------------------------------Member Controller-----------------------------
	//참여한 투표들
	@GetMapping("/attendvote")
	public void attVote(PageRequestBoardDTO dto, HttpSession session, Model model) {
		log.info("참여한 투표 요청");
		Sort sort = Sort.by("bno").descending();
		Pageable pageable = PageRequest.of(dto.getPage()-1, dto.getSize(), sort);
		
		String email = (String)session.getAttribute("userId");
		
		PageResponseBoardDTO res = boardService.attendBoard(pageable, email);
		model.addAttribute("result", res);
	}
    
-------------------------------Board Service-----------------------------
	@Override
	public PageResponseBoardDTO attendBoard(Pageable pageable, String email) {
		Page<Board> page = boardRepository.boardByAttend(pageable, email);
		
		PageResponseBoardDTO result = new PageResponseBoardDTO();
		result.setTotalPage(page.getTotalPages());
		result.makePageList(pageable);
		List<BoardDTO> list = new ArrayList<>();
		page.get().forEach(item -> {
			list.add(entityToDto(item, 0));
		});
		result.setBoardList(list);
		return result;
	}
    
-------------------------------Board Custom Repository-------------------------
	@Override
	public Page<Board> boardByAttend(Pageable pageable, String email) {
		int page = pageable.getPageNumber();
		int size = pageable.getPageSize();
		
		List<Board> list = query.select(board)
				.from(detail)
				.join(detail.voteitem, item)
				.join(item.board, board)
				.join(board.member, member)
				.fetchJoin()
				.where(detail.voter.eq(email))
				.orderBy(board.bno.desc())
				.offset(page*size)
				.limit(size)
				.fetch();
		
		Long count = query.select(board).distinct()
				.from(detail)
				.join(detail.voteitem, item)
				.join(item.board, board)
				.join(board.member, member)
				.fetchJoin()
				.where(detail.voter.eq(email))
				.orderBy(board.bno.desc())
				.offset(page*size)
				.limit(size)
				.fetchCount();
		
		return new PageImpl<>(list, pageable, count);
	}

총 4개의 테이블을 조인했다. 페치 조인과 페이징을 동시에 하기 위해 QueryDSL을 사용했다. VoteDetail 테이블과 VoteItem 테이블은 투표에 참여한 글들만 필터링하기 위해 조인에 사용했지만 데이터는 사용할 일이 없기에 fetch join이 아닌 일반 join을 사용했고 작성자의 정보가 필요해서 Member 테이블은 fetch join을 적용하였다.

Git

https://github.com/JINJAEHO/vote

profile
Java, Spring, SpringMVC, JPA, MyBatis

0개의 댓글