제공기능
사실, 제공기능 소개인데, 궁금해서 직접 짜봤다.
public interface PostRepository extends JpaRepository<Post,Long>, QuerydslPredicateExecutor<Post> {
Page<Post> findAll(Pageable pageable);
}
@RestController
public class PostController {
@Autowired
private PostRepository postRepository;
@GetMapping("/post/{id}")
public String getTitle(@PathVariable("id")Post post) {
return post.getTitle();
}
@GetMapping("/posts")
public PagedModel<EntityModel<Post>> getPosts(Pageable pageable, PagedResourcesAssembler<Post> assembler) {
Page<Post> all = postRepository.findAll(pageable);
return assembler.toModel(all);
}
@GetMapping("/postsByPredicate")
public Optional<Post> getPostsByPredicate(@QuerydslPredicate(root = Post.class) Predicate predicate){
Optional<Post> one = postRepository.findOne(predicate);
return one;
}
}
- 도메인 컨버터 : @PathVariable, RequestParamerter 로 들어오는 Domain Id 를 이용해 바로 도메인으로 받아낼 수 있다.
@Test
public void testRestController() throws Exception {
Post post = new Post();
post.setTitle("Jpa");
post.setContent("Spring Data");
postRepository.save(post);
mockMvc.perform(MockMvcRequestBuilders.get("/post/1"))
.andExpect(MockMvcResultMatchers.status().isOk()).andDo(MockMvcResultHandlers.print());
}
/////
Hibernate:
select
post0_.id as id1_0_0_,
post0_.content as content2_0_0_,
post0_.title as title3_0_0_
from
post post0_
where
post0_.id=?
2020-11-17 21:03:52.108 TRACE 16468 --- [ main] o.h.type.descriptor.sql.BasicBinder : binding parameter [1] as [BIGINT] - [1]
- 컨트롤러의 매개 값으로 Pageable 을 받아 낼 수 있다. (page & size)
@Test
public void testRestController1() throws Exception {
Post post = new Post();
post.setTitle("Jpa");
post.setContent("Spring Data");
postRepository.save(post);
mockMvc.perform(MockMvcRequestBuilders.get("/posts").param("page", "0").param("size", "10"))
.andExpect(MockMvcResultMatchers.status().isOk())
.andDo(MockMvcResultHandlers.print());
}
///
Hibernate:
select
post0_.id as id1_0_,
post0_.content as content2_0_,
post0_.title as title3_0_
from
post post0_ limit ?
///
Body = {"_embedded":{"postList":[{"id":1,"title":"Jpa","content":"Spring Data"}]},"_links":{"self":{"href":"http://localhost/posts?page=0&size=10"}},"page":{"size":10,"totalElements":1,"totalPages":1,"number":0}}
- Page 관련 HATEOAS 기능 제공 : 리소스에 관련된 링크정보를 PagedResourcesAssembler 를 이용해 줄 수 있다.
@Test
public void testRestController1() throws Exception {
Post post = new Post();
post.setTitle("Jpa");
post.setContent("Spring Data");
postRepository.save(post);
mockMvc.perform(MockMvcRequestBuilders.get("/posts").param("page", "0").param("size", "10"))
.andExpect(MockMvcResultMatchers.status().isOk())
.andDo(MockMvcResultHandlers.print());
}
///
MockHttpServletResponse:
Status = 200
Error message = null
Headers = [Content-Type:"application/hal+json"]
Content type = application/hal+json
Body = {"_embedded":{"postList":[{"id":1,"title":"Jpa","content":"Spring Data"}]},"_links":{"self":{"href":"http://localhost/posts?page=0&size=10"}},"page":{"size":10,"totalElements":1,"totalPages":1,"number":0}}
- 쿼리스트링이나 파라미터를 @QuerydslPredicate 를 이용해 Predicate 로 변환 (QueryDSL)
@Test
public void testPredicate() throws Exception {
Post post = new Post();
post.setTitle("Jpa");
post.setContent("Spring Data");
postRepository.save(post);
mockMvc.perform(MockMvcRequestBuilders.get("/postsByPredicate").param("title", "Jpa"))
.andExpect(MockMvcResultMatchers.status().isOk())
.andDo(MockMvcResultHandlers.print());
}
///
Hibernate:
select
post0_.id as id1_0_,
post0_.content as content2_0_,
post0_.title as title3_0_
from
post post0_
where
post0_.title=?
2020-11-17 21:08:24.528 TRACE 17320 --- [ main] o.h.type.descriptor.sql.BasicBinder : binding parameter [1] as [VARCHAR] - [Jpa]
2020-11-17 21:08:24.532 TRACE 17320 --- [ main] o.h.type.descriptor.sql.BasicExtractor : extracted value ([id1_0_] : [BIGINT]) - [1]
2020-11-17 21:08:24.536 TRACE 17320 --- [ main] o.h.type.descriptor.sql.BasicExtractor : extracted value ([content2_0_] : [VARCHAR]) - [Spring Data]
2020-11-17 21:08:24.536 TRACE 17320 --- [ main] o.h.type.descriptor.sql.BasicExtractor : extracted value ([title3_0_] : [VARCHAR]) - [Jpa]
///
Content type = application/json
Body = {"id":1,"title":"Jpa","content":"Spring Data"}
'springframework > Spring Data JPA' 카테고리의 다른 글
Spring Data Common : Web - Pageable , Sort (0) | 2020.11.17 |
---|---|
Spring Data Common : Web - Domain Class Converter (0) | 2020.11.17 |
Spring Datat Common : QueryDSL 변경사항 (0) | 2020.11.17 |
Spring Data Common : QueryDSL (0) | 2020.11.17 |
Spring Data Common : Domain Event (0) | 2020.11.17 |