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

Seminar/#7 #8

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open

Seminar/#7 #8

wants to merge 2 commits into from

Conversation

Yangdaehan
Copy link
Contributor

@Yangdaehan Yangdaehan commented May 1, 2024

이 주의 과제

블로그에 대해 글을 작성하는 POST API와, GET API를 구현

태스크

  • POST 되는 객체에 대해 Request body Validation을 진행
  • GET API 에서 SuccessStatusResponse와 ErrorResponse를 적절히 변경해서 Data를 담아보내기
  • 블로그를 소유하지 않은 사용자가 해당 블로그에 글을 작성할 경우 예외처리 진행
  1. PostController 클래스 생성

Post를 생성하는 API를 구현
사용자는 블로그 ID를 헤더를 통해 제공하고, Post의 내용은 Request Body를 통해 받음
Post 되는 객체에 대해 Request body Validation을 진행
 

@RestController
@RequestMapping("/api/v1")
@RequiredArgsConstructor
public class PostController {
private final PostService postService;
@PostMapping("/posts")
public ResponseEntity<SuccessStatusResponse> createPost(
@RequestHeader Long blogId,
@Valid @RequestBody PostCreateRequest postCreateRequest) {
return ResponseEntity.status(HttpStatus.CREATED).header(
"Location",
postService.create(blogId, postCreateRequest))
.body(SuccessStatusResponse.of(SuccessMessage.POST_CREATE_SUCCESS));
}
}

  1. PostService 클래스 생성

Post 생성
해당 블로그에 새로운 post를 생성 후 저장

@Service
@RequiredArgsConstructor
public class PostService {
private final PostRepository postRepository;
private final BlogService blogService;
public String create(Long blogId, PostCreateRequest postCreateRequest) {
Blog blog = blogService.findById(blogId);
Post post = new Post(postCreateRequest.title(), postCreateRequest.content(),blog);
post = postRepository.save(post);
return post.getId().toString();
}
}

  1. DTO 정의

Post 생성 DTO

public record PostCreateRequest(
String title,
String content
) {}

  1. SuccessMessage Enum 업데이트

Post 생성 메시지 추가

POST_CREATE_SUCCESS(HttpStatus.CREATED.value(), "게시글이 생성되었습니다.");

  1. PostRepository 생성

import org.sopt.spring.domain.Post;
import org.springframework.data.jpa.repository.JpaRepository;
public interface PostRepository extends JpaRepository<Post, Long> {
}

스크린샷 2024-05-02 오전 3 36 36

요구사항 분석

API명세서
 

[POST] 블로그 글 작성

  1. 어떤 API 인가요?
    POST 블로그 글 작성
    블로그에 글을 작성하는 API
     
  2. Request
    Path Parameter
     
    Request Header
  • Request Header

key value Description
blogId int 블로그 id

Request Body

  • Request Body

이름 타입 Description
title String 글 제목
content String 글 내용
 
 
  1. Response

Response Body

Response

  • Response Body

|status|201 created|

구현 고민 사항

권한 있는 아이디를 제외하고 예외처리하는 부분을 구현하는데 어려움을 겪었습니다. 예외처리를 하는 부분을 좀 더 따로 공부해야할것 같습니다....

질문있어요!

인텔리제이가 문제인지 push가 잘 되지 않았습니다... 그래서 commit을 여러번 시도하느라 막 쳤는데 commit 내용이 성의 없게 올라가게 되었습니다. 양해 부탁드립니다...

@paragon0107
Copy link

"권한 있는 아이디를 제외하고 예외처리하는 부분" 혹시 이부분이 어떤 부분인지 알 수 있을까요?
그리고 제가 봤을때는 아직 GetPost가 없더라구여 저같은 경우에 GetPost할 때 Post안에있는 Blog객체에 Member필드가 fetchtype.lazy 이 속성 때문에 로드가 안됐어서 많이 애를 먹었었는데 추가로 구현하신다면 이부분 참고하셔서 구현하시면 좋을것 같아요!

Comment on lines +18 to +19
Post post = new Post(postCreateRequest.title(), postCreateRequest.content(),blog);
post = postRepository.save(post);

Choose a reason for hiding this comment

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

객체 생성할 때 정적 팩토리 메소드 패턴을 사용해 보는 것도 좋을것 같아요! 물론 지금은 간단해서 객체 생성에 추가적인 로직이 필요 없지만 그래도 미리 사용해 보면서 나중에 복잡한 로직에서 적용시켜보면 좋을 것 같아요!
또 post객체도 따로 사용되는 곳이 있는게 아니니 save안에 넣어서 불필요한 메모리 사용을 줄이는 것도 좋다고 하더라구여!

Copy link

@eeddiinn eeddiinn left a comment

Choose a reason for hiding this comment

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

과제하느라 수고하셨습니다 😄😄

private final BlogService blogService;
public String create(Long blogId, PostCreateRequest postCreateRequest) {
Blog blog = blogService.findById(blogId);
Post post = new Post(postCreateRequest.title(), postCreateRequest.content(),blog);
Copy link

Choose a reason for hiding this comment

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

 Post post = Post.create(postCreateRequest, blog);

요기서 Post 클래스의 정적 팩토리 메서드를 호출하여 새로운 Post 객체를 생성할 수 있습니다 !!

post.title = title;
post.content = content;
return post;
}
Copy link

Choose a reason for hiding this comment

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

public static Post create(Blog blog, PostCreateRequest postCreateRequest) {
        return new Post(blog, postCreateRequest.content(), postCreateRequest.name());
    }

민규님이 말씀한 것 처럼 이렇게 정적 팩토리 메서드를 사용해보는 것도 좋을 것 같아요 !!!

Blog blog = blogService.findById(blogId);
Post post = new Post(postCreateRequest.title(), postCreateRequest.content(),blog);
post = postRepository.save(post);
return post.getId().toString();
Copy link

Choose a reason for hiding this comment

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

return postRepository.save(new Post(postCreateRequest.title(), postCreateRequest.content(), blogService.findById(blogId))).getId().toString();
이렇게 하면 한 줄로 만들 수 있어 코드가 훨씬 간결해집니당

Copy link
Member

@chaewonni chaewonni left a comment

Choose a reason for hiding this comment

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

과제 수고하셨습니다!! 이미 좋은 리뷰가 많아서 구경하고 갑니다!! 😁😁

Copy link
Contributor

@sohyundoh sohyundoh left a comment

Choose a reason for hiding this comment

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

대한님 과제하느라 고생하셨습니다!

과제 깔끔하니 좋네요!! 앞으로도 더더욱 화이팅입니다!
겁내지 않고 도전하는 모습 항상 응원하겠습니다!

Copy link
Contributor

Choose a reason for hiding this comment

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

과제에 있었던 Post를 생성할 때 Blog와 Member의 권한 체크도 한번 진행해보는게 어떨까요? 좋은 코드를 남겨두고 가겠습니다!

https://github.com/NOW-SOPT-SERVER/mini-min/pull/9/files#diff-63a808c22aa486813dcaea3a32deb0f692b71c4811cf8a7d386fb7c3e7047c26

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.

Week 03 과제
5 participants