Home > Data Structure > 🧩 [Data Structure] λŒ€κ·œλͺ¨ λ°μ΄ν„°μ—μ„œμ˜ κ²Œμ‹œκΈ€ λͺ©λ‘ 쑰회

🧩 [Data Structure] λŒ€κ·œλͺ¨ λ°μ΄ν„°μ—μ„œμ˜ κ²Œμ‹œκΈ€ λͺ©λ‘ 쑰회
Data Structure

🧩 [Data Structure] λŒ€κ·œλͺ¨ λ°μ΄ν„°μ—μ„œμ˜ κ²Œμ‹œκΈ€ λͺ©λ‘ 쑰회.

🍎 Intro.

  • λŒ€κ·œλͺ¨ λ°μ΄ν…Œμ΄μ„œ κ²Œμ‹œκΈ€ λͺ©λ‘ μ‘°νšŒλŠ” μ™œ λ³΅μž‘ν• κΉŒμš”?
    • κ·Έ μ΄μœ λŠ” λͺ¨λ“  데이터λ₯Ό ν•œ λ²ˆμ— 보여쀄 수 μ—†κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.
      • λ©”λͺ¨λ¦¬, λ„€νŠΈμ›Œν¬, μ„±λŠ₯ λ“±μ˜ μ œμ•½μ΄ 있음.
    • μœ„μ™€ 같은 이유둜 인해 νŽ˜μ΄μ§•μ΄ ν•„μš”ν•©λ‹ˆλ‹€.

βœ…1️⃣ νŽ˜μ΄μ§• μ²˜λ¦¬λž€ λ¬΄μ—‡μΌκΉŒμš”?

  • νŽ˜μ΄μ§• 처리(Paging)λž€, λ§Žμ€ μ–‘μ˜ 데이터λ₯Ό μ—¬λŸ¬ νŽ˜μ΄μ§€λ‘œ λ‚˜λˆ„μ–΄ ν•œ λ²ˆμ— 일뢀 λ°μ΄ν„°λ§Œ ν‘œμ‹œν•˜λŠ” 방법을 λ§ν•©λ‹ˆλ‹€.
  • 주둜 μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜, λ°μ΄ν„°λ² μ΄μŠ€, UI 섀계 λ“±μ—μ„œ λŒ€λŸ‰ 데이터λ₯Ό 효율적으둜 ν‘œμ‹œν•˜κ³  μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ©λ‹ˆλ‹€.

βœ…2️⃣ νŽ˜μ΄μ§• μ²˜λ¦¬κ°€ ν•„μš”ν•œ 이유?

  • 1. λŒ€λŸ‰ 데이터λ₯Ό 효율적으둜 μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄:
    • 데이터가 λ§Žμ„ 경우, ν•œ λ²ˆμ— λͺ¨λ“  데이터λ₯Ό μ‚¬μš©μžμ—κ²Œ 보여주면 μ„±λŠ₯ μ €ν•˜μ™€ λΆˆνŽΈν•œ UI/UX λ¬Έμ œκ°€ λ°œμƒν•©λ‹ˆλ‹€.
      • νŽ˜μ΄μ§•μ„ μ‚¬μš©ν•˜λ©΄ ν•œ λ²ˆμ— ν•„μš”ν•œ λ°μ΄ν„°λ§Œ 가져와 μ„±λŠ₯을 ν–₯상할 수 μžˆμŠ΅λ‹ˆλ‹€.
  • 2. μ‚¬μš©μž κ²½ν—˜(UX) κ°œμ„ :
    • 데이터λ₯Ό νŽ˜μ΄μ§€λ³„λ‘œ λ‚˜λˆ„μ–΄ λ³΄μ—¬μ€ŒμœΌλ‘œμ¨ μ‚¬μš©μžκ°€ 데이터λ₯Ό μ‰½κ²Œ 탐색할 수 μžˆμŠ΅λ‹ˆλ‹€.
      • 예: μ‡Όν•‘λͺ° μƒν’ˆ λͺ©λ‘, λΈ”λ‘œκ·Έ κ²Œμ‹œκΈ€ λͺ©λ‘ λ“±

