실전! 스프링 데이터 JPA - 인프런 | 강의
스프링 데이터 JPA는 기존의 한계를 넘어 마치 마법처럼 리포지토리에 구현 클래스 없이 인터페이스만으로 개발을 완료할 수 있습니다. 그리고 반복 개발해온 기본 CRUD 기능도 모두 제공합니다.
www.inflearn.com
Spring Data JPA - Reference Documentation
Example 119. Using @Transactional at query methods @Transactional(readOnly = true) interface UserRepository extends JpaRepository { List findByLastname(String lastname); @Modifying @Transactional @Query("delete from User u where u.active = false") void del
docs.spring.io
Spring Data는 Spring MVC와 함께 사용하면 다양한 WEB 확장 기능을 제공한다.
스프링부트를 사용하지않는다면, 아래와같은 설정을 통해 WEB 확장 기능을 활성화 할 수 있다.
@Configuration
@EnableWebMvc
@EnableSpringDataWebSupport
class WebConfiguration {}
도메인 클래스 컨버터
http request에 엔티티의 아이디가 파라미터로 넘어오는 경우 엔티티 객체를 찾아서 바인딩 시켜준다.
아래의 코드에서 HTTP request로 회원ID를 받지만, 도메인 클래스 컨버터가 동작하여 회원 엔티티객체를 반환시켜준다.
* 주의 : 트랜젝션 외부에서 엔티티를 조회했으므로 엔티티가 준영속 상태이다. (영속성 컨텍스트에 없음)
@Controller
class UserController {
@RequestMapping("/member/{id}")
String showUserForm(@PathVariable("id") Member member, Model model) {
model.addAttribute("member", member);
return "memberForm";
}
}
페이징과 정렬
스프링 데이터가 제공하는 페이징과 정렬기능을 스프링 MVC에서 편리하게 사용할 수 있다.
아래코드에서 [http://localhost:8080/members?page=0&size=3&sort=username.desc] 라는 요청이 들어왔을 때
총 3건의 member 정보가 username기준으로 내림차순되어 조회된다.
@Controller
class MemberController {
...
@RequestMapping("/members")
String Page<Member>(Model model, Pageable pageable) {
return memberRepository.findAll(pageable);
}
}
Request에 사용되는 Pageable 매개변수
page | 검색하려는 페이지 (default : 0) |
size | 검색하려는 페이지의 크기 (default : 20) |
sort | 정렬 속성으로 형식은 다음과 같다.[property,property(,ASC|DESC)(,IgnoreCase)] 기본 값은 대소문자를 구분하는 오름차순이다. ex) ?sort=firstname&sort=lastname,asc&sort=city,ignorecase |
request에 사용되는 pageable의 default값을 변경하기 위해서 아래와같은 설정을 적용할 수 있다.
글로벌 설정
application-properties에 아래 옵션을 추가한다.
기본 페이지 사이즈 설정 : spring.data.web.pageable.default-page-size=20
최대 페이지 사이즈 설정 : spring.data.web.pageable.max-page-size=2000
개별 설정
@PageableDefault 어노테이션을 사용
@RequestMapping(value = "/members", method = RequestMethod.GET)
public Page<Member> list(@PageableDefault(size = 12,
sort = “username”,
direction = Sort.Direction.DESC) Pageable pageable) {
return memberRepository.findAll(pageable);
}
페이징 정보가 둘 이상인 경우
[http://localhost:8080/members?member_page=1&order_page=1] 같은 요청이 들어온 경우
아래 코드와 같이 @Qualifier 어노테이션을 통해 접두사를 정의하여 Pageable 객체를 구분할 수 있다.
@RequestMapping(value = "/members", method = RequestMethod.GET)
public Dto list(@Qualifer("Member") Pageable memberPageable,
@Qualifer("Order") Pageable orderPageable) {
...
}
'Spring Data JPA' 카테고리의 다른 글
Auditing (0) | 2022.12.20 |
---|---|
사용자 정의 레퍼지토리 (0) | 2022.12.18 |
Hint & Lock (0) | 2022.12.18 |
엔티티 그래프 @EntityGraph (0) | 2022.12.18 |
벌크성 수정쿼리 @Modifying (0) | 2022.12.18 |