등록한 post를 조회하는 기능을 추가하였다.
- postId를 통해 1개의 글 조회
- 전체 Post 조회
1. Domain
Post
public class Post extends BaseEntity{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String body;
private String title;
@ManyToOne(fetch = LAZY)
@JoinColumn(name = "user_id")
private User user;
public PostDto toResponse() {
return PostDto.builder()
.id(this.getId())
.userName(this.getUser().getUserName())
.title(this.getTitle())
.body(this.getBody())
.createdAt(this.getCreatedAt())
.lastModifiedAt(this.getLastModifiedAt())
.build();
}
}
Post를 PostDto로 변환하는 toResponse method를 추가하였다.
PostDto
public class PostDto {
private int id;
private String userName;
private String title;
private String body;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul")
private LocalDateTime lastModifiedAt;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul")
private LocalDateTime createdAt;
}
post를 조회 시, view에 milliSecond를 제회하여 보여주어야 되기 때문에 @JsonFormat annotation을 추가하였다.
<Reference>
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=varkiry05&logNo=221736856257
2. Service
PostService
@Service
@RequiredArgsConstructor
@Slf4j
public class PostService {
private final PostRepository postRepository;
private final UserRepository userRepository;
public PostDto detailPost(Integer id) {
Post post = postRepository.findById(id)
.orElseThrow(() -> new AppException(ErrorCode.POST_NOT_FOUND, ""));
return post.toResponse();
}
public Page<PostDto> getPostAll(Pageable pageable) {
Page<Post> postPages = postRepository.findAll(pageable);
return new PageImpl<>(postPages.stream()
.map(Post::toResponse)
.collect(Collectors.toList()));
}
}
detailPost : controller에서 id를 받아 DB에서 해당 id의 post내용을 찾아 postDto형태로 controller에 return
getPostAll : controller에서 pageable을 받아서 모든 post를 불러오고, 다시 Page<PostDto>형태로 retrun
postPages에 있는 Post들을 모두 PostDto로바꾼 후 list에 넣었다가, 그것을 Page형태로 다시 바꾸었다.
방법은 아래 Reference를 참조하였다.
<Reference>
https://wakestand.tistory.com/931
3. Controller
PostController
@RestController
@RequestMapping("/api/v1/posts")
@RequiredArgsConstructor
public class PostController {
private final PostService postService;
@GetMapping("/{postId}")
public Response<PostDto> getPostDetail(@PathVariable Integer postId) {
PostDto postDto = postService.detailPost(postId);
return Response.success(postDto);
}
@GetMapping()
public Response<Page<PostDto>> getPost(
//한페이지 20개의 글, 최신글 정렬
@PageableDefault(size=20, sort="createdAt", direction = Sort.Direction.DESC) Pageable pageable) {
Page<PostDto> postDtos = postService.getPostAll(pageable);
return Response.success(postDtos);
}
}
getPostDetail : view에서 입력받은 postId를 받아와 service에 넘겨주고 받은 postDto를 Response 객체에 담아 view에 return한다.
getPost : 한 페이지에 20개, 최근 등록 글 순으로 정렬한다. 설정 방법은 아래 Reference를 참고하였다.
<Reference>
https://tecoble.techcourse.co.kr/post/2021-08-15-pageable/
<전체 Reference>
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=varkiry05&logNo=221736856257
https://wakestand.tistory.com/931
https://wonit.tistory.com/483
https://tecoble.techcourse.co.kr/post/2021-08-15-pageable/
'프로젝트 > 멋사 개인 프로젝트 (mutsa-SNS)' 카테고리의 다른 글
[11] mutsa-SNS 5일차 - (2) Post 삭제, 수정 기능 추가 (0) | 2022.12.26 |
---|---|
[10] mutsa-SNS 5일차 - (1) Post 조회 기능 TestCode 추가 (0) | 2022.12.26 |
[08] mutsa-SNS 3일차 - (3) JwtTokenFilter Exception 추가 (0) | 2022.12.23 |
[07] mutsa-SNS 3일차 - (2) 글쓰기 기능 (2) | 2022.12.22 |
[06] mutsa-SNS 3일차 - (1) User 수정 (0) | 2022.12.22 |