중급자를 위해 준비한
[웹 개발, 백엔드] 강의입니다.
JPA(Java Persistence API)를 보다 쉽게 사용할 수 있도록 여러 기능을 제공하는 스프링 데이터 JPA에 대해 학습합니다.
✍️
이런 걸
배워요!
ORM에 대한 이해
JPA 프로그래밍
Bean 생성 방법
스프링 JPA가 어렵게 느껴졌다면?
개념과 원리, 실제까지 확실하게 학습해 보세요.
제대로 배우는
백기선의 스프링 데이터 JPA
JPA(Java Persistence API)를 보다 쉽게 사용할 수 있도록 여러 기능을 제공하는 스프링 데이터 JPA에 대해 학습합니다.
강의 :
https://www.inflearn.com/course/스프링-데이터-jpa#reviews
강의자료 :
https://docs.google.com/document/d/1IjSKwMEsLdNXhRLvFk576VTR03AKTED_3jMsk0bHANg/edit
소스 코드
https://github.com/braverokmc79/springdatajpa
https://github.com/braverokmc79/demojpa3
강좌 소개
Application -> 스프링 데이터 JPA (-> JPA -> JDBC) -> Database
강사 소개
백기선
마이크로소프트(2+) <- 아마존(1) <- 네이버(4.5) <- SLT(2.5) ...
강좌
스프링 프레임워크 입문 (Udemy)
백기선의 스프링 부트 (인프런)
특징
스프링 프레임워크 중독자
JPA 하이버네이트 애호가
유튜브 / 백기선
[2부: 스프링 데이터 JPA 활용]
26.스프링 데이터 Common 11. 웹 기능 1부 소개
강의 :
https://www.inflearn.com/course/lecture?courseSlug=스프링-데이터-jpa&unitId=13769&tab=curriculum
스프링 데이터 웹 지원 기능 설정
스프링 부트를 사용하는 경우에.. 설정할 것이 없음. (자동 설정)
스프링 부트 사용하지 않는 경우?
@Configuration @EnableWebMvc @EnableSpringDataWebSupport class WebConfiguration {}
제공하는 기능
도메인 클래스 컨버터
@RequestHandler 메소드에서 Pageable과 Sort 매개변수 사용
Page 관련 HATEOAS 기능 제공
PagedResourcesAssembler
PagedResoure
Payload 프로젝션
요청으로 들어오는 데이터 중 일부만 바인딩 받아오기
@ProjectedPayload, @XBRead, @JsonPath
요청 쿼리 매개변수를 QueryDSLdml Predicate로 받아오기
?firstname=Mr&lastname=White => Predicate
27.스프링 데이터 Common 12. 웹 기능 2부 DomainClassConverter
강의 :
https://www.inflearn.com/course/lecture?courseSlug=스프링-데이터-jpa&unitId=13770&tab=curriculum
스프링 Converter
Formatter도 들어 본 것 같은데...
@GetMapping("/posts/{id}") public String getAPost(@PathVariable Long id) { Optional<Post> byId = postRepository.findById(id); Post post = byId.get(); return post.getTitle(); }
@GetMapping("/posts/{id}") public String getAPost(@PathVariable(“id”) Post post) { return post.getTitle(); }
테스트
package com.example.demojap3.post; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.web.servlet.MockMvc; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @SpringBootTest @AutoConfigureMockMvc class PostControllerTest { @Autowired MockMvc mockMvc; @Autowired PostRepository postRepository; @Test public void getPost() throws Exception{ Post post=new Post(); post.setTitle("jpa"); postRepository.save(post); mockMvc.perform(get("/posts/"+post.getId())) .andDo(print()) .andExpect(status().isOk()) .andExpect(content().string("jpa")); } }
28.스프링 데이터 Common 13. 웹 기능 3부 Pageable과 Sort
강의 :
https://www.inflearn.com/course/lecture?courseSlug=스프링-데이터-jpa&unitId=13771&tab=curriculum
스프링 MVC HandlerMethodArgumentResolver
스프링 MVC 핸들러 메소드의 매개변수로 받을 수 있는 객체를 확장하고 싶을 때 사용하는 인터페이스
페이징과 정렬 관련 매개변수
page: 0부터 시작.
size: 기본값 20.
sort: property,property(,ASC|DESC)
예) sort=created,desc&sort=title (asc가 기본값)
@GetMapping("/posts") public Page<Post> getPosts(Pageable pageable){ return postRepository.findAll(pageable); }
package com.example.demojap3.post; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.web.servlet.MockMvc; import static org.hamcrest.core.Is.is; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; @SpringBootTest @AutoConfigureMockMvc class PostControllerTest { @Autowired MockMvc mockMvc; @Autowired PostRepository postRepository; @Test public void getPosts() throws Exception{ Post post =new Post(); post.setTitle("jpa"); postRepository.save(post); mockMvc.perform( get("/posts") .param("page", "0") .param("size", "10") .param("sort", "created,desc") .param("sort", "title") ) .andDo(print()) .andExpect(status().isOk()) .andExpect(jsonPath("$.content[0].title", is("jpa"))); } }
출력
MockHttpServletResponse: Status = 200 Error message = null Headers = [Content-Type:"application/json"] Content type = application/json Body = {"content":[{"id":1,"title":"jpa","content":null,"created":null}],"pageable":{"sort":{"empty":false,"unsorted":false,"sorted":true},"offset":0,"pageNumber":0,"pageSize":10,"unpaged":false,"paged":true},"last":true,"totalElements":1,"totalPages":1,"size":10,"number":0,"sort":{"empty":false,"unsorted":false,"sorted":true},"first":true,"numberOfElements":1,"empty":false} Forwarded URL = null Redirected URL = null Cookies = []
29.스프링 데이터 Common 14. 웹 기능 4부 HATEOAS
강의 :
https://www.inflearn.com/course/lecture?courseSlug=스프링-데이터-jpa&unitId=13772&tab=curriculum
라이브러리 추가
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-hateoas</artifactId> </dependency>
스프링 HATEOAS의 낮은 버전에서는 ResourceSupport / Resource / Resources / PagedResources와 같은 클래스를 제공해줬지만 버전이 올라가면서 ResourceSupport / Resource / Resources / PagedResources 클래스의 위치와 이름이 변경되었습니다.
HATEOAS에서 위와 같은 클래스들을 사용할 수 없다면 밑에 변경된 클래스들을 확인하고 변경해줘야 합니다.
첫 번째
첫 번째로 linkTo, methodOn의 메소드의 경우에는 옛날 버전에서는 ControllerLinkBuilder안에 포함되었지만 지금은 WebMvcLinkBuilder 안에 존재합니다.
- import static org.springframework.hateoas.mvc.ControllerLinkBuilder.*; 를
- import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.*; 로 변경
ResourceSupport -> RepresentationModel
Resource -> EntityModel
Resources -> CollectionModel
PagedResources -> PagedModel
1. 기본
@GetMapping("/posts") public Page<Post> getPosts(Pageable pageable){ return postRepository.findAll(pageable); }
=>출력
{ "content":[ ... { "id":111, "title":"jpa", "created":null } ], "pageable":{ "sort":{ "sorted":true, "unsorted":false }, "offset":20, "pageSize":10, "pageNumber":2, "unpaged":false, "paged":true }, "totalElements":200, "totalPages":20, "last":false, "size":10, "number":2, "first":false, "numberOfElements":10, "sort":{ "sorted":true, "unsorted":false } }
★2. hateoas 로 할경우
@GetMapping("/posts-ha") public PagedModel<EntityModel<Post>> getPosts(Pageable pageable, PagedResourcesAssembler<Post> assembler) { Post post=new Post(); post.setTitle("hello"); post.setContent("jpa"); postRepository.save(post); return assembler.toModel(postRepository.findAll(pageable)); }
"_embedded":{ "postList":[ { "id":140, "title":"jpa", "created":null }, ... { "id":109, "title":"jpa", "created":null } ] }, "_links":{ "first":{ "href":"http://localhost/posts?page=0&size=10&sort=created,desc&sort=title,asc" }, "prev":{ "href":"http://localhost/posts?page=1&size=10&sort=created,desc&sort=title,asc" }, "self":{ "href":"http://localhost/posts?page=2&size=10&sort=created,desc&sort=title,asc" }, "next":{ "href":"http://localhost/posts?page=3&size=10&sort=created,desc&sort=title,asc" }, "last":{ "href":"http://localhost/posts?page=19&size=10&sort=created,desc&sort=title,asc" } }, "page":{ "size":10, "totalElements":200, "totalPages":20, "number":2 } }
30.스프링 데이터 Common: 마무리
강의 :
https://www.inflearn.com/course/lecture?courseSlug=스프링-데이터-jpa&unitId=13774&tab=curriculum
지금까지 살펴본 내용
스프링 데이터 Repository
쿼리 메소드
메소드 이름 보고 만들기
메소드 이름 보고 찾기
Repository 정의하기
내가 쓰고 싶은 메소드만 골라서 만들기
Null 처리
쿼리 메소드 정의하는 방법
리포지토리 커스터마이징
리포지토리 하나 커스터마이징
모든 리포지토리의 베이스 커스터마이징
도메인 이벤트 Publish
스프링 데이터 확장 기능
QueryDSL 연동
웹 지원
댓글 ( 4)
댓글 남기기