Skip to content

Catch-Live/catch-live-api

Repository files navigation

μ‹€μ‹œκ°„ 슀트리밍 λ…Ήν™” ν”„λ‘œμ νŠΈ

β€œμ‹€μ‹œκ°„ 방솑, λ†“μΉ˜μ§€ 말고 CatchLive ν•˜μ„Έμš”!”
β€œλ‹Ήμ‹ μ˜ 슀트리머의 슀트리밍 μˆœκ°„μ„ μžλ™μœΌλ‘œ μΊμΉ˜ν•΄λ“œλ¦½λ‹ˆλ‹€.”



πŸ“– λͺ©μ°¨

  1. ν”„λ‘œμ νŠΈ κ°œμš”
  2. ν”„λ‘œμ νŠΈ 동기
  3. λ ˆν¬μ§€ν„°λ¦¬ μ—­ν• 
  4. 핡심 κΈ°λŠ₯
  5. 기술 μŠ€νƒ
  6. 개발 쀑 κ³ λ―Όκ³Ό ν•΄κ²°
  7. 멀버 μ†Œκ°œ
  8. 회고

1. ν”„λ‘œμ νŠΈ κ°œμš”


  • ν”„λ‘œμ νŠΈλͺ…: CatchLive
  • κΈ°κ°„: 2025.5.26 ~ 2025.6.20 (기획 1μ£Ό / 개발 및 배포 4μ£Ό)
  • λͺ©μ : μ‹€μ‹œκ°„ 라이브 슀트리밍 λ…Ήν™”λ₯Ό μœ„ν•œ ν”„λ‘œμ νŠΈ
  • λŒ€μƒ μ‚¬μš©μž: 라이브 슀트리밍 방솑 μ‹œκ°„μ— 약속이 μžˆμ–΄μ„œ 보지 λͺ»ν•˜λŠ” μ‚¬λžŒλ“€


2. ν”„λ‘œμ νŠΈ 동기


μ‹€μ‹œκ°„ 라이브 μŠ€νŠΈλ¦¬λ°μ€ 점점 더 λ§Žμ€ μ½˜ν…μΈ κ°€ μƒμ„±λ˜κ³  μ†ŒλΉ„λ˜λŠ” 핡심 ν”Œλž«νΌμ΄ 되고 μžˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ ν”Œλž«νΌ μžμ²΄μ—μ„œ 라이브 방솑을 λ‹€μ‹œ 보기 κΈ°λŠ₯ 없이 μ’…λ£Œν•΄λ²„λ¦¬λŠ” κ²½μš°κ°€ 많고, μ‚¬μš©μžλ“€μ΄ λ†“μΉœ 방솑을 λ‹€μ‹œ μ‹œμ²­ν•  수 μžˆλŠ” 방법은 μ œν•œμ μž…λ‹ˆλ‹€.

특히 팬덀 μ€‘μ‹¬μ˜ μ½˜ν…μΈ  μ†ŒλΉ„κ°€ ν™œλ°œν•œ μ§€κΈˆ, μ‹€μ‹œκ°„ μŠ€νŠΈλ¦¬λ°μ„ λ†“μΉ˜λ©΄ 영영 λ³Ό 수 μ—†λŠ” 아쉬움은 μ‚¬μš©μžμ—κ²Œ 큰 λΆˆνŽΈν•¨μ΄ λ©λ‹ˆλ‹€. λ˜ν•œ ν¬λ¦¬μ—μ΄ν„°λ‚˜ 데이터 뢄석가 μž…μž₯μ—μ„œλŠ” 방솑 기둝을 λ³΄κ΄€ν•˜κ±°λ‚˜ 후속 μ½˜ν…μΈ  μ œμž‘μ— ν™œμš©ν•  수 μžˆλŠ” μˆ˜λ‹¨μ΄ ν•„μš”ν•©λ‹ˆλ‹€.

이 ν”„λ‘œμ νŠΈλŠ” YouTube, μΉ˜μ§€μ§(Chzzk) λ“± λ‹€μ–‘ν•œ ν”Œλž«νΌμ—μ„œ μ‹€μ‹œκ°„ 방솑이 μ‹œμž‘λ˜λ©΄ μžλ™μœΌλ‘œ κ°μ§€ν•˜κ³ , 방솑 μ’…λ£Œ μ‹œκΉŒμ§€ μ•ˆμ •μ μœΌλ‘œ λ…Ήν™”ν•΄μ£ΌλŠ” λ°±μ—”λ“œ μ‹œμŠ€ν…œμ„ κ΅¬ν˜„ν•œ κ²ƒμž…λ‹ˆλ‹€.


채널 ꡬ독 β†’ 라이브 감지 β†’ λ…Ήν™” μ‹œμž‘ β†’ S3 μ—…λ‘œλ“œ β†’ μ™„λ£Œ μ•Œλ¦Ό β†’ μ˜μƒ λ‹€μš΄λ‘œλ“œκΉŒμ§€ μžλ™ν™”λœ νŒŒμ΄ν”„λΌμΈμ„ 톡해 팬, 크리에이터, ν”Œλž«νΌ 운영자 λͺ¨λ‘μ—κ²Œ μœ μš©ν•œ 슀트리밍 λ°±μ—… μ‹œμŠ€ν…œμ„ λ§Œλ“œλŠ” 것이 λͺ©ν‘œμ˜€μŠ΅λ‹ˆλ‹€.



3. λ ˆν¬μ§€ν„°λ¦¬ μ—­ν• 


3.1. λ ˆν¬μ§€ν† λ¦¬ μ†Œκ°œ

ν΄λΌμ΄μ–ΈνŠΈ λ ˆν¬μ§€ν† λ¦¬ | μ„œλ²„ λ ˆν¬μ§€ν† λ¦¬

ν•΄λ‹Ή λ ˆν¬μ§€ν† λ¦¬λŠ” CatchLive μ„œλΉ„μŠ€μ˜ μ„œλ²„ κ΄€λ ¨ μ½”λ“œλ₯Ό κ΄€λ¦¬ν•˜λŠ” μ €μž₯μ†Œμž…λ‹ˆλ‹€.

ν•˜λ‚˜μ˜ λ ˆν¬μ§€ν† λ¦¬ λ‚΄μ—μ„œ λ‹€μŒκ³Ό 같은 μ„Έ κ°€μ§€ μ„œλ²„λ₯Ό ν•¨κ»˜ μš΄μ˜ν•©λ‹ˆλ‹€

  • API μ„œλ²„: ν΄λΌμ΄μ–ΈνŠΈμ™€ ν†΅μ‹ ν•˜λ©° μ‚¬μš©μž 인증, 일정, μ±„νŒ…, ꡬ독 λ“± λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ μ²˜λ¦¬ν•©λ‹ˆλ‹€.
  • λͺ¨λ‹ˆν„°λ§ μ„œλ²„: λ…Ήν™” μƒνƒœ 확인, μ›Œμ»€ ν—¬μŠ€μ²΄ν¬ λ“± μ‹œμŠ€ν…œμ˜ μƒνƒœλ₯Ό λͺ¨λ‹ˆν„°λ§ν•©λ‹ˆλ‹€.
  • λ…Ήν™” μ›Œμ»€ μ„œλ²„: μ‹€μ‹œκ°„ 방솑을 λ°±κ·ΈλΌμš΄λ“œμ—μ„œ λ…Ήν™”ν•˜κ³ , 처리 및 μ €μž₯을 λ‹΄λ‹Ήν•©λ‹ˆλ‹€.

βΈ»

3.2. μ„œλ²„ ꡬ쑰 및 μ•„ν‚€ν…μ²˜