βœ…3️⃣ νŽ˜μ΄μ§• 처리의 ꡬ성 μš”μ†Œ?

  • νŽ˜μ΄μ§• μ²˜λ¦¬λŠ” 주둜 λ‹€μŒκ³Ό 같은 ꡬ성 μš”μ†Œλ‘œ μ΄λ£¨μ–΄μ§‘λ‹ˆλ‹€:
  • 1. νŽ˜μ΄μ§€ 번호(Page Number):
    • μ‚¬μš©μžκ°€ 보고자 ν•˜λŠ” νŽ˜μ΄μ§€λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
      • 예: 1, 2, 3, …
  • 2. νŽ˜μ΄μ§€ 크기(Page Size):
    • ν•œ νŽ˜μ΄μ§€μ— ν‘œμ‹œν•  λ°μ΄ν„°μ˜ 개수λ₯Ό μ„€μ •ν•©λ‹ˆλ‹€.
      • 예: 10개, 20개, 50개 λ“±.
  • 3. 전체 데이터 수(Total Items):
    • 전체 λ°μ΄ν„°μ˜ 개수λ₯Ό κ³„μ‚°ν•˜μ—¬ λͺ‡ νŽ˜μ΄μ§€κΉŒμ§€ ν•„μš”ν•œμ§€ κ²°μ •ν•©λ‹ˆλ‹€.
  • 4. 전체 νŽ˜μ΄μ§€ 수(Total Pages):
    • 전체 데이터λ₯Ό νŽ˜μ΄μ§€ 크기둜 λ‚˜λˆˆ κ°’μž…λ‹ˆλ‹€.
      • 계산: 전체 νŽ˜μ΄μ§€ 수 = [전체 데이터 수 / νŽ˜μ΄μ§€ 크기]

βœ…4️⃣ νŽ˜μ΄μ§• 처리의 예.

πŸ›οΈ μ‡Όν•‘λͺ° μƒν’ˆ λͺ©λ‘.

  • 예λ₯Ό λ“€μ–΄, 1,000개의 μƒν’ˆμ΄ 있고, ν•œ νŽ˜μ΄μ§€μ— 20개의 μƒν’ˆμ„ ν‘œμ‹œν•œλ‹€κ³  κ°€μ •ν•©λ‹ˆλ‹€.
    • νŽ˜μ΄μ§€ 크기 (Page Size): 20
    • 전체 νŽ˜μ΄μ§€ 수 (Total Pages): [1,000 / 20] = 50
  • μ‚¬μš©μžκ°€ 각 νŽ˜μ΄μ§€λ₯Ό μš”μ²­ν•˜λ©΄ λ‹€μŒκ³Ό 같이 데이터λ₯Ό λ‚˜λˆ„μ–΄ κ°€μ Έμ˜΅λ‹ˆλ‹€:
    • 1νŽ˜μ΄μ§€ : μƒν’ˆ 1 ~ 20
    • 2νŽ˜μ΄μ§€ : μƒν’ˆ 21 ~ 40
    • …
    • 50νŽ˜μ΄μ§€ : μƒν’ˆ 981 ~ 1,000

