์ง๊ธ๊น์ง Spring-JPA-MySql์ ์ฌ์ฉํด์ ์งํํ ํ๋ก์ ํธ์์๋ ์ ํต์ ? ์ธ ํ์ด์ง ๋ฐฉ์์ Offset-Limit
๋ฐฉ์์ ์ฌ์ฉํ๋ค. ์ฒซ ๋ฒ์งธ row๋ก๋ถํฐ offset๋งํผ ๋จ์ด์ง ๊ณณ์์ limit๋งํผ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐฉ์์ ๋งํ๋ค.
์ด ๋ฐฉ์์๋ ์ฑ๋ฅ์ ์ ํ์ํค๋ ์์๊ฐ ์๋ค.
๋ฐ์ดํฐ๊ฐ ๊ต์ฅํ ๋ง์ ๊ฒฝ์ฐ ํ์ด์ง๊ฐ ๋ค๋ก ๊ฐ์๋ก ์ ์ ์ฑ๋ฅ์ ํ๋ ์ฌํด์ง๋ค.
์ฑ๋ฅ์ ํ๋ offset๋งํผ ๋จ์ด์ง ๋ฐ์ดํฐ๋ฅผ ์ฝ๋ ๊ณผ์ ์ ๋ฐ์ํ๋ค. ์ธ์ ๋ ์ฒซ row๋ถํฐ offset๊น์ง ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ด ์ฌ์ค์ ์๊ธฐ ์ ๊น์ง offset์ ์ง์ ํ๋ฉด offset๋ถํฐ ํ์์ด ์์๋๋ ๊ฒ์ผ๋ก ์๊ณ ์์๋ค. um... ใ
๊ธฐ์กด์ offset-limit
๋ฐฉ์์์๋ ํ์ด์ง ๋ฒํธ๋ฅผ ์ ๊ณตํ๊ณ ํด๋ผ์ด์ธํธ๋ ํด๋น ํ์ด์ง๋ก ์ด๋ํ๋ ๋ฐฉ์์ด์๋ค. ์ด๋ฒ์๋ ํ์ด์ง๋ค์ด์
๋ฒํผ์ ์ ๊ณตํ์ง ์๊ณ ๋๋ณด๊ธฐ ๋ฒํผ ํ๋๋ง ์ ๊ณตํ๋ฉด offset-limit
๋ฐฉ์์์ ๋ค ํ์ด์ง๋ก ๊ฐ์๋ก ์ฑ๋ฅ์ด ์ ํ๋๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
๊ตฌํ Overview
PK๋ auto_increment๋ก ์ค์ ๋์ด ์๊ธฐ ๋๋ฌธ์ PK๋ฅผ ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌํ์ฌ ์ต์ ์ ๋ฐ์ดํฐ๊ฐ ์กฐํ๋๋๋ก ํ๋ค.
class ItemQueryRepositoryImpl(private val query: JPAQueryFactory): ItemQueryRepository {
/**
* ์ํ ๋ชฉ๋ก์กฐํ
*/
override fun getItemList(lastItemId: Long?, limit: Int): List<Item> {
return query.select(item)
.from(item)
.where(itemIdLessThen(lastItemId)) // ์ด์ ์์ฒญ์ ๋ง์ง๋ง pk๊ฐ๋ณด๋ค ์์ ๊ณณ๋ถํฐ ์กฐํ๋๋๋ก ํ๋ค.
.limit(limit.toLong())
.orderBy(item.itemId.desc())
.fetch()
}
fun itemIdLessThen(itemId: Long?): BooleanExpression? {
itemId?.let {
return item.itemId.lt(itemId)
} ?: return null
}
}
ํด๋ผ์ด์ธํธ์๊ฒ๋ ์กฐํ๊ฒฐ๊ณผ์ ์กฐํ๊ฒฐ๊ณผ์ ๋ง์ง๋ง PK๋ง ๋ด๋ ค์ค๋ค.
data class PageResponseV2<T> (
val data: List<T>,
val lastId: Long
)