๐Ÿ“ฆ Dropbox ์„ค๊ณ„

Gunhoยท2026๋…„ 1์›” 26์ผ

System Design

๋ชฉ๋ก ๋ณด๊ธฐ
3/4

๐Ÿ“ฆ Dropbox ์‹œ์Šคํ…œ ์„ค๊ณ„

์›๊ฒฉ ์ €์žฅ์†Œ์— ํŒŒ์ผ์„ ์—…๋กœ๋“œ/๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ์—ฌ๋Ÿฌ ๊ธฐ๊ธฐ ๊ฐ„ ์ž๋™ ๋™๊ธฐํ™”ํ•˜๋Š” ํด๋ผ์šฐ๋“œ ์Šคํ† ๋ฆฌ์ง€ ์„œ๋น„์Šค


๐Ÿ“‹ ๊ธฐ๋Šฅ ์š”๊ตฌ์‚ฌํ•ญ

ํŒŒ์ผ ์—…๋กœ๋“œ

  • ์‚ฌ์šฉ์ž๊ฐ€ ํŒŒ์ผ์„ ์›๊ฒฉ ์ €์žฅ์†Œ์— ์—…๋กœ๋“œ

ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ

  • ์‚ฌ์šฉ์ž๊ฐ€ ์›๊ฒฉ ์ €์žฅ์†Œ์—์„œ ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ

ํŒŒ์ผ ๊ณต์œ 

  • ์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž์™€ ํŒŒ์ผ ๊ณต์œ  ๋ฐ ์ ‘๊ทผ ๊ฐ€๋Šฅ

์ž๋™ ๋™๊ธฐํ™”

  • ์—ฌ๋Ÿฌ ๊ธฐ๊ธฐ ๊ฐ„ ํŒŒ์ผ ์ž๋™ ๋™๊ธฐํ™”

๐Ÿ“Š ์‹œ์Šคํ…œ ๊ทœ๋ชจ

  • ์ผ์ผ ํ™œ์„ฑ ์‚ฌ์šฉ์ž: 1์–ต ๋ช… (100M DAU)
  • ์ตœ๋Œ€ ํŒŒ์ผ ํฌ๊ธฐ: 50GB

๐Ÿ“‹ ๋น„๊ธฐ๋Šฅ ์š”๊ตฌ์‚ฌํ•ญ

TPS (Transactions Per Second)

๊ฐ€์ •

  • 1์–ต ๋ช…์˜ ์œ ์ € (10^8)
  • ํ•˜๋ฃจ์— 10๋ฒˆ ์•ฑ ์ ‘์†
  • Download:Upload ๋น„์œจ = 3:1 ~ 5:1
  • ํ•˜๋ฃจ โ‰ˆ 10^5 ์ดˆ

๊ณ„์‚ฐ

์ด request = 10^8 ร— 10 = 10^9 request/์ผ

๋‹ค์šด๋กœ๋“œ TPS = (10^9 ร— 0.75~0.8) / 10^5 = 7,500~8,000 TPS
์—…๋กœ๋“œ TPS = (10^9 ร— 0.25~0.2) / 10^5 = 2,000~2,500 TPS

๐ŸŽฏ ์‹œ์Šคํ…œ ์„ค๊ณ„ ๋ชฉํ‘œ

Scalability & CAP

๋ถ„์‚ฐ ์ฒ˜๋ฆฌ

  • ์ˆ˜ํ‰์  ํ™•์žฅ(Horizontal Scaling) ํ•„์š”
  • ๋‹ค์ค‘ ์„œ๋ฒ„ ๊ตฌ์„ฑ์œผ๋กœ ํŠธ๋ž˜ํ”ฝ ๋ถ„์‚ฐ