기쑴의 λ ˆμ΄μ–΄λ“œ μ•„ν‚€ν…μ²˜(Layered Architecture) 에 클린 μ•„ν‚€ν…μ²˜(Clean Architecture) 사상을 μ μš©ν•΄μ„œ λ‹€μŒκ³Ό 같은 4개의 μ£Όμš” λ ˆμ΄μ–΄λ‘œ κ΅¬μ„±λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

  1. Domain λ ˆμ΄μ–΄ β€’ μ„œλΉ„μŠ€μ˜ 핡심 λΉ„μ¦ˆλ‹ˆμŠ€ κ·œμΉ™κ³Ό 도메인 λͺ¨λΈμ„ μ •μ˜ν•©λ‹ˆλ‹€. β€’ 기술 κ΅¬ν˜„κ³Ό λ¬΄κ΄€ν•œ μˆœμˆ˜ν•œ 둜직(μ—”ν‹°ν‹°, 도메인 μ„œλΉ„μŠ€ λ“±)을 ν¬ν•¨ν•©λ‹ˆλ‹€. β€’ μ €μž₯μ†Œμ— λŒ€ν•œ 접근은 직접 ν•˜μ§€ μ•ŠμœΌλ©°, repository interface만 μ •μ˜ν•©λ‹ˆλ‹€.

  2. Application λ ˆμ΄μ–΄ β€’ μ‹€μ œ μ‚¬μš©μžμ˜ μš”μ²­μ— λŒ€ν•œ μœ μŠ€μΌ€μ΄μŠ€λ₯Ό μ •μ˜ν•©λ‹ˆλ‹€. β€’ 도메인 객체듀을 μ‘°ν•©ν•˜μ—¬ ꡬ체적인 μž‘μ—… 흐름을 κ΅¬μ„±ν•©λ‹ˆλ‹€. β€’ νŠΈλžœμž­μ…˜ μ œμ–΄, μ„œλΉ„μŠ€ 호좜 μˆœμ„œ 관리 λ“± 처리 흐름을 λ‹΄λ‹Ήν•©λ‹ˆλ‹€.

  3. Interface λ ˆμ΄μ–΄ β€’ μ™ΈλΆ€μ™€μ˜ μ—°κ²° μ§€μ μœΌλ‘œ, Controller, Module, DTO 등이 ν¬ν•¨λ©λ‹ˆλ‹€. β€’ ν΄λΌμ΄μ–ΈνŠΈ μš”μ²­μ„ λ°›μ•„ application layer의 μœ μŠ€μΌ€μ΄μŠ€λ₯Ό ν˜ΈμΆœν•˜κ³ , 응닡을 λ°˜ν™˜ν•©λ‹ˆλ‹€. β€’ 인증, κΆŒν•œ 체크, μš”μ²­κ°’ 검증 λ“±μ˜ 역할도 이 λ ˆμ΄μ–΄μ—μ„œ μ²˜λ¦¬ν•©λ‹ˆλ‹€.

  4. Infrastructure λ ˆμ΄μ–΄ β€’ λ°μ΄ν„°λ² μ΄μŠ€, 파일 μ‹œμŠ€ν…œ, μ™ΈλΆ€ API λ“± μ™ΈλΆ€ μ‹œμŠ€ν…œκ³Όμ˜ 연결을 λ‹΄λ‹Ήν•©λ‹ˆλ‹€. β€’ repository interface의 μ‹€μ œ κ΅¬ν˜„μ²΄λ“€μ΄ 이곳에 μœ„μΉ˜ν•©λ‹ˆλ‹€. β€’ Prisma ORM, S3, Redis λ“±μ˜ μ™ΈλΆ€ 도ꡬλ₯Ό μ‚¬μš©ν•˜λŠ” ꡬ체적인 μ½”λ“œκ°€ ν¬ν•¨λ©λ‹ˆλ‹€.


4. 핡심 κΈ°λŠ₯

4.1. κ΅¬λ…ν•˜κΈ°

ν™”λ©΄

ꡬ독

  • μ‚¬μš©μžλŠ” μ›ν•˜λŠ” 슀트리머λ₯Ό ꡬ독할 수 μžˆμŠ΅λ‹ˆλ‹€.(CHZZK or YOUTUBE)
    • μ΅œλŒ€ 5λͺ…κΉŒμ§€ 슀트리머λ₯Ό ꡬ독할 수 μžˆμŠ΅λ‹ˆλ‹€.
  • κ΅¬λ…ν•œ μ‹œμ λΆ€ν„° μŠ€νŠΈλ¦¬λ¨Έκ°€ 라이브 쀑일 경우 μžλ™μœΌλ‘œ λ…Ήν™”κ°€ μ‹œμž‘λ©λ‹ˆλ‹€.

4.2. λ…Ήν™” λͺ©λ‘ & λ‹€μš΄λ‘œλ“œ

ν™”λ©΄

λ…Ήν™”

  • μ‚¬μš©μžλŠ” ν˜„μž¬ μžμ‹ μ΄ ꡬ독 쀑인 λ…Ήν™” 상황을 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.
  • 방솑이 μ’…λ£Œλœ 경우, λ‹€μš΄λ‘œλ“œλ₯Ό 톡해 λ…Ήν™” νŒŒμΌμ„ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.
    • μ΅œλŒ€ 3μΌκΉŒμ§€ λ‹€μš΄λ‘œλ“œ κ°€λŠ₯ν•©λ‹ˆλ‹€.
  • 검색을 톡해 μžμ‹ μ΄ μ°Ύκ³  싢은 λ…Ήν™” νŒŒμΌμ„ 찾을 수 μžˆμŠ΅λ‹ˆλ‹€.


5. 기술 μŠ€νƒ

Backend

  • Language: Node 18
  • Framework: NestJS 11
  • Database: MySQL 8.xx
  • Infrastructure: Redis 7.x
  • ORM: Prisma 6.8
  • Authentication: OAuth2 + JWT

Infra & DevOps

  • CI/CD: GitHub Actions + Docker + AWS Elastic Beanstalk
  • Middleware: AWS ElasticCache, AWS S3, AWS RDS

πŸ€” Why Nest.js?

Nest.jsλŠ” λͺ¨λ“ˆ 기반 μ•„ν‚€ν…μ²˜μ™€ μ˜μ‘΄μ„± μ£Όμž… κΈ°λŠ₯, λ°μ½”λ ˆμ΄ν„° κΈ°λŠ₯듀을 μ œκ³΅ν•˜λŠ” TypeScript μ€‘μ‹¬μ˜ Node.js ν”„λ ˆμž„μ›Œν¬μž…λ‹ˆλ‹€. Node.jsλ₯Ό 기반으둜 ν•˜κΈ° λ•Œλ¬Έμ— λΉŒλ“œλœ μ»¨ν…Œμ΄λ„ˆμ˜ 크기가 μž‘κ³ , λŸ°νƒ€μž„μ— 기본적으둜 μ μœ ν•˜λŠ” λ¦¬μ†ŒμŠ€λ„ 적어 μ‹ κ·œ μ„œλΉ„μŠ€λ₯Ό μ œμž‘ν•˜κ³  μš΄μ˜ν•˜λŠ”λ° μ ν•©ν•©λ‹ˆλ‹€.

Express.js 와 λΉ„κ΅ν•˜μ—¬, λ°μ½”λ ˆμ΄ν„°μ™€ λͺ¨λ“ˆ μ˜μ‘΄μ„± 컨트둀 등을 μΆ”κ°€λ‘œ ν•™μŠ΅ν•΄μ•Ό λ˜μ§€λ§Œ, 둜그인, 토큰 관리 같은 널리 μ“°μ΄λŠ” κΈ°λŠ₯듀을 λ°μ½”λ ˆμ΄ν„°λ₯Ό 톡해 μ‰½κ²Œ μ‚¬μš©ν•  수 있고, λ¦¬μ†ŒμŠ€ μ μœ λ‚˜ λΉŒλ“œλœ μ»¨ν…Œμ΄λ„ˆ νŒŒμΌλ“±μ΄ μ „μ²΄μ μœΌλ‘œ 가볍기 λ•Œλ¬Έμ— AWS 배포에도 μ ν•©ν•˜λ‹€κ³  νŒλ‹¨λ˜μ–΄ Nest.js λ₯Ό μ‚¬μš©ν•˜κΈ°λ‘œ ν–ˆμŠ΅λ‹ˆλ‹€.

πŸ€” Why Prisma?

PrismaλŠ” μ„ μ–Έν˜• μŠ€ν‚€λ§ˆμ™€ μžλ™ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜, νƒ€μž… μ„ μ–Έκ³Ό 검사, 직관적 API둜 개발 생산성과 μ•ˆμ •μ„±μ„ κ·ΉλŒ€ν™”ν•˜λŠ” ORMμž…λ‹ˆλ‹€. μž‘μ„±ν•œ μŠ€ν‚€λ§ˆλ₯Ό 톡해 μ‹€μ œ DB에 ꡬ쑰λ₯Ό μžλ™ 생성할 수 있으며, SQLλŒ€μ‹  Prismaμ—μ„œ μ œκ³΅ν•˜λŠ” κΈ°λŠ₯을 μ‚¬μš©ν•˜μ—¬ μ‹€μ œλ‘œ 쿼리λ₯Ό μš”μ²­ν•˜κΈ° 전에 μ—λŸ¬λ₯Ό 감지할 수 있고, transaction 같은 κΈ°λŠ₯듀도 Prismaλ₯Ό 톡해 κ°„λ‹¨ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

