이제 위의 GET API와 POST API 구현과정을 정리해보자.
// GET /users/{id}/posts
@GetMapping("/jpa/users/{id}/posts")
public List<Post> retrievePostsForUser(@PathVariable("id") int id) {
User user = repository.findById(id).get();
if (user == null) {
throw new UserNotFoundException("id" + id);
}
return user.getPosts();
}
실행결과,
user 데이터들을 저장할 UserRepository가 있듯이, Post 게시글 데이터들을 저장할 PostRepository를 만들어야 한다!
package com.minjiki2.rest.webservices.restfulwebservices.jpa;
import org.springframework.data.jpa.repository.JpaRepository;
import com.minjiki2.rest.webservices.restfulwebservices.user.Post;
public interface PostRepository extends JpaRepository<Post, Integer> {
}
@Size(min = 20)
private String description;
@ManyToOne
@JsonIgnore
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
private PostRepository postRepository;
public UserJpaResource(UserRepository repository, PostRepository postRepository) {
this.repository = repository;
this.postRepository = postRepository;
}
// POST /users/{id}/posts
@PostMapping("/jpa/users/{id}/posts")
public ResponseEntity<Object> createPostForUser(@PathVariable("id") int id, @Valid @RequestBody Post post) {
User user = userRepository.findById(id).get();
if (user == null) {
throw new UserNotFoundException("id" + id);
}
post.setUser(user);
Post savedPost = postRepository.save(post);
// /jpa/users/{id}/posts/{post_id}
URI location = ServletUriComponentsBuilder.fromCurrentContextPath()
.path("/{id}").buildAndExpand(savedPost.getId()).toUri();
return ResponseEntity.created(location).build();
}
post를 save했다면, 추가된 post의 URL도 만들어야 함
/jpa/users/{id}/posts/{post_id}
fromCurrentContextPath() → 현재 request의 url을 반환해준다. 즉 /jpa/users/{id}/posts를 반환
path() → 현재 url에 /{post_id} url를 append시키고,
buildAndExpand로 path parameter값을 추가된 post_id로 replace시키고,
toUri() → URI 클래스 형태로 반환시켜준다
실행결과,
참고 및 출처
이 시리즈는 Udemy 강의의 내용을 정리한 것입니다.
https://www.udemy.com/course/spring-boot-and-spring-framework-korean/