βœ…5️⃣ νŽ˜μ΄μ§• 처리의 κ΅¬ν˜„ 방식.

  • μ„œλ²„ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ‚΄μ˜ λ©”λͺ¨λ¦¬λ‘œ λ””μŠ€ν¬μ— μ €μž₯된 λͺ¨λ“  데이터λ₯Ό κ°€μ Έμ˜¨ ν›„ νŠΉμ • νŽ˜μ΄μ§€λ§Œ μΆ”μΆœν•˜λŠ” 것은 λΉ„νš¨μœ¨μ  μž…λ‹ˆλ‹€.
    • λ””μŠ€ν¬ 접근은 λ©”λͺ¨λ¦¬ 접근보닀 느리기 λ•Œλ¬Έμž…λ‹ˆλ‹€.
      • λ””μŠ€ν¬ I/O λΉ„μš©μ΄ λ“­λ‹ˆλ‹€.
    • λ””μŠ€ν¬μ— μ €μž₯된 λ°μ΄ν„°λŠ” λ©”λͺ¨λ¦¬ μš©λŸ‰μ„ μ΄ˆκ³Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.
      • Out of Memory(OOM)
        • μ‹œμŠ€ν…œμ—μ„œ μ‚¬μš© κ°€λŠ₯ν•œ λ©”λͺ¨λ¦¬κ°€ λͺ¨λ‘ μ‚¬μš©λ˜μ–΄ 더 이상 ν• λ‹Ήν•  수 μ—†λŠ” 상황을 λ§ν•©λ‹ˆλ‹€.
  • λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ νŠΉμ • νŽ˜μ΄μ§€μ˜ λ°μ΄ν„°λ§Œ λ°”λ‘œ μΆ”μΆœν•˜λŠ” 방법이 ν•„μš”ν•©λ‹ˆλ‹€.
    • 이것을 β€œνŽ˜μ΄μ§• 쿼리”라고 λΆ€λ¦…λ‹ˆλ‹€.
      • μ΄λŸ¬ν•œ νŽ˜μ΄μ§• 방식은 ν΄λΌμ΄μ–ΈνŠΈ λ˜λŠ” μ„œλΉ„μŠ€ νŠΉμ„±μ— λ”°λΌμ„œ 크게 두 κ°€μ§€λ‘œ λ‚˜λ‰©λ‹ˆλ‹€.
          1. νŽ˜μ΄μ§€ 번호
          1. λ¬΄ν•œ 슀크둀
        • βœ…1️⃣ β€œνŽ˜μ΄μ§€ λ²ˆν˜Έβ€μ™€ β€œλ¬΄ν•œ μŠ€ν¬λ‘€β€μ΄λž€?

  • νŽ˜μ΄μ§€ 번호 방식과 λ¬΄ν•œ 슀크둀 방식은 데이터λ₯Ό νŽ˜μ΄μ§• μ²˜λ¦¬ν•˜μ—¬ μ‚¬μš©μžμ—κ²Œ λ³΄μ—¬μ£ΌλŠ” λ°©λ²•μž…λ‹ˆλ‹€.
    • λ‘˜ λ‹€ 데이터λ₯Ό νŽ˜μ΄μ§€ λ‹¨μœ„λ‘œ λ‚˜λˆ„μ–΄ λ‘œλ“œν•˜μ§€λ§Œ, μ‚¬μš© 방식과 μ‚¬μš©μž κ²½ν—˜(UX)이 크게 λ‹€λ¦…λ‹ˆλ‹€.

βœ…2️⃣ νŽ˜μ΄μ§€ 번호 방식.

  • νŽ˜μ΄μ§€ 번호 방식은 데이터 μ „μ²΄μ˜ νŽ˜μ΄μ§€λ₯Ό 번호둜 λ‚˜λˆ„κ³ , μ‚¬μš©μžκ°€ νŠΉμ • νŽ˜μ΄μ§€ 번호λ₯Ό ν΄λ¦­ν•˜κ±°λ‚˜ μ„ νƒν•˜μ—¬ ν•΄λ‹Ή νŽ˜μ΄μ§€μ˜ 데이터λ₯Ό μš”μ²­ν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€.

πŸ“Œ1️⃣ νŽ˜μ΄μ§€ 번호 λ°©μ‹μ˜ νŠΉμ§•.

  • λ°μ΄ν„°λŠ” νŽ˜μ΄μ§€λ³„λ‘œ κ΅¬λΆ„λ©λ‹ˆλ‹€.
  • μ‚¬μš©μžλŠ” νŠΉμ • νŽ˜μ΄μ§€λ₯Ό 직접 탐색할 수 μžˆμŠ΅λ‹ˆλ‹€.
  • 일반적으둜 ν™”λ©΄ μ•„λž˜μ— νŽ˜μ΄μ§€ 번호(Pagination)κ°€ ν‘œμ‹œλ©λ‹ˆλ‹€.

πŸ“Œ2️⃣ μ˜ˆμ‹œ: μ‡Όν•‘λͺ° μƒν’ˆ λͺ©λ‘.