TypeORM도 SQL λŒ€μ‹  μ œκ³΅ν•˜λŠ” κΈ°λŠ₯듀을 μ“Έ 수 μžˆμœΌλ‚˜, 컴파일 λ‹¨κ³„μ—μ„œ νƒ€μž… 검사λ₯Ό ν•˜μ§€ μ•Šμ•„ 였λ₯˜ 검사, μˆ˜μ •μ΄ 번거둭고, Prisma에 λΉ„ν•΄ μžλ™μœΌλ‘œ μ œκ³΅ν•˜λŠ” κΈ°λŠ₯이 적어 개발 μ†Œμš”κ°€ λŠ˜μ–΄λ‚  수 μžˆμŠ΅λ‹ˆλ‹€. κ·Έλž˜μ„œ μ’€ 더 κ°„νŽΈν•˜κ²Œ μ‚¬μš©ν•  수 있고 λ‹€μ–‘ν•œ κΈ°λŠ₯듀을 μ œκ³΅ν•˜λŠ” Prismaλ₯Ό μ‚¬μš©ν•˜κΈ°λ‘œ ν–ˆμŠ΅λ‹ˆλ‹€.

πŸ€” Why MySQL?

MySQL은 μ˜€ν”ˆ μ†ŒμŠ€ 기반의 κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€ 관리 μ‹œμŠ€ν…œμœΌλ‘œ, μ•ˆμ •μ μ΄κ³  효율적으둜 λŒ€μš©λŸ‰ 데이터λ₯Ό μ €μž₯·관리할 수 μžˆμŠ΅λ‹ˆλ‹€. λ°μ΄ν„°μ˜ νƒ€μž…μ„ μ •μ˜ν•˜μ—¬ 잘λͺ»λœ 값이 기둝될 상황을 λ°©μ§€ν•  수 있으며, νŠΈλžœμž­μ…˜μ˜ μ£Όμš” 속성인 ACIDλ₯Ό μ€€μˆ˜ν•©λ‹ˆλ‹€. AWSλ₯Ό λΉ„λ‘―ν•œ λ§Žμ€ ν΄λΌμš°λ“œν”Œλž«νΌμ—μ„œ MySQL을 μ§€μ›ν•˜κΈ° λ•Œλ¬Έμ— λ‹€μ–‘ν•œ 상황, ν™˜κ²½μ—μ„œλ„ μ•ˆμ •μ μœΌλ‘œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

MongoDB등을 ν¬ν•¨ν•œ NoSQL은 μœ μ—°ν•œ 데이터 ꡬ쑰λ₯Ό κ°€μ§ˆ 수 μžˆμœΌλ‚˜, ν˜„μž¬ 개발 ν”„λ‘œμ νŠΈλŠ” λͺ…ν™•ν•œ 데이터 ꡬ쑰λ₯Ό κ°€μ§€κ³  있고, 이λ₯Ό μžλ™μœΌλ‘œ μ—„κ²©ν•˜κ²Œ 관리해야 ν•˜κΈ° λ•Œλ¬Έμ— κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜κΈ°λ‘œ ν–ˆμŠ΅λ‹ˆλ‹€.

πŸ€” Why Redis?

RedisλŠ” λ©”λͺ¨λ¦¬ 기반의 κ³ μ„±λŠ₯ ν‚€-κ°’ 데이터 μ €μž₯μ†Œλ‘œ, μ‚¬μš©μžμ™€ μ„œλ²„, μ„œλ²„μ™€ μ„œλ²„ μ‚¬μ΄μ—μ„œ μž„μ‹œλ‘œ μ‚¬μš©ν•˜λŠ” 데이터듀을 κ΄€λ¦¬ν•˜λŠ”λ° μ‚¬μš©ν•©λ‹ˆλ‹€. λ¬Έμžμ—΄(string), 리슀트(list), μ§‘ν•©(set), μ •λ ¬λœ μ§‘ν•©(sorted set), ν•΄μ‹œ(hash) λ“± λ‹€μ–‘ν•œ 데이터 ꡬ쑰λ₯Ό λ©”λͺ¨λ¦¬μ—μ„œ 직접 지원해 λ³΅μž‘ν•œ μΊμ‹œΒ·νλ₯Ό μ†μ‰½κ²Œ κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ Pub/Subκ³Ό Streams κΈ°λŠ₯을 ν™œμš©ν•΄ μ‹€μ‹œκ°„ λ©”μ‹œμ§•, 이벀트 기반 처리, μž‘μ—… νŒŒμ΄ν”„λΌμΈ κΈ°λŠ₯을 톡해 λΆ„μ‚° μ‹œμŠ€ν…œμ„ 지원할 수 μžˆμŠ΅λ‹ˆλ‹€

ν˜„μž¬ 개발 ν”„λ‘œμ νŠΈμ—μ„œλŠ” λ…Ήν™” μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” λΆ„μ‚° μ‹œμŠ€ν…œμ„ 지원할 κΈ°λŠ₯듀이 ν•„μš”ν•˜μ—¬ Redisλ₯Ό μ‚¬μš©ν•˜κΈ°λ‘œ ν–ˆμŠ΅λ‹ˆλ‹€.


6. 개발 쀑 κ³ λ―Όκ³Ό ν•΄κ²°

6.1. μ˜€λ²„μŠ€ν¬λ‘€λ§ ν•΄κ²°

상황

μ•Œλ¦Όμ΄λ‚˜ μƒνƒœ λͺ©λ‘λ“€μ„ 일정 λ²”μœ„ μ•ˆμ—λ‹€ μž‘μ„±ν•˜κ³ , 이λ₯Ό μŠ€ν¬λ‘€ν•΄μ„œ λ³Ό 수 μžˆλ„λ‘ κ³„νšν•˜κ³  κ°œλ°œμ„ μ‹œμž‘ν–ˆμŠ΅λ‹ˆλ‹€.

문제

κ·ΈλŸ¬λ‚˜ μƒνƒœ λͺ©λ‘λ“€μ΄ 일정 λ²”μœ„ 밖을 λ²—μ–΄λ‚˜μ„œ ν•˜λ‹¨ λ„€λΉ„κ²Œμ΄μ…˜ λ°”λ₯Ό λ°€μ–΄λ‚΄κ±°λ‚˜, λ²”μœ„ λ°”κΉ₯으둜 계속 μž‘μ„±λ˜κ³ , 슀크둀 바도 κ³„νš μ™Έμ˜ λΆ€λͺ¨ μ»¨ν…Œμ΄λ„ˆμ— μ μš©λ˜μ–΄ λͺ©λ‘ μ™Έ μ»¨ν…Œμ΄λ„ˆλ“€λ„ 같이 μŠ€ν¬λ‘€λ˜λŠ” 증상이 λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.

ν•΄κ²°

width λ‚˜ height의 min, max등을 μ§€μ •ν•˜μ§€ μ•ŠμœΌλ©΄ λ””ν΄νŠΈ 섀정인 autoκ°€ 되고, λŒ€λΆ€λΆ„μ˜ 경우, width, height λ₯Ό λ‹€μŒκ³Ό 같은 κ³΅μ‹μœΌλ‘œ κ³„μ‚°ν•©λ‹ˆλ‹€.

'width' + '쒌우 margin' + '쒌우 border' + '쒌우 padding' = block의 전체 width

좜처

슀크둀 λŒ€μƒμΈ μžμ‹ μ»¨ν…Œμ΄λ„ˆλ“€λΆ€ν„° μ΅œμƒλ‹¨κΉŒμ§€, μ–΄λŠ ν•˜λ‚˜λΌλ„ auto κ°’μœΌλ‘œ μ„€μ •λ˜μ–΄μžˆλ‹€λ©΄ 본인의 크기λ₯Ό μžμ‹ μ»¨ν…Œμ΄λ„ˆμ˜ 크기λ₯Ό κ΅¬ν•œ λ‹€μŒ κ·Έ 값에 λ§žμΆ”κΈ° λ•Œλ¬Έμ— μ˜λ„μΉ˜ μ•Šμ€ λΆ€λͺ¨ μ»¨ν…Œμ΄λ„ˆμ— 슀크둀이 μ μš©λ˜κ±°λ‚˜, λ‹€λ₯Έ 컨텐츠듀이 ν™”λ©΄ λ°–μœΌλ‘œ λ°€λ €λ‚  수 μžˆμŠ΅λ‹ˆλ‹€.