CAP ์ •๋ฆฌ

  • AP ์šฐ์„  (Availability + Partition Tolerance)
  • Eventual Consistency ํ—ˆ์šฉ
  • ํŒŒ์ผ ๋™๊ธฐํ™”๋Š” ์ฆ‰์‹œ ๋ฐ˜์˜๋˜์ง€ ์•Š์•„๋„ ๋จ
  • ๊ณ ๊ฐ€์šฉ์„ฑ์„ ํ†ตํ•œ ์„œ๋น„์Šค ์•ˆ์ •์„ฑ ํ™•๋ณด

์‘๋‹ต ์‹œ๊ฐ„ & ์‚ฌ์šฉ์ž ๊ฒฝํ—˜

๋‹ค์šด๋กœ๋“œ/์—…๋กœ๋“œ ์‹œ๊ฐ„

  • ํŒŒ์ผ ํฌ๊ธฐ์— ๋”ฐ๋ผ ๊ฐ€๋ณ€์ 
  • ์ง„ํ–‰ ์ƒํƒœ ํ‘œ์‹œ๋กœ ์‚ฌ์šฉ์ž ๋Œ€๊ธฐ ์ธ๋‚ด์‹ฌ ํ–ฅ์ƒ
  • ์˜ˆ์ƒ ์™„๋ฃŒ ์‹œ๊ฐ„ ์ œ๊ณต

๋„คํŠธ์›Œํฌ ์žฅ์•  ์ฒ˜๋ฆฌ

  • ๋Œ€์šฉ๋Ÿ‰ ํŒŒ์ผ ์ „์†ก ์ค‘ ๋„คํŠธ์›Œํฌ ํŒŒํ‹ฐ์…˜ ๋ฐœ์ƒ ๊ฐ€๋Šฅ
  • ์žฌ์‹œ์ž‘ ๋ฐฉ์ง€: ์ค‘๋‹จ๋œ ์ง€์ ๋ถ€ํ„ฐ ์žฌ๊ฐœ(Resume) ๊ธฐ๋Šฅ ํ•„์ˆ˜
  • ์ฒญํฌ(Chunk) ๋‹จ์œ„ ์ „์†ก์œผ๋กœ ์•ˆ์ •์„ฑ ํ™•๋ณด

ํŒŒ์ผ ๋™๊ธฐํ™”

  • ์—ฌ๋Ÿฌ ๊ธฐ๊ธฐ ๊ฐ„ ํ•ฉ๋ฆฌ์ ์ธ ์‹œ๊ฐ„ ๋‚ด ๋™๊ธฐํ™” ์™„๋ฃŒ
  • ์‹ค์‹œ๊ฐ„ ๋™๊ธฐํ™”๋ณด๋‹ค ์ตœ์ข… ์ผ๊ด€์„ฑ ๋ณด์žฅ

๐Ÿ”‘ ํ•ต์‹ฌ ์š”๊ตฌ์‚ฌํ•ญ ์ •๋ฆฌ

ํ•ญ๋ชฉ๊ฐ’
๋‹ค์šด๋กœ๋“œ TPS7,500~8,000 TPS
์—…๋กœ๋“œ TPS2,000~2,500 TPS
์ตœ๋Œ€ ํŒŒ์ผ ํฌ๊ธฐ50GB
CAP ์šฐ์„ ์ˆœ์œ„AP (Availability)
์ผ๊ด€์„ฑ ๋ชจ๋ธEventual Consistency

ํ•ต์‹ฌ ๊ธฐ์ˆ ์  ๊ณผ์ œ

  • ๋Œ€์šฉ๋Ÿ‰ ํŒŒ์ผ ์ „์†ก ์•ˆ์ •์„ฑ
  • ๋„คํŠธ์›Œํฌ ์žฅ์•  ๋ณต๊ตฌ (Resume ๊ธฐ๋Šฅ)
  • ๋‹ค์ค‘ ๊ธฐ๊ธฐ ๋™๊ธฐํ™”
  • ๊ณ ๊ฐ€์šฉ์„ฑ ๋ณด์žฅ

