SHcommit / SoTalk

Socket talk with realtime service using TCP : )

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

SoTalk ๐Ÿ’ฌ

๋„คํŠธ์›Œํฌ ํ•™๊ธฐ๋ง ๊ณผ์ œ: TCP ํ†ต์‹ , UDPํ†ต์‹ ๋“ฑ Socket์„ ์‚ฌ์šฉํ•œ ์ฑ„ํŒ…๊ธฐ๋Šฅ ๊ด€๋ จ ์„œ๋น„์Šค ๋งŒ๋“ค๊ธฐ :]

Duration: 2023.05.25 ~ 2023.06.12 ( 19 Days )

๐ŸŽฏ ํ”„๋กœ์ ํŠธ ๋ชฉํ‘œ

  • ํšŒ์›๊ฐ€์ž…, ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ
  • ํ”„๋กœํ•„ ์ €์žฅ, ์—…๋ฐ์ดํŠธ ๊ธฐ๋Šฅ (์‚ญ์ œ ๊ธฐ๋Šฅ ๋ฏธ์™„)
  • ๊ทธ๋ฃน ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ
  • ๋ฉ”์ธ ํ™”๋ฉด
  • ๊ทธ๋ฃน ์ฑ„ํŒ… ๊ธฐ๋Šฅ (with TCP socket :)
  • ๊ธฐํƒ€ ์• ๋‹ˆ๋ฉ”์ด์…˜
  • Without third party !!

๐Ÿ‘ฅ ํŒ€์› ์†Œ๊ฐœ

iOS: ์–‘์Šนํ˜„ BE: ์ž„๊ฒฝ์™„
@SHcommit @MoonDooo

โœจ ์ž‘๋™ ํ™”๋ฉด

ํšŒ์›๊ฐ€์ž… ๋กœ๊ทธ์ธ+ํ”„๋กœํ•„ ์ด๋ฏธ์ง€ ๋ณ€๊ฒฝ
๊ทธ๋ฃน ์ฑ„ํŒ… ์ถ”๊ฐ€ ๊ธฐ๋ณธ ๊ธฐ๋Šฅ ๊ทธ๋ฃน ์ถ”๊ฐ€ ๊ธฐ๋Šฅ
Carousel effect ์„œ๋ฒ„ ์—ฐ๋™ ์ „ ์ฑ„ํŒ…
TCP Socket ์—ฐ๋™ ํ›„ ์ฑ„ํŒ… ๋ฐฉ
TCP Socket์œผ๋กœ ์ฑ„ํŒ…์ค‘ send, recv ... :)

๐Ÿ“š Tech stack

๐Ÿ‘จโ€๐Ÿ’ป iOS Tech stack

1st party

  • UIKit

  • GCD

  • AutoLayout

3rd party

  • SwiftLint

  • Lottie

