728x90
체크 사항
- 로그인이 되어있어야 하며, 토큰으로 인증을 통과해야 한다.
- 회원만이 글 작성 가능
DTO
PostRequest
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Builder
public class PostRequest {
private String title;
private String body;
}
입력폼에서 요구하는 "title"과 "body"를 받아올 dto를 생성합니다.
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Builder
public class PostResponse {
private String message;
private Integer postId;
}
응답폼에서 요구하는 "message"와 "postId"를 반환할 수 있는 dto를 생성합니다.
Controller
@RequestMapping("/api/v1/posts")
@RestController
@RequiredArgsConstructor
@Slf4j
public class PostController {
private final PostService postService;
@PostMapping
public Response<PostResponse> post(@RequestBody PostRequest dto, Authentication authentication){
String userName = authentication.getName();
log.info("userName = {}", userName);
PostResponse postResponse = postService.post(dto, userName);
return Response.success(postResponse);
}
}
Authentication을 사용하여 HttpHeader에 저장되어 있는 Authentication 정보를 받아와 String 형식의 변수인 userName에 Authentication의 userName을 저장합니다.
dto와 userName을 사용해서 Post등록을 진행합니다.
Post등록을 마치고 무사히 PostResponse로 저장되었다면 받아온 PostResponse를 반환합니다.
Service
@Service
@RequiredArgsConstructor
public class PostService {
private final PostRepository postRepository;
private final UserRepository userRepository;
public PostResponse post(PostRequest dto, String userName) {
// user가 찾아지지 않는다면 등록할 수 없다.
User user = userRepository.findByUserName(userName)
.orElseThrow(
() -> new SNSAppException(ErrorCode.USERNAME_NOT_FOUND, "일치하지 않은 회원 입니다.")
);
Post post = Post.builder()
.user(user)
.title(dto.getTitle())
.body(dto.getBody())
.build();
postRepository.save(post);
return new PostResponse("포스트 등록 완료", post.getId());
}
}
Authentication에서 받아온 userName이 null인 경우 Token이 없거나 잘못된 경우이다.
로그인이 안되어있거나, 잘못된 경로로 접근한 경우이므로 예외를 발생시킨다.
User를 잘 찾아왔다면 Dto에 담겨있는 데이터와 User데이터를 가지고 Post 객체를 생성한다.
생성한 객체를 Repository를 통해 save 하고 PostResponse에 맞춰서 message에 "포스트 등록 완료", postId에 작성된 Post 객체의 id를 넣어 컨트롤러로 반환한다.
결과
반응형
'프로젝트 > Archive' 카테고리의 다른 글
[03] 게시된 모든 포스트 목록 보기 (0) | 2022.12.23 |
---|---|
[03] 포스트 단건 상세 정보 보기 만들기 (0) | 2022.12.23 |
[03] 포스트 기능 만들기 준비 (0) | 2022.12.23 |
[02] 로그인 기능 만들기 - 2 (0) | 2022.12.21 |
[02] 로그인 기능 만들기 - 1 (1) | 2022.12.21 |