λ”°λΌμ„œ μžμ‹ μ»¨ν…Œμ΄λ„ˆλΆ€ν„° μ΅œμƒλ‹¨ λΆ€λͺ¨ μ»¨ν…Œμ΄λ„ˆκΉŒμ§€, auto 섀정이 λ˜μ§€ μ•Šλ„λ‘ min-h-0 같은 μ˜΅μ…˜λ“€μ„ μž‘μ„±ν•΄μ•Ό μ˜λ„ν•œ λŒ€λ‘œ 일정 λ²”μœ„μ•ˆμ— μžμ‹ μ»¨ν…Œμ΄λ„ˆλ“€μ΄ 있고, μŠ€ν¬λ‘€ν•΄μ„œ λͺ¨λ“  μžμ‹ μ»¨ν…Œμ΄λ„ˆλ₯Ό λ³Ό 수 μžˆλ„λ‘ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

회고

생각지도 λͺ»ν•œ CSS λ¬Έμ œμ˜€κΈ°μ— κ½€ 였랜 μ‹œκ°„μ΄ μ†Œμš”λμŠ΅λ‹ˆλ‹€. auto λŠ” μžμ‹ μ»¨ν…Œμ΄λ„ˆμ˜ 값을 λ¨Όμ € κ΅¬ν•˜κ³ , κ·Έ 값에 λ§žμΆ°μ„œ λΆ€λͺ¨μ˜ 값을 κ΅¬ν•œλ‹€λŠ”κ²ƒμ„ λͺ…심해야겠닀고 μƒκ°ν–ˆμŠ΅λ‹ˆλ‹€.

6.2. νƒ€μž…μŠ€ν¬λ¦½νŠΈμ˜ νƒ€μž…μΆ”λ‘  μ‹€νŒ¨ 문제

상황

이전에 μž‘μ„±λœ useInfinityQueryλ₯Ό 별도둝 ν…œν”Œλ¦Ών™” μ‹œμΌœμ„œ, useInfinityQuery λ₯Ό μž¬μž‘μ„±ν•  ν•„μš” 없이, μ •ν•΄μ§„ ν…œν”Œλ¦ΏλŒ€λ‘œ μž…λ ₯ν•˜λ©΄ λ™μž‘ν•˜λ„λ‘ κ΅¬ν˜„ν•˜κ³ μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

문제

λ¦¬ν„΄κ°’μ˜ νƒ€μž… 좔둠에 μ‹€νŒ¨ν•˜μ—¬ 계속 νƒ€μž…μŠ€ν¬λ¦½νŠΈ 였λ₯˜κ°€ λ°œμƒν•˜μ˜€μŠ΅λ‹ˆλ‹€.

ν•΄κ²°

이전에 μž‘μ„±λœ μ½”λ“œμ—μ„œ κ³ μ •λœ μ˜΅μ…˜ 값을 μΆ”κ°€λ‘œ μž…λ ₯λ°›μ„μˆ˜ μžˆλ„λ‘ ...options λ₯Ό μΆ”κ°€ν•˜μ˜€λŠ”λ°, μ΄λ ‡κ²Œ μ˜΅μ…˜κ°’μ΄ 고정이 μ•„λ‹Œ λ³€μˆ˜κ°€ 되면 리턴값을 νƒ€μž… μΆ”λ‘ ν•˜λŠ”λ° μ‹€νŒ¨ν•˜λŠ”κ²ƒμœΌλ‘œ λ³΄μž…λ‹ˆλ‹€. λ”°λΌμ„œ μ΄μ „μ—λŠ” μžλ™μœΌλ‘œ InfiniteData<T, number | null>둜 λ³€ν™˜ν•΄μ„œ 별 λ¬Έμ œμ—†μ΄ μ‹€ν–‰λœ 리턴 νƒ€μž… T λ₯Ό InfiniteData<T, number | null>둜 μ„ μ–Έν•˜μ—¬ μ˜¬λ°”λ₯Έ 리턴값 νƒ€μž…μ„ μΆ”λ‘ ν•˜λ„λ‘ μˆ˜μ •ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

회고

μ˜΅μ…˜κ°’μ΄ κ³ μ •μ΄μ—ˆμ„λ•Œ μžλ™μœΌλ‘œ νƒ€μž…μ„ λ³€ν™˜ν•˜μ—¬ λ¦¬ν„΄ν•˜κΈΈλž˜ μžλ™μœΌλ‘œ νƒ€μž…μ„ λ³€ν™˜ν•΄μ£ΌλŠ” κΈ°λŠ₯이 λΌμ΄λΈŒλŸ¬λ¦¬μ— μžˆλ‹€κ³  μƒκ°ν•˜μ—¬ μ˜€λžœμ‹œκ°„ λ‹€λ₯Έ λ°©ν–₯μ—μ„œ 문제의 원인을 μ°Ύμ•˜μŠ΅λ‹ˆλ‹€. 문제의 원인을 μΆ”λ‘ ν• λ•Œ μ’€ 더 μ˜€ν”ˆ λ§ˆμΈλ“œλ‘œ 가섀을 μ„ΈμšΈ ν•„μš”κ°€ μžˆλ‹€κ³  μƒκ°ν–ˆμŠ΅λ‹ˆλ‹€.


6.3. μ†Œμ…œ 둜그인 κ΅¬ν˜„μ—μ„œμ˜ μ „λž΅ νŒ¨ν„΄ 적용

μ†Œμ…œ 둜그인 κΈ°λŠ₯을 κ΅¬ν˜„ν•˜λ©΄μ„œ κ°€μž₯ κ³ λ―Όν–ˆλ˜ 뢀뢄은 카카였, 넀이버, κ΅¬κΈ€μ²˜λŸΌ μ„œλ‘œ λ‹€λ₯Έ ν”Œλž«νΌμ˜ 인증 방식과 응닡 포맷을 μ–΄λ–»κ²Œ μΌκ΄€λ˜κ²Œ μ²˜λ¦¬ν•  κ²ƒμΈκ°€μ˜€μŠ΅λ‹ˆλ‹€.


πŸ€” μ΄ˆκΈ°μ— κ²ͺ은 문제

μ²˜μŒμ—λŠ” 인증 λ‘œμ§μ„ ν•˜λ‚˜μ˜ μ„œλΉ„μŠ€(AuthService) μ•ˆμ— λͺ¨λ‘ μž‘μ„±ν–ˆμŠ΅λ‹ˆλ‹€. ν”Œλž«νΌμ— 따라 if 문으둜 인증 흐름을 λΆ„κΈ°ν–ˆλŠ”λ°, 이 방식은 λ‹Ήμž₯은 λ™μž‘ν–ˆμ§€λ§Œ 점점 ꡬ쑰가 λ¬΄κ±°μ›Œμ‘ŒμŠ΅λ‹ˆλ‹€.

각 ν”Œλž«νΌλ§ˆλ‹€ 인가 μ½”λ“œ μš”μ²­, 토큰 λ°œκΈ‰, μ‚¬μš©μž 정보 쑰회 흐름은 μœ μ‚¬ν–ˆμ§€λ§Œ, μ„ΈλΆ€ νŒŒλΌλ―Έν„°λ‚˜ API μ—”λ“œν¬μΈνŠΈ, 응닡 포맷이 달라 λΉ„μŠ·ν•œ 둜직이 λ°˜λ³΅λ˜μ—ˆκ³ , 그둜 인해 ν•˜λ‚˜μ˜ 파일 λ‚΄ μ½”λ“œλŸ‰μ΄ λ§Žμ•„μ§€λ©΄μ„œ 가독성이 점점 λ–¨μ–΄μ§€λŠ” λ¬Έμ œκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.

λ˜ν•œ μƒˆλ‘œμš΄ μ†Œμ…œ 둜그인 방식을 μΆ”κ°€ν•  λ•Œλ§ˆλ‹€ κΈ°μ‘΄ μ½”λ“œμ— 손을 λŒ€μ•Ό ν–ˆκ³ , μ΄λŠ” ν–₯ν›„ ν™•μž₯μ„±κ³Ό μ•ˆμ •μ„± λͺ¨λ‘μ— μ’‹μ§€ μ•Šλ‹€κ³  νŒλ‹¨ν–ˆμŠ΅λ‹ˆλ‹€.


βœ… μ „λž΅ νŒ¨ν„΄ λ„μž…μ„ ν†΅ν•œ ꡬ쑰 κ°œμ„ 

이 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ μ „λž΅ νŒ¨ν„΄(Strategy Pattern) 을 λ„μž…ν–ˆμŠ΅λ‹ˆλ‹€. 핡심 μ•„μ΄λ””μ–΄λŠ” ν”Œλž«νΌλ³„ 인증 λ‘œμ§μ„ 각각의 μ „λž΅ 클래슀둜 λΆ„λ¦¬ν•˜κ³ , 이듀을 κ³΅ν†΅λœ μΈν„°νŽ˜μ΄μŠ€λ‘œ λ¬Άμ–΄ μΌκ΄€λœ λ°©μ‹μœΌλ‘œ μ‹€ν–‰ν•  수 μžˆλŠ” ꡬ쑰λ₯Ό λ§Œλ“œλŠ” κ²ƒμ΄μ—ˆμŠ΅λ‹ˆλ‹€.