๐Ÿ”ญ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ: MVVM+C

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2023-06-27 แ„‹แ…ฉแ„Œแ…ฅแ†ซ 12 20 07

  • clean architecture + MVVM์„ ์‚ฌ์šฉํ•˜๋ ค ํ–ˆ์œผ๋‚˜ ๊ตณ์ด use case์ •์˜ ์—†์–ด๋„ ๋  ๊ฒƒ ๊ฐ™์•„ UseCase๋ฅผ ์ œ์™ธํ•œ Clean architecture๋ฅผ ์ ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ViewController์™€ ViewModel๊ฐ„ Input/Output binding์„ ์‚ฌ์šฉํ•ด ๋น„์ฆˆ๋‹ˆ์Šค๋กœ์ง๊ณผ UI๊ด€๋ จ ์ฒ˜๋ฆฌ๋ฅผ ๋ถ„๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ์„œ๋ฒ„ ์—ฐ๋™ ์ „๊นŒ์ง€ Mock data ์‚ฌ์šฉ์ด ์šฉ์ดํ–ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ”ญ Coordinator pattern

  • ๋กœ๊ทธ์ธ ํ›„ ๋ฉ”์ธ ํ™”๋ฉด์œผ๋กœ ๊ฐˆ ๋•Œ Coordinator ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ๋กœ SceneDelegate.swift์—์„œ ๋ฃจํŠธ ์œˆ๋„์šฐ๋ฅผ ๊ต์ฒดํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Coordinator ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋ฉด์„œ parent, child์˜ ๊ด€๋ฆฌ๋งŒ ์ž˜ํ•ด์ค€๋‹ค๋ฉด, ๊ทธ๋ฆฌ๊ณ  ํŠน์ • ํ™”๋ฉด์—์„œ ๋‹ค๋ฅธ ํ™”๋ฉด์œผ๋กœ ๋„˜์–ด๊ฐˆ ๊ฒฝ์šฐ๋ฅผ Coordiantor ์•ˆ์— ์ •์˜ํ•ด ์ค€๋‹ค๋ฉด ๋”์šฑ ํŽธ๋ฆฌํ•˜๊ฒŒ ํ™”๋ฉด ์ „ํ™˜์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ•ด์„œ Coordinator ํŒจํ„ด์„ ๋„์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ๋ฉ”์ธ ํ™ˆ์—์„œ, ์‚ฌ์ด๋“œ ๋ฉ”๋‰ด์™€ ์‚ฌ์ด๋“œ ๋ฉ”๋‰ด์—์„œ ๋ฐœ์ƒ๋˜๋Š” ์—ฌ๋Ÿฌ ํ™”๋ฉด ์ „ํ™˜ ์ปจํŠธ๋กค๋Ÿฌ๋“ค์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์šฉ์ดํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ViewController์—์„œ ํ™”๋ฉด ์ „ํ™˜์˜ ๋ถ€๋‹ด์„ ์ค„์˜€์Šต๋‹ˆ๋‹ค.


๐Ÿ—บ ์ƒˆ๋กœ ์•Œ๊ฒŒ๋œ ๊ฐœ๋…, ๊ธฐ์กด์— ํ•™์Šตํ–ˆ๋˜ ๊ฐœ๋…

  • Side menu

์˜ˆ์ „์— ์นœ์ ˆํ•œ ์žฌ์€์”จ ์‹ค์ „ํŽธ์—์„œ ๊ณต๋ถ€ํ–ˆ๋˜ Side menu ์ •๋ง ์–ด๋ ต๊ฒŒ ๋Š๊ปด์กŒ์ง€๋งŒ, ๊ทธ๋Ÿผ์—๋„ third party๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๊ตฌํ˜„ํ–ˆ๋˜ ๊ฒฝํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด์„œ๋„ side menu๊ฐ€ show๋ฌ์„ ๋•Œ ๊ธฐ์กด์— ์žˆ๋Š” ๋ฉ”์ธ ํ™”๋ฉด์ด ํ„ฐ์น˜๋˜์„œ ๋ฉ”๋ชจ์žฅ์„ ๋™์‹œ์— ์ž‘์„ฑํ•˜๋Š” ๊ทธ๋Ÿฐ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ๊ฒฌํ•˜๊ณ ๋„ ์ˆ˜์ •ํ•˜์ง€ ๋ชปํ–ˆ์—ˆ๋˜ ๊ธฐ์–ต๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฒˆ์— ๋‹ค์‹œ ์ƒˆ๋กญ๊ฒŒ ๊ตฌํ˜„ํ•˜๋ฉด์„œ CGAffineTransform์˜ ์œ„๋Œ€ํ•จ์„ ๋‹ค์‹œ ๋Š๊ผˆ๊ณ  ์ด์ „์—๋Š” ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ–ˆ๋˜ ๊ทธ๋Ÿฐ ์—๋Ÿฌ๋“ค์„ ์†์‰ฝ๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

  • FirstResponder | InputAcecssoryView