[1] [2] [3] [4] [5] ... [Next >]
  • μ‚¬μš©μžκ°€ β€œ3번 νŽ˜μ΄μ§€β€λ₯Ό ν΄λ¦­ν•˜λ©΄, 3번 νŽ˜μ΄μ§€μ— ν•΄λ‹Ήν•˜λŠ” 데이터λ₯Ό μ„œλ²„μ—μ„œ κ°€μ Έμ˜΅λ‹ˆλ‹€.

πŸ“Œ3️⃣ νŽ˜μ΄μ§€ 번호 λ°©μ‹μ˜ μž₯점.

  • 1. μ‚¬μš©μžκ°€ μ›ν•˜λŠ” νŽ˜μ΄μ§€λ₯Ό 직접 탐색할 수 μžˆμŠ΅λ‹ˆλ‹€.
    1. λ„€νŠΈμ›Œν¬ μš”μ²­μ΄ λͺ…ν™•νžˆ κ΅¬λΆ„λ˜μ–΄, μ‚¬μš©μžκ°€ λ‘œλ“œ 과정을 μ œμ–΄ κ°€λŠ₯ν•©λ‹ˆλ‹€.
    1. 데이터 λ‘œλ”© 및 μ„±λŠ₯ 관리가 μš©μ΄ν•©λ‹ˆλ‹€.

πŸ“Œ4️⃣ νŽ˜μ΄μ§€ 번호 λ°©μ‹μ˜ 단점.

    1. νŽ˜μ΄μ§€ 이동 μ‹œ 화면이 κ°±μ‹ λ˜λ―€λ‘œ UXκ°€ 끊길 수 μžˆμŠ΅λ‹ˆλ‹€.
    1. μ‚¬μš©μžκ°€ μ›ν•˜λŠ” 데이터λ₯Ό μ°ΎκΈ° μœ„ν•΄ μ—¬λŸ¬ νŽ˜μ΄μ§€λ₯Ό 반볡 탐색해야 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

βœ…2️⃣ λ¬΄ν•œ 슀크둀 방식.

  • λ¬΄ν•œ 슀크둀 방식은 μ‚¬μš©μžκ°€ νŽ˜μ΄μ§€ 번호λ₯Ό μ„ νƒν•˜μ§€ μ•Šκ³ , 화면을 μ•„λž˜λ‘œ μŠ€ν¬λ‘€ν•  λ•Œλ§ˆλ‹€ μžλ™μœΌλ‘œ λ‹€μŒ 데이터λ₯Ό λ‘œλ“œν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€.

πŸ“Œ1️⃣ λ¬΄ν•œ 슀크둀 λ°©μ‹μ˜ νŠΉμ§•.

  • λ°μ΄ν„°λŠ” ν•œ λ²ˆμ— ν•˜λ‚˜μ˜ νŽ˜μ΄μ§€μ”© λ’€μ—μ„œ μΆ”κ°€ λ‘œλ“œλ©λ‹ˆλ‹€.
  • μ‚¬μš©μžλŠ” λŠκΉ€ μ—†λŠ” 슀크둀 κ²½ν—˜μ„ μ–»μŠ΅λ‹ˆλ‹€.
  • 일반적으둜 μ†Œμ…œ λ―Έλ””μ–΄λ‚˜ 이미지 κ°€λŸ¬λ¦¬μ—μ„œ 많이 μ‚¬μš©ν•©λ‹ˆλ‹€.

πŸ“Œ2️⃣ λ¬΄ν•œ 슀크둀 λ°©μ‹μ˜ μ˜ˆμ‹œ: SNS ν”Όλ“œ.

  • μ‚¬μš©μžκ°€ μ•„λž˜λ‘€ μŠ€ν¬λ‘€ν•˜λ©΄ μƒˆλ‘œμš΄ κ²Œμ‹œλ¬Όμ΄ 계속 μΆ”κ°€λ‘œ λ‘œλ“œλ©λ‹ˆλ‹€.
  • νŽ˜μ΄μ§€μ˜ κ°œλ…μ΄ 보이지 μ•ŠμœΌλ©°, 데이터가 λŠκΈ°μ§€ μ•Šκ³  계속 ν‘œμ‹œλ©λ‹ˆλ‹€.