λ¨Όμ €, 카카였, 넀이버, ꡬ글 λ“± 각 μ†Œμ…œ 둜그인 ν”Œλž«νΌμ— λŒ€ν•΄ λ³„λ„μ˜ μ „λž΅ 클래슀λ₯Ό λ§Œλ“€μ—ˆμŠ΅λ‹ˆλ‹€. 각 μ „λž΅ ν΄λž˜μŠ€λŠ” ν•΄λ‹Ή ν”Œλž«νΌμ— νŠΉν™”λœ 인가 μ½”λ“œ 처리, 토큰 λ°œκΈ‰, μ‚¬μš©μž 정보 쑰회 λ‘œμ§λ§Œμ„ μ±…μž„μ§€λ©°, λͺ¨λ‘ κ³΅ν†΅λœ λ©”μ„œλ“œ ꡬ쑰λ₯Ό λ”°λ¦…λ‹ˆλ‹€.

κ·Έλ‹€μŒ, μ „λž΅ 객체λ₯Ό μ„ νƒν•˜κ³  μ‹€ν–‰ν•˜λŠ” νŒ©ν† λ¦¬ 클래슀λ₯Ό κ΅¬μ„±ν•˜μ—¬, μ†Œμ…œ 둜그인 μš”μ²­μ΄ λ“€μ–΄μ˜¬ λ•Œ μ–΄λ–€ ν”Œλž«νΌμΈμ§€μ— 따라 μ μ ˆν•œ μ „λž΅μ„ μ°Ύμ•„ μ‹€ν–‰ν•˜λ„λ‘ ν–ˆμŠ΅λ‹ˆλ‹€. 즉, 인증 νλ¦„μ˜ μ§„μž…μ μ—μ„œλŠ” β€œμ–΄λ–€ μ „λž΅μ„ μ‚¬μš©ν• μ§€β€ κ²°μ •λ§Œ ν•˜κ³ , μ‹€μ œ 인증 λ‘œμ§μ€ μ „λž΅ ν΄λž˜μŠ€μ— 역할을 μœ„μž„ν•˜λŠ” ꡬ쑰둜 바뀐 κ²ƒμž…λ‹ˆλ‹€.

μ΄λŸ¬ν•œ ꡬ쑰 덕뢄에, 도메인 μ„œλΉ„μŠ€ 계측(AuthService)μ—μ„œλŠ” μΉ΄μΉ΄μ˜€λ“  넀이버든 ꡬ글이든 상관없이, λ‹¨μˆœνžˆ getAccessToken, getUserInfo 같은 곡톡 λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜κΈ°λ§Œ ν•˜λ©΄ λ©λ‹ˆλ‹€. ν”Œλž«νΌμ˜ μ„ΈλΆ€ κ΅¬ν˜„μ„ λͺ°λΌλ„ λ™μΌν•œ λ°©μ‹μœΌλ‘œ λ‘œμ§μ„ μ²˜λ¦¬ν•  수 있게 λ˜μ—ˆκ³ , 둜직의 좔상화 μˆ˜μ€€μ΄ λ†’μ•„μ Έ 가독성과 μœ μ§€λ³΄μˆ˜μ„±μ΄ λŒ€ν­ ν–₯μƒλ˜μ—ˆμŠ΅λ‹ˆλ‹€.

λ„μž… ν›„ 얻은 효과

μ „λž΅ νŒ¨ν„΄μ„ λ„μž…ν•œ λ’€λ‘œ λ‹€μŒκ³Ό 같은 μž₯점이 μžˆμ—ˆμŠ΅λ‹ˆλ‹€

  • 인증 둜직이 각 μ „λž΅ ν΄λž˜μŠ€μ— λͺ…ν™•ν•˜κ²Œ λΆ„λ¦¬λ˜μ–΄ μžˆμ–΄, μ½”λ“œλ₯Ό μ΄ν•΄ν•˜κ³  μœ μ§€λ³΄μˆ˜ν•˜κΈ° 훨씬 μ‰¬μ›Œμ‘ŒμŠ΅λ‹ˆλ‹€.
  • μƒˆλ‘œμš΄ μ†Œμ…œ 둜그인 ν”Œλž«νΌμ„ μΆ”κ°€ν•  λ•ŒλŠ”, κΈ°μ‘΄ λ‘œμ§μ„ μˆ˜μ •ν•˜μ§€ μ•Šκ³  μ „λž΅ 클래슀λ₯Ό μƒˆλ‘œ μΆ”κ°€ν•˜κ³  λ“±λ‘λ§Œ ν•˜λ©΄ λ˜λ―€λ‘œ ν™•μž₯성이 λ›°μ–΄λ‚¬μŠ΅λ‹ˆλ‹€.
  • 인증 흐름이 ν‘œμ€€ν™”λ˜λ©΄μ„œ ν…ŒμŠ€νŠΈ μž‘μ„±μ΄ μ‰¬μ›Œμ§€κ³ , ν”Œλž«νΌλ³„ 문제λ₯Ό μ „λž΅ λ‹¨μœ„λ‘œ λ…λ¦½μ μœΌλ‘œ 디버깅할 수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.
  • 결과적으둜 OCP(개방-폐쇄 원칙) 을 μΆ©μ‹€νžˆ μ§€ν‚€λŠ” ꡬ쑰가 λ˜μ–΄, 이후에도 μ•ˆμ •μ μœΌλ‘œ κΈ°λŠ₯을 ν™•μž₯ν•΄ λ‚˜κ°ˆ 수 μžˆλŠ” κΈ°λ°˜μ„ λ§ˆλ ¨ν•  수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.



6.4. 메인 μ„œλ²„λ‘œλΆ€ν„° μ›Œμ»€ 뢄리

개발1

상황

  • μ‚¬μš©μžκ°€ μ›ν•˜λŠ” 슀트리머λ₯Ό κ΅¬λ…ν•˜λ©΄, ν•΄λ‹Ή μŠ€νŠΈλ¦¬λ¨Έκ°€ μ‹€μ‹œκ°„ 방솑을 μ‹œμž‘ν•  λ•Œ μžλ™μœΌλ‘œ λ…Ήν™”λ₯Ό μˆ˜ν–‰ν•˜λŠ” μ‹œμŠ€ν…œ
    • ꡬ독 β†’ μ‹€μ‹œκ°„ μŠ€νŠΈλ¦¬λ¨Έκ°€ 라이브 쀑인지 주기적으둜 확인 β†’ λ…Ήν™” μ§„ν–‰

문제

  • 단일 μ„œλ²„ κ΅¬μ‘°μ—μ„œλŠ” λ‹€μŒκ³Ό 같은 λ¬Έμ œκ°€ λ°œμƒκ°€λŠ₯
    • ν™•μž₯μ„± λΆ€μ‘±: μŠ€νŠΈλ¦¬λ¨Έκ°€ λ§Žμ•„μ§ˆμˆ˜λ‘ 각 슀트리밍 ν”Œλž«νΌμ— λŒ€ν•΄ 주기적인 Live μƒνƒœ 체크, λ…Ήν™” 처리, ν›„μ²˜λ¦¬ 등이 ν•œ μ„œλ²„μ— μ§‘μ€‘λ˜μ–΄ 병λͺ©μ΄ λ°œμƒ
    • λΆˆμ•ˆμ •ν•œ ν”„λ‘œμ„ΈμŠ€ 관리: λ…Ήν™” 쀑인 슀트리밍의 μ€‘λ‹¨μ΄λ‚˜ 였λ₯˜ λ°œμƒ μ‹œ μžλ™ 볡ꡬ가 어렀움

ν•΄κ²°

  • μ‹œμŠ€ν…œμ„ μ•„λž˜μ™€ 같이 μ—­ν•  뢄리 및 λΆ„μ‚° 처리 ꡬ쑰둜 μž¬μ„€κ³„
    • Main Server: μœ μ € ꡬ독 관리, λ…Ήν™” μš”μ²­/κ²°κ³Ό 확인 및 μ˜μƒ λ‹€μš΄λ‘œλ“œ, μ•Œλ¦Ό, 마이 νŽ˜μ΄μ§€
    • Monitoring Server: 각 ν”Œλž«νΌμ˜ 슀트리머 Live μƒνƒœλ₯Ό μ‹€μ‹œκ°„ 감지, 감지 μ‹œ μ›Œμ»€μ—κ²Œ λ…Ήν™” μš”μ²­ 전솑
    • Recording Worker: 각 μ›Œμ»€λŠ” λ…λ¦½μ μœΌλ‘œ Streamlink 기반 λ…Ήν™” μˆ˜ν–‰, 병렬 λ…Ήν™” κ°€λŠ₯, λ…Ήν™” κ²°κ³Όλ₯Ό S3에 μ—…λ‘œλ“œν•˜κ³  DB 기둝