์•„์ฃผ ์˜ˆ์ „์— ์ธ์Šคํƒ€ ๊ทธ๋žจ ๊ฐœ๋ฐœํ•  ๋•Œ UIResponder๊ด€๋ จํ•ด์„œ ๊ณต๋ถ€๋ฅผ ํ–ˆ์—ˆ๋Š”๋ฐ ๊ทธ์ƒˆ ๊นŒ๋จน์—ˆ์ง€๋งŒ ๋‹ค์‹œ ์™„๋ฒฝํ•˜๊ฒŒ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ ๋˜ ํƒ„ํƒ„ํ•˜๊ฒŒ ์•Œ๊ฒŒ๋œ ๊ฐœ๋… ์ค‘ ํ•˜๋‚˜๋Š” InputAccessoryView์ž…๋‹ˆ๋‹ค. ํ† ์Šค์˜ 1 thing 1page๋ฅผ ๋ณธ๋”ฐ์„œ ํšŒ์›๊ฐ€์ž… ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค์–ด๋ณด๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋•Œ ํšŒ์›๊ฐ€์ž…์—์„œ์˜ 1thing์€ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ™”๋ฉด์—์„œ ๋„ˆ๋ฌด ์ž‘์€ ์˜์—ญ์— ์†ํ–ˆ๊ธฐ์— ๊ณ ๋ฏผ์ด ๋งŽ์•˜์ง€๋งŒ InputAccessoryView์™€ firstResponder๋ฅผ ์œ ์ง€ํ•˜๋ฉฐ ํ™”๋ฉด์˜ ๋นˆ ๊ณต๋ฐฑ์„ ์ฑ„์› ์Šต๋‹ˆ๋‹ค.

๋” ๋‚˜์•„๊ฐ€ ์„œ๋ฒ„์—์„œ ์ง€์ •ํ•œ ์ผ์ • ํ…์ŠคํŠธ ์ด์ƒ์„ ์ž…๋ ฅํ•˜๊ฑฐ๋‚˜ ์ž…๋ ฅํ•˜์ง€ ์•Š์•˜์„ ๋•Œ, ๋‹ค์Œ ๋ฒ„ํŠผ์ด ์ž ๊ธฐ๊ณ  ์ผ์ • ์ž…๋ ฅ์„ ๋„˜๊ฒผ์„ ๋•Œ ๊ฒ‰ ํ…Œ๋‘๋ฆฌ์˜ ๋ณ€ํ™” ๋“ฑ์˜ ๊ฐ์ง€ ๊ธฐ๋Šฅ์„ ์ƒˆ๋กญ๊ฒŒ ์ปค์Šคํ…€ํ•ด์„œ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • UINavigationBar

์ด์ „๊นŒ์ง€ ๊ฐœ๋ฐœํ•˜๋ฉด์„œ status bar์™€ ๋„ค๋น„๊ฒŒ์ด์…˜ ๋ฐ”๋Š” ํ•„์ˆ˜์ ์œผ๋กœ ํ•ด๋‹น ์˜์—ญ ์•ˆ์— ์ถ”๊ฐ€ํ•ด์„œ ์‚ฌ์šฉ๋˜์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ง€๊ธˆ๊ณผ ๊ฐ™์€ ํ™ˆ ํ™”๋ฉด์„ ๊ตฌํ˜„ํ•  ๋•Œ navigation bar์— subview๋กœ ๋„ฃ๊ฒŒ ๋œ๋‹ค๋ฉด SafeAreaLayoutGuide๊ฐ€ ์ธ์ง€ํ•˜์ง€ ๋ชปํ•ด์„œ ์˜คํ† ๋ ˆ์ด์•„์›ƒ์˜ top์˜์—ญ ๋ ˆ์ด์•„์›ƒ ์žก๊ธฐ๊ฐ€ ํž˜๋“ค์–ด ์งˆ ๊ฒƒ์ด๊ณ .. ์ปค์Šคํ…€ ๋„ค๋น„๋ฐ”๋ฅผ ๋งŒ๋“ค์–ด๋„ ์• ์ดˆ์— ๋„ค๋น„๊ฒŒ์ด์…˜ ๋ฐ”์˜ ๊ธฐ๋ณธ ํฌ๊ธฐ๊ฐ€ 44?๋กœ ์ •ํ•ด์ ธ ์žˆ๊ธฐ์— ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋„์ €ํžˆ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ๋ชฐ๋ž๊ณ , iOS๊ฐœ๋ฐœ ๋‹จํ†ก๋ฐฉ์— ์งˆ๋ฌธํ–ˆ์—ˆ๋Š”๋ฐ ์œ ์พŒํ•˜๊ฒŒ .. ์•ˆ์“ฐ๋ฉด ๋˜๋Š”๊ฑฐ ์•„๋‹ˆ๋ƒ๋Š” ๋‹ต๋ณ€์ด.. (์•„ํ•˜)

  • Chatting UI

์ฑ„ํŒ… ๊ธฐ๋Šฅ์„ ์ฒ˜์Œ์— ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ํ–ˆ์„ ๋•Œ ํ™”๋ฉด ๊ตฌ์„ฑ์„ ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ์ง€ ๋ง‰๋ง‰ํ•˜๋ฉด์„œ๋„ ์˜ˆ์ „์— ๋ดค๋˜ ๋ผ์ธ message cell colllectionView๋กœ ๋ฆฌํŽ™ํ„ฐ๋ง ํ•œ ๊ธ€์ด ๋– ์˜ฌ๋ž๊ณ  ์ด์™€, ์นด์นด์˜คํ†ก์˜ UI๋ฅผ ๋ณธ๋”ฐ์„œ ๋งŒ๋“ค๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ผ์ธ์˜ ๊ธ€์„ ๋ณด๋‹ˆ ์ •๋ง ๋งŽ์€ ๊ธฐ๋Šฅ๋“ค์„ ๊ตฌํ˜„ํ–ˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์‹œ๊ฐ„์  ์—ฌ์œ ๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ณ„์†ํ•ด์„œ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์„ ๊ฐœ๋ฐœํ•˜๊ณ  ์‹ถ์€๋ฐ ์ง€๊ธˆ ๋” ๋Œ€๋ฐ•์ธ ์•ฑ์„ ๊ฐœ๋ฐœ์ค‘์— ์žˆ์–ด์„œ.. (์‹œ๊ฐ„์ด 48์‹œ๊ฐ„์ด์—ˆ์œผ๋ฉด ์ข‹์•˜์„ํ…๋ฐ.. :)

  • Multipart form-data

์œผ์œผ... ๊ธฐ์กด์— ๊ฐœ๋ฐœํ•  ๋•Œ base64๋ฅผ ์ผ์—ˆ๋‹ค๊ฐ€ ์ธ์Šคํƒ€๊ทธ๋žจ ๊ฐœ๋ฐœํ•˜๋ฉด์„œ ํŒŒ์ด์–ด๋ฒ ์ด์Šค์—์„œ ์ง€์›๋˜๋Š” ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ–ˆ๊ณ  firesbase์˜ storage์—์„œ url์„ ๋ถˆ๋Ÿฌ์™”์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ์— ์ฒ˜์Œ์œผ๋กœ Multipart ํ˜•์‹์œผ๋กœ ์ด๋ฏธ์ง€๋ฅผ requsetํ•ด์•ผ ํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ •๋ง ์–ด๋ ค์› ๋Š”๋ฐ.. ๊ทธ๋Ÿผ์—๋„ ์„œ๋ฒ„์ธก์—์„  ๊ธฐ๋Šฅ์„ ์ด๋ฏธ ๊ตฌํ˜„ํ–ˆ๊ธฐ์—...

์ด๋ฒˆ์— ์ƒˆ๋กญ๊ฒŒ ์ ‘ํ•œ Multipart ๋„ ๊ณ„์†ํ•ด์„œ ์ฝ”๋“œ๋ฅผ ๋ณด๋‹ˆ ์ต์ˆ™ํ•ด์ ธ ๋ฒ„๋ ธ์Šต๋‹ˆ๋‹ค. boundary๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ์„œ๋ฒ„์—์„œ ์š”๊ตฌํ–ˆ๋˜ json data๋ฅผ ์–‘์‹์— ๋งž๊ฒŒ ์—ฌ๋Ÿฌ ํŒŒํŠธ๋กœ ๋‚˜๋ˆ ์„œ ๋ณด๋‚ด๋ฉด ๋˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. (์ฒ˜์Œ์ด ์–ด๋ ต์ง€..)

  • HTTP/HTTPs header, body param, method, query param... Endpoints | Encodable, Decodable

