Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[신윤섭] 3차 과제 제출 #12

Open
wants to merge 17 commits into
base: develop
Choose a base branch
from

Conversation

supsup-hae
Copy link
Member

Post API 구현 체크리스트 및 API 명세

1. Post 엔티티 설계 및 구현

  • 구현 완료

2. 게시글 단일 생성 기능

  • 구현 완료 POST /api/posts

3. 게시글 다중 생성 기능 (엑셀)

  • 구현 완료 POST /api/posts/excel

4. 게시글 조회 기능

  • 구현 완료 GET /api/posts/{id}

5. 게시글 목록 조회 기능

  • 구현 완료 GET /api/posts

6. 게시글 삭제 기능

  • 구현 완료 DELETE /api/posts/{id}

고민되는 점

  • 현재 공통 응답과 에러 및 예외 처리 부분이 제대로 반영되지 않았다.
    • Request DTO 와 기존에 사용하던 방식의 DTO 구조가 중복되는 부분이 존재하는데 어떻게 해야 더 깔끔하게 처리할까?
  • DTO <-> Entity 변환 로직을 어디에 작성하는 것이 직관적일까?
  • 공통 응답 부분에 대해서 살펴보면서 Pageable 도 한 번 더 살펴볼 필요가 있을 것 같다.

supsup-hae and others added 17 commits November 9, 2024 14:07
- key 값이 공유 되지 않도록 application.properties 제외
- SaveSinglePostRequest.java
- SavePostsByExcelRequest.java
- id를 기반으로 게시글 생성
- request dto을 record로 변경 시 생긴 코드 수정 반영
- id를 기반으로 게시글 조회 및 영속성 컨텍스트 이용한 조회수 증가
- 오타 수정 및 직관적인 네이밍 반영
- likes를 기반으로한 Pageable 정렬 기능 추가 위함
- 페이지네이션과 추가 기능(현재, 전체 페이지 수) 구현
- likes 값에 따른 DESC 정렬
- 메서드명을 더 정확하게 수정
- URI 경로를 RESTful 원칙에 맞게 수정
  - /search → /{id}
  - /single → /
  - /delete → /{id}
Copy link
Member

@yooooonshine yooooonshine left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

굿굿 너무 고생하셨습니다!
윤섭닙도 같이 동시성 문제, 인덱싱, 조회 최적화 쪽으로 파보셨으면 좋겠습니다!

page.getTotalPages(),
page.getTotalElements()
);
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

오 이렇게 따로 PageResponse를 만들어서 사용하시는군요!

맨날 Page 응답하면 Warning 뜨던데 이렇게 처리하면 좋을 거 같네요! 배워갑니다

@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@NonNull
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@NonNull을 필드와 생성자에서 모두 사용하시는 군요!
생성자에 붙이면 lombok이 처리해줄텐데 중복되는 느낌으로 필드에도 붙여주신 이유가 있을까요?
이 부분에서 @Column(nullable=false) 대신 @NonNull을 붙이신 이유가 궁금합니다!

return new Post(title, content, name, VIEWS_INIT_VALUE, LIKES_INIT_VALUE);
})
.toList();
postJdbcRepository.saveAllPost(posts);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

우왁 그레잇.,.,

} catch (Exception e) {
log.error("Failed to save single post", e);
throw ApiException.from(INTERNAL_SERVER_ERROR);
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이 부분에서 try catch예외처리를 해주신 이유가 궁급합니다!

@Override
public PostDto findPostById(Long id) {
try {
Post findPost = postRepository.findById(id).orElseThrow();
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

혹시 여기서 orElseThrow에서 어떤 예외를 던질지 명시해주지 않은 이유가 있으신가요!?

Copy link
Member

@chaen-ing chaen-ing left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

코드가 일관성 있으면서 보기에 좋은것같아요! 많이 배워갑니다 💯

Comment on lines +7 to +13
@Builder
public record PostDto(@NonNull String title, @NonNull String content, @NonNull String name, int views, int likes) {

public static PostDto from(Post post) {
return new PostDto(post.getTitle(), post.getContent(), post.getName(), post.getViews(), post.getLikes());
}
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

레코드에 빌더를 쓰니까 더 코드가 깔끔해지네요! 저도 사용해봐야겠어요!

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

예외도 꼼꼼히 처리하신거같아요 👍

Comment on lines +32 to +33
private final static int VIEWS_INIT_VALUE = 0;
private final static int LIKES_INIT_VALUE = 0;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍👍

import cotato.backend.domains.post.dto.request.SavePostsByExcelRequest;
import cotato.backend.domains.post.dto.request.SaveSinglePostRequest;

public interface PostService {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PostService 로 PostServiceImpl 을 한번 감싼 형태의 구조를 채택하신 이유가 궁금합니다!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants