[JPA] Spring Data JPA - Web ํ์ฅ ๊ธฐ๋ฅ
by rlaehddnd0422Spring Data JPA๋ MVC์์ ์ฌ์ฉํ ์ ์๋ ํธ๋ฆฌํ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
๋๋ฉ์ธ ํด๋์ค ์ปจ๋ฒํฐ ๊ธฐ๋ฅ
๋๋ฉ์ธ ํด๋์ค ์ปจ๋ฒํฐ๋ HTTP ํ๋ผ๋ฏธํฐ๋ก ๋์ด์จ ์ํฐํฐ์ ์์ด๋๋ก ์ํฐํฐ ๊ฐ์ฒด๋ฅผ ์ฐพ์์ ๋ฐ์ธ๋ฉํด์ค๋๋ค.
๊ธฐ์กด์๋ ์๋์ ๊ฐ์ด ์๋ณ์๋ฅผ Service๊ณ์ธต์ด๋ Repository๊ณ์ธต์์ ๋ฉ์๋๋ฅผ ํตํด ์ฐพ๊ฒ ํ์ง๋ง,
@GetMapping("/members/{id}")
@ResponseBody
public String findMember(@PathVariable("id") Long id){
return memberRepository.findById(id).getName()
}
Spirng Data JPA๊ฐ ์ ๊ณตํ๋ ๋๋ฉ์ธ ํด๋์ค ์ปจ๋ฒํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ณ์๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์ ์ํฐํฐ์ ์์ด๋๋ก ์ํฐํฐ ๊ฐ์ฒด๋ฅผ ์ฐพ์์ ๋ฐ์ธ๋ฉํ ์ ์์ต๋๋ค.
@GetMapping("/members/{id}")
public String findMember(@PathVariable("id") Member member) {
return member.getName();
}
์ฃผ์ํ ์ : ํธ๋์ญ์ ์ด ์๋ ๋ฒ์์์ ์ํฐํฐ๋ฅผ ์กฐํํ๊ธฐ ๋๋ฌธ์, ์ํฐํฐ๋ฅผ ๋ณ๊ฒฝํด๋ DB์ ๋ฐ์๋์ง ์์ต๋๋ค!
๋ฐ๋ผ์ ์ด ๊ธฐ๋ฅ์ ๋จ์ํ ์กฐํ์ฉ์ผ๋ก๋ง ์ฌ์ฉํด์ผ ํฉ๋๋ค.
ํ์ด์ง ๋ฐ ์ ๋ ฌ ๊ธฐ๋ฅ
์คํ๋ง ๋ฐ์ดํฐ๊ฐ ์ ๊ณตํ๋ ํ์ด์ง๊ณผ ์ ๋ ฌ ๊ธฐ๋ฅ์ MVC์์ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก HandlerMethodArgumentResolver๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ํ์ด์ง ๊ธฐ๋ฅ : PageableHandlerMethodArgumentResolver
- ์ ๋ ฌ ๊ธฐ๋ฅ : SortHandlerMethodArgumentResolver
@GetMapping("/members")
public Page<Member> list(Pageable pageable, Model model){
Page<Member> page = memberRepository.findAll(pageable);
return page;
}
HandlerMethodArgumentResolver๋ฅผ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์, ํ๋ผ๋ฏธํฐ๋ก Pageable์ ๋ฐ์ ์ ์์ต๋๋ค.
์์ฒญ ํ๋ผ๋ฏธํฐ
- page : ํ์ฌ ํ์ด์ง, 0๋ถํฐ ์์
- size : ํ ํ์ด์ง์ ๋ ธ์ถํ ๋ฐ์ดํฐ ๊ฑด์
- sort : ์ ๋ ฌ ์กฐ๊ฑด ์ ์
ex) /members?page=0&size=3&sort=id,desc&sort=username,desc
์ถ๊ฐ1 : ์์ฒญ ํ๋ผ๋ฏธํฐ ์ ๋ณด ๋ํดํธ ๊ฐ์ application.properties์ ๋ฑ๋กํด์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
spring.data.web.pageable.default-page-size=20 /# ๊ธฐ๋ณธ ํ์ด์ง ์ฌ์ด์ฆ/
spring.data.web.pageable.max-page-size=2000 /# ์ต๋ ํ์ด์ง ์ฌ์ด์ฆ/
์ถ๊ฐ1-1 : ๊ฐ๋ณ์ค์ ์ @PageableDefulat ์ด๋ ธํ ์ด์ ์ฌ์ฉ
public String list(@PageableDefault(size = 12, sort = “username”,
direction = Sort.Direction.DESC) Pageable pageable) {
...
}
์ถ๊ฐ 2 : ํ์ด์ง ์ ๋ณด๊ฐ ๋ ์ด์์ธ ๊ฒฝ์ฐ - ์ด ๋ @Qualifier์ ์ ๋์ฌ๋ช ์ ์ถ๊ฐํด ์ถ๊ฐ ๊ตฌ๋ถ์๋ฅผ ๋ฑ๋กํด ์ค์๋ค.
@GetMapping("/members")
public String list(
@Qualifier("member") Pageable memberPageable,
@Qualifier("order") Pageable orderPageable, ...){
...
}
ex) /members?member_page=0&order_page=1&member_size=5&order_size=3
์ถ๊ฐ 3 : ์ํฐํฐ๋ฅผ ๊ทธ๋๋ก ๋ ธ์ถํ๋ ๊ฒ์ ์ธ์ ๋ ์ํํฉ๋๋ค. ํ์ด์ง์ ์ฌ์ฉํ ๋ ๋ํ ์ํฐํฐ๋ฅผ ๊ทธ๋๋ก ๋ ธ์ถํ์ง ๋ง๊ณ DTO๋ฅผ ์ฌ์ฉํฉ์๋ค !
Page๋ map()์ ์ง์ํด์ ๋ด๋ถ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฅธ ๊ฒ์ผ๋ก ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
@GetMapping("/members")
public Page<MemberDto> list(Pageable pageable) {
Page<Member> page = memberRepository.findAll(pageable);
Page<MemberDto> pageDto = page.map(MemberDto::new);
return pageDto;
}
์ถ๊ฐ 4 : ํ์ด์ง๋ฅผ 1๋ถํฐ ์์ํ๊ณ ์ถ์ผ๋ฉด PageableHandlerMethodArgumentResolver๋ฅผ ์คํ๋ง ๋น์ผ๋ก ์ง์ ๋ฑ๋กํ ์ดํ setOneIndexedParameters๋ฅผ true๋ก ์ค์
@Configuration
public class CustomPageableConfiguration {
@Bean
public PageableHandlerMethodArgumentResolverCustomizer customize() {
return p -> p.setOneIndexedParameters(true);
}
}
๋๋ application.properties์ ์ค์ ์ถ๊ฐ
spring.data.web.pageable.one-indexed-parameters=true
์ด ๋ฐฉ๋ฒ๋ค์ web์์ page ํ๋ผ๋ฏธํฐ๋ฅผ -1 ์ฒ๋ฆฌํ ๋ฟ์ด๊ธฐ ๋๋ฌธ์ ๋ฐ๋ผ์ ํ๋ผ๋ฏธํฐ๋ ๋ฉ์๋๋ฅผ๋ฅผ ํตํด ์ ๋ ฅ๋ฐ๋ ๊ฐ๊ณผ -1์ฉ ์ฐจ์ด๊ฐ ๋๊ธฐ ๋๋ฌธ์ ํ์ฌ ํ์ด์ง index๋ฅผ ๋ฐํํ๊ณ ์ถ๋ค๋ฉด ๋ฐ๋์ ์ ๋ ฅ ๊ฐ์ -1์ ํด์ฃผ์ด์ผ ํฉ๋๋ค.
<์ฐธ๊ณ ์๋ฃ>
'๐ Backend > Spring Data JPA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JPA] ํ์ด์ง์ ์ฌ์ฉ๋๋ Page์ Slice (0) | 2023.06.23 |
---|---|
[JPA] Spring Data JPA ๊ตฌํ์ฒด(SimpleJpaRepository) ๋ถ์ (0) | 2023.05.22 |
[JPA] Spring Data JPA - ํ์ฅ ๊ธฐ๋ฅ (0) | 2023.05.19 |
[JPA] Spring Data JPA - ์ฟผ๋ฆฌ ๋ฉ์๋ ๊ธฐ๋ฅ (0) | 2023.05.18 |
[JPA] JPQL ๋ฌธ๋ฒ 4 - ๋คํ์ฑ ์ฟผ๋ฆฌ, ์ํฐํฐ ์ง์ ์ฌ์ฉ, Named ์ฟผ๋ฆฌ (0) | 2023.05.10 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
Study Repository
rlaehddnd0422