πŸ“Œ3️⃣ λ¬΄ν•œ 슀크둀 λ°©μ‹μ˜ μž₯μ •.

    1. UXκ°€λ§€λ„λŸ½κ³  직관적이며, 탐색이 λΉ λ¦…λ‹ˆλ‹€.
    1. μ‚¬μš©μžκ°€ 클릭 없이 데이터λ₯Ό μžμ—°μŠ€λŸ½κ²Œ 탐색 κ°€λŠ₯ν•©λ‹ˆλ‹€.
    1. λͺ¨λ°”일 확경에 특히 μ ν•©ν•©λ‹ˆλ‹€.

πŸ“Œ4️⃣ λ¬΄ν•œ 슀크둀 λ°©μ‹μ˜ 단점.

    1. λ„€νŠΈμ›Œν¬ μš”μ²­μ΄ λ§Žμ•„μ Έμ„œ μ„œλ²„ λΆ€ν•˜κ°€ 증가할 수 μžˆμŠ΅λ‹ˆλ‹€.
    1. μ‚¬μš©μžκ°€ νŠΉμ • μœ„μΉ˜λ‘œ λŒμ•„κ°€κ±°λ‚˜ νŠΉμ • 데이터λ₯Ό λ‹€μ‹œ μ°Ύγ„±κΈ° μ–΄λ ΅μŠ΅λ‹ˆλ‹€.
    1. 데이터가 λ§Žμ•„μ§ˆμˆ˜λ‘ λΈŒλΌμš°μ € λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ΄ μ¦κ°€ν•©λ‹ˆλ‹€.

βœ…3️⃣ 비ꡐ: νŽ˜μ΄μ§€ 번호 vs λ¬΄ν•œ 슀크둀

νŠΉμ§• νŽ˜μ΄μ§€ 번호 방식 λ¬΄ν•œ 슀크둀 방식
μ‚¬μš©μž κ²½ν—˜(UX) μ‚¬μš©μžκ°€ μ›ν•˜λŠ” νŽ˜μ΄μ§€λ‘œ 직접 이동 κ°€λŠ₯ μžμ—°μŠ€λŸ¬μš΄ 탐색, 클릭 없이 데이터 자둱 λ‘œλ“œ
데이터 λ‘œλ”© 방식 λͺ…μ‹œμ μœΌλ‘œ νŽ˜μ΄μ§€ μš”μ²­ 슀크둀 μ΄λ²€νŠΈμ— 따라 μžλ™μœΌλ‘œ μΆ”κ°€ λ‘œλ“œ
λ„€νŠΈμ›Œν¬ λΆ€ν•˜ νŽ˜μ΄μ§€ μš”μ²­μ΄ λͺ…ν™•, λΆ€ν•˜κ°€ 적음 μŠ€ν¬λ‘€ν•  λ•Œλ§ˆλ‹€ μš”μ²­ λ°œμƒ, λΆ€ν•˜ 증가 κ°€λŠ₯
νŠΉμ • 데이터 탐색 νŠΉμ • νŽ˜μ΄μ§€λ‘œ λ°”λ‘œ 이동 κ°€λŠ₯ νŠΉμ • μœ„μΉ˜λ‘œ 이동이 이렀움
μ ν•©ν•œ ν™˜κ²½ μƒν’ˆ λͺ©λ‘, λΈ”λ‘œκ·Έ κ²Œμ‹œκΈ€, 검색 κ²°κ³Ό λ“± μ†Œμ…œ λ―Έλ””μ–΄, 이미지 가러리, 동적 μ½˜ν…μΈ 

βœ…4️⃣ SQL 예제.

πŸ“1️⃣ νŽ˜μ΄μ§€ 번호 방식.