๐Ÿ—„๏ธ ๋„๋ฉ”์ธ ๋ชจ๋ธ

๐Ÿ“ˆ ๊ฐ€์ •

  • ์™ธ๋ถ€ ์‹œ์Šคํ…œ (S3, Azure Storage, ..)
  • ์™ธ๋ถ€ ์‹œ์Šคํ…œ์— ์‹ค์ œ ํŒŒ์ผ์„ ์ €์žฅ
  • ์™ธ๋ถ€ ์‹œ์Šคํ…œ์—์„œ block ๋‹จ์œ„์˜ ๊ฐ์ง€, ๋‹ค์šด๋กœ๋“œ, ์—…๋กœ๋“œ ๊ธฐ๋Šฅ ์ œ๊ณต

1. FileMetadata

Table: file_metadata

ColumnTypeDescriptionConstraints
idBIGINTPrimary keyNOT NULL, PRIMARY KEY
file_nameTEXTํŒŒ์ผ ์ด๋ฆ„NOT NULL
file_typeVARCHARํŒŒ์ผ ํƒ€์ž… (ํ™•์žฅ์ž)NOT NULL
file_keyTEXT์™ธ๋ถ€ ์Šคํ† ๋ฆฌ์ง€ ๊ฒฝ๋กœ/ํ‚คNOT NULL, UNIQUE
file_sizeBIGINTํŒŒ์ผ ํฌ๊ธฐ (bytes)NOT NULL
user_idBIGINT์†Œ์œ ์ž IDNOT NULL, FOREIGN KEY
created_atTIMESTAMP์ƒ์„ฑ ์‹œ๊ฐ„NOT NULL
updated_atTIMESTAMP์ตœ์ข… ์ˆ˜์ • ์‹œ๊ฐ„NOT NULL

2. Chunk

Table: chunks

ColumnTypeDescriptionConstraints
idBIGINTPrimary keyNOT NULL, PRIMARY KEY
file_idBIGINTํŒŒ์ผ IDNOT NULL
hash_valueTEXTํŒŒ์ผ hash ๊ฐ’NOT NULL
created_atTIMESTAMP์ƒ์„ฑ ์‹œ๊ฐ„NOT NULL
updated_atTIMESTAMP์ตœ์ข… ์ˆ˜์ • ์‹œ๊ฐ„NOT NULL

3. User

Table: users

ColumnTypeDescriptionConstraints
idBIGINTPrimary keyNOT NULL, PRIMARY KEY
nameVARCHAR(255)์‚ฌ์šฉ์ž ์ด๋ฆ„NOT NULL
emailVARCHAR(255)์ด๋ฉ”์ผNOT NULL, UNIQUE
hashed_passwordVARCHAR(255)์•”ํ˜ธํ™”๋œ ๋น„๋ฐ€๋ฒˆํ˜ธNOT NULL
created_atTIMESTAMP๊ณ„์ • ์ƒ์„ฑ ์‹œ๊ฐ„NOT NULL
updated_atTIMESTAMP์ตœ์ข… ์ˆ˜์ • ์‹œ๊ฐ„NOT NULL

๋“ฑ๋“ฑ ํ•„์š”์— ๋”ฐ๋ผ ๋” ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋„๋ฉ”์ธ์ด ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, RDBMS๊ฐ€ ์•„๋‹ˆ๋ผ MongoDB ๋“ฑ์˜ NoSQL ์‚ฌ์šฉ๋„ ๊ฐ€๋Šฅ


๐Ÿ”Œ API ์„ค๊ณ„

1. ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ

GET /api/v1/files/{fileId}

Response

200 OK

{
  "presigned_url": "https://s3.amazonaws.com/bucket/file.pdf?X-Amz-Signature=...",
  "file_name": "presentation.pdf",
  "file_size": 5242880,
  "expires_in": 3600
}

