springframework/Spring Data JPA

Spring Data Common : Web 소개

Jungsoomin :) 2020. 11. 17. 21:11

제공기능

사실, 제공기능 소개인데, 궁금해서 직접 짜봤다.

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"}