-- νŽ˜μ΄μ§€ 번호 기반 νŽ˜μ΄μ§• (νŽ˜μ΄μ§€ 크기: 10, 2번 νŽ˜μ΄μ§€ 데이터)
SELECT *
FROM article
ORDER BY created_at DESC
LIMIT 10 OFFSET 10;
  • LIMIT 10 ➞ ν•œ λ²ˆμ— κ°€μ Έμ˜¬ 데이터 개수.
  • OFFSET 10 ➞ λͺ‡ 개λ₯Ό κ±΄λ„ˆλ›°κ³  κ°€μ Έμ˜¬μ§€.

πŸ“2️⃣ λ¬΄ν•œ 슀크둀 방식.

-- λ¬΄ν•œ 슀크둀 νŽ˜μ΄μ§• (μ»€μ„œ 기반, created_at κΈ°μ€€)
SELECT *
FROM article
WHERE created_at < '2025-01-31 12:00:00'
ORDER BY created_at DESC
LIMIT 10;
  • WHERE created_at < ? ➞ ν˜„μž¬ λ‘œλ“œλœ λ§ˆμ§€λ§‰ λ°μ΄ν„°μ˜ μ‹œκ°„λ³΄λ‹€ 이전 데이터λ₯Ό κ°€μ Έμ˜΄.
  • LIMIT 10 ➞ ν•œ λ²ˆμ— κ°€μ Έμ˜¬ 데이터 개수.

βœ…5️⃣ νŽ˜μ΄μ§€ 번호 λ°©μ‹±κ³Ό λ¬΄ν•œ 슀크둀 방식 정리.

  • νŽ˜μ΄μ§€ 번호 방식 : μ‚¬μš©μžκ°€ νŽ˜μ΄μ§€λ₯Ό 직접 μ„ νƒν•˜μ—¬ νƒμƒ‰ν•˜λ©°, μƒν’ˆ λͺ©λ‘, 검색 결과와 같은 ꡬ쑰에 μ ν•©ν•©λ‹ˆλ‹€.
  • λ¬΄ν•œ 슀크둀 방식 : λŠκΉ€ μ—†λŠ” 슀크둀 κ²½ν—˜μ„ μ œκ³΅ν•˜λ©°, μ†Œμ…œ λ―Έλ””μ–΄ ν”Όλ“œ, 이미지 가러리 λ“± 동적 μ½˜ν…μΈ μ— μ ν•©ν•©λ‹ˆλ‹€.

βœ…6️⃣ νŽ˜μ΄μ§• 처리의 μž₯단점.

βœ…1️⃣ μž₯점.

  • 1 μ„±λŠ₯ μ΅œμ ν™” : ν•œ λ²ˆμ— ν•„μš”ν•œ λ°μ΄ν„°λ§Œ μ²˜λ¦¬ν•˜λ―€λ‘œ 응닡 속도가 λΉ¨λΌμ§‘λ‹ˆλ‹€.
  • 2. μ‚¬μš©μž κ²½ν—˜ κ°œμ„  : λŒ€λŸ‰ 데이터λ₯Ό νƒμƒ‰ν•˜κΈ° 쉽고, UIκ°€ κ°„κ²°ν•΄μ§‘λ‹ˆλ‹€.
  • 3. λ„€νŠΈμ›Œν¬ νš¨μœ¨μ„± : ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„ κ°„ μ „μ†‘λ˜λŠ” 데이터 양이 μ€„μ–΄λ“­λ‹ˆλ‹€.

❌2️⃣ 단점.

  • 1. κ΅¬ν˜„ λ³΅μž‘μ„± 증가 : μ„œλ²„ 및 ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ νŽ˜μ΄μ§• 처리λ₯Ό μΆ”κ°€λ‘œ κ΅¬ν˜„ν•΄μ•Ό ν•©λ‹ˆλ‹€.
  • 2. νŽ˜μ΄μ§€ 이동 μ‹œ μΆ”κ°€ μš”μ²­ : 각 νŽ˜μ΄μ§€λ₯Ό 이동할 λ•Œλ§ˆλ‹€ μ„œλ²„μ™€ 톡신해야 ν•˜λ―€λ‘œ, 느린 λ„€νŠΈμ›Œν¬μ—μ„œλŠ” 체감 속도가 λ–¨μ–΄μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€.