์„ค๋ช…

  • Presigned URL์„ ํ†ตํ•ด S3์—์„œ ์ง์ ‘ ๋‹ค์šด๋กœ๋“œ
  • ์„œ๋ฒ„ ๋ถ€ํ•˜ ์—†์ด ํด๋ผ์ด์–ธํŠธ๊ฐ€ S3์™€ ์ง์ ‘ ํ†ต์‹ 

2. ํŒŒ์ผ ์—…๋กœ๋“œ

POST /api/v1/files

Request

{
  "file_name": "presentation.pdf",
  "file_type": "pdf",
  "file_size": 5242880
}

Response

201 Created

{
  "file_id": 1000001,
  "presigned_url": "https://s3.amazonaws.com/bucket/upload?X-Amz-Signature=...",
  "expires_in": 3600
}

์„ค๋ช…

  • ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋งŒ ์„œ๋ฒ„์— ์ €์žฅ
  • Presigned URL๋กœ ํด๋ผ์ด์–ธํŠธ๊ฐ€ S3์— ์ง์ ‘ ์—…๋กœ๋“œ
  • ์—…๋กœ๋“œ ์™„๋ฃŒ ํ›„ webhook์œผ๋กœ ์„œ๋ฒ„์— ์•Œ๋ฆผ

3. ํŒŒ์ผ ๊ณต์œ 

Endpoint

POST /api/files/{fileId}/share

Request

{
  "user_ids": [1, 32, 22],
  "permission": "read"  // "read" or "write"
}

Response

201 Created
{
  "file_id": 1000001,
  "shared_with": [
    {
      "user_id": 1,
      "email": "user1@example.com",
      "permission": "read",
      "shared_at": "2025-01-09T15:30:00Z"
    },
    {
      "user_id": 32,
      "email": "user32@example.com",
      "permission": "read",
      "shared_at": "2025-01-09T15:30:00Z"
    },
    {
      "user_id": 22,
      "email": "user22@example.com",
      "permission": "read",
      "shared_at": "2025-01-09T15:30:00Z"
    }
  ],
  "share_url": "https://app.dropbox.com/s/abc123/presentation.pdf"
}

์„ค๋ช…

  • N:N์˜ ๊ด€๊ณ„๋ฅผ ๊ฐ€์ง€๋Š” ์ƒˆ๋กœ์šด table shared_files ๋„์ž…๊ฐ€๋Šฅ
  • ํŒŒ์ผ ๊ณต์œ  ๊ธฐ๋ก์„ ์ €์žฅ

4. ํŒŒ์ผ ๋™๊ธฐํ™” (SSE)

Endpoint

GET /api/v1/sync/connect/{userId}

Response

200 OK
Content-Type: text/event-stream

data: {"event": "file_updated", "file_id": 1000001, "updated_at": "2025-01-09T14:20:00Z"}

data: {"event": "file_deleted", "file_id": 1000002}

data: {"event": "file_created", "file_id": 1000003, "file_name": "new_document.pdf"}

์„ค๋ช…

  • Server-Sent Events๋กœ ์‹ค์‹œ๊ฐ„ ๋™๊ธฐํ™”
  • ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ๋กœ ๋ณ€๊ฒฝ ์‚ฌํ•ญ ํ‘ธ์‹œ
  • ์—ฐ๊ฒฐ ์œ ์ง€๋กœ ์ฆ‰๊ฐ์ ์ธ ๋™๊ธฐํ™” ์•Œ๋ฆผ

์š”์•ฝ

MethodEndpointDescription์ธ์ฆ ํ•„์š”
GET/api/v1/files/{fileId}ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ URL ์ƒ์„ฑโœ…
POST/api/v1/filesํŒŒ์ผ ์—…๋กœ๋“œ URL ์ƒ์„ฑโœ…
GET/api/v1/sync/connect/{userId}์‹ค์‹œ๊ฐ„ ๋™๊ธฐํ™” ์—ฐ๊ฒฐโœ…