회고

  • 이 ꡬ쑰 덕뢄에 슀트리머 μˆ˜κ°€ λŠ˜μ–΄λ‚˜λ„ μ•ˆμ •μ μœΌλ‘œ λ…Ήν™”κ°€ κ°€λŠ₯해짐
  • 단일 μ„œλ²„ κ΅¬μ‘°μ˜€λ‹€λ©΄ λΆˆκ°€λŠ₯ν–ˆλ˜ ν™•μž₯μ„±κ³Ό μ•ˆμ •μ„±μ„ 확보할 수 μžˆμ—ˆκ³ , μ‹€μ œ 운영 쀑인 μ‹œμŠ€ν…œμ—μ„œλ„ μž₯μ•  격리, 병렬성, μž₯μ•  볡ꡬ의 이점이 λͺ…확해짐

6.5. Redis둜 νžˆνŠΈλΉ„νŠΈ 및 μƒνƒœκ΄€λ¦¬ 이관

개발1

상황

  • λͺ¨λ‹ˆν„°λ§ μ„œλ²„λŠ” 라이브 방솑을 κ°μ§€ν•˜κ³ , μ›Œμ»€λŠ” λ…Ήν™” ν”„λ‘œμ„ΈμŠ€λ₯Ό μ‹€ν–‰ν•˜λ©°, 이 λ‘˜μ€ TCP 연결을 톡해 데이터λ₯Ό 직접 ν†΅μ‹ ν•˜κ³  ν•˜νŠΈλΉ„νŠΈ μ§„ν–‰

문제

  • μ΄ˆκΈ°μ—λŠ” TCP 기반의 직접 μ—°κ²°λ‘œ μ›Œμ»€μ™€ λͺ¨λ‹ˆν„°λ§ μ„œλ²„ κ°„μ˜ μƒνƒœ 확인 및 Job 전달을 μˆ˜ν–‰ν–ˆμ§€λ§Œ, μ„œλΉ„μŠ€κ°€ ν™•μž₯λ˜λ©΄μ„œ λ‹€μŒκ³Ό 같은 λ¬Έμ œκ°€ λ°œμƒ
    • μ—°κ²° 관리 λΆ€λ‹΄ 증가: μ›Œμ»€ μˆ˜κ°€ λ§Žμ•„μ§ˆμˆ˜λ‘, TCP μ—°κ²° μˆ˜κ°€ κΈ°ν•˜κΈ‰μˆ˜μ μœΌλ‘œ λŠ˜μ–΄λ‚˜ μ—°κ²° μƒνƒœ μœ μ§€(keep-alive)와 μž¬μ—°κ²°μ— λŒ€ν•œ 뢀담이 컀짐
    • μƒνƒœ 관리 μ±…μž„μ˜ 뢈λͺ…ν™•μ„±: μ›Œμ»€κ°€ μˆ˜μ‹œλ‘œ scale-out/in λ˜λ©΄μ„œ λˆ„κ°€ μ–΄λ–€ μ›Œμ»€μ˜ μƒνƒœλ₯Ό μΆ”μ ν•˜κ³  μž₯μ• λ₯Ό 감지할지 μ±…μž„ 뢄리가 λͺ¨ν˜Έν•΄μ§
    • μœ μ§€λ³΄μˆ˜ 및 μž₯μ•  λŒ€μ‘ 어렀움: TCP 기반의 ping-pong κ΅¬μ‘°λŠ” μž¬μ—°κ²° μ‹œ μƒνƒœ λ³΅κ΅¬λ‚˜ job 볡제 λ°©μ§€κ°€ μ–΄λ ΅κ³ , λͺ¨λ‹ˆν„°λ§ μ„œλ²„κ°€ 단일 μž₯애점(SPOF)이 될 수 있음

ν•΄κ²°

  • TCP 기반 μƒνƒœ 관리λ₯Ό Redis 기반 λ©”μ‹œμ§€/μƒνƒœ μ‹œμŠ€ν…œμœΌλ‘œ μ™„μ „νžˆ μ΄κ΄€ν•˜κ³ , λͺ¨λ“  Job 전달, ν•˜νŠΈλΉ„νŠΈ, μƒνƒœ 좔적을 Redis ν‚€ μ€‘μ‹¬μœΌλ‘œ 섀계
ν‚€ 이름 νƒ€μž… μ—­ν•  TTL
job:waiting:queue List λͺ¨λ‹ˆν„°λ§ μ„œλ²„κ°€ μ›Œμ»€μ—κ²Œ 전달할 μž‘μ—… λŒ€κΈ° 큐 μ—†μŒ
job:fail:queue List μ‹€νŒ¨ν•œ μž‘μ—… μž¬μ‹œλ„ 큐 μ—†μŒ
recording:worker:<WORKER_ID> Set ν•΄λ‹Ή μ›Œμ»€κ°€ 처리 쀑인 μ„Έμ…˜ ID 리슀트 μ—†μŒ
job:meta Hash μ„Έμ…˜ ID β†’ μž‘μ—… 정보 μ—†μŒ
job:done:queue List μ™„λ£Œλœ μž‘μ—… 큐 μ—†μŒ
heartbeat:worker:<WORKER_ID> String (TTL) μ›Œμ»€ 생쑴 ν™•μΈμš© ν‚€ 3초

회고

  • Redis 기반으둜 μ „ν™˜ν•œ 이후 μ‹œμŠ€ν…œμ€ ν™•μž₯μ„±, μ•ˆμ •μ„±, 볡ꡬ κ°€λŠ₯μ„± μΈ‘λ©΄μ—μ„œ 크게 ν–₯상
  • TCP μ—°κ²° 기반 방식은 μ†Œκ·œλͺ¨ μ‹œμŠ€ν…œμ—λŠ” μ ν•©ν–ˆμ§€λ§Œ, μˆ˜ν‰ ν™•μž₯μ„±κ³Ό μž₯μ•  볡원λ ₯이 μš”κ΅¬λ˜λŠ” ν™˜κ²½μ—μ„œλŠ” ꡬ쑰적 ν•œκ³„κ°€ λ“œλŸ¬λ‚¨
  • Redis ν‚€ 섀계λ₯Ό μ„ΈλΆ„ν™”ν•˜κ³  역할을 λͺ…ν™•νžˆ λ‚˜λˆ„λ©΄μ„œ, μž₯μ•  λ°œμƒ μ‹œμ—λ„ λͺ…ν™•ν•œ 기쀀에 따라 μ›Œμ»€ μƒνƒœλ₯Ό νŒλ‹¨ν•˜κ³  μž¬μ²˜λ¦¬ν•  수 있게 λ˜μ—ˆμŒ

6.6. 데이터 λΉ„μš© 문제 ν•΄κ²°

상황

  • μ›Œμ»€λŠ” Streamlinkλ₯Ό 톡해 .ts 포맷으둜 μ˜μƒμ„ μ €μž₯ν•˜λ©°, 방솑이 μ’…λ£Œλ  λ•ŒκΉŒμ§€ λ…Ήν™”λ₯Ό μ§€μ†ν•˜λ„λ‘ μ„€κ³„λ˜μ–΄ 있음

문제

  • μž₯μ‹œκ°„ 방솑 λ…Ήν™” μ‹œκ°„ μ œν•œ μ—†μŒ
    • λΌμ΄λΈŒκ°€ 수 μ‹œκ°„ 이상 μ§€μ†λ˜λ©΄ μ›Œμ»€κ°€ 계속 λ…Ήν™”ν•˜μ—¬ μžμ› μ μœ κ°€ κΈΈμ–΄μ§€κ³ , κ³Όλ„ν•œ 파일 크기가 λ°œμƒ
    • μŠ€νŠΈλ¦¬λ¨Έκ°€ μ‹€μˆ˜λ‘œ 방솑을 끄지 μ•ŠμœΌλ©΄ μˆ˜μΌκ°„ λ…Ήν™”κ°€ μ΄μ–΄μ§ˆ 수 μžˆλŠ” ꡬ쑰
  • 1μ‹œκ°„λ‹Ή μ•½ 1GB에 λ‹¬ν•˜λŠ” .ts νŒŒμΌμ€ S3 μ €μž₯ λΉ„μš© 및 λ„€νŠΈμ›Œν¬ λŒ€μ—­ν­μ— 뢀담을 쀌

