๊ด๋ฆฌ์ ํ๋ฉด API๋ฅผ ๋น ๋ฅด๊ฒ ๋ง๋๋: ์ปค์ vs ์คํ์ ํ์ด์ง๋ค์ด์
์ ๋ ฌ, ํํฐ, ์ด๊ณ์ ๋ํด ์ผ๊ด๋ API ๊ณ์ฝ์ ์ฌ์ฉํด ์น๊ณผ ๋ชจ๋ฐ์ผ ๊ด๋ฆฌ์ ํ๋ฉด์ ์๋ต์ฑ์ ์ ์งํ๋ ์ปค์ vs ์คํ์ ํ์ด์ง๋ค์ด์ ์ ํ์ตํ์ธ์.

๊ด๋ฆฌ์ ํ๋ฉด์ด ๋๋ฆฌ๊ฒ ๋๊ปด์ง๋ ์ด์
๊ด๋ฆฌ์ ํ๋ฉด์ ํํ ๊ฐ๋จํ ํ ์ด๋ธ์์ ์์ํฉ๋๋ค: ์ฒ์ 25๊ฐ ํ์ ๋ถ๋ฌ์ค๊ณ , ๊ฒ์ ์์๋ฅผ ์ถ๊ฐํ๋ฉด ๋. ๋ช๋ฐฑ ๊ฑด์ผ ๋ ์ฆ๊ฐ์ ์ผ๋ก ๋๊ปด์ง๋๋ค. ํ์ง๋ง ๋ฐ์ดํฐ์ ์ด ์ปค์ง๋ฉด ๋์ผํ ํ๋ฉด์ด ๋ฒ๋ฒ ๊ฑฐ๋ฆฌ๊ธฐ ์์ํฉ๋๋ค.
๋ฌธ์ ๋ ๋ณดํต UI๊ฐ ์๋๋๋ค. API๊ฐ ์ ๋ ฌ๊ณผ ํํฐ๋ฅผ ์ ์ฉํ ์ฑ๋ก 12ํ์ด์ง๋ฅผ ๋ฐํํ๊ธฐ ์ ์ ์ํํด์ผ ํ๋ ์์ ์ด ๋ฌธ์ ์ ๋๋ค. ํ ์ด๋ธ์ด ์ปค์ง์๋ก ๋ฐฑ์๋๋ ์ผ์นํ๋ ํญ๋ชฉ์ ์ฐพ๊ณ , ๊ฐ์๋ฅผ ์ธ๊ณ , ์์ชฝ ๊ฒฐ๊ณผ๋ฅผ ๊ฑด๋๋ฐ๋๋ผ ๋ ๋ง์ ์๊ฐ์ ์๋๋ค. ํด๋ฆญํ ๋๋ง๋ค ๋ ๋ฌด๊ฑฐ์ด ์ฟผ๋ฆฌ๊ฐ ์คํ๋๋ฉด ํ๋ฉด์ ๋ฐ์ํ๋ ๋์ ์๊ฐํ๋ ๊ฒ์ฒ๋ผ ๋๊ปด์ง๋๋ค.
๋น์ทํ ์ฆ์์ ์ธ์ ๋ ๋ํ๋ฉ๋๋ค: ํ์ด์ง ์ ํ์ด ์ ์ ๋๋ ค์ง๊ณ , ์ ๋ ฌ์ด ๋ํด์ง๊ณ , ๊ฒ์ ๊ฒฐ๊ณผ๊ฐ ํ์ด์ง๋ง๋ค ์ผ๊ด๋์ง ์์ผ๋ฉฐ, ๋ฌดํ ์คํฌ๋กค์ ๋น ๋ฅด๊ฒ ๋ก๋๋๋ค ๊ฐ์๊ธฐ ๋๋ ค์ง๋๋ค. ํ๋ฐํ ์์คํ ์์๋ ์์ฒญ ์ฌ์ด์ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋๋ฉด์ ์ค๋ณต์ด๋ ๋๋ฝ๋ ํ์ด ๋ณด์ผ ์๋ ์์ต๋๋ค.
์น๊ณผ ๋ชจ๋ฐ์ผ UI๋ ํ์ด์ง๋ค์ด์ ์ ์๋ก ๋ค๋ฅธ ์๊ตฌ๋ฅผ ํฉ๋๋ค. ์น ๊ด๋ฆฌ์ฉ ํ ์ด๋ธ์ ํน์ ํ์ด์ง๋ก ๊ฑด๋๋ฐ๊ฑฐ๋ ์ฌ๋ฌ ์ด๋ก ์ ๋ ฌํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค. ๋ชจ๋ฐ์ผ ํ๋ฉด์ ๋ณดํต ๋ค์ ์ฒญํฌ๋ฅผ ๋ถ๋ฌ์ค๋ ๋ฌดํ ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํ๋ฉฐ, ๊ฐ ํ ๋์์ด ๋์ผํ๊ฒ ๋น ๋ฅด๊ธธ ๊ธฐ๋ํฉ๋๋ค. API๊ฐ ํ์ด์ง ๋ฒํธ ๊ธฐ๋ฐ์ผ๋ก๋ง ์ค๊ณ๋๋ฉด ๋ชจ๋ฐ์ผ์ด ๊ณ ํต๋ฐ๊ณ , next/after ๊ธฐ๋ฐ์ผ๋ก๋ง ์ค๊ณ๋๋ฉด ์น ํ ์ด๋ธ์ด ์ ํ์ ์ผ ์ ์์ต๋๋ค.
๋ชฉํ๋ ๋จ์ํ 25๊ฐ ํญ๋ชฉ์ ๋ฐํํ๋ ๊ฒ์ด ์๋๋๋ค. ๋ฐ์ดํฐ๊ฐ ์ปค์ ธ๋ ๋น ๋ฅด๊ณ ์์ธก ๊ฐ๋ฅํ ํ์ด์ง, ํ ์ด๋ธ๊ณผ ๋ฌดํ ๋ฆฌ์คํธ ๋ชจ๋์ ์ ์ฉ๋๋ ๊ท์น์ ๋ง๋๋ ๊ฒ์ ๋๋ค.
UI๊ฐ ์์กดํ๋ ํ์ด์ง๋ค์ด์ ๊ธฐ๋ณธ
ํ์ด์ง๋ค์ด์ ์ ๊ธด ๋ชฉ๋ก์ ์์ ๋ฉ์ด๋ฆฌ๋ก ๋๋์ด ํ๋ฉด์ด ๋น ๋ฅด๊ฒ ๋ก๋ํ๊ณ ๋ ๋๋งํ๋๋ก ํฉ๋๋ค. UI๋ ๋ชจ๋ ๋ ์ฝ๋๋ฅผ ์์ฒญํ๋ ๋์ ๋ค์ ๊ฒฐ๊ณผ ์กฐ๊ฐ์ ์์ฒญํฉ๋๋ค.
๊ฐ์ฅ ์ค์ํ ์ ์ด๋ ํ์ด์ง ํฌ๊ธฐ(์ข
์ข
limit)์
๋๋ค. ์์ ํ์ด์ง๋ ์๋ฒ๊ฐ ์ฒ๋ฆฌํ ์์
์ด ์ ๊ณ ์ฑ์ด ๋ ๋๋งํ ํ๋ ์ ์ผ๋ฏ๋ก ๋ณดํต ๋ ๋น ๋ฅด๊ฒ ๋๊ปด์ง๋๋ค. ํ์ง๋ง ๋๋ฌด ์์ ํ์ด์ง๋ ์ฌ์ฉ์๊ฐ ๋ ์์ฃผ ํด๋ฆญํ๊ฑฐ๋ ์คํฌ๋กคํด์ผ ํ๋ฏ๋ก ๋ถํธํ ์ ์์ต๋๋ค. ๋ง์ ๊ด๋ฆฌ์ ํ
์ด๋ธ์์๋ 25~100๊ฐ๊ฐ ์ค์ฉ์ ๋ฒ์์ด๋ฉฐ, ๋ชจ๋ฐ์ผ์ ๋ณดํต ๋ฎ์ ์ชฝ์ ์ ํธํฉ๋๋ค.
์์ ์ ์ธ ์ ๋ ฌ ์์๋ ๋๋ถ๋ถ์ ํ์ด ์์ํ๋ ๊ฒ๋ณด๋ค ์ค์ํฉ๋๋ค. ์์ฒญ ์ฌ์ด์ ์์๊ฐ ๋ฐ๋๋ฉด ์ฌ์ฉ์๋ ํ์ด์ง๋ฅผ ๋๊ธฐ๋ฉฐ ์ค๋ณต ๋๋ ๋๋ฝ์ ๋ณด๊ฒ ๋ฉ๋๋ค. ์์ ์ ์ธ ์ ๋ ฌ์ ๋ณดํต created_at ๊ฐ์ ๊ธฐ๋ณธ ํ๋์ id ๊ฐ์ ํ์ด๋ธ๋ ์ด์ปค๋ฅผ ํฌํจํฉ๋๋ค. ์ด๋ ์คํ์
์ด๋ ์ปค์๋ ๋ชจ๋ ์ค์ํฉ๋๋ค.
ํด๋ผ์ด์ธํธ ๊ด์ ์์ ํ์ด์งํ๋ ์๋ต์ ํญ๋ชฉ, ๋ค์ ํ์ด์ง ํํธ(ํ์ด์ง ๋ฒํธ๋ ์ปค์ ํ ํฐ), ๊ทธ๋ฆฌ๊ณ UI๊ฐ ์ค์ ๋ก ํ์ํ ์นด์ดํธ๋ง ํฌํจํด์ผ ํฉ๋๋ค. ์ด๋ค ํ๋ฉด์ โ1-50 of 12,340โ ๊ฐ์ ์ ํํ ์ด๊ณ๋ฅผ ํ์๋ก ํ๊ณ , ๋ค๋ฅธ ํ๋ฉด์ has_more๋ง ์์ผ๋ฉด ๋ฉ๋๋ค.
์คํ์ ํ์ด์ง๋ค์ด์ : ์๋ ๋ฐฉ์๊ณผ ๋ฌธ์ ์
์คํ์
ํ์ด์ง๋ค์ด์
์ ๊ณ ์ ์ ์ธ ํ์ด์ง N ๋ฐฉ์์
๋๋ค. ํด๋ผ์ด์ธํธ๋ ๊ณ ์ ๋ ํ ์๋ฅผ ์์ฒญํ๊ณ ์ฒ์์ ๊ฑด๋๋ธ ํ ์๋ฅผ API์ ์๋ ค์ค๋๋ค. limit๊ณผ offset์ผ๋ก ๋ณด์ด๊ฑฐ๋ ์๋ฒ๊ฐ ์คํ์
์ผ๋ก ๋ณํํ๋ page์ pageSize๋ก ๋ณผ ์ ์์ต๋๋ค.
์ผ๋ฐ์ ์ธ ์์ฒญ ์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
GET /tickets?limit=50\u0026offset=950- โ์ฒ์ 950๊ฐ๋ฅผ ๊ฑด๋๋ฐ๊ณ ํฐ์ผ 50๊ฐ๋ฅผ ์ฃผ์ธ์.โ
ํ์ด์ง 20์ผ๋ก ๊ฑด๋๋ฐ๊ฑฐ๋ ์ค๋๋ ๋ ์ฝ๋๋ฅผ ์กฐํํ๊ฑฐ๋ ํฐ ๋ชฉ๋ก์ ์ฒญํฌ๋ก ๋ด๋ณด๋ผ ๋ ์ ์ฉํฉ๋๋ค. ๋ด๋ถ์ ์ผ๋ก๋ ์ค๋ช ํ๊ธฐ ์ฝ์ต๋๋ค: โํ์ด์ง 3์ ๋ณด์ธ์.โ
๋ฌธ์ ๋ ๊น์ ํ์ด์ง์์ ๋ํ๋ฉ๋๋ค. ๋ง์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ํนํ ์ ๋ ฌ ์์์ ์ ์ ํ ์ธ๋ฑ์ค๊ฐ ์์ ๋ ๊ฑด๋๋ด ํ์ ์ง๋์ผ ํฉ๋๋ค. ํ์ด์ง 1์ ๋น ๋ฅด์ง๋ง ํ์ด์ง 200์ ๋์ ๋๊ฒ ๋๋ ค์ง ์ ์๊ณ , ์ฌ์ฉ์๊ฐ ์คํฌ๋กคํ๊ฑฐ๋ ๊ฑด๋๋ธ ๋ ๊ด๋ฆฌ์ ํ๋ฉด์ด ์ง์ฐ๋๋ ์ด์ ๊ฐ ๋ฉ๋๋ค.
๋ ๋ค๋ฅธ ๋ฌธ์ ๋ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋ ๋์ ์ผ๊ด์ฑ์ ๋๋ค. ์ง์ ๋งค๋์ ๊ฐ ์ต์ ์์ผ๋ก ์ ๋ ฌ๋ ํฐ์ผ์ 5ํ์ด์ง๋ฅผ ์ด์ด๋ณธ๋ค๊ณ ๊ฐ์ ํด๋ณด์ธ์. ๋ณด๋ ์ฌ์ด์ ์ ํฐ์ผ์ด ๋ค์ด์ค๊ฑฐ๋ ์ค๋๋ ํฐ์ผ์ด ์ญ์ ๋ฉ๋๋ค. ์ฝ์ ์ ํญ๋ชฉ์ ์์ผ๋ก ๋ฐ์ด ์ค๋ณต์ ๋ง๋ค ์ ์๊ณ , ์ญ์ ๋ ํญ๋ชฉ์ด ์ฌ๋ผ์ง๊ฒ ํฉ๋๋ค.
์คํ์ ํ์ด์ง๋ค์ด์ ์ ์์ ํ ์ด๋ธ, ์์ ๋ ๋ฐ์ดํฐ์ , ๋๋ ์ผํ์ฑ ๋ด๋ณด๋ด๊ธฐ์๋ ๊ด์ฐฎ์ต๋๋ค. ํ์ง๋ง ํฐ ๊ท๋ชจ์ ํ๋ฐํ ํ ์ด๋ธ์์๋ ๊ณง ๋ฌธ์ ์ ์ด ๋๋ฌ๋ฉ๋๋ค.
์ปค์ ํ์ด์ง๋ค์ด์ : ์๋ ๋ฐฉ์๊ณผ ์์ ์ฑ
์ปค์ ํ์ด์ง๋ค์ด์
์ ๋ถ๋งํฌ๋ก์ ์ปค์๋ฅผ ์ฌ์ฉํฉ๋๋ค. โ7ํ์ด์ง๋ฅผ ๋ฌ๋ผโ๊ฐ ์๋๋ผ โ์ด ํญ๋ชฉ ๋ค๋ถํฐ ๊ณ์ํด ๋ฌ๋ผโ๊ณ ํด๋ผ์ด์ธํธ๊ฐ ๋งํฉ๋๋ค. ์ปค์๋ ๋ณดํต ๋ง์ง๋ง ํญ๋ชฉ์ ์ ๋ ฌ ๊ฐ(created_at, id ๋ฑ)์ ์ธ์ฝ๋ฉํ์ฌ ์๋ฒ๊ฐ ์ ํํ ์์น์์ ๋ค์ ์์ํ ์ ์๊ฒ ํฉ๋๋ค.
์์ฒญ์ ๋ณดํต ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
limit: ๋ฐํํ ํญ๋ชฉ ์cursor: ์ด์ ์๋ต์์ ๋ฐ์ ๋ถํฌ๋ช ํ ํฐ(์ข ์ขafter๋ผ๊ณ ๋ถ๋ฆผ)
์๋ต์ ํญ๋ชฉ๊ณผ ๊ทธ ์กฐ๊ฐ์ ๋์ ๊ฐ๋ฆฌํค๋ ์ ์ปค์๋ฅผ ๋ฐํํฉ๋๋ค. ์ค๋ฌด ์ฐจ์ด๋ ์ปค์๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํ์ ์ธ๊ณ ๊ฑด๋๋ฐ๋ผ๊ณ ์์ฒญํ์ง ์๋๋ค๋ ์ ์ ๋๋ค. ๋์ ์๋ ค์ง ์์น์์ ์์ํ๋ผ๊ณ ์์ฒญํฉ๋๋ค.
์ด ๋๋ฌธ์ ์ปค์ ํ์ด์ง๋ค์ด์
์ ์์ผ๋ก ์คํฌ๋กคํ๋ ๋ฆฌ์คํธ์์ ๋น ๋ฅด๊ฒ ์ ์ง๋ฉ๋๋ค. ์ ์ ํ ์ธ๋ฑ์ค๊ฐ ์์ผ๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ โX ์ดํ ํญ๋ชฉโ์ผ๋ก ๋ฐ๋ก ๊ฑด๋๋ด ๋ค์ limit๋งํผ ์ฝ์ ์ ์์ต๋๋ค. ๋ฐ๋ฉด ์คํ์
์ ์คํ์
์ด ์ปค์ง์๋ก ๋ ๋ง์ ํ์ ์ค์บํ๊ฑฐ๋ ๊ฑด๋๋ฐ์ด์ผ ํ ๋๊ฐ ๋ง์ต๋๋ค.
UI ๊ด์ ์์ ์ปค์ ํ์ด์ง๋ค์ด์
์ โ๋ค์โ์ด ์์ฐ์ค๋ฝ์ต๋๋ค: ๋ฐํ๋ ์ปค์๋ฅผ ๋ค์ ์์ฒญ์ ๊ทธ๋๋ก ๋ณด๋
๋๋ค. โ์ด์ โ์ ์ ํ ์ฌํญ์ด๊ณ ๋ ๊น๋ค๋กญ์ต๋๋ค. ์ผ๋ถ API๋ before ์ปค์๋ฅผ ์ง์ํ๊ณ , ๋ค๋ฅธ API๋ ์ญ์์ผ๋ก ๊ฐ์ ธ์ ๊ฒฐ๊ณผ๋ฅผ ๋ค์ง์ต๋๋ค.
์ธ์ ์ปค์, ์คํ์ , ํ์ด๋ธ๋ฆฌ๋๋ฅผ ์ ํํ ๊น
์ ํ์ ์ฌ๋๋ค์ด ๋ชฉ๋ก์ ์ค์ ๋ก ์ด๋ป๊ฒ ์ฌ์ฉํ๋์ง์์ ์์ํฉ๋๋ค.
์ปค์ ํ์ด์ง๋ค์ด์ ์ ์ฃผ๋ก ์์ผ๋ก ์ด๋ํ๊ณ ์๋๊ฐ ์ค์ํ ๊ฒฝ์ฐ์ ์ ํฉํฉ๋๋ค: ํ๋ ๋ก๊ทธ, ์ฑํ , ์ฃผ๋ฌธ, ํฐ์ผ, ๊ฐ์ฌ ๊ธฐ๋ก, ๋๋ถ๋ถ์ ๋ชจ๋ฐ์ผ ๋ฌดํ ์คํฌ๋กค. ์ ํ์ด ์ฝ์ ๋๊ฑฐ๋ ์ญ์ ๋ ๋์๋ ๋ ์ ๋์ํฉ๋๋ค.
์คํ์ ํ์ด์ง๋ค์ด์ ์ ์ฌ์ฉ์๊ฐ ์์ฃผ ์ด๋ฆฌ์ ๋ฆฌ ๊ฑด๋๋ฐ๋ ํด๋์ํ ๊ด๋ฆฌ์ ํ ์ด๋ธ(ํ์ด์ง ๋ฒํธ, ํน์ ํ์ด์ง๋ก ๊ฐ๊ธฐ)์ด ์์ ๋ ์๋ฏธ๊ฐ ์์ต๋๋ค. ์ค๋ช ํ๊ธฐ ์ฝ์ง๋ง ํฐ ๋ฐ์ดํฐ์ ์์๋ ๋๋ ค์ง๊ณ ๋ฐ์ดํฐ๊ฐ ๋ณํ๋ฉด ๋ ์์ ์ ์ ๋๋ค.
์ค์ฉ์ ์ธ ํ๋จ ๊ธฐ์ค:
- ์ฃผ๋ ๋์์ด โ๋ค์, ๋ค์, ๋ค์โ์ด๋ฉด ์ปค์๋ฅผ ์ ํํ์ธ์.
- โNํ์ด์ง๋ก ๊ฑด๋๋ฐ๊ธฐโ๊ฐ ์ค์ ์๊ตฌ์ฌํญ์ด๋ผ๋ฉด ์คํ์ ์ ์ ํํ์ธ์.
- ์ด๊ณ๋ ์ ํ ์ฌํญ์ผ๋ก ๊ฐ์ฃผํ์ธ์. ํฐ ํ ์ด๋ธ์์๋ ์ ํํ ์ด๊ณ๊ฐ ๋น์ฉ์ด ๋ง์ด ๋ญ๋๋ค.
ํ์ด๋ธ๋ฆฌ๋๋ ํํฉ๋๋ค. ํ ์ ๊ทผ๋ฒ์ ์๋๋ฅผ ์ํด ์ปค์ ๊ธฐ๋ฐ next/prev๋ฅผ ์ฌ์ฉํ๊ณ , ์คํ์ ์ด ์ฌ์ ํ ๋น ๋ฅธ ์์ ํํฐ๋ ๋ถ๋ถ์งํฉ์ ๋ํด ์ ํ์ ํ์ด์ง ์ ํ ๋ชจ๋๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ ๋๋ค. ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์บ์๋ ์ค๋ ์ท์ ๊ธฐ๋ฐ์ผ๋ก ํ์ด์ง ๋ฒํธ๋ฅผ ์ ๊ณตํ๋ ์ปค์ ๊ฒ์์ผ๋ก, ํ ์ด๋ธ์ด ์น์ํ๊ฒ ๋๊ปด์ง๊ฒ ํ๋ฉด์ ๋ชจ๋ ์์ฒญ์ ๋ฌด๊ฒ๊ฒ ๋ง๋ค์ง ์์ต๋๋ค.
์น๊ณผ ๋ชจ๋ฐ์ผ์์ ์๋ํ๋ ์ผ๊ด๋ API ๊ณ์ฝ
๊ด๋ฆฌ์ UI๋ ๋ชจ๋ ๋ชฉ๋ก ์๋ํฌ์ธํธ๊ฐ ๋์ผํ๊ฒ ๋์ํ ๋ ๋ ๋น ๋ฅด๊ฒ ๋๊ปด์ง๋๋ค. UI๊ฐ ๋ฐ๋์ด๋(API๊ฐ ํ ์ด๋ธ์ธ์ง ๋ฌดํ ์คํฌ๋กค์ธ์ง), API ๊ณ์ฝ์ ๋์ผํด์ผ ๊ฐ ํ๋ฉด๋ง๋ค ๋ณ๋์ ํ์ด์ง๋ค์ด์ ๊ท์น์ ๋ฐฐ์ธ ํ์๊ฐ ์์ต๋๋ค.
์ค์ฉ์ ์ธ ๊ณ์ฝ์ ์ธ ๋ถ๋ถ์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค: ํ(items), ํ์ด์ง ์ํ(paging state), ์ ํ์ ์ด๊ณ(totals). ์๋ํฌ์ธํธ ๊ฐ ์ด๋ฆ์ ๋์ผํ๊ฒ ์ ์งํ์ธ์(tickets, users, orders ๋ฑ). ๋ด๋ถ ํ์ด์ง ๋ชจ๋๊ฐ ๋ฌ๋ผ๋ ์ด๋ฆ์ ๊ฐ๊ฒ ์ ์งํฉ๋๋ค.
์น๊ณผ ๋ชจ๋ฐ์ผ ๋ชจ๋์ ์ ๋ง๋ ์๋ต ํํ ์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
{
"data": [ { "id": "...", "createdAt": "..." } ],
"page": {
"mode": "cursor",
"limit": 50,
"nextCursor": "...",
"prevCursor": null,
"hasNext": true,
"hasPrev": false
},
"totals": {
"count": 12345,
"filteredCount": 120
}
}
๋ค์ ์ธ๋ถ ์ฌํญ์ด ์ฌ์ฌ์ฉ์ ์ฝ๊ฒ ๋ง๋ญ๋๋ค:
page.mode๋ ์๋ฒ๊ฐ ์ด๋ค ๋ฐฉ์์ ์ฌ์ฉํ๋์ง ์๋ ค์ฃผ์ด ํ๋ ์ด๋ฆ์ ๋ฐ๊พธ์ง ์์๋ ๋ฉ๋๋ค.limit์ ํญ์ ์์ฒญํ ํ์ด์ง ํฌ๊ธฐ์ ๋๋ค.nextCursor์prevCursor๋ ํ๋๊ฐ null์ด๋ผ๋ ํญ์ ์กด์ฌํฉ๋๋ค.totals๋ ์ ํ์ ์ ๋๋ค. ๋น์ฉ์ด ํฌ๋ฉด ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญํ ๋๋ง ๋ฐํํ์ธ์.
์น ํ ์ด๋ธ์ ์์ฒด์ ์ผ๋ก โํ์ด์ง 3โ์ ๊ณ์ฐํด API๋ฅผ ๋ฐ๋ณต ํธ์ถํ์ฌ ํ์ํ ์ ์๊ณ , ๋ชจ๋ฐ์ผ ๋ฆฌ์คํธ๋ ํ์ด์ง ๋ฒํธ๋ฅผ ๋ฌด์ํ๊ณ ๋จ์ํ ๋ค์ ์ฒญํฌ๋ฅผ ์์ฒญํ๋ฉด ๋ฉ๋๋ค.
AppMaster๋ก ์น๊ณผ ๋ชจ๋ฐ์ผ ๊ด๋ฆฌ์ UI๋ฅผ ๋ชจ๋ ๋น๋ํ๊ณ ์๋ค๋ฉด, ์ด๋ฐ ์์ ๋ ๊ณ์ฝ์ ๋น ๋ฅด๊ฒ ํจ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค. ๊ฐ์ ๋ชฉ๋ก ๋์์ ์ฌ๋ฌ ํ๋ฉด์์ ์ฌ์ฌ์ฉํ ์ ์์ด ์๋ํฌ์ธํธ๋ง๋ค ๋ณ๋์ ํ์ด์ง๋ค์ด์ ๋ก์ง์ ๋ง๋ค ํ์๊ฐ ์ค์ด๋ญ๋๋ค.
ํ์ด์ง๋ค์ด์ ์ ์์ ํ๊ฒ ์ ์งํ๋ ์ ๋ ฌ ๊ท์น
์ ๋ ฌ์ ๋ณดํต ํ์ด์ง๋ค์ด์ ์ ๊นจ๋จ๋ฆฌ๋ ์ง์ ์ ๋๋ค. ์์ฒญ ์ฌ์ด์ ์์๊ฐ ๋ฐ๋๋ฉด ์ฌ์ฉ์๋ ์ค๋ณต, ๊ฐ๊ฒฉ, ๋๋ โ์๋โ ํ์ ๋ณด๊ฒ ๋ฉ๋๋ค.
์ ๋ ฌ์ ์ ์์ด ์๋๋ผ ๊ณ์ฝ์ผ๋ก ๋ง๋์ธ์. ํ์ฉ๋ ์ ๋ ฌ ํ๋์ ๋ฐฉํฅ์ ๊ณต๊ฐํ๊ณ , ๊ทธ๋ ์ง ์์ ์์ฒญ์ ๊ฑฐ๋ถํ์ธ์. ์ด๋ ๊ฒ ํ๋ฉด ์์ธก ๊ฐ๋ฅํ๊ณ ๊ฐ๋ฐ ํ๊ฒฝ์์๋ ๋ฌธ์ ๊ฐ ์์ด ๋ณด์๋ ๋๋ฆฐ ์ ๋ ฌ ์์ฒญ์ ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญํ์ง ๋ชปํ๊ฒ ํฉ๋๋ค.
์์ ์ ์ธ ์ ๋ ฌ์ ๊ณ ์ ํ ํ์ด๋ธ๋ ์ด์ปค๋ฅผ ํ์๋ก ํฉ๋๋ค. ์๋ฅผ ๋ค์ด created_at์ผ๋ก ์ ๋ ฌํ ๋ ๋ ๋ ์ฝ๋๊ฐ ๋์ผํ ํ์์คํฌํ๋ฅผ ๊ฐ์ง ์ ์์ผ๋ฏ๋ก ๋ง์ง๋ง ์ ๋ ฌ ํค๋ก id(๋๋ ๋ค๋ฅธ ๊ณ ์ ์ปฌ๋ผ)๋ฅผ ์ถ๊ฐํ์ธ์. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๋์ผํ ๊ฐ์ ๋ํด ์์์ ์์๋ฅผ ๋ฐํํ ์ ์์ต๋๋ค.
์ค์ฉ์ ์ธ ๊ท์น:
- ์ธ๋ฑ์ค๋, ์ ์ ์๋ ํ๋๋ง ์ ๋ ฌ์ ํ์ฉํ์ธ์(์:
created_at,updated_at,status,priority). - ๋ง์ง๋ง ํค๋ก ํญ์ ๊ณ ์ ํ์ด๋ธ๋ ์ด์ปค๋ฅผ ํฌํจํ์ธ์(์:
id ASC). - ๊ธฐ๋ณธ ์ ๋ ฌ์ ์ ์ํ๊ณ (์:
created_at DESC, id DESC) ํด๋ผ์ด์ธํธ ์ ๋ฐ์์ ์ผ๊ด๋๊ฒ ์ ์งํ์ธ์. - null ์ ๋ ฌ ๋ฐฉ์(์: ๋ ์ง์ ์ซ์์ ๋ํด โnulls lastโ)์ ๋ฌธ์ํํ์ธ์.
์ ๋ ฌ์ ๋ํ ์ปค์ ์์ฑ์ ์ํฅ์ ์ค๋๋ค. ์ปค์๋ ๋ง์ง๋ง ํญ๋ชฉ์ ์ ๋ ฌ ๊ฐ์ ์์๋๋ก ์ธ์ฝ๋ฉํด์ผ ํ๋ฉฐ, ํ์ด๋ธ๋ ์ด์ปค๋ ํฌํจ๋์ด์ผ ๋ค์ ํ์ด์ง์์ ๊ทธ ํํ ์ดํ๋ฅผ ์ฟผ๋ฆฌํ ์ ์์ต๋๋ค. ์ ๋ ฌ์ด ๋ณ๊ฒฝ๋๋ฉด ์ด์ ์ปค์๋ ๋ฌดํจ๊ฐ ๋ฉ๋๋ค. ์ ๋ ฌ ๋งค๊ฐ๋ณ์๋ฅผ ์ปค์ ๊ณ์ฝ์ ์ผ๋ถ๋ก ์ทจ๊ธํ์ธ์.
๊ณ์ฝ์ ๊นจ์ง ์๋ ํํฐ์ ์ด๊ณ ์ฒ๋ฆฌ
ํํฐ๋ ํ์ด์ง๋ค์ด์ ๊ณผ ๋ถ๋ฆฌ๋์ด์ผ ํฉ๋๋ค. UI๋ โ๋ค๋ฅธ ์งํฉ์ ํ์ ๋ณด์ฌ์คโ๋ผ๊ณ ๋งํ ๋ค์์ โ๊ทธ ์งํฉ์ ํ์ด์ง๋ค์ด์ ํด ์คโ๋ผ๊ณ ์์ฒญํฉ๋๋ค. ํํฐ ํ๋๋ฅผ ํ์ด์ง๋ค์ด์ ํ ํฐ์ ์๊ฑฐ๋ ํํฐ๋ฅผ ์ ํ์ ์ผ๋ก ๊ฒ์ฆํ๋ฉด ๋น ํ์ด์ง, ์ค๋ณต, ๋๋ ์ปค์๊ฐ ๊ฐ์๊ธฐ ๋ค๋ฅธ ๋ฐ์ดํฐ์ ์ ๊ฐ๋ฆฌํค๋ ๋ฑ ๋๋ฒ๊ทธํ๊ธฐ ์ด๋ ค์ด ๋์์ด ์๊น๋๋ค.
๊ฐ๋จํ ๊ท์น: ํํฐ๋ ํ๋ฌธ ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ์(๋๋ POST์ ๊ฒฝ์ฐ ์์ฒญ ๋ณธ๋ฌธ์) ๋๊ณ , ์ปค์๋ ํด๋น ์ ํํ ํํฐ+์ ๋ ฌ ์กฐํฉ์๋ง ์ ํจํ ๋ถํฌ๋ช ํ ํ ํฐ์ผ๋ก ํ์ธ์. ์ฌ์ฉ์๊ฐ ์ด๋ค ํํฐ(์: status, ๋ ์ง ๋ฒ์, ๋ด๋น์)๋ฅผ ๋ณ๊ฒฝํ๋ฉด ํด๋ผ์ด์ธํธ๋ ์ด์ ์ปค์๋ฅผ ๋ฒ๋ฆฌ๊ณ ์ฒ์๋ถํฐ ์์ํด์ผ ํฉ๋๋ค.
ํ์ฉ๋๋ ํํฐ๋ฅผ ์๊ฒฉํ๊ฒ ํ์ธ์. ์ฑ๋ฅ์ ๋ณดํธํ๊ณ ๋์์ ์์ธก ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค:
- ์ ์ ์๋ ํํฐ ํ๋๋ ๊ฑฐ๋ถํ์ธ์(์กฐ์ฉํ ๋ฌด์ํ์ง ๋ง์ธ์).
- ํ์ ๊ณผ ๋ฒ์๋ฅผ ๊ฒ์ฆํ์ธ์(๋ ์ง, ์ด๊ฑฐํ, ID ๋ฑ).
- ๋์ ํํฐ๋ ์ ํํ์ธ์(์: IN ๋ชฉ๋ก์ ์ต๋ 50๊ฐ์ ID).
- ๋ฐ์ดํฐ์ ์ด๊ณ์ ๊ฐ์ ํํฐ๋ฅผ ์ ์ฉํ์ธ์(์ซ์๊ฐ ์ผ์นํ์ง ์๊ฒ ํ์ง ๋ง์ธ์).
์ด๊ณ๋ ๋ง์ API๋ฅผ ๋๋ฆฌ๊ฒ ๋ง๋๋ ์ง์ ์ ๋๋ค. ์ ํํ ์นด์ดํธ๋ ํนํ ์ฌ๋ฌ ํํฐ๊ฐ ์๋ ํฐ ํ ์ด๋ธ์์ ๋น์ฉ์ด ํฝ๋๋ค. ๋ณดํต ์ธ ๊ฐ์ง ์ต์ ์ด ์์ต๋๋ค: ์ ํํ ๊ฐ, ์ถ์ ๊ฐ, ๋๋ ์์. ์ ํํ ๊ฐ์ ์์ ๋ฐ์ดํฐ์ ์ด๋ ์ฌ์ฉ์๊ฐ ์ค์ ๋ก ์ด๊ณ๋ฅผ ํ์๋ก ํ ๋ ์ ์ฉํฉ๋๋ค. ์ถ์ ์ ๊ด๋ฆฌ์ ํ๋ฉด์ ์ถฉ๋ถํ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ํ์ ์๋ค๋ฉด ์๋ตํด๋ ๋ฉ๋๋ค.
๋ชจ๋ ์์ฒญ์ ๋๋ฆฌ๊ฒ ํ์ง ์์ผ๋ ค๋ฉด ์ด๊ณ๋ฅผ ์ ํ์ฌํญ์ผ๋ก ๋ง๋์ธ์: ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญํ ๋๋ง ๊ณ์ฐ(includeTotal=true ๊ฐ์ ํ๋๊ทธ๋ก), ํํฐ ์งํฉ๋ณ๋ก ์ ์ ์บ์ํ๊ฑฐ๋ ์ฒซ ํ์ด์ง์์๋ง ๋ฐํํ์ธ์.
๋จ๊ณ๋ณ: ์๋ํฌ์ธํธ ์ค๊ณ ๋ฐ ๊ตฌํ
๊ธฐ๋ณธ๊ฐ๋ถํฐ ์์ํ์ธ์. ๋ชฉ๋ก ์๋ํฌ์ธํธ๋ ์์ ์ ์ธ ์ ๋ ฌ ์์์ ๊ฐ์ ๊ฐ์ ๊ฐ์ง ํ์ ์ํ ํ์ด๋ธ๋ ์ด์ปค๊ฐ ํ์ํฉ๋๋ค. ์: createdAt DESC, id DESC. ํ์ด๋ธ๋ ์ด์ปค(id)๋ ์ ๋ ์ฝ๋๊ฐ ์ถ๊ฐ๋ ๋ ์ค๋ณต๊ณผ ๊ฐ๊ฒฉ์ ๋ฐฉ์งํฉ๋๋ค.
์์ฒญ ํ์์ ํ๋๋ก ์ ์ํ๊ณ ์ง๋ฃจํ๊ฒ ์ ์งํ์ธ์. ์ผ๋ฐ ๋งค๊ฐ๋ณ์๋ limit, cursor(๋๋ offset), sort, filters์
๋๋ค. ๋ ๋ชจ๋๋ฅผ ๋ชจ๋ ์ง์ํ๋ฉด ์ํธ ๋ฐฐํ์ ์ผ๋ก ๋ง๋์ธ์: ํด๋ผ์ด์ธํธ๋ cursor๋ฅผ ๋ณด๋ด๊ฑฐ๋ offset์ ๋ณด๋ด์ง๋ง ๋ ๋ค ๋ณด๋ด๋ฉด ์ ๋ฉ๋๋ค.
์๋ต ๊ณ์ฝ์ ์ผ๊ด๋๊ฒ ์ ์งํด ์น๊ณผ ๋ชจ๋ฐ์ผ UI๊ฐ ๊ฐ์ ๋ชฉ๋ก ๋ก์ง์ ๊ณต์ ํ๋๋ก ํ์ธ์:
items: ๋ ์ฝ๋ ํ์ด์งnextCursor: ๋ค์ ํ์ด์ง๋ฅผ ๊ฐ์ ธ์ฌ ์ปค์(๋๋null)hasMore: UI๊ฐ โ๋ ๋ถ๋ฌ์ค๊ธฐโ๋ฅผ ํ์ํ ์ง ๊ฒฐ์ ํ๋ ๋ถ๋ฆฌ์ธtotal: ์ ์ฒด ์ผ์น ๋ ์ฝ๋ ์(null, ์นด์ดํ ์ด ๋น์ธ๋ฉด ์์ฒญ ์์๋ง)
๊ตฌํ์ ๋ ์ ๊ทผ๋ฒ์ด ๊ฐ๋ฆฌ๋ ์ง์ ์ ๋๋ค.
์คํ์
์ฟผ๋ฆฌ๋ ๋ณดํต ORDER BY ... LIMIT ... OFFSET ...์ด๊ณ ํฐ ํ
์ด๋ธ์์ ๋๋ ค์ง ์ ์์ต๋๋ค.
์ปค์ ์ฟผ๋ฆฌ๋ ๋ง์ง๋ง ํญ๋ชฉ์ ๊ธฐ์ค์ผ๋ก ํ์ ์กฐ๊ฑด์ ์ฌ์ฉํฉ๋๋ค: โ(createdAt, id) ์ด ๋ง์ง๋ง (createdAt, id)๋ณด๋ค ์์ ํญ๋ชฉ์ ์คโ. ์ด๋ ๊ฒ ํ๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํด ์ฑ๋ฅ์ ์์ ์ ์ผ๋ก ์ ์งํ ์ ์์ต๋๋ค.
์ถ์ ์ ์ ๋ค์ ๊ฐ๋๋ ์ผ์ ์ถ๊ฐํ์ธ์:
limit์ ์ ํํ์ธ์(์: ์ต๋ 100) ๋ฐ ๊ธฐ๋ณธ๊ฐ ์ค์ .sort๋ฅผ ํ์ฉ ๋ชฉ๋ก์ผ๋ก ๊ฒ์ฆํ์ธ์.- ํํฐ๋ฅผ ํ์ ๋ณ๋ก ๊ฒ์ฆํ๊ณ ์ ์ ์๋ ํค๋ ๊ฑฐ๋ถํ์ธ์.
cursor๋ ๋ถํฌ๋ช ํ๊ฒ ๋ง๋ค๊ณ ์๋ชป๋ ์ปค์๋ ๊ฑฐ๋ถํ์ธ์.total์ด ์ด๋ป๊ฒ ์์ฒญ๋๋์ง ๊ฒฐ์ ํ์ธ์.
๋ฐ์ดํฐ๊ฐ ์์ฒญ ์ฌ์ด์ ๋ณ๊ฒฝ๋๋ ์ํฉ์ผ๋ก ํ ์คํธํ์ธ์. ์์ฒญ ์ฌ์ด์ ๋ ์ฝ๋๋ฅผ ์์ฑํ๊ณ ์ญ์ ํ๊ณ ์ ๋ ฌ์ ์ํฅ์ ์ฃผ๋ ํ๋๋ฅผ ์ ๋ฐ์ดํธํด ์ค๋ณต์ด๋ ๋๋ฝ์ด ๋ฐ์ํ์ง ์๋์ง ํ์ธํ์ธ์.
์์: ์น๊ณผ ๋ชจ๋ฐ์ผ์์ ๋น ๋ฅด๊ฒ ๋์ํ๋ ํฐ์ผ ๋ชฉ๋ก
์ง์ ํ์ด ์ต์ ํฐ์ผ์ ๊ฒํ ํ๋ ค๊ณ ๊ด๋ฆฌ์ ํ๋ฉด์ ์ฝ๋๋ค. ์ ํฐ์ผ์ด ๋ค์ด์ค๊ณ ์์ด์ ํธ๊ฐ ์ค๋๋ ํฐ์ผ์ ์ ๋ฐ์ดํธํด๋ ๋ชฉ๋ก์ด ์ฆ๊ฐ์ ์ผ๋ก ๋๊ปด์ ธ์ผ ํฉ๋๋ค.
์น์์๋ UI๊ฐ ํ
์ด๋ธ์
๋๋ค. ๊ธฐ๋ณธ ์ ๋ ฌ์ updated_at(์ต์ ์)์ด๊ณ ํ์ ๋ณดํต Open ๋๋ Pending์ผ๋ก ํํฐํฉ๋๋ค. ๊ฐ์ ์๋ํฌ์ธํธ๊ฐ ์์ ์ ์ธ ์ ๋ ฌ๊ณผ ์ปค์ ํ ํฐ์ผ๋ก ๋ ์๋๋ฆฌ์ค๋ฅผ ๋ชจ๋ ์ง์ํ ์ ์์ต๋๋ค.
GET /tickets?status=open\u0026sort=-updated_at\u0026limit=50\u0026cursor=eyJ1cGRhdGVkX2F0IjoiMjAyNi0wMS0yNVQxMTo0NTo0MloiLCJpZCI6IjE2OTMifQ==
์๋ต์ UI์ ์์ธก ๊ฐ๋ฅํ ํํ๋ก ๋จ์ต๋๋ค:
{
"items": [{"id": 1693, "subject": "Login issue", "status": "open", "updated_at": "2026-01-25T11:45:42Z"}],
"page": {"next_cursor": "...", "has_more": true},
"meta": {"total": 128}
}
๋ชจ๋ฐ์ผ์์๋ ๊ฐ์ ์๋ํฌ์ธํธ๊ฐ ๋ฌดํ ์คํฌ๋กค์ ์ง์ํฉ๋๋ค. ์ฑ์ ํ ๋ฒ์ 20๊ฐ์ ํฐ์ผ์ ๋ก๋ํ๊ณ , ๋ค์ ๋ฐฐ์น๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํด next_cursor๋ฅผ ๋ณด๋
๋๋ค. ํ์ด์ง ๋ฒํธ ๋ก์ง์ด ์๊ณ , ๋ ์ฝ๋๊ฐ ๋ณํด๋ ์ด๋ฏธ ์คํฌ๋กคํ ๋ถ๋ถ์์ ๋๋ผ์ด ์ผ์ด ์ ์ต๋๋ค.
ํต์ฌ์ ์ปค์๊ฐ ๋ง์ง๋ง์ผ๋ก ๋ณธ ์์น(์: updated_at๊ณผ ํ์ด๋ธ๋ ์ด์ปค๋ก์ id)๋ฅผ ์ธ์ฝ๋ฉํ๋ค๋ ์ ์
๋๋ค. ํฐ์ผ์ด ์ฌ์ฉ์๊ฐ ์คํฌ๋กคํ๋ ๋์ ์
๋ฐ์ดํธ๋๋ฉด ๋ค์ ์๋ก๊ณ ์นจ์์ ์๋ก ์ด๋ํ ์ ์์ง๋ง, ์ด๋ฏธ ์คํฌ๋กคํ ํผ๋์์ ์ค๋ณต์ด๋ ๊ฐ๊ฒฉ์ ๋ง๋ค์ง๋ ์์ต๋๋ค.
์ด๊ณ๋ ์ ์ฉํ์ง๋ง ํฐ ๋ฐ์ดํฐ์
์์๋ ๋น์ฉ์ด ํฝ๋๋ค. ๊ฐ๋จํ ๊ท์น์ ์ฌ์ฉ์๊ฐ ํํฐ๋ฅผ ์ ์ฉํ๊ฑฐ๋ ๋ช
์์ ์ผ๋ก ์์ฒญํ์ ๋๋ง meta.total์ ๋ฐํํ๋ ๊ฒ์
๋๋ค(status=open ๊ฐ์ ๊ฒฝ์ฐ).
์ค๋ณต, ๊ฐ๊ฒฉ, ์ง์ฐ์ ์ ๋ฐํ๋ ์ผ๋ฐ์ ์ค์
๋๋ถ๋ถ์ ํ์ด์ง๋ค์ด์ ๋ฒ๊ทธ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์๋๋ผ ์ฌ์ํ API ๊ฒฐ์ ์์ ์ต๋๋ค. ํ ์คํธ์์๋ ๊ด์ฐฎ์ ๋ณด์ด๋ ๊ฒ์ด ์์ฒญ ์ฌ์ด์ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋๋ฉด ๋ฌด๋์ง๋๋ค.
๊ฐ์ฅ ํํ ์ค๋ณต(๋๋ ๋๋ฝ) ์์ธ์ ๊ณ ์ ํ์ง ์์ ํ๋๋ก ์ ๋ ฌํ๋ ๊ฒ์
๋๋ค. created_at์ผ๋ก ์ ๋ ฌํ ๋ ๋ ํญ๋ชฉ์ด ๊ฐ์ ํ์์คํฌํ๋ฅผ ๊ฐ์ง๋ฉด ์์ฒญ ์ฌ์ด์ ์์๊ฐ ๋ค๋ฐ๋ ์ ์์ต๋๋ค. ํด๊ฒฐ์ฑ
์ ๊ฐ๋จํฉ๋๋ค: ํญ์ ๊ธฐ๋ณธ ํค ๊ฐ์ ์์ ์ ์ธ ํ์ด๋ธ๋ ์ด์ปค๋ฅผ ์ถ๊ฐํ๊ณ ์ ๋ ฌ์ (created_at desc, id desc) ๊ฐ์ ์์ผ๋ก ์ทจ๊ธํ์ธ์.
๋ ๋ค๋ฅธ ํํ ๋ฌธ์ ๋ ํด๋ผ์ด์ธํธ๊ฐ ์ด๋ค ํ์ด์ง ํฌ๊ธฐ๋ ์์ฒญํ ์ ์๊ฒ ํ๋ ๊ฒ์ ๋๋ค. ํฐ ์์ฒญ ํ๋๊ฐ CPU, ๋ฉ๋ชจ๋ฆฌ, ์๋ต ์๊ฐ์ ๊ธ์ฆ์์ผ ๋ชจ๋ ๊ด๋ฆฌ์ ํ๋ฉด์ ๋๋ ค์ง๊ฒ ํฉ๋๋ค. ํฉ๋ฆฌ์ ์ธ ๊ธฐ๋ณธ๊ฐ๊ณผ ๊ฐ์ ์ต๋๊ฐ์ ์ ํ๊ณ ํด๋ผ์ด์ธํธ๊ฐ ๋ ๋ง์ด ์์ฒญํ๋ฉด ์ค๋ฅ๋ฅผ ๋ฐํํ์ธ์.
์ด๊ณ๋ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์์ต๋๋ค. ๋ชจ๋ ์์ฒญ์์ ์ผ์นํ๋ ๋ชจ๋ ํ์ ์ธ๋ ๊ฒ์ ๋๋ ค์ง ์ ์์ผ๋ฉฐ ํํฐ๊ฐ ์์์๋ก ์ต์ ์ ๋๋ค. UI๊ฐ ์ด๊ณ๋ฅผ ํ์๋ก ํ๋ค๋ฉด ์์ฒญํ ๋๋ง ๊ฐ์ ธ์ค๊ฑฐ๋(๋๋ ์ถ์ ๊ฐ ๋ฐํ) ์ ์ฒด ์นด์ดํธ์ UI๋ฅผ ๋ธ๋กํนํ์ง ๋ง์ธ์.
๊ฐ์ฅ ์์ฃผ ๋ฌธ์ ๋ฅผ ๋ง๋๋ ์ค์:
- ๊ณ ์ ํ์ด๋ธ๋ ์ด์ปค ์๋ ์ ๋ ฌ(๋ถ์์ ํ ์์)
- ๋ฌด์ ํ ํ์ด์ง ํฌ๊ธฐ(์๋ฒ ๊ณผ๋ถํ)
- ๋งค๋ฒ ์ด๊ณ ๋ฐํ(๋๋ฆฐ ์ฟผ๋ฆฌ)
- ํ๋์ ์๋ํฌ์ธํธ์์ ์คํ์ ๊ณผ ์ปค์ ๊ท์น์ ํผํฉ(ํด๋ผ์ด์ธํธ ํผ๋)
- ํํฐ๋ ์ ๋ ฌ์ด ๋ฐ๋์์ ๋ ๊ฐ์ ์ปค์ ์ฌ์ฌ์ฉ(์๋ชป๋ ๊ฒฐ๊ณผ)
ํํฐ๋ ์ ๋ ฌ์ด ๋ณ๊ฒฝ๋๋ฉด ํ์ด์ง๋ค์ด์ ์ ๋ฆฌ์ ํ์ธ์. ์๋ก์ด ํํฐ๋ ์๋ก์ด ๊ฒ์์ผ๋ก ์ทจ๊ธํด ์ปค์/์คํ์ ์ ์ง์ฐ๊ณ ์ฒ์๋ถํฐ ์์ํ์ธ์.
์ถ์ ์ ๋น ๋ฅธ ์ฒดํฌ๋ฆฌ์คํธ
API์ UI๋ฅผ ๋๋ํ ๋๊ณ ํ ๋ฒ๋ง ์คํํด ๋ณด์ธ์. ๋๋ถ๋ถ์ ๋ฌธ์ ๋ ๋ชฉ๋ก ํ๋ฉด๊ณผ ์๋ฒ ๊ฐ ๊ณ์ฝ์์ ๋ฐ์ํฉ๋๋ค.
- ๊ธฐ๋ณธ ์ ๋ ฌ์ด ์์ ์ ์ด๊ณ ๊ณ ์ ํ์ด๋ธ๋ ์ด์ปค๋ฅผ ํฌํจํ๋์ง(์:
created_at DESC, id DESC). - ์ ๋ ฌ ํ๋์ ๋ฐฉํฅ์ด ํ์ฉ ๋ชฉ๋ก์ ์๋์ง.
- ํฉ๋ฆฌ์ ์ธ ๊ธฐ๋ณธ๊ฐ๊ณผ ์ต๋ ํ์ด์ง ํฌ๊ธฐ(์ต๋
limit)๊ฐ ๊ฐ์ ๋๋์ง. - ์ปค์ ํ ํฐ์ด ๋ถํฌ๋ช ํ๊ณ ์๋ชป๋ ์ปค์๋ ์์ธก ๊ฐ๋ฅํ ๋ฐฉ์์ผ๋ก ์คํจํ๋์ง.
- ํํฐ๋ ์ ๋ ฌ ๋ณ๊ฒฝ ์ ํ์ด์ง๋ค์ด์ ์ํ๊ฐ ๋ฆฌ์ ๋๋์ง.
- ์ด๊ณ ๋์์ด ๋ช ์์ ์ธ์ง: ์ ํ, ์ถ์ ๋๋ ์๋ต.
- ๋์ผํ ๊ณ์ฝ์ด ํ ์ด๋ธ๊ณผ ๋ฌดํ ์คํฌ๋กค์ ํน์ ์ฒ๋ฆฌ ์์ด ๋ชจ๋ ์ง์ํ๋์ง.
๋ค์ ๋จ๊ณ: ๋ชฉ๋ก ํ์คํ ๋ฐ ์ผ๊ด์ฑ ์ ์ง
์ฌ๋๋ค์ด ๋งค์ผ ์ฌ์ฉํ๋ ๊ด๋ฆฌ์ ๋ชฉ๋ก ํ๋๋ฅผ ๊ณจ๋ผ ๊ทธ๊ฒ์ ๊ณจ๋ ์คํ ๋๋๋ก ๋ง๋์ธ์. Tickets, Orders, Users ๊ฐ์ ๋ฐ์ ํ ์ด๋ธ์ด ์ข์ ์ถ๋ฐ์ ์ ๋๋ค. ๊ทธ ์๋ํฌ์ธํธ๊ฐ ๋น ๋ฅด๊ณ ์์ธก ๊ฐ๋ฅํด์ง๋ฉด ๋์ผํ ๊ณ์ฝ์ ๋ค๋ฅธ ๊ด๋ฆฌ์ ํ๋ฉด๋ค๋ก ๋ณต์ฌํ์ธ์.
๊ณ์ฝ์ ๋ฌธ์๋ก ๋จ๊ธฐ์ธ์, ๊ฐ๋จํ๋๋ผ๋ ์ข์ต๋๋ค. API๊ฐ ์๋ฝํ๋ ๊ฒ๊ณผ ๋ฐํํ๋ ๊ฒ์ ๋ช ์ํ๋ฉด UI ํ์ด ์ถ์ธกํ์ง ์์ ์๋ํฌ์ธํธ๋ง๋ค ๋ค๋ฅธ ๊ท์น์ ์ค์๋ก ๋ง๋ค์ง ์์ต๋๋ค.
๋ชจ๋ ๋ชฉ๋ก ์๋ํฌ์ธํธ์ ์ ์ฉํ ๊ฐ๋จํ ํ์ค:
- ํ์ฉ ์ ๋ ฌ: ์ ํํ ํ๋ ์ด๋ฆ, ๋ฐฉํฅ, ๋ช
ํํ ๊ธฐ๋ณธ๊ฐ(๊ทธ๋ฆฌ๊ณ
id๊ฐ์ ํ์ด๋ธ๋ ์ด์ปค) - ํ์ฉ ํํฐ: ์ด๋ค ํ๋๋ฅผ ํํฐํ ์ ์๋์ง, ๊ฐ ํฌ๋งท, ์๋ชป๋ ํํฐ์ ๋ํ ๋์
- ์ด๊ณ ๋์: ์ธ์ ๊ฐ์๋ฅผ ๋ฐํํ๋์ง, ์ธ์ โunknownโ์ ๋ฐํํ๋์ง, ์ธ์ ์๋ตํ๋์ง
- ์๋ต ํํ: ์ผ๊ด๋ ํค(
items, ํ์ด์ง ์ ๋ณด, ์ ์ฉ๋ ์ ๋ ฌ/ํํฐ, totals) - ์ค๋ฅ ๊ท์น: ์ผ๊ด๋ ์ํ ์ฝ๋์ ์ฝ๊ธฐ ์ฌ์ด ๊ฒ์ฆ ๋ฉ์์ง
AppMaster๋ก ์ด๋ฌํ ๊ด๋ฆฌ์ ํ๋ฉด์ ๋น๋ํ๋ค๋ฉด(์: appmaster.io), ์ผ์ฐ ํ์ด์ง๋ค์ด์ ๊ณ์ฝ์ ํ์คํํ๋ ๊ฒ์ด ๋์์ด ๋ฉ๋๋ค. ๋์ผํ ๋ชฉ๋ก ๋์์ ์น ์ฑ๊ณผ ๋ค์ดํฐ๋ธ ๋ชจ๋ฐ์ผ ์ฑ ์ ๋ฐ์์ ์ฌ์ฌ์ฉํ ์ ์์ด ๋์ค์ ํ์ด์ง๋ค์ด์ ์ฃ์ง ์ผ์ด์ค๋ฅผ ์ซ์๋ค๋๋ ๋ฐ ๋๋ ์๊ฐ์ ์ค์ผ ์ ์์ต๋๋ค.
์์ฃผ ๋ฌป๋ ์ง๋ฌธ
Offset pagination uses limit plus offset (or page/pageSize) to skip rows, so deeper pages often get slower as the database has to walk past more records. Cursor pagination uses an after token based on the last itemโs sort values, so it can jump to a known position and stay fast as you keep moving forward.
Because page 1 is usually cheap, but page 200 forces the database to skip a large number of rows before it can return anything. If you also sort and filter, the work grows, so each click feels more like a new heavy query than a quick fetch.
Always use a stable sort with a unique tie-breaker, such as created_at DESC, id DESC or updated_at DESC, id DESC. Without the tie-breaker, records with the same timestamp can swap order between requests, which is a common cause of duplicates and โmissingโ rows.
Use cursor pagination for lists where people mostly move forward and speed matters, like activity logs, tickets, orders, and mobile infinite scroll. It stays consistent when new rows are inserted or deleted, because the cursor anchors the next page to an exact last-seen position.
Offset pagination fits best when โjump to page Nโ is a real UI feature and users regularly bounce around. Itโs also convenient for small tables or stable datasets, where deep-page slowdown and shifting results are unlikely to matter.
Keep one response shape across endpoints and include the items, paging state, and optional totals. A practical default is returning items, a page object (with limit, nextCursor/prevCursor or offset), and a lightweight flag like hasNext so both web tables and mobile lists can reuse the same client logic.
Because exact COUNT(*) on large, filtered datasets can become the slowest part of the request and make every page change feel laggy. A good default is to make totals optional, return them only when requested, or return has_more when the UI only needs โLoad more.โ
Treat filters as part of the dataset, and treat the cursor as valid only for that exact filter and sort combination. If a user changes any filter or sort, reset pagination and start from the first page; reusing an old cursor after changes is a common way to get empty pages or confusing results.
Whitelist allowed sort fields and directions, and reject anything else so clients canโt accidentally request slow or unstable ordering. Prefer sorting on indexed fields and always append a unique tie-breaker like id to keep the order deterministic across requests.
Enforce a maximum limit, validate filters and sort parameters, and make cursor tokens opaque and strictly validated. If youโre building admin screens in AppMaster, keeping these rules consistent across all list endpoints makes it easier to reuse the same table and infinite-scroll behavior without custom pagination fixes per screen.