โš™๏ธ ์‹œ์Šคํ…œ ๊ตฌ์กฐ

์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜ ๊ฐœ์š”

์™ธ๋ถ€ ๊ฐ์ฒด ์Šคํ† ๋ฆฌ์ง€ ํ™œ์šฉ

  • S3, Azure Storage ๋“ฑ ๊ฒ€์ฆ๋œ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ ํ™œ์šฉ
  • ์‹ค์ œ ํŒŒ์ผ ์ €์žฅ ๋ฐ ์ „์†ก์€ ์™ธ๋ถ€ ์„œ๋น„์Šค๊ฐ€ ๋‹ด๋‹น
  • ์šฐ๋ฆฌ ์‹œ์Šคํ…œ์€ ํŒŒ์ผ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋งŒ ๊ด€๋ฆฌ

์ฒญํฌ ๊ธฐ๋ฐ˜ ์ฒ˜๋ฆฌ

  • ์™ธ๋ถ€ ์„œ๋น„์Šค์˜ ์ฒญํฌ ๋‹จ์œ„ ๊ธฐ๋Šฅ ํ™œ์šฉ
  • ์ฒญํฌ ๋ณ€๊ฒฝ ๊ฐ์ง€, ์—…๋กœ๋“œ, ๋‹ค์šด๋กœ๋“œ ๊ธฐ๋Šฅ ์ œ๊ณต
  • ํšจ์œจ์ ์ธ ์ฆ๋ถ„ ๋™๊ธฐํ™” ๊ฐ€๋Šฅ

๋“ฑ์„ ๊ณ ๋ คํ•˜๊ณ  ๋˜ ์ด๋ฏธ ์ž˜ ์„ค๊ณ„ ๋œ CDN, S3 ๊ฐ™์€ ์„œ๋น„์Šค๋“ค์„ ์•Œ๋งž๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ๋Œ€๋ถ€๋ถ„์˜ ์š”๊ตฌ๋˜์—ˆ๋˜ TPS ์ฒ˜๋ฆฌ๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด Third Party Service ์— ์œ„์ž„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

๊ทธ๋ฆฌ๊ณ  ์ถ”๊ฐ€๋กœ ๋กœ์ปฌํ™˜๊ฒฝ์—์„œ์˜ ๋ณ€ํ™”๋ฅผ ๊ฐ์ง€ํ•˜์—ฌ ํด๋ผ์šฐ๋“œํ™˜๊ฒฝ ๋ฐ˜์˜ํ•˜๊ฑฐ๋‚˜ ๋ฐ˜๋Œ€๋กœ ํด๋ผ์šฐ๋“œํ™˜๊ฒฝ์—์„œ์˜ ๋ณ€ํ™”๋ฅผ ๋กœ์ปฌ์— ๋ฐ˜์˜ํ•˜์—ฌ์•ผ ํ•œ๋‹ค๋ฉด ๋ช‡๊ฐ€์ง€ ์ปดํฌ๋„ŒํŠธ๋“ค์ด ๋” ์ถ”๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:


๐ŸŒค๏ธ ๋Œ€์šฉ๋Ÿ‰ ํŒŒ์ผ ์‹œ์Šคํ…œ ํ•ต์‹ฌ ํฌ์ธํŠธ

๐Ÿ“ฆ ํŒŒ์ผ ์ฒญํ‚น (Chunking)

๋Œ€์šฉ๋Ÿ‰ ํŒŒ์ผ ์—…๋กœ๋“œ์˜ ์žฌ๊ฐœ์™€ ํšจ์œจ์ ์ธ ๋ณ€๊ฒฝ ๊ฐ์ง€๋กœ ๋ฐœ์ƒํ•œ ์—…๋กœ๋“œ, ๋‹ค์šด๋กœ๋“œ๋ฅผ ์œ„ํ•ด์„œ๋Š” chunk๋ฅผ ํ™œ์šฉํ•˜๋Š”๊ฒŒ ํ•ต์‹ฌ

