Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 스프링
- springdatajpa
- transaction
- http
- JPQL
- jpa
- 자바
- 백준
- 김영한
- Greedy
- Exception
- SpringBoot
- 인프런
- 알고리즘
- db
- java
- Spring Boot
- Servlet
- 그리디
- 스프링 핵심 기능
- AOP
- Android
- Proxy
- pointcut
- Thymeleaf
- JDBC
- kotlin
- 스프링 핵심 원리
- spring
- QueryDSL
Archives
- Today
- Total
개발자되기 프로젝트
Web 확장 : 도메인 클래스 컨버터, 페이징 & 정렬 본문
1. 도메인 클래스 컨버터
- HTTP 파라미터로 넘어온 엔티티의 아이디로 엔티티 객체를 찾아서 바인딩해줌
- 쉽게말해 @Pathvariable로 id를 받으면 스프링이 id를 가지고 엔티티를 바인딩함.
- findMember : id를 파라미터로 받아 직접 member를 찾아옴.
- fimdMember2 : id를 파라미터로 받으면 스프링이 member와 바인딩함.
@GetMapping("/members/{id}")
public String findMember(@PathVariable("id") Long id){
Member member = memberRepository.findById(id).get();
return member.getUserName();
}
@GetMapping("/members2/{id}")
public String findMember2(@PathVariable("id") Member member){
//Member member = memberRepository.findById(id).get();
return member.getUserName();
}
- 주의: 도메인 클래스 컨버터로 엔티티를 파라미터로 받으면,
- 이 엔티티는 단순 조회용으로만 사용해야 한다.
- (트랜잭션이 없는 범위에서 엔티티를 조회했으므로, 엔티티를 변경해도 DB에 반영되지 않는다.)
2. 페이징, 정렬
1) 페이징
- 파라미터로 Pageable을 받으면
- HTTP 파리미터에 page=?&size=? 가 있으면
http://localhost:8080/members?page=0&size=3
- 넘어온 파라미터를 가지고 Pageable의 구현체인 PageRequest를 만들어서 메서드에 넘겨줌
@GetMapping("/members")
public Page<Member> list(Pageable pageable){
Page<Member> page = memberRepository.findAll(pageable);
return page;
}
- 애플리케이션을 실행시키고 위의 url로 접속해보자.
{
"content": [
{
"createdDate": "2021-08-31T20:02:40.485596",
"lastModifiedDate": "2021-08-31T20:02:40.485596",
"createdBy": "9ecef417-7e8c-41ed-9854-df21d3506706",
"lastModifiedBy": "9ecef417-7e8c-41ed-9854-df21d3506706",
"id": 1,
"userName": "user0",
"age": 0,
"team": null
},
{
"createdDate": "2021-08-31T20:02:40.53407",
"lastModifiedDate": "2021-08-31T20:02:40.53407",
"createdBy": "d574508b-bb42-4c72-9201-a5b662f11725",
"lastModifiedBy": "d574508b-bb42-4c72-9201-a5b662f11725",
"id": 2,
"userName": "user1",
"age": 1,
"team": null
},
{
"createdDate": "2021-08-31T20:02:40.537071",
"lastModifiedDate": "2021-08-31T20:02:40.537071",
"createdBy": "4a3424ef-cbee-4abc-bc08-1c6f984565b5",
"lastModifiedBy": "4a3424ef-cbee-4abc-bc08-1c6f984565b5",
"id": 3,
"userName": "user2",
"age": 2,
"team": null
}
],
"pageable": {
"sort": {
"sorted": false,
"unsorted": true,
"empty": true
},
"offset": 0,
"pageNumber": 0,
"pageSize": 3,
"paged": true,
"unpaged": false
},
"last": false,
"totalPages": 34,
"totalElements": 100,
"size": 3,
"number": 0,
"sort": {
"sorted": false,
"unsorted": true,
"empty": true
},
"first": true,
"numberOfElements": 3,
"empty": false
}
- 기본적으로 20개씩 나온다. 기본 설정을 바꾸고 싶으면??
- 글로벌 설정 : Application.yml에 설정을 해주면 됨.
data:
web:
pageable:
default-page-size: 10
max-page-size: 2000
- 특정 메서드만 : @PageableDefault
@GetMapping("/members")
public Page<Member> list(@PageableDefault(size = 5) Pageable pageable){
Page<Member> page = memberRepository.findAll(pageable);
return page;
}
2) 정렬
- 정렬 : 쿼리 파라미터를 추가하며됨.
- sort=대상,정렬방법
- 여러개도 가능
localhost:8080/members?page=0&size=3&sort=id,desc
localhost:8080/members?page=0&size=3&sort=id,desc&sort=userName,desc
3) 접두사
- 페이징 정보가 둘 이상이면 접두사로 구분
- @Qualifier 에 접두사명 추가 "{접두사명}_xxx”
- 예제: /members?member_page=0&order_page=1
public String list(
@Qualifier("member") Pageable memberPageable,
@Qualifier("order") Pageable orderPageable, ...
4) Page 내용을 DTO로 변환
- map을 통해 page내부의 member를 memberDto로 변환.
@GetMapping("/members")
public Page<MemberDto> list(@PageableDefault(size = 5) Pageable pageable){
Page<Member> page = memberRepository.findAll(pageable);
Page<MemberDto> map = page.map(member -> new MemberDto(member.getId(), member.getUserName(), null));
return map;
}
5)페이지 번호가 기본 0인데,, 1부터 시작하고 싶으면?
- Pageable, Page를 파리미터와 응답 값으로 사용히지 않고, 직접 클래스를 만들어서 처리한다.
그리고 직접 PageRequest(Pageable 구현체)를 생성해서 리포지토리에 넘긴다.
물론 응답값도 Page 대신에 직접 만들어서 제공해야 한다. - spring.data.web.pageable.one-indexed-parameters 를 true 로 설정한다.
그런데 이 방법은 web에서 page 파라미터를 -1 처리 할 뿐이다.
따라서 응답값인 Page 에 모두 0 페이지 인덱스를 사용하는 한계가 있다.
그래서 Pageable 내의 데이터 가 맞지 않음
왜냐? Pageable의 데이터는 인덱스 0을 기준으로 함.ㅋㅋㅋㅋㅋㅋㅋㅋㅋ
3. GitHub : 210831 Web, Paging, Sorting
'인프런 > [인프런] Spring Data JPA' 카테고리의 다른 글
Query By Example (0) | 2021.08.31 |
---|---|
SpringDataJpa의 구현체 (0) | 2021.08.31 |
Auditing (0) | 2021.08.30 |
사용자 정의 Repository (0) | 2021.08.30 |
JPA Hint & Lock (0) | 2021.08.29 |
Comments