๊ธฐ์กด https ํ†ต์‹ ์€ ๊ทธ์ € ์˜ํ™” ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค๋˜์ง€, ๋‰ด์Šค ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค๋˜์ง€ ๋“ฑ + ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ์ •๋ณด๋งŒ Decodable๋กœ mappingํ•ด์„œ ๋ฐ›์•„์˜ค๋ฉด ๋์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํŒŒ์ด์–ด๋ฒ ์ด์Šค๋ฅผ 5๊ฐœ์›”๊ฐ„ ์‚ฌ์šฉํ–ˆ์—ˆ๋Š”๋ฐ,, ์ด๋ฒˆ ๊ธฐํšŒ์— ์„œ๋ฒ„๋ž‘ ํ†ต์‹ ์„ ํ•˜๋ฉด์„œ ์ฒ˜์Œ์œผ๋กœ.... post๋„ method๋กœ body param๋„ ๋„ฃ์–ด๋ณด๊ณ  get์œผ๋กœ query param๋„ ๋„ฃ๋Š” ๊ฒฝํ—˜์„ ํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ „์—๋Š” Codable์„ ์™œ ์ •์˜ํ–ˆ์„๊นŒ? (์ฃผ๋กœ Decodable ๋งŒ ์‚ฌ์šฉํ–ˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.) ์ด๋ฒˆ ์„œ๋ฒ„์™€์˜ ํ†ต์‹ ์„ ํ†ตํ•ด Encodable์€ request!!! Decodable์€ response๋ผ๋Š” ๊ฒƒ์„ ์ •ํ™•ํžˆ ์•Œ๊ฒŒ ๋ฌ๊ณ  ์™œ Decodable์€ init์œผ๋กœ ์‹œ์ž‘๋˜๋Š”๊ฐ€? ์—๋Œ€ํ•œ ํ•ด๋‹ต์„ ์ž์—ฐ์Šค๋ ˆ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. "์„œ๋ฒ„์—์„œ์˜ data๋ฅผ Decodableํƒ€์ž…์˜ ๋ชจ๋ธ ๊ฐ๊ฐ์˜ ์ธ์Šคํ„ด์Šค์— ๊ฐ’์„ ๋„ฃ๊ธฐ ์œ„ํ•ด init์„ ์‚ฌ์šฉํ•œ๋‹ค๋Š”..." ์šฐ์™€.. ์ •๋ง ํ”„๋กœํ† ์ฝœ ์ž˜ ์ง€์—ˆ๋‹ค๋Š” ์ƒ๊ฐ์ด..

Endpoints๋Š” Clean architecture์—์„œ๋„ ์ •์˜๋ฅผ ํ–ˆ๋Š”๋ฐ ๊น€์ข…๊ถŒ๋‹˜์ด ์ •์˜ํ•œ ๊ฒƒ์— ์ถ”๊ฐ€์ ์œผ๋กœ Multipart form data requestํ˜•์‹์„ ์ถ”๊ฐ€ํ•ด์„œ ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿงญ ๋Š๋‚€์ 

  • TCP ํ†ต์‹ ์„ ์„ค๊ณ„ํ•  ๋•Œ ํ™”๋ฉด ๋‹จ์—์„œ๋Š” ์Šคํฌ๋กค์ด๋‚˜ ํ‚ค๋ณด๋“œ ์ž…๋ ฅ๊ณผ ๊ฐ™์€ user interactive๊ด€๋ จ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด์™€ ๋™์‹œ์— TCP์˜ recv()๋Š” ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋‹ค๋ฅธ ์œ ์ €๊ฐ€ ๋ณด๋‚ธ send()๋ฅผ ์–ธ์ œ๋“ ์ง€ listening์„ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฃน๋ฐฉ์˜ Socket์— connectํ•˜๊ธฐ ์œ„ํ•œ ์„œ๋ฒ„ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ •ํ•œ ์ดˆ๊ธฐ ๊ทœ์น™์„ ์ค€์ˆ˜ ํ•  ๊ฒฝ์šฐ ์„ฑ๊ณต์ ์œผ๋กœ serv socket์œผ๋กœ๋ถ€ํ„ฐ recv๋ฅผ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๊ฒฝ์šฐ ๋•Œ๋ฌธ์— background thread๋ฅผ ํ™œ์šฉํ•ด recv()ํ•จ์ˆ˜๋Š” ๊ณ„์†ํ•ด์„œ listening์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๊ณ , ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ์ด ์žˆ์„ ๊ฒฝ์šฐ์—๋งŒ ์„œ๋ฒ„ํ•œํ…Œ send()๋ฅผ ๋ณด๋‚ด๋Š” ๋กœ์ง์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