ํ”„๋กœ์„ธ์Šค

50GB ํŒŒ์ผ
  โ†“
ํด๋ผ์ด์–ธํŠธ์—์„œ 5-10MB ์ฒญํฌ๋กœ ๋ถ„ํ• 
  โ†“
๊ฐ ์ฒญํฌ๋งˆ๋‹ค SHA-256 ์ง€๋ฌธ ์ƒ์„ฑ
  โ†“
์ „์ฒด ํŒŒ์ผ ์ง€๋ฌธ ์ƒ์„ฑ (fileId)
  โ†“
๋ณ‘๋ ฌ ์—…๋กœ๋“œ ์‹œ์ž‘

์™œ ํด๋ผ์ด์–ธํŠธ์—์„œ?

โŒ ์„œ๋ฒ„ ์ฒญํ‚น: ์ „์ฒด ํŒŒ์ผ์„ ์ผ๋‹จ ์„œ๋ฒ„๋กœ ์ „์†ก (์˜๋ฏธ ์—†์Œ)
โœ… ํด๋ผ์ด์–ธํŠธ ์ฒญํ‚น: ์ž‘์€ ์กฐ๊ฐ์œผ๋กœ ๋‚˜๋ˆ ์„œ ์ „์†ก ์‹œ์ž‘

์žฅ์ 

โœ… ์ง„ํ–‰๋ฅ  ํ‘œ์‹œ ๊ฐ€๋Šฅ (3/10 ์ฒญํฌ ์™„๋ฃŒ)
โœ… ๋„คํŠธ์›Œํฌ ๋Š๊น€ ์‹œ ์ด์–ด๋ฐ›๊ธฐ
โœ… API Gateway 10MB ์ œํ•œ ์šฐํšŒ
โœ… ๋ณ‘๋ ฌ ์—…๋กœ๋“œ๋กœ ์†๋„ ํ–ฅ์ƒ
โœ… ํŒŒ์ผ ๋ณ€๊ฒฝ ์‹œ ๋ณ€๊ฒฝ๋œ ์ฒญํฌ๋งŒ ์žฌ์—…๋กœ๋“œ (๋ธํƒ€ ๋™๊ธฐํ™”)

โœ… ์—…๋กœ๋“œ ๊ฒ€์ฆ (Trust but Verify)

์—…๋กœ๋“œ ํ”Œ๋กœ์šฐ

1. ํด๋ผ์ด์–ธํŠธ: ํŒŒ์ผ ์ง€๋ฌธ ๊ณ„์‚ฐ
   โ†“
2. GET /files/{fileId} โ†’ ์ด๋ฏธ ์—…๋กœ๋“œ ์ค‘์ธ์ง€ ํ™•์ธ
   โ†“ (์—†์œผ๋ฉด)
3. POST /files โ†’ S3 Multipart Upload ์‹œ์ž‘
   โ†“
4. ๊ฐ ์ฒญํฌ ์—…๋กœ๋“œ to S3 Presigned URL
   โ†“
5. PATCH /files/{fileId}/chunks โ†’ ETag + ์ƒํƒœ ์—…๋ฐ์ดํŠธ
   โ†“
6. ์„œ๋ฒ„์—์„œ๋„ S3 ListParts API์™€ ETag๋กœ ์ƒํ˜ธ๊ฒ€์ฆ
   โ†“
7. ๋ชจ๋“  ์ฒญํฌ ์™„๋ฃŒ โ†’ CompleteMultipartUpload

๊ฒ€์ฆ ์ „๋žต

ํด๋ผ์ด์–ธํŠธ ์ธก
โ”œโ”€ ์ฒญํฌ ์—…๋กœ๋“œ ์ฆ‰์‹œ PATCH ์š”์ฒญ
โ”œโ”€ ๋น ๋ฅธ UI ์—…๋ฐ์ดํŠธ (์ง„ํ–‰๋ฅ  ํ‘œ์‹œ)
โ””โ”€ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ํ–ฅ์ƒ

์„œ๋ฒ„ ์ธก
โ”œโ”€ ์ฒญํฌ ์—…๋กœ๋“œ ํ™•์ธ ์š”์ฒญ์‹œ S3 ListParts API ํ˜ธ์ถœ
โ”œโ”€ ETag ๋น„๊ต๋กœ ์‹ค์ œ ์ƒํƒœ ํ™•์ธ
โ””โ”€ ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ ๋ณด์žฅ

FileMetadata ์Šคํ‚ค๋งˆ

{
  "fileId": "sha256-hash",
  "name": "video.mp4",
  "size": 50000000000,
  "uploadedBy": "user123",
  "status": "uploading",
  "uploadId": "s3-multipart-id",
  "chunks": [
    {"id": "chunk-1", "etag": "abc123", "status": "uploaded"},
    {"id": "chunk-2", "etag": "def456", "status": "uploaded"},
    {"id": "chunk-3", "etag": null, "status": "pending"}
  ]
}

๐Ÿ—œ๏ธ ์••์ถ• ์ „๋žต

์˜์‚ฌ๊ฒฐ์ • ํ”„๋กœ์„ธ์Šค

์••์ถ• ๊ณ ๋ ค
  โ†“
์••์ถ•์‹œ๊ฐ„ + ์••์ถ•ํ›„ Network IO
  vs
์›๋ณธ Network IO
  โ†“
๋น ๋ฅธ ์ชฝ ์„ ํƒ

์••์ถ• ๋Œ€์ƒ ํŒŒ์ผ

โœ… ํ…์ŠคํŠธ (.txt, .log, .json): 5GB โ†’ 1GB (80% ๊ฐ์†Œ)
โœ… CSV, XML: ์••์ถ•๋ฅ  ๋†’์Œ
โœ… ์ฝ”๋“œ ํŒŒ์ผ (.js, .py, .java)
โœ… JSON/XML API ์‘๋‹ต

์••์ถ• ์ œ์™ธ ํŒŒ์ผ

โŒ ์ด๋ฏธ์ง€ (.jpg, .png): ์ด๋ฏธ ์••์ถ•๋จ
โŒ ๋น„๋””์˜ค (.mp4, .mov): ํšจ๊ณผ ๊ฑฐ์˜ ์—†์Œ
โŒ ์••์ถ• ํŒŒ์ผ (.zip, .gz): ์ด๋ฏธ ์••์ถ•๋จ
โŒ ์•”ํ˜ธํ™”๋œ ํŒŒ์ผ: ์••์ถ• ํšจ๊ณผ ์—†์Œ

๋ณด์•ˆ ๊ณ ๋ ค์‚ฌํ•ญ

์˜ฌ๋ฐ”๋ฅธ ์ˆœ์„œ
์••์ถ• โ†’ ์•”ํ˜ธํ™” โœ…
(์••์ถ•๋ฅ  ์ตœ๋Œ€ํ™”)

์ž˜๋ชป๋œ ์ˆœ์„œ
์•”ํ˜ธํ™” โ†’ ์••์ถ• โŒ
(๋žœ๋ค ๋ฐ์ดํ„ฐ๋Š” ์••์ถ• ๋ถˆ๊ฐ€)

๐Ÿ”„ ์‹ค์‹œ๊ฐ„ ๋™๊ธฐํ™”

Hot File ์ „๋žต

์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ํŒŒ์ผ (์ƒ์œ„ 20%)
  โ†“
WebSocket ์‹ค์‹œ๊ฐ„ ์—ฐ๊ฒฐ ์œ ์ง€
  โ†“
๋ณ€๊ฒฝ ์ฆ‰์‹œ ํ‘ธ์‹œ
  โ†“
ํ˜‘์—… ๊ฒฝํ—˜ ํ–ฅ์ƒ

