๐Ÿ”ฅ TIL - Day 76 ํŽ˜์ด์ง• ์„ฑ๋Šฅ ๊ฐœ์„  (๋”๋ณด๊ธฐ ๋ฒ„ํŠผ ๋ฐฉ์‹)

Kim Dae Hyunยท2021๋…„ 12์›” 26์ผ
2

TIL

๋ชฉ๋ก ๋ณด๊ธฐ
87/93

์ง€๊ธˆ๊นŒ์ง€ Spring-JPA-MySql์„ ์‚ฌ์šฉํ•ด์„œ ์ง„ํ–‰ํ•œ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์ „ํ†ต์ ? ์ธ ํŽ˜์ด์ง• ๋ฐฉ์‹์€ Offset-Limit ๋ฐฉ์‹์„ ์‚ฌ์šฉํ–ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ row๋กœ๋ถ€ํ„ฐ offset๋งŒํผ ๋–จ์–ด์ง„ ๊ณณ์—์„œ limit๋งŒํผ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ์‹์„ ๋งํ•œ๋‹ค.

์ด ๋ฐฉ์‹์—๋Š” ์„ฑ๋Šฅ์„ ์ €ํ•˜์‹œํ‚ค๋Š” ์š”์†Œ๊ฐ€ ์žˆ๋‹ค.
๋ฐ์ดํ„ฐ๊ฐ€ ๊ต‰์žฅํžˆ ๋งŽ์€ ๊ฒฝ์šฐ ํŽ˜์ด์ง€๊ฐ€ ๋’ค๋กœ ๊ฐˆ์ˆ˜๋ก ์ ์  ์„ฑ๋Šฅ์ €ํ•˜๋Š” ์‹ฌํ•ด์ง„๋‹ค.
์„ฑ๋Šฅ์ €ํ•˜๋Š” offset๋งŒํผ ๋–จ์–ด์ง„ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š” ๊ณผ์ •์— ๋ฐœ์ƒํ•œ๋‹ค. ์–ธ์ œ๋‚˜ ์ฒซ row๋ถ€ํ„ฐ offset๊นŒ์ง€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ด ์‚ฌ์‹ค์„ ์•Œ๊ธฐ ์ „๊นŒ์ง€ offset์„ ์ง€์ •ํ•˜๋ฉด offset๋ถ€ํ„ฐ ํƒ์ƒ‰์ด ์‹œ์ž‘๋˜๋Š” ๊ฒƒ์œผ๋กœ ์•Œ๊ณ  ์žˆ์—ˆ๋‹ค. um... ใ… 


๐Ÿ“Œ ์„ฑ๋Šฅ๊ฐœ์„ 

๊ธฐ์กด์˜ offset-limit ๋ฐฉ์‹์—์„œ๋Š” ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ๋ฅผ ์ œ๊ณตํ•˜๊ณ  ํด๋ผ์ด์–ธํŠธ๋Š” ํ•ด๋‹น ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๋Š” ๋ฐฉ์‹์ด์˜€๋‹ค. ์ด๋ฒˆ์—๋Š” ํŽ˜์ด์ง€๋„ค์ด์…˜ ๋ฒ„ํŠผ์„ ์ œ๊ณตํ•˜์ง€ ์•Š๊ณ  ๋”๋ณด๊ธฐ ๋ฒ„ํŠผ ํ•˜๋‚˜๋งŒ ์ œ๊ณตํ•˜๋ฉด offset-limit ๋ฐฉ์‹์—์„œ ๋’ค ํŽ˜์ด์ง€๋กœ ๊ฐˆ์ˆ˜๋ก ์„ฑ๋Šฅ์ด ์ €ํ•˜๋˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ตฌํ˜„ Overview

  • ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์ตœ์ดˆ ์š”์ฒญ์‹œ ์ •ํ•ด์ง„ ํฌ๊ธฐ(limit) ๋งŒํผ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.
    ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํ„ดํ•˜๋ฉด์„œ ์กฐํšŒ๋œ ๊ฒฐ๊ณผ์˜ ๋งˆ์ง€๋ง‰ PK๋ฅผ ํ•จ๊ป˜ ๋ฆฌํ„ดํ•œ๋‹ค.
  • ๋”๋ณด๊ธฐ ๋ฒ„ํŠผ ํด๋ฆญ์‹œ ์„œ๋ฒ„๋กœ ๋งˆ์ง€๋ง‰ row์˜ PK๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.
  • ์„œ๋ฒ„๋Š” ์ „๋‹ฌ๋ฐ›์€ ๋งˆ์ง€๋ง‰ PK๋กœ๋ถ€ํ„ฐ limit๋งŒํผ์˜ ์กฐํšŒ๊ฒฐ๊ณผ๋ฅผ ๋งŒ๋“ค์–ด์„œ ๋ฆฌํ„ดํ•œ๋‹ค.
    (๋งˆ์ง€๋ง‰ PK๋ณด๋‹ค ์ž‘์€ ๊ณณ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•œ๋‹ค. - PK ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ)

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
)

๐Ÿ“Œ ์ฐธ๊ณ 

https://jojoldu.tistory.com/528

profile
์ข€ ๋” ์ฒœ์ฒœํžˆ ๊นŒ๋จน๊ธฐ ์œ„ํ•ด ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ๐Ÿง

0๊ฐœ์˜ ๋Œ“๊ธ€