프로젝트를 진행하며, 이번에 내가 구현해야 할 기능은 '게시글 전체 조회' 였다. 처음에는 별거 아닌 것처럼 보여서 내가 구현하겠다고 했는데, 생각보다 까다로워서 많이 고민했었다. 이번 기회에 내가 고민했던 점들과 이를 어떻게 처리했는지 정리해보고자 한다.
나는 아이패드에 로직을 먼저 쭉 짜보고 코드를 작성하는 편이다. 같이 프로젝트를 진행하는 휼륭한 멘토님께서 알려준 방법인데, 생각 정리도 되고, 나중에 생각난 로직때문에 코드 수정을 하는 일도 줄어들어 좋은 방법인거 같다. 그리고 막히는 부분이나 긴가민가한 부분을 미리 캐치할 수 있어, 대응방법에 대한 이야기도 더 많이 나눌 수 있다는 장점도 있었다!
위에서 짜 놓은 로직을 다시 한 번 정리해보자면
<< Controller >>
1. Get요청
2. 보여줄 내용 < 유저이름,유저프로필사진,게시글 제목, 작성날짜, 미디어 갯수, 좋아요 갯수, 댓글갯수, 조회수, 카테고리, 글타입, 게시글번호>
-> 협업하는 분들과 회의 후 유저프로필사진을 없애고, 조회수를 넣자고 해서 변경했다!
3. 받아올 정보 < 글 타입, 카테고리 > -> @RequestParam 이용
<< Service >>
1. PostListDto를 만들어 Controller에서 받아온 데이터와 서비스 로직을 통한 데이터 담기
2. 게시글 작성 시간에 따라 '방금, 몇분 전, 몇시간 전, 몇일 전, YYYY.MM.DD' 으로 형식 변환해서 보여주기
사실 이번에는 동적쿼리를 이용해서 대부분 내가 하고 싶었던 기능을 구현할 수 있었어서 서비스단 로직이 비교적 간단했다ㅎㅎ
<< Repository >>
1. 선택한 글타입 & 선택한 카테고리에 맞춰 게시글 보여주기
2. 삭제되지 않은 게시글만 보여주기
3. 유저 권한에 따라 보여주는 게시글 달리 하기 (일반 유저는 삭제된 게시글 열람X)
4. 게시글 생성일을 기준으로 내림차순(최신순)으로 정렬
5. 페이징 (Slice)
//PostController.java
@GetMapping("/post")
public ResponseEntity<ResponseResult<PostListWithSliceDto>> getPostList(@RequestParam(value = "postType", required = false) List<String> postType,
@RequestParam(value = "woryOutCategory", required = false) List<String> workOutCategories,
Pageable pageable) throws ParseException {
return ResponseEntity.status(HttpStatus.OK).body(postService.getPostList(postType, workOutCategories, pageable));
}
//PostService.java
public ResponseResult<PostListWithSliceDto> getPostList(List<String> postTypeList, List<String> workOutCategories, Pageable pageable) throws ParseException {
String memberRole = SecurityUtil.getMemberRole();
Slice<Post> postList = postRepository.postAsSearchType(memberRole, postTypeList, workOutCategories, pageable);
List<Post> posts = postList.getContent();
boolean hasNext = postList.hasNext();
boolean isFirst = postList.isFirst();
List<PostListDto> postListDtos = new ArrayList<>();
for (Post post : posts) {
SimpleDateFormat formatterDateTime = new SimpleDateFormat("yyyy-MM-dd HH:mm");
String dateString = post.getDateTime().getCreatedAt();
Date date;
try {
date = formatterDateTime.parse(dateString);
} catch (ParseException e) {
throw new ParseException(ErrorCode.DATE_FORMAT_EXCEPTION.getMessage(), e.getErrorOffset());
}
String calculateTime = TimeConvertUtil.calculateTime(date);
if (calculateTime == null) {
String[] splitString = post.getDateTime().getCreatedAt().split(" ");
calculateTime = splitString[0];
}
PostListDto postListDto = PostListDto.builder()
.username(post.getPostWriter().getUsername())
.postType(post.getPostType())
.workOutCategory(post.getWorkOutCategory())
.createdAt(calculateTime)
.title(post.getTitle())
.postId(post.getId())
.mediaListCount(post.getMediaList().size())
.likeCount(post.getLikeCount().size())
//commentCount()
.views(post.getViews())
.build();
postListDtos.add(postListDto);
}
PostListWithSliceDto postListWithSliceDto = PostListWithSliceDto.builder()
.postListDto(postListDtos)
.hasNext(hasNext)
.isFirst(isFirst)
.build();
return new ResponseResult<>(HttpStatus.OK.value(), postListWithSliceDto);
}