ν•΄κ²°

  • λ…Ήν™” νƒ€μž„μ•„μ›ƒ μ œν•œ λ„μž…
    • λ…Ήν™” λ‘œμ§μ— 6μ‹œκ°„ μ œν•œ λ‘œμ§μ„ μΆ”κ°€ν•΄, μž₯μ‹œκ°„ 방솑 λ…Ήν™”λ₯Ό μžλ™μœΌλ‘œ μ’…λ£Œν•˜λ„λ‘ κ°œμ„ 
  • .mp4 λ³€ν™˜ 및 μš©λŸ‰ μ••μΆ• μΆ”κ°€
    • λ…Ήν™” μ™„λ£Œ ν›„ ffmpegλ₯Ό ν™œμš©ν•΄ .ts β†’ .mp4 μž¬μΈμ½”λ”© κ³Όμ • μΆ”κ°€
    • μ΅œλŒ€ μš©λŸ‰ 50% 절감

회고

  • 데이터 전솑 및 μ €μž₯ λΉ„μš©μ„ 쀄이기 μœ„ν•΄ mp4 μ••μΆ• 과정을 λ„μž…ν•œ 것은 μ‹€μ§ˆμ μΈ λΉ„μš© 절감
    • λ‹€λ§Œ, CPU μžμ›μ„ 많이 μ†Œλͺ¨ν•˜λŠ” 인코딩 μž‘μ—…μ„ μ›Œμ»€κ°€ 직접 μˆ˜ν–‰ν•  경우, λ…Ήν™” μ„±λŠ₯ μ €ν•˜λ‚˜ 지연이 λ°œμƒν•  수 μžˆμ–΄ 별도 μ„œλ²„λ‘œ λΆ„λ¦¬ν•˜λŠ” ꡬ쑰의 ν•„μš”μ„± λŠλ‚Œ
  • νƒ€μž„μ•„μ›ƒ 기반 λ…Ήν™” μ’…λ£Œλ₯Ό 톡해 μ‹œμŠ€ν…œ μ•ˆμ •μ„±μ„ 높이고, μž₯μ• λ‚˜ μ‚¬μš©μž μ‹€μˆ˜λ‘œ μΈν•œ μž₯κΈ° λ¦¬μ†ŒμŠ€ 점유λ₯Ό 효과적으둜 λ°©μ§€

7. 멀버 μ†Œκ°œ

Name E-Mail GitHub
λ°•κ²½νƒœ [email protected] https://github.com/smileboy0014
이승민 [email protected] https://github.com/leesm0218
μ΄ν˜„μˆ˜ [email protected] https://github.com/soo96


8. 회고

λ°•κ²½νƒœ μˆœκ°„μˆœκ°„μ€ 길게 λŠκ»΄μ‘Œμ§€λ§Œ, μ§€λ‚˜κ³  λ³΄λ‹ˆ ν•œ 달은 μ°Έ 짧은 μ‹œκ°„μ΄μ—ˆμŠ΅λ‹ˆλ‹€. μΉ˜μ—΄ν•˜κ²Œ κ³ λ―Όν•˜κ³  ν† λ‘ ν•˜λ©° 결과물을 λ§Œλ“€μ–΄κ°€λŠ” 과정은 κ²°μ½” 쉽지 μ•Šμ•˜μ§€λ§Œ, 인풋 μ΄μƒμ˜ 아웃풋이 μžˆμ—ˆλ˜ κ°’μ§„ μ‹œκ°„μ΄μ—ˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. ν”„λ‘œμ νŠΈ 아이디어 μ„ μ •λΆ€ν„° Git μ „λž΅, 컀밋 및 이슈 ν…œν”Œλ¦Ώ, μ½”λ“œ μ»¨λ²€μ…˜, 기술 μŠ€νƒκΉŒμ§€β€” 무엇 ν•˜λ‚˜ 이유 없이 μ •ν•œ 것은 μ—†μ—ˆμŠ΅λ‹ˆλ‹€. 이 κ²½ν—˜μ„ λ°”νƒ•μœΌλ‘œ, μ•žμœΌλ‘œ μ–΄λ–€ ν™˜κ²½μ—μ„œ λˆ„κ΅¬μ™€ μž‘μ—…ν•˜λ”λΌλ„ κ·Έλ•Œμ˜ κ³ λ―Όκ³Ό 선택을 κΈ°μ–΅ν•˜λ©° μ΅œμ„ μ˜ κ²°κ³Όλ₯Ό λ‚Ό 수 μžˆμ„ 것이라 λ―ΏμŠ΅λ‹ˆλ‹€.

μ’‹μ•˜λ˜ 점: 섀계뢀터 λ°°ν¬κΉŒμ§€ μ„œλΉ„μŠ€ 개발의 전체 사이클을 직접 κ²½ν—˜ν•΄λ³Ό 수 μžˆμ—ˆλ˜ 점이 κ°€μž₯ μ’‹μ•˜μŠ΅λ‹ˆλ‹€. λ‹¨μˆœνžˆ κΈ°μˆ μ„ μ„ νƒν•˜λŠ” 데 κ·ΈμΉ˜μ§€ μ•Šκ³ , ν•©λ‹Ήν•œ 이유λ₯Ό λ°”νƒ•μœΌλ‘œ 합리적인 결정을 λ‚΄λ¦¬λŠ” 사고 방식을 배울 수 μžˆμ—ˆλ˜ 것도 큰 μˆ˜ν™•μ΄μ—ˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ, μ½”λ“œ 리뷰λ₯Ό 톡해 μ„œλ‘œμ˜ 생각을 κ³΅μœ ν•˜κ³  ν† λ‘ ν•˜λŠ” 과정을 톡해 νŒ€ 개발의 μ§„μ •ν•œ 의미λ₯Ό 체감할 수 μžˆμ—ˆλ˜ μ‹œκ°„μ΄μ—ˆμŠ΅λ‹ˆλ‹€.

μ•„μ‰¬μ› λ˜ 점: ν•œ λ‹¬μ΄λΌλŠ” 짧은 κΈ°κ°„ μ•ˆμ— ν”„λ‘œμ νŠΈ κΈ°νšλΆ€ν„° λ°°ν¬κΉŒμ§€ λͺ¨λ“  과정을 μˆ˜ν–‰ν•˜λŠ” 것은 쉽지 μ•Šμ•˜μŠ΅λ‹ˆλ‹€. 특히 의견 좩돌이 μžˆμ—ˆμ„ λ•Œ, 쑰금 더 μš°μ•„ν•˜κ²Œ μ‘°μœ¨ν•˜κ³  μ„€λ“ν–ˆλ‹€λ©΄ λΆˆν•„μš”ν•œ μ‹œκ°„ μ†Œλͺ¨λ₯Ό 쀄일 수 μžˆμ—ˆμ„ κ²ƒμ΄λΌλŠ” 아쉬움이 λ‚¨μŠ΅λ‹ˆλ‹€. μ•žμœΌλ‘œλŠ” 의견 차이가 생기면 λͺ…ν™•ν•œ 근거와 자료λ₯Ό ν•¨κ»˜ μ€€λΉ„ν•΄ λŒ€ν™”ν•˜λŠ” 방식을 톡해 λ”μš± 생산적인 λ…Όμ˜λ₯Ό μ΄λŒμ–΄λ³΄κ³  μ‹ΆμŠ΅λ‹ˆλ‹€.

보완할 점: ν”Όλ“œλ°± μ‹œκ°„μ— 받은 μ˜κ²¬λ“€μ„ λ°˜μ˜ν•΄, 예λ₯Ό λ“€μ–΄ 검색 κΈ°λŠ₯ κ°œμ„ μ΄λ‚˜ λ…Ήν™” 쀑 슀트리머의 κ΅¬λ…μžκ°€ 아무도 없을 경우 μžλ™μœΌλ‘œ λ…Ήν™”λ₯Ό μ’…λ£Œν•˜λŠ” κΈ°λŠ₯ 등을 λ³΄μ™„ν•˜λ©΄ μ„œλΉ„μŠ€ 완성도λ₯Ό ν•œμΈ΅ 더 높일 수 μžˆμ„ 것이라 μƒκ°ν•©λ‹ˆλ‹€.

