본문 바로가기

프로젝트/멋사 개인 프로젝트 (mutsa-SNS)

[09] mutsa-SNS 4일차 - Post 조회 기능 추가

등록한 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 

 

[spring] LocalDateTime 주고받기(Response, Request)

데이터베이스에서 날짜데이터를 로드할 때 날짜형식의 String 형태으로 구성하여 전달하는 경우가 있다. (...

blog.naver.com

 

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

 

자바 List<class>를 Page로 Return 하는 방법

List sampleDtoList = sampleRepository.findAll().stream() .map(model -> new SampleDto().fromEntity(model)).collect(Collectors.toList()) 자바에서 List 형태의 sampleDtoList를 page로 return을 받고 싶은 경우 return new PageImpl(treasurySummeryDt

wakestand.tistory.com

 

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://wonit.tistory.com/483

 

[배워보자 Spring Data JPA] JPA 에서 Pageable 을 이용한 페이징과 정렬

해당 글은 배워보자 Spring Data JPA 시리즈 입니다. 해당 시리즈의 내용이 이어지는 형태이므로 글의 내용 중에 생략되는 말들이 있을 수 있으니, 자세한 사항은 아래 링크를 참고해주세요! Spring Dat

wonit.tistory.com

https://tecoble.techcourse.co.kr/post/2021-08-15-pageable/

 

Pageable을 이용한 Pagination을 처리하는 다양한 방법

Spring Data JPA에서 Pageable 를 활용한 Pagination 의 개념과 방법을 알아본다.

tecoble.techcourse.co.kr

 

<전체 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/