Restful ํ†ต์‹ ์„ ํ•  ๋•Œ๋Š” ํด๋ผ์ด์–ธํŠธ ๋‹จ์—์„œ request๊ฐ€ ์žˆ์–ด์•ผ๋งŒ server์ธก์—์„œ response๋ฅผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ €๋Š” ์˜ˆ์ „์— ์ธ์Šคํƒ€ ๊ทธ๋žจ ๊ฐœ๋ฐœ์„ ํ•  ๋•Œ, ์ฑ„ํŒ… ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ๋•Œ ๊ฒŒ์‹œ๊ธ€ ์ฒ˜๋Ÿผ ์œ„๋กœ ๋‹น๊ฒจ์„œ refresh๋ฅผ ํ•ด์•ผ๋งŒ ํƒ€ ์œ ์ €๊ฐ€ ๋‚จ๊ธด ๊ธ€์„ ๋ณผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์™€ ๋ฐ˜๋ฉด Socket ํ†ต์‹ ์€ recv()๋ฅผ ํ™œ์šฉํ•ด์„œ ์„œ๋ฒ„์˜ ๋‹ค๋ฅธ ์œ ์ €๊ฐ€ send() ํ•  ๊ฒฝ์šฐ recv()์ค‘์ธ ํด๋ผ์ด์–ธํŠธํ•œํ…Œ ํƒ€ ์œ ์ €๊ฐ€ ๋ณด๋‚ธ ๊ธ€์„ ๋‹ค๋ฅธ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ๋„ ์ „์†กํ•  ์ˆ˜ ์žˆ๋‹ค๋Š”๊ฒŒ ์ •๋ง ์‹ ๊ธฐํ–ˆ๊ณ  ์ด ๊ธฐ๋Šฅ์„ ์ƒ๊ฐํ•ด๋‚ธ ๊ฒฝ์™„์ด๋„ ๋Œ€๋‹จํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ์ด ๋‚ ์„ ์œ„ํ•ด Socket๊ด€๋ จ ๊ฐœ๋…๋“ค์„ ๊ณต๋ถ€ํ•˜๋ฉฐ ๊ตฌํ˜„ํ–ˆ๋˜ TCP, UDP serv, client ...๋“ฑ C์–ธ์–ด๋กœ ๊ตฌํ˜„ํ–ˆ๋˜ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ทธ๋Œ€๋กœ Swift๋กœ ํ˜ผ์ž ๊ตฌํ˜„ํ–ˆ์—ˆ๋Š”๋ฐ ๊ทธ ๋ณด๋žŒ์ด ์žˆ์—ˆ๋˜ ๊ฒƒ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค. BSD socket ์ž์ฒด๊ฐ€ C์–ธ์–ด๋กœ ๊ฐœ๋ฐœ๋œ ๊ฑฐ๋ผ ์ด๋ฅผ wrappingํ•œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„  withUnsafePointer()๋“ฑ ์ฒ˜์Œ ์ ‘ํ•˜๋Š” ํ•จ์ˆ˜๋“ค์„ ์‚ฌ์šฉํ•  ์ค„ ์•Œ์•„์•ผ ํ–ˆ๊ณ  ์ƒˆ๋กญ๊ฒŒ ํ•™์Šตํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

  • ๊ธธ๋‹ค๋ฉด ๊ธธ๊ณ  ์งง์€ ๊ธฐ๊ฐ„์ด์—ˆ์ง€๋งŒ,, ์ •๋ง ๋งŽ์€ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ๋“ค์„ ํ•™์Šตํ•˜๋ฉฐ ์ ์šฉํ•ด ๋‚˜๊ฐ”์Šต๋‹ˆ๋‹ค. ์ด๋ก ์œผ๋กœ ๊ณต๋ถ€ํ•˜๋ฉฐ ์–ด๋ฆผ์žก์•„ ์•Œ๊ณ  ์žˆ์—ˆ๋˜ ์• ๋‹ˆ๋ฉ”์ด์…˜๊ณผ ์ด๋ก ์œผ๋กœ ๊ณต๋ถ€๋งŒ ํ–ˆ์—ˆ๋˜ Clean architecture, ๋ธŒ๋žœ๋””์—์„œ ์ œ๊ณตํ•œ datasource, delegate๋ฅผ ๋‹ค๋ฃจ๋Š” adapter pattern ๋“ฑ ๋‹ค์–‘ํ•œ ์ด๋ก ์„ ์‹ค์ œ๋กœ ์ ์šฉํ•˜๋ฉด์„œ ์ง€์‹๋“ค์ด ์นœ๊ทผํ•ด์ง„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ์ด TCP ํ”„๋กœ์ ํŠธ๋Š” ๊ต์ˆ˜๋‹˜์ด ์•„๋ฌด ์–ธ์–ด๋‚˜ ์‚ฌ์šฉํ•ด๋„ ๋œ๋‹ค๊ณ  ํ•˜์…จ๊ธฐ์— Swift๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด ์ •๋ง ์žฌ๋ฐŒ์„ ๊ฒƒ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ดˆ๊ธฐ ํ™”๋ฉด์— UI๋ฅผ ์ฑ„์›Œ ๋„ฃ์„ ๋ฐ์ดํ„ฐ๊ฐ€ ๋„ˆ๋ฌด ์—†์–ด์„œ ๋ง‰๋ง‰ํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋ถ€์กฑํ•œ ๋ถ€๋ถ„๋“ค์€ ์• ๋‹ˆ๋ฉ”์ด์…˜๋“ค์„ ๋ถ€๋ถ„ ๋ถ€๋ถ„ ์ ์šฉํ•ด์„œ ์‹œ์„ ์„ ์ด๋Œ๋ ค๊ณ  ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • Carousel ๊ด€๋ จ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ์€ ์„ธ๋กœ๋กœ๋„ ํ•ด๋ณด๊ณ  ๊ฐ€๋กœ๋กœ๋„ ํ•ด๋ดค๊ณ  ๋ธ”๋กœ๊ทธ์— 3ํŽธ ์ •๋„ ์ •๋ฆฌ๋ฅผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ์—๋Š” collectoinView์˜ contentInset์„ ๋„ฃ์—ˆ๊ณ  ์ด ๊ฒฝ์šฐ๋Š” ๋˜ ์ฒ˜์Œ์ด๊ธฐ์— ๋˜ ์ƒˆ๋กœ์šด ๋ฒฝ์„ ๋งŒ๋‚ฌ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด์„œ ์ƒˆ๋กœ ์•Œ๊ฒŒ๋œ ์ ์€ scrollView.content.x๋Š” collectionView์˜ content inset๋ฅผ ์ธ์ง€ํ•˜์ง€ ๋ชปํ•œ๋‹ค๋Š” ๊ฒƒ์ด๊ธฐ์— contentinset.leading์˜ ๊ฐ’๋งŒํผ ๋นผ์•ผํ–ˆ๊ณ , collectionView.contentSize.x์˜ ๋ ๋ถ€๋ถ„๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์˜€์Šต๋‹ˆ๋‹ค. ์ด๋ถ€๋ถ„์ด ์ •๋ง ๊นŒ๋‹ค๋กญ๋‹ค๋Š” ๊ฒƒ์„ ๋˜ ์ด๋ ‡๊ฒŒ ์ƒˆ๋กœ ๊ฒฝํ—˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

About

Socket talk with realtime service using TCP : )

License:MIT License


Languages

Language:Swift 99.9%Language:Ruby 0.1%