이승민 아이디어 발꡴ 기간이 ν¬ν•¨λœ κ°œλ°œκΈ°κ°„μ€ 정말 μ§§λ‹€λŠ”κ²ƒμ„ λŠκΌˆμŠ΅λ‹ˆλ‹€. NodeJs둜 κ°„λ‹¨ν•œ ν”„λ‘œκ·Έλž˜λ°λ§Œ ν–ˆμ—ˆκΈ°μ— λ°±μ—”λ“œμ˜ λ ˆμ΄μ–΄λ“œ 아킀텍쳐에 λͺ¨λ“ˆν™”와 클린 아킀텍쳐에 μ΅μˆ™ν•˜μ§€ μ•Šμ•„μ„œ λ”λ”μš± 짧은 μ‹œκ°„μ΄μ—ˆλ˜κ²ƒ κ°™μŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ κ²½ν—˜μ΄ μ’€ 더 λ‚˜μ€ μ‹€λ ₯의 밑바탕이 λ˜λ„λ‘ λ”μš± λ…Έλ ₯ν•˜κ² μŠ΅λ‹ˆλ‹€.

μ’‹μ•˜λ˜μ : νŒ€μ›λΆ„λ“€μ˜ μ½”λ“œ λ…Έν•˜μš°μ™€ 생각을 리뷰λ₯Ό 톡해 λ³Ό 수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€. 의견이 μ—‡κ°ˆλ¦¬λ”λΌλ„ μ„œλ‘œ λ‚˜λ¦„μ˜ κ·Όκ±°λ₯Ό μ œμ‹œν•˜λ©΄μ„œ ν† λ‘ ν–ˆλ˜κ²ƒλ„ μ’‹μ•˜μŠ΅λ‹ˆλ‹€.

μ•„μ‰¬μ› λ˜μ : μ˜ˆμƒλ³΄λ‹€ 개발 속도가 λ”λŽŒμ Έμ„œ λ‹€λ₯Έ νŒ€μ›λΆ„λ“€κ³Ό 결과물의 κ°œμ„  λ°©ν–₯을 놓고 μ„œλ‘œ 이야기λ₯Ό 해보고 μ‹Άμ—ˆλŠ”λ° κ·ΈλŸ¬μ§€ λͺ»ν•΄ μ•„μ‰¬μ› μŠ΅λ‹ˆλ‹€.

보완할점: 미리 κ³„νšν•œ κ°œλ°œκ³„νšκ³Ό μ„€κ³„λŠ” 막상 개발이 μ‹œμž‘λ˜λ‹ˆ 따라가기에 κΈ‰κΈ‰ν–ˆκ³ , 였λ₯˜μ— λŒ€ν•œ 정보λ₯Ό μ°ΎκΈ° νž˜λ“€μ–΄ μ˜ˆμƒλ³΄λ‹€ 기간이 많이 μ†Œμš”λ˜μ—ˆμŠ΅λ‹ˆλ‹€. μ•žμœΌλ‘œ μ„€κ³„ν• λ•Œ μ°Έκ³ ν•˜μ—¬ κ³„νšμ„ μˆ˜λ¦½ν•˜κ±°λ‚˜, μ΄λŸ¬ν•œ 상황에 λŒ€μ²˜ν•˜λŠ” λ…Έν•˜μš°κ°€ μžˆλŠ”μ§€ μ•Œμ•„λ΄μ•Ό λ˜κ² μŠ΅λ‹ˆλ‹€.

μ΄ν˜„μˆ˜ 이번 ν”„λ‘œμ νŠΈλ₯Ό 톡해 섀계뢀터 개발, λ°°ν¬κΉŒμ§€μ˜ μ „ 과정을 νŒ€μ›λ“€κ³Ό ν•¨κ»˜ κ²½ν—˜ν•  수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€. 기획 단계뢀터 μ–΄λ–€ ꡬ쑰둜 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ 섀계할지 κ³ λ―Όν•˜κ³ , 이λ₯Ό μ‹€μ œ μ½”λ“œλ‘œ κ΅¬ν˜„ν•˜λ©°, λ§ˆμ§€λ§‰μ—λŠ” λ°°ν¬κΉŒμ§€ μ±…μž„μ§€λŠ” 과정을 νŒ€ λ‹¨μœ„λ‘œ μˆ˜ν–‰ν–ˆλ‹€λŠ” μ μ—μ„œ 싀무에 κ°€κΉŒμš΄ κ²½ν—˜μ„ μŒ“μ„ 수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

μ’‹μ•˜λ˜ 점 : κΈ°λŠ₯을 ν•˜λ‚˜ν•˜λ‚˜ κ°œλ°œν•΄λ‚˜κ°€λŠ” κ³Όμ •μ—μ„œ λͺ¨λ“  μ˜μ‚¬κ²°μ •μ„ νŒ€μ›λ“€κ³Ό ν•¨κ»˜ λ…Όμ˜ν•˜κ³  ν•©μ˜ν•΄ λ‚˜κ°”λ‹€λŠ” 점이 μ’‹μ•˜μŠ΅λ‹ˆλ‹€. μ–΄λ–€ λ°©ν–₯이 더 λ‚˜μ€ 선택일지 λŠμž„μ—†μ΄ λŒ€ν™”ν•˜λ©° κ²°μ •ν–ˆκ³ , μ˜ˆμƒμΉ˜ λͺ»ν•œ λ¬Έμ œκ°€ λ°œμƒν–ˆμ„ λ•Œλ„ 각자 해결책을 μ œμ•ˆν•˜κ³  ν•¨κ»˜ κ³ λ―Όν•˜λ©° ν’€μ–΄κ°€λŠ” νŒ€μ›Œν¬κ°€ ν”„λ‘œμ νŠΈμ˜ 큰 원동λ ₯이 λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

μ•„μ‰¬μ› λ˜ 점 : μ΄ˆκΈ°μ— μ†Œμ…œ 둜그인 κΈ°λŠ₯을 카카였, 넀이버, ꡬ글 μ„Έ κ°€μ§€ λͺ¨λ‘ κ΅¬ν˜„ν•˜λ €λ‹€ λ³΄λ‹ˆ, μ˜ˆμƒλ³΄λ‹€ λ§Žμ€ λ¦¬μ†ŒμŠ€κ°€ μ΄ˆλ°˜μ— μ§‘μ€‘λ˜μ—ˆμŠ΅λ‹ˆλ‹€. 각 ν”Œλž«νΌλ§ˆλ‹€ 인증 방식이 달라 κ΅¬ν˜„ λ‚œμ΄λ„μ™€ ν…ŒμŠ€νŠΈ 뢀담이 μ»Έκ³ , 이둜 인해 핡심 κΈ°λŠ₯ 개발이 μ§€μ—°λ˜λŠ” 결과둜 μ΄μ–΄μ‘ŒμŠ΅λ‹ˆλ‹€. 돌이켜보면 μ²˜μŒλΆ€ν„° λͺ¨λ“  ν”Œλž«νΌμ„ κ΅¬ν˜„ν•˜κΈ°λ³΄λ‹€λŠ” ν•œ κ°€μ§€(예: 카카였)만 μš°μ„  λ„μž…ν•˜κ³ , μ£Όμš” κΈ°λŠ₯ κ°œλ°œμ— μ§‘μ€‘ν–ˆμœΌλ©΄ ν”„λ‘œμ νŠΈμ˜ μ „λ°˜μ μΈ 완성도와 일정 μΈ‘λ©΄μ—μ„œ 더 λ‚˜μ€ κ²°κ³Όλ₯Ό 얻을 수 μžˆμ—ˆμ„ 것이라 아쉬움이 λ‚¨μŠ΅λ‹ˆλ‹€.

보완할 점 : 이번 κ²½ν—˜μ„ 톡해 κΈ°λŠ₯별 μ€‘μš”λ„μ™€ λ‚œμ΄λ„, μ‚¬μš©μž 영ν–₯도λ₯Ό κ³ λ €ν•œ μž‘μ—… μš°μ„ μˆœμœ„ μ„€μ •μ˜ ν•„μš”μ„±μ„ λŠκΌˆμŠ΅λ‹ˆλ‹€. μ•žμœΌλ‘œλŠ” 초기 섀계 λ‹¨κ³„μ—μ„œ 전체 λ‘œλ“œλ§΅μ„ μœ μ—°ν•˜κ²Œ μ„€κ³„ν•˜κ³ , κΌ­ ν•„μš”ν•œ κΈ°λŠ₯λΆ€ν„° μš°μ„  κ΅¬ν˜„ν•˜μ—¬ μ μ§„μ μœΌλ‘œ ν™•μž₯ν•΄λ‚˜κ°€λŠ” μ „λž΅μ„ μ μš©ν•˜λ € ν•©λ‹ˆλ‹€. 이λ₯Ό 톡해 ν•œμ •λœ μ‹œκ°„κ³Ό μžμ›μ„ 보닀 효율적으둜 μ‚¬μš©ν•  수 μžˆλ„λ‘ κ°œμ„ ν•΄λ‚˜κ°ˆ κ³„νšμž…λ‹ˆλ‹€.


About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 3

  •  
  •  
  •  

Languages