Cold File ์ „๋žต

๊ฐ€๋” ์‚ฌ์šฉ๋˜๋Š” ํŒŒ์ผ (๋‚˜๋จธ์ง€ 80%)
  โ†“
Polling (30์ดˆ๋งˆ๋‹ค ํ™•์ธ)
  โ†“
๋ฆฌ์†Œ์Šค ์ ˆ์•ฝ
  โ†“
๋น„์šฉ ์ตœ์ ํ™”

ํŒ๋‹จ ๊ธฐ์ค€

ํŒŒ์ผ ์ ‘๊ทผ ํŒจํ„ด
โ”œโ”€ ์ตœ๊ทผ 7์ผ๊ฐ„ ์ ‘๊ทผ ํšŸ์ˆ˜
โ”œโ”€ ๋งˆ์ง€๋ง‰ ์ ‘๊ทผ ์‹œ๊ฐ„
โ””โ”€ ์ ‘๊ทผ ๋นˆ๋„ (์ผ ๋‹จ์œ„)

ํ˜‘์—… ์ง€ํ‘œ
โ”œโ”€ ๋™์‹œ ํŽธ์ง‘์ž ์ˆ˜
โ”œโ”€ ๊ณต์œ  ๋ฒ”์œ„ (๊ฐœ์ธ/ํŒ€/์ „์‚ฌ)
โ””โ”€ ๋Œ“๊ธ€/์ˆ˜์ • ํ™œ๋™

ํŒŒ์ผ ํŠน์„ฑ
โ”œโ”€ ํŒŒ์ผ ํƒ€์ž… (๋ฌธ์„œ > ๋ฏธ๋””์–ด > ์•„์นด์ด๋ธŒ)
โ”œโ”€ ํŒŒ์ผ ํฌ๊ธฐ (์ž‘์€ ํŒŒ์ผ ์šฐ์„ )
โ””โ”€ ํŽธ์ง‘ ๊ฐ€๋Šฅ ์—ฌ๋ถ€
๋“ฑ๋“ฑ

Hot/Cold ์ „ํ™˜ ๋กœ์ง

Hot โ†’ Cold ์ „ํ™˜
โ”œโ”€ 7์ผ๊ฐ„ ์ ‘๊ทผ ์—†์Œ
โ”œโ”€ ํ˜‘์—…์ž ๋ชจ๋‘ ์˜คํ”„๋ผ์ธ
โ””โ”€ ์ฝ๊ธฐ ์ „์šฉ ๋ชจ๋“œ

Cold โ†’ Hot ์ „ํ™˜
โ”œโ”€ ํŽธ์ง‘ ์‹œ์ž‘
โ”œโ”€ ์ƒˆ ํ˜‘์—…์ž ์ฐธ์—ฌ
โ””โ”€ 3ํšŒ ์ด์ƒ ์—ฐ์† ์ ‘๊ทผ

๋ฆฌ์†Œ์Šค ์ตœ์ ํ™”

Hot Files (20%)
โ”œโ”€ WebSocket: 10,000 ๋™์‹œ ์—ฐ๊ฒฐ
โ”œโ”€ ๋ฉ”๋ชจ๋ฆฌ: ํŒŒ์ผ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์บ์‹ฑ
โ””โ”€ ๋น„์šฉ: ๋†’์Œ

Cold Files (80%)
โ”œโ”€ HTTP Polling: ํ•„์š”์‹œ์—๋งŒ
โ”œโ”€ ๋ฉ”๋ชจ๋ฆฌ: ๋””์Šคํฌ ๊ธฐ๋ฐ˜ ์กฐํšŒ
โ””โ”€ ๋น„์šฉ: ๋‚ฎ์Œ
๋“ฑ ๊ณ ๋ ค ๊ฐ€๋Šฅ

๐Ÿ“š ์ฐธ์กฐ

Hello Interview

profile
Hello

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