Giter VIP home page Giter VIP logo

boostcampwm2023 / ios04-heatpick Goto Github PK

View Code? Open in Web Editor NEW
15.0 3.0 1.0 9.74 MB

๐Ÿ”ฅ ์—ฌ๋Ÿฌ๋ถ„์ด ๋จธ๋ฌธ ์ž๋ฆฌ์— ๋”ฐ๋œปํ•œ ์˜จ๊ธฐ๋ฅผ ๋‚จ๊ฒจ๋ณด์„ธ์š” - ์œ„์น˜๊ธฐ๋ฐ˜ SNS ์„œ๋น„์Šค

Home Page: https://hogumachu.github.io/articles/heatpick/

Swift 88.65% JavaScript 0.05% TypeScript 11.27% Dockerfile 0.03%

ios04-heatpick's Introduction

iOS04 - HeatPick

๐Ÿ”ฅ HeatPick ์†Œ๊ฐœ

์—ฌ๋Ÿฌ๋ถ„์ด ๋จธ๋ฌธ ์ž๋ฆฌ์— ๋”ฐ๋œปํ•œ ์˜จ๊ธฐ๋ฅผ ๋‚จ๊ฒจ๋ณด์„ธ์š”
์œ„์น˜๊ธฐ๋ฐ˜ SNS ์„œ๋น„์Šค

๋„ค์ด๋ฒ„ ๋ถ€์ŠคํŠธ์บ ํ”„ ์›นใƒป๋ชจ๋ฐ”์ผ 8๊ธฐ ๊ทธ๋ฃน ํ”„๋กœ์ ํŠธ
2023.11.06 ~ 2023.12.15

๐Ÿ“” ๋ฌธ์„œ

HeatPick์˜ ์ƒ์„ธํ•œ ๊ฐœ๋ฐœ ์ผ์ง€๋ฅผ ํ™•์ธํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ??
HeatPick Wiki๋ฅผ ํ™•์ธํ•ด๋ณด์„ธ์š” !!

๐Ÿ“‘ HeatPick Wiki ๐ŸŽจ ์•ฑ ๋””์ž์ธ ๐Ÿ“ API

๐Ÿง‘๐Ÿปโ€๐Ÿ’ป HeatPick ํŒ€์› ์†Œ๊ฐœ

๐ŸŽ iOS ๐ŸŽ iOS ๐ŸŽ iOS ๐ŸŒ Backend ๐ŸŒ Backend
S029_์ด์ค€๋ณต S031_์ž„์ •๋ฏผ S042_ํ™์„ฑ์ค€ J138_์ •์„ธํ˜ธ J154_์ตœ๊ฒ€๊ธฐ
junbok97 jungmin-lim hogumachu JeongSH1 cgg7777

โญ๏ธ ํ”„๋กœ์ ํŠธ ์†Œ๊ฐœ

MVP

๐Ÿ’ก ์ฃผ์š” ๊ธฐ๋Šฅ ์†Œ๊ฐœ

ํ˜„์žฌ ์œ„์น˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ
์‚ฌ์šฉ์ž์™€ ์Šคํ† ๋ฆฌ๋ฅผ ์ถ”์ฒœํ•ด์ค๋‹ˆ๋‹ค.
์›ํ•˜๋Š” ์œ„์น˜์—์„œ ์Šคํ† ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ์Šคํ† ๋ฆฌ์— ๋Œ“๊ธ€์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

์›ํ•˜๋Š” ํ‚ค์›Œ๋“œ๋กœ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. ์ง€๋„์—์„œ ์Šคํ† ๋ฆฌ๋“ค์„
ํด๋Ÿฌ์Šคํ„ฐ๋ง ํ•ฉ๋‹ˆ๋‹ค.
๊ด€์‹ฌ ์žˆ๋Š” ์œ ์ €๋ฅผ ํŒ”๋กœ์ž‰ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ› ๏ธ ๊ธฐ์ˆ  ์Šคํƒ

๐Ÿ—๏ธ ์•„ํ‚คํ…์ณ

๐ŸŽ iOS

๐ŸŒ Backend

๐Ÿค” ๊ธฐ์ˆ  ์„ ํƒ ๊ณผ์ •

๐ŸŽ iOS

๐ŸŒ Backend

๐Ÿƒ๐Ÿป ๊ธฐ์ˆ ์  ๋„์ „

๋ฐฐํฌ ๋ฐ ์ž๋™ํ™”

๊ฐœ๋ฐœ์„ ์ง„ํ–‰ํ•˜๋Š” ๊ณผ์ •์—์„œ iOS-server ๊ฐ„ ๊ฐœ๋ฐœ์†๋„์˜ ์ฐจ์ด๋กœ ์ธํ•œ ๋ถˆํŽธํ•จ์„ ์ฒด๊ฐํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์„œ๋ฒ„์˜ ๊ฐœ๋ฐœ์ด ์™„๋ฃŒ๋˜๋Š” ์ฆ‰์‹œ iOS์ธก์—์„œ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๋Š” ํ™˜๊ฒฝ์„ ๋งˆ๋ จํ•˜๋Š” ๊ฒƒ์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์˜€๊ณ  ๋ฐฐํฌ ๋ฐ ์ž๋™ํ™”๋ฅผ ์ตœ์šฐ์„  ์ˆœ์œ„๋กœ ์„ค์ •ํ•˜์—ฌ ์ง„ํ–‰ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

ORM

ORM์€ ์ฟผ๋ฆฌ๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ•  ํ•„์š”๊ฐ€ ์—†์–ด์„œ ๋ถ„๋ช… ํŽธ๋ฆฌํ•˜์ง€๋งŒ ๋™์ž‘ ๋ฐฉ์‹์— ๋Œ€ํ•ด ๋ถ„๋ช…ํžˆ ์ดํ•ดํ•˜๊ณ  ์žˆ์–ด์•ผ ํšจ๊ณผ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ, ORM ๋‚ด์—์„œ Transaction์„ ์ง์ ‘ ์ œ์–ดํ•  ํ•„์š”๊ฐ€ ์žˆ์—ˆ๊ณ , Cascade ์†์„ฑ์„ ํ†ตํ•ด ๋ถ€๋ชจ์˜ ์ƒํƒœ ๋ณ€ํ™”์— ๋”ฐ๋ฅธ ์ž์‹์˜ ์˜ํ–ฅ, lazy-loading์„ ์ด์šฉํ•ด ๋ฐœ์ƒํ•œ N+1๋ฌธ์ œ์™€ ์„ฑ๋Šฅ ๊ฐœ์„ , ๋ณต์žกํ•œ ์ฟผ๋ฆฌ๋ฅผ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ Query Builder๋„ ์ˆ˜ํ–‰ํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

ํ‘ธ์‹œ ์„œ๋น„์Šค

์ €ํฌ ํ”„๋กœ์ ํŠธ์—์„œ ์•Œ๋ฆผ ์„œ๋น„์Šค๋ฅผ ๋„์ž…์„ ์œ„ํ•ด Firebase Cloud Messaging์„ ์‚ฌ์šฉํ–ˆ๊ณ  ํ‘ธ์‹œ ์š”์ฒญ์„ ์ฑ…์ž„์ง€๋Š” ํ‘ธ์‹œ ์„œ๋ฒ„๋ฅผ ๋งŒ๋“ค์–ด ์„œ๋น„์Šค ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ‘ธ์‹œ ์„œ๋ฒ„๋ฅผ ๋งŒ๋“ค๋ฉด์„œ ํ‘ธ์‹œ ์š”์ฒญ์˜ ํ๋ฆ„์— ๋Œ€ํ•ด ํ•™์Šตํ•  ์ˆ˜ ์žˆ์—ˆ๊ณ , ๋ณ„๋„๋กœ Message Queue ํŒจํ„ด์„ ํ•™์Šตํ•˜๊ณ  ์‹ค์ œ ์ ์šฉํ•ด๋ณด๋ฉฐ, ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ž‘์—…ํ•˜๊ณ , ์‹œ์Šคํ…œ ์žฅ์• ์— ๋”ฐ๋ฅธ ๋ฉ”์„ธ์ง€ ์†Œ์‹ค์ด ์—†๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด์„œ ํ•ด๋‹น ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•˜์—ฌ ์ˆ˜ํ–‰ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๐Ÿซ  ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ…

1์ฃผ์ฐจ

2์ฃผ์ฐจ

3์ฃผ์ฐจ

4์ฃผ์ฐจ

5์ฃผ์ฐจ

๊ทธ๋ฃน ํ”„๋กœ์ ํŠธ ๋งˆ๋ฌด๋ฆฌ ์†Œ๊ฐ

์ค€๋ณต

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

์„ฑ์ค€

  • ํŒ€์›๋“ค์—๊ฒŒ ๋นจ๋ฆฌ๋นจ๋ฆฌํ•˜์ž๊ณ  ํ•ด์„œ ํ€„๋ฆฌํ‹ฐ๋ฅผ ๋ชป์ฑ™๊ธด๊ฑฐ ๊ฐ™์•˜์ง€๋งŒ ๊ฒฐ๊ณผ๋ฌผ์ด ์ข‹์•„์„œ ํŒ€์›๋“ค ๋ชจ๋‘ ๊ณ ์ƒํ•˜์…จ๊ณ  ๋„ˆ๋ฌด ์ข‹์•˜๋‹ค.
  • 6์ฃผ๋™์•ˆ ์ด๋ ‡๊ฒŒ ๋นก๋นกํ•˜๊ฒŒ ๊ฐœ๋ฐœํ•œ์ ์ด ์ฒ˜์Œ์ธ๊ฑฐ ๊ฐ™์€๋ฐ ํ€„๋ฆฌํ‹ฐ๊ฐ€ ๋„ˆ๋ฌด ์ข‹์•„์„œ ๋†€๋ž๋‹ค.
  • ์ •๋ง ์ข‹์€ ๊ฒฝํ—˜์ด์—ˆ๊ณ  ์ด๋ฅผ ๋ฐœํŒ์œผ๋กœ ๋” ์ข‹์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ ๊ฒƒ ๊ฐ™๋‹ค.

์ •๋ฏผ

  • iOS ํ”„๋กœ์ ํŠธ๊ฐ€ ์ฒ˜์Œ์ด๋ผ ๊ฑฑ์ •์ด ๋งŽ์•˜๋Š”๋ฐ ๋ง‰์ƒ ํ•ด๋ณด๋‹ˆ๊นŒ ํŒ€์›๋ถ„๋“ค์ด ์ž˜ ๋„์™€์ฃผ์…”์„œ ๋‚ด๊ฐ€ ์ƒ๊ฐํ–ˆ๋˜๊ฒƒ๋ณด๋‹ค ๋” ๋งŽ์ด ์„ฑ์žฅํ•  ์ˆ˜ ์žˆ์—ˆ๋˜๊ฑฐ ๊ฐ™๋‹ค
  • ์„œ๋ฒ„๋ฅผ ๋งŽ์ด ๊ดด๋กญํ˜”๋˜๊ฑฐ ๊ฐ™์€๋ฐ ์„œ๋ฒ„๋ถ„๋“ค์—๊ฒŒ ๋„ˆ๋ฌด ๊ฐ์‚ฌํ•˜๋‹ค
  • ์•„์‰ฌ์› ๋˜๊ฑด ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ ๋ถ€๋ถ„์„ ์‹ ๊ฒฝ์„ ๋ชป์“ด๊ฒŒ ์ข€ ์•„์‰ฝ๋‹ค

์„ธํ˜ธ

  • ์ข‹์€ ํŒ€์›๋“ค ๋งŒ๋‚˜์„œ ์ข‹์€ ๊ฒฝํ—˜์„ ํ•˜๊ฒŒ๋˜์–ด ์ข‹์•˜๋‹ค.
  • ๊ฒ€๊ธฐ๋‹˜์„ ๋งŽ์ด ๊ดด๋กญํžŒ๊ฑฐ ๊ฐ™์€๋ฐ ์ž˜ ๋ณด์‚ดํŽด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•˜๋‹ค.
  • 6์ฃผ๋™์•ˆ ์ •๋ง ๋งŽ์ด ์„ฑ์žฅํ•œ๊ฒƒ ๊ฐ™๋‹ค.

๊ฒ€๊ธฐ

  • iOS ๋ถ„๋“ค ํ™”๋ฉด์„ ๋ณด๋ฉด์„œ ๋นจ๋ฆฌ๋นจ๋ฆฌ ๊ณต๋ถ€
  • ์ฝ”๋“œ๋ฅผ ์ข€ ๋” ์„น์‹œํ•˜๊ฒŒ ์งฏ์–ด์•ผ ํ–ˆ๋Š”๋ฐ ๊ทธ๋Ÿฌ์ง€ ๋ชปํ•ด์„œ ์•„์‰ฝ๋‹ค
  • 6์ฃผ๋™์•ˆ ๋ฐ€๋„์žˆ๊ฒŒ ๋ฐฐ์šด๊ฒƒ ๊ฐ™์•„ ์ข‹์•˜๋‹ค
  • ํ•™์—…๊ณผ ๋ณ‘ํ–‰ํ•˜๊ฒŒ ๋˜์–ด ๋น ์ง€๋Š” ์‹œ๊ฐ„์ด ์žˆ์—ˆ๋Š”๋ฐ ์ž˜ ๋ณดํ•ฉํ•ด์ฃผ์‹  ์„ธํ˜ธ๋‹˜๊ป˜ ๋„ˆ๋ฌด ๊ณ ๋ง™๋‹ค.

6์ฃผ๋™์•ˆ ๊ณ ์ƒ ๋งŽ์œผ์…จ์Šต๋‹ˆ๋‹ค !

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2023-12-15 แ„‹แ…ฉแ„’แ…ฎ 4 19 16

ios04-heatpick's People

Contributors

hogumachu avatar junbok97 avatar cgg7777 avatar jungmin-lim avatar jeongsh1 avatar

Stargazers

KIDI'S-TECH avatar  avatar binisnil avatar Eric Kwon / ๊ถŒ์Šน์šฉ avatar Junnos ๏ฃฟ avatar ๋ฐ•ํšจ์ข… avatar Byeon Jinha  avatar  avatar ๊น€๊ฒฝํ˜ธ avatar  avatar  avatar ๊ฐ•์ฐฝํ•œ avatar  avatar  avatar  avatar

Watchers

crong avatar Hoyoung Jung avatar totuworld avatar

Forkers

jeongsh1

ios04-heatpick's Issues

ํšŒ์›๊ฐ€์ž… ์™„๋ฃŒ ํ™”๋ฉด ์ถ”๊ฐ€

๐Ÿ—’๏ธ ์„ค๋ช…

  • ํšŒ์›๊ฐ€์ž… ์™„๋ฃŒ ํ™”๋ฉด ์ถ”๊ฐ€
  • ๋กœ๊ทธ์ธ ํ™”๋ฉด -> ํšŒ์›๊ฐ€์ž… -> ํšŒ์›๊ฐ€์ž… ์™„๋ฃŒ

โœ… ํ•  ์ผ

  • ํšŒ์›๊ฐ€์ž… ์™„๋ฃŒ ํ™”๋ฉด ์ถ”๊ฐ€

AppRoot์— ๋กœ๊ทธ์ธ ํ™”๋ฉด, TabBar ํ™”๋ฉด ๋ถ„๊ธฐ ์ฒ˜๋ฆฌ ์ถ”๊ฐ€

๐Ÿ—’๏ธ ์„ค๋ช…

  • AppRoot์˜ TabBar์— ํ˜„์žฌ ํšŒ์›๊ฐ€์ž… ํ™”๋ฉด์ด ๋ถ™์–ด์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋กœ๊ทธ์ธ ์—ฌ๋ถ€๋ฅผ ํ†ตํ•ด TabBar๋ฅผ ๋ณด์—ฌ์ค„ ์ง€ ๋กœ๊ทธ์ธ ํ™”๋ฉด์„ ๋ณด์—ฌ์ค„ ์ง€ ๋ถ„๊ธฐ์ฒ˜๋ฆฌ ํ•ฉ๋‹ˆ๋‹ค.

โœ… ํ•  ์ผ

  • ๋กœ๊ทธ์ธ ์—ฌ๋ถ€์— ๋”ฐ๋ฅธ ๋กœ๊ทธ์ธ/TabBar ๋ถ„๊ธฐ ์ฒ˜๋ฆฌ

๊ฒ€์ƒ‰์–ด ์ž…๋ ฅ ์™„๋ฃŒ ์‹œ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ์ „๋‹ฌ

๐Ÿ—’๏ธ ์„ค๋ช…

  • ๊ฒ€์ƒ‰์–ด ์ž…๋ ฅ ์™„๋ฃŒ ์‹œ, ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ์ „๋‹ฌํ•˜๊ณ  ๊ฒ€์ƒ‰ ๊ธฐ๋ก์„ ์บ์‹ฑ

โœ… ํ•  ์ผ

  • ์ „๋‹ฌ๋ฐ›์€ ๊ฒ€์ƒ‰์–ด๋ฅผ db์— ์ €์žฅํ•œ๋‹ค.
  • ์ดํ›„ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.

Search Tab ๊ตฌํ˜„

๐Ÿ—’๏ธ ์„ค๋ช…

โœ… ํ•  ์ผ

  • ๊ฒ€์ƒ‰ ์นดํ…Œ๊ณ ๋ฆฌ ๋ทฐ ๊ตฌํ˜„
  • ๊ฒ€์ƒ‰ ํ…์ŠคํŠธ ์ž…๋ ฅ์‹œ ๋ทฐ ๊ตฌํ˜„
  • ๊ฒ€์ƒ‰ ํ…์ŠคํŠธ ์ž…๋ ฅ ์™„๋ฃŒ์‹œ ๊ฒฐ๊ณผ ๋ทฐ ๊ตฌํ˜„
  • ์„œ๋ฒ„์™€ ์—ฐ๊ฒฐ

BasePresentation ์ถ”๊ฐ€

๐Ÿ—’๏ธ ์„ค๋ช…

  • Presentation์—์„œ ๊ณต์šฉ์œผ๋กœ ์‚ฌ์šฉ๋  ๋ชจ๋“ˆ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

โœ… ํ•  ์ผ

  • BasePresentation ์ถ”๊ฐ€

๋„ค์ด๋ฒ„, ์• ํ”Œ ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ UI ์ˆ˜์ •

๐Ÿ—’๏ธ ์„ค๋ช…

  • ๋ฒ„ํŠผ์ด Press ์ƒํƒœ์—์„œ ์•„์ด์ฝ˜ ์ด๋ฏธ์ง€๋Š” Press ๋˜์ง€ ์•Š์€ ์ด์Šˆ

โœ… ํ•  ์ผ

  • ๋„ค์ด๋ฒ„ ๋ฒ„ํŠผ ์•„์ด์ฝ˜ Press ๋˜๋„๋ก ์ˆ˜์ •
  • ์• ํ”Œ ๋ฒ„ํŠผ ์•„์ด์ฝ˜ Press ๋˜๋„๋ก ์ˆ˜์ •

AppRootComponent ๋ถ„๋ฆฌ

๐Ÿ—’๏ธ ์„ค๋ช…

  • AppComponent๋Š” ๋น„์–ด์žˆ๊ฒŒ ๋งŒ๋“ค๊ณ  AppRootComponent์—์„œ ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•ด์ฃผ๊ฒŒ ๋งŒ๋“ค๊ธฐ

โœ… ํ•  ์ผ

  • AppComponent ๋นˆ Component๋กœ ๋งŒ๋“ค๊ธฐ
  • AppRootComponent ํŒŒ์ผ ๋ถ„๋ฆฌ

๋ฐ์ดํ„ฐ ์Šคํ‚ค๋งˆ ์ž‘์„ฑ

๐Ÿ—’๏ธ ์„ค๋ช…

๋ฐ์ดํ„ฐ ์Šคํ‚ค๋งˆ ์ž‘์„ฑ

โœ… ํ•  ์ผ

  • ์–ด๋–ค DB ์‚ฌ์šฉํ• ์ง€ ๊ฒฐ์ •
  • ๋ฐ์ดํ„ฐ ์Šคํ‚ค๋งˆ ์ž‘์„ฑํ•˜๊ธฐ

Entity ์ถ”๊ฐ€ ํ›„ ๋ฒ„๊ทธ ํ”ฝ์Šค

๐Ÿ—’๏ธ ์„ค๋ช…

  • Entity ์ถ”๊ฐ€ ์ดํ›„์— ๋ฐœ์ƒํ•˜๋˜ ๋ฒ„๊ทธ๋ฅผ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.

โœ… ํ•  ์ผ

  • import ๋ฒ„๊ทธ ์ˆ˜์ •
  • column ์™ธ๋ž˜ํ‚ค ์ง€์ • ๊ด€๋ จ ์—๋Ÿฌ ์ˆ˜์ •

Story ์ƒ์„ฑ API ๊ตฌํ˜„

๐Ÿ—’๏ธ ์„ค๋ช…

  • Story ์ƒ์„ฑ API ๊ตฌํ˜„

โœ… ํ•  ์ผ

  • Story ์ƒ์„ฑ API ๊ตฌํ˜„
  • Story ์ƒ์„ฑ ํ…Œ์ŠคํŠธ ํ™•์ธ

์Šคํ† ๋ฆฌ ์ƒ์„ฑ ๋ฐ ์ˆ˜์ • ์—๋””ํ„ฐ

๐Ÿ—’๏ธ ์„ค๋ช…

  • ์Šคํ† ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.

โœ… ํ•  ์ผ

  • ์Šคํ† ๋ฆฌ ์ œ๋ชฉ ๋ฐ ๋‚ด์šฉ editor view ๊ตฌํ˜„
  • ์Šคํ† ๋ฆฌ ์‚ฌ์ง„ ์ถ”๊ฐ€ editor view ๊ตฌํ˜„
  • ์Šคํ† ๋ฆฌ ์†์„ฑ ์„ค์ • editor view ๊ตฌํ˜„
  • ์Šคํ† ๋ฆฌ ์ˆ˜์ • ์‹œ, ๊ธฐ์กด ๋‚ด์šฉ ๋กœ๋“œ ๋กœ์ง ๊ตฌํ˜„
  • ์Šคํ† ๋ฆฌ ์ƒ์„ฑ API ์—ฐ๊ฒฐ
  • ์Šคํ† ๋ฆฌ ์ˆ˜์ • API ์—ฐ๊ฒฐ

๋กœ๊ณ  ์ด๋ฏธ์ง€ ๋ฆฌ์†Œ์Šค scale ์ถ”๊ฐ€

๐Ÿ—’๏ธ ์„ค๋ช…

  • ๋กœ๊ณ  ์ด๋ฏธ์ง€ ํฌ๊ธฐ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. (x2, x3 ๋ชจ๋‘ ์ถ”๊ฐ€)
  • Launch Screen์—์„œ ์ด๋ฏธ์ง€๊ฐ€ ๊นจ์ง
  • ๋กœ๊ทธ์ธ ํ™”๋ฉด์—์„œ ์ด๋ฏธ์ง€๊ฐ€ ๊นจ์ง

โœ… ํ•  ์ผ

  • Launch Screen Logo ์ด๋ฏธ์ง€ ์ถ”๊ฐ€ (logo)
  • Login Logo ์ด๋ฏธ์ง€ ์ถ”๊ฐ€ (logoWithTitle)

Feature ํ…œํ”Œ๋ฆฟ ์ถ”๊ฐ€

๐Ÿ—’๏ธ ์„ค๋ช…

  • Tuist scaffold๋ฅผ ์ด์šฉํ•˜์—ฌ Feature ๋ชจ๋“ˆ์„ ํŽธํ•˜๊ฒŒ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฐ๋ชจ์•ฑ ์„ค์ •, Test ์„ค์ • ์ถ”๊ฐ€

โœ… ํ•  ์ผ

  • Feature ๋ชจ๋“ˆ ํ…œํ”Œ๋ฆฟ ์ถ”๊ฐ€

ํด๋ผ์šฐ๋“œ์— ์„œ๋ฒ„ ๋ฐฐํฌ ์ž๋™ํ™” [Github Action]

๐Ÿ—’๏ธ ์„ค๋ช…

  • iOS์ธก๊ณผ ์›ํ™œํ•œ API ์š”์ฒญ, ์‘๋‹ต์„ ์œ„ํ•ด ๋ฐฐํฌ ์ž๋™ํ™”

โœ… ํ•  ์ผ

  • ๋ฐฐํฌ์— ๋Œ€ํ•œ ๊ณผ์ • ํ•™์Šต
  • Github Action ํ•™์Šต
  • ํด๋ผ์šฐ๋“œ์— ํ™˜๊ฒฝ์„ค์ •
  • ํด๋ผ์šฐ๋“œ์— ๋ฐฐํฌ
  • ๋™์ž‘ ํ™•์ธ

Backend ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ

๐Ÿ—’๏ธ ์„ค๋ช…

NestJS ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ

โœ… ํ•  ์ผ

  • NestJS ํ”„๋กœ์ ํŠธ ์ƒ์„ฑํ•˜๊ธฐ
  • typeORM ์„ค์น˜ ๋ฐ ์„ค์ •
  • ssh ํ„ฐ๋„๋ง ๊ตฌํ˜„ ๋ฐ ํ…Œ์ŠคํŠธ

ํ™ˆ UI ์ถ”๊ฐ€

๐Ÿ—’๏ธ ์„ค๋ช…

  • ํ™ˆ ํ™”๋ฉด์— ๋Œ€ํ•œ UI๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

โœ… ํ•  ์ผ

  • ํ™ˆ Attach
  • ํ™ˆ UI ์ถ”๊ฐ€
    • ๋น„์–ด์žˆ๋Š” ๊ฒฝ์šฐ
    • ์ถ”์ฒœ Section
    • ํ•ซํ”Œ๋ ˆ์ด์Šค Section
    • ํŒ”๋กœ์ž‰ Section
    • ์นœ๊ตฌ ์ถ”์ฒœ Section

Network ์ถ”๊ฐ€

๐Ÿ—’๏ธ ์„ค๋ช…

  • ๊ณต์šฉ์œผ๋กœ ์‚ฌ์šฉํ•  Network ์‹œ์Šคํ…œ์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

โœ… ํ•  ์ผ

  • Network ์ถ”๊ฐ€

์ด๋ฏธ์ง€ ์บ์‹ฑ ๊ธฐ๋Šฅ, ์ด๋ฏธ์ง€ ๋‹ค์šด๋กœ๋“œ ๊ธฐ๋Šฅ ์ถ”๊ฐ€

๐Ÿ—’๏ธ ์„ค๋ช…

  • ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ๋ฅผ ํ•  ๋งค๋‹ˆ์ €๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
    • ๊ณ ๋ฏผ์‚ฌํ•ญ
      • ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ - CoreKit & DesignKit vs. Util ๋“ฑ
      • ์‹ฑ๊ธ€ํ†ค vs. ์œ ์Šค์ผ€์ด์Šค
  • ์ด๋ฏธ์ง€ ๋‹ค์šด๋กœ๋“œ๋ฅผ ์บ”์Šฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

โœ… ํ•  ์ผ

  • ์ด๋ฏธ์ง€ ์บ์‹œ ๋งค๋‹ˆ์ € ์ถ”๊ฐ€
  • ์ด๋ฏธ์ง€ ๋‹ค์šด๋กœ๋“œ ๋ฐ ์บ”์Šฌ ๊ธฐ๋Šฅ ์ถ”๊ฐ€

์Šคํ† ๋ฆฌ ์ƒ์„ธ

๐Ÿ—’๏ธ ์„ค๋ช…

  • ์Šคํ† ๋ฆฌ ์ƒ์„ธ ๋‚ด์šฉ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

โœ… ํ•  ์ผ

  • ์ž‘์„ฑ์ž ํ”„๋กœํ•„ view ๊ตฌํ˜„
  • ์Šคํ† ๋ฆฌ ์ด๋ฏธ์ง€ ๋ฆฌ์ŠคํŠธ view ๊ตฌํ˜„
  • ์Šคํ† ๋ฆฌ ์ œ๋ชฉ, ๋‚ด์šฉ view ๊ตฌํ˜„
  • ์Šคํ† ๋ฆฌ ์œ„์น˜ ์ง€๋„ view ๊ตฌํ˜„
  • ์ถ”์ฒœ ์Šคํ† ๋ฆฌ ๋ฆฌ์ŠคํŠธ view ๊ตฌํ˜„
  • ์Šคํ† ๋ฆฌ ์ƒ์„ธ API ์—ฐ๊ฒฐ
  • ์ถ”์ฒœ ์Šคํ† ๋ฆฌ API ์—ฐ๊ฒฐ

ํšŒ์›๊ฐ€์ž… ์„ฑ๊ณต ํ™”๋ฉด

๐Ÿ—’๏ธ ์„ค๋ช…

  • ํšŒ์›๊ฐ€์ž…์ด ์„ฑ๊ณต์ ์œผ๋กœ ๋˜์—ˆ์œผ๋ฉด ์„ฑ๊ณตํ™”๋ฉด ๋„์›Œ์ฃผ๊ธฐ

โœ… ํ•  ์ผ

  • ํ™”๋ฉด ๊ตฌํ˜„

๊ฒ€์ƒ‰์–ด ์ž๋™์™„์„ฑ ๊ธฐ๋Šฅ

๐Ÿ—’๏ธ ์„ค๋ช…

  • ๊ฒ€์ƒ‰ ์ž๋™์™„์„ฑ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ๋‹ค.

โœ… ํ•  ์ผ

  • ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๋ฅผ ์ž์†Œ๋‹จ์œ„๋กœ ๋ถ„๋ฆฌํ•œ๋‹ค
  • ๋ถ„๋ฆฌ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ถ”์ฒœ ๊ฒ€์ƒ‰์–ด๋ฅผ ์–ป์–ด๋‚ด๊ณ  ๋ฆฌํ„ดํ•œ๋‹ค.

์œ„์น˜ ๊ถŒํ•œ ํ”Œ๋กœ์šฐ ์ถ”๊ฐ€

๐Ÿ—’๏ธ ์„ค๋ช…

  • ์ง€๋„ ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์œ„์น˜ ๊ถŒํ•œ ์ถ”๊ฐ€
  • ๋กœ๊ทธ์ธ ํ™”๋ฉด -> ํšŒ์›๊ฐ€์ž… -> ํšŒ์›๊ฐ€์ž… ์™„๋ฃŒ -> ์œ„์น˜ ๊ถŒํ•œ

โœ… ํ•  ์ผ

  • ์œ„์น˜ ๊ถŒํ•œ ํ”Œ๋กœ์šฐ ์ถ”๊ฐ€

์•ฑ ์‹œ์ž‘ ์‹œ ์นดํ…Œ๊ณ ๋ฆฌ ์ •๋ณด ์ „์†ก

๐Ÿ—’๏ธ ์„ค๋ช…

  • ์•ฑ ์ตœ์ดˆ ์‹คํ–‰ ์‹œ ์นดํ…Œ๊ณ ๋ฆฌ ์ •๋ณด๋ฅผ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.

โœ… ํ•  ์ผ

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์นดํ…Œ๊ณ ๋ฆฌ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์™€์„œ ์ „์†ก
  • ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ

TextField ๋””์ž์ธ ์‹œ์Šคํ…œ ์ถ”๊ฐ€

๐Ÿ—’๏ธ ์„ค๋ช…

  • ๊ณต์šฉ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ํ…์ŠคํŠธ ํ•„๋“œ ๋””์ž์ธ ์‹œ์Šคํ…œ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

โœ… ํ•  ์ผ

  • ํ…์ŠคํŠธ ํ•„๋“œ ๋””์ž์ธ ์‹œ์Šคํ…œ ๊ตฌํ˜„

๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ ๊ตฌํ˜„

๐Ÿ—’๏ธ ์„ค๋ช…

์•ฑ์—์„œ ์ „์†ก๋œ Token์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ ๊ตฌํ˜„

โœ… ํ•  ์ผ

  • accessToken ๋ฐ”ํƒ•์œผ๋กœ ์œ ์ € ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ (3hour) -> (2hour)
  • ๊ฐ€์ ธ์˜จ ์œ ์ € ์ •๋ณด ๋ฐ”ํƒ•์œผ๋กœ, ์ด๋ฏธ ๊ฐ€์ž…ํ•œ ์œ ์ €์ธ ๊ฒฝ์šฐ accessToken ๋ฐœ๊ธ‰ ํ›„ response / ์ฒซ ๋กœ๊ทธ์ธ์ธ ๊ฒฝ์šฐ ๋นˆ response ์ „๋‹ฌ (3hour) -> (3hour)
  • ํšŒ์›๊ฐ€์ž… ๊ตฌํ˜„ (1hour) -> (1hour)

์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ณ€๊ฒฝ

๐Ÿ—’๏ธ ์„ค๋ช…

  • ๋งˆ์Šคํ„ฐ ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ตœ์†Œํ™”
  • RxSwift๋ฅผ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด ModernRIBs๋กœ ๋ณ€๊ฒฝ

โœ… ํ•  ์ผ

  • RIBs, RxSwift ์ œ๊ฑฐ
  • ModernRIBs ์ถ”๊ฐ€

RIBs Routing ์œ ํ‹ธ ์ถ”๊ฐ€

๐Ÿ—’๏ธ ์„ค๋ช…

  • Navigation ๋ฐ ViewControllable ๋ผ์šฐํŒ…์„ ์œ„ํ•œ ์œ ํ‹ธ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

โœ… ํ•  ์ผ

  • NavigationControllable ์ถ”๊ฐ€
  • ViewControllable Extension ์ถ”๊ฐ€

README Figma link ์ˆ˜์ •

๐Ÿ—’๏ธ ์„ค๋ช…

  • README์˜ Figma link๊ฐ€ team invite๋กœ ๋˜์–ด์žˆ๋Š” ๋ฌธ์ œ

โœ… ํ•  ์ผ

  • README Figma link ์ˆ˜์ •

๋กœ๊ทธ์ธ ์„œ๋น„์Šค ์ถ”๊ฐ€

๐Ÿ—’๏ธ ์„ค๋ช…

  • Naver AccessToken์„ ์ด์šฉํ•ด ์„œ๋ฒ„์™€ ์ž˜ ๋™์ž‘ํ•˜๋„๋ก ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

โœ… ํ•  ์ผ

  • ๋กœ๊ทธ์ธ ์„œ๋น„์Šค ์ถ”๊ฐ€

๋กœ๊ทธ์ธ ์ถ”๊ฐ€

๐Ÿ—’๏ธ ์„ค๋ช…

  • Naver ๋กœ๊ทธ์ธ ์ถ”๊ฐ€ (OAuth)

โœ… ํ•  ์ผ

  • Naver Login ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ถ”๊ฐ€
  • ๋กœ๊ทธ์ธ ํ™”๋ฉด ์ถ”๊ฐ€
  • ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ ์ถ”๊ฐ€

Secret Key ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ์œ ํ‹ธ ์ถ”๊ฐ€

๐Ÿ—’๏ธ ์„ค๋ช…

  • ๋„๋ฉ”์ธ, API Key ๋“ฑ ๋น„๋ฐ€ํ‚ค๋ฅผ ๊ด€๋ฆฌํ•  ์œ ํ‹ธ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • ํ˜„์žฌ Cryptokit์— ๋Œ€ํ•œ ์–ธ๊ธ‰์ด ๋‚˜์™”์—ˆ์Œ

โœ… ํ•  ์ผ

  • Secret Key ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ์œ ํ‹ธ ์ถ”๊ฐ€

ํšŒ์›๊ฐ€์ž… ์‹œ ์ด๋ฏธ์ง€ ์ €์žฅ

๐Ÿ—’๏ธ ์„ค๋ช…

  • ํšŒ์›๊ฐ€์ž… ์‹œ, ์‚ฌ์šฉ์ž์˜ ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ๊ฐ€ ์˜ฌ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ ์ €์žฅํ•œ๋‹ค.

โœ… ํ•  ์ผ

  • ์„œ๋ฒ„์— ํŒŒ์ผ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ๋‹ค.
  • ์ €์žฅ๋œ ๊ฒฝ๋กœ๋ฅผ db์— ์ €์žฅํ•œ๋‹ค.

iOS ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ

๐Ÿ—’๏ธ ์„ค๋ช…

  • iOS ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ ๋ฐ ์„ค์ •

โœ… ํ•  ์ผ

  • iOS ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ ๋ฐ ์„ค์ •
  • Tuist ์„ค์ •

Log ์ถ”๊ฐ€

๐Ÿ—’๏ธ ์„ค๋ช…

  • Log๋ฅผ ์ฐ์–ด๋ณด๊ธฐ์œ„ํ•ด CoreKit์— Logger๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

โœ… ํ•  ์ผ

  • CoreKit์— Logger ์ถ”๊ฐ€

Story, Category Entity ์ƒ์„ฑ

๐Ÿ—’๏ธ ์„ค๋ช…

  • Story Entity ์ƒ์„ฑ
  • Category Entity ์ƒ์„ฑ

โœ… ํ•  ์ผ

  • Story Entity ์ƒ์„ฑ
  • Category Entity ์ƒ์„ฑ

swagger ์„ค์ •

๐Ÿ—’๏ธ ์„ค๋ช…

  • ๊ตฌํ˜„๋œ ๋กœ๊ทธ์ธ / ํšŒ์›๊ฐ€์ž… API๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ swagger ์ž‘์„ฑ

โœ… ํ•  ์ผ

  • ๋กœ๊ทธ์ธ swagger ์ž‘์„ฑ
  • ํšŒ์›๊ฐ€์ž… swagger ์ž‘์„ฑ

๊ฒ€์ƒ‰ UI ์ถ”๊ฐ€

๐Ÿ—’๏ธ ์„ค๋ช…

  • ๊ฒ€์ƒ‰ํ™”๋ฉด UI๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

โœ… ํ•  ์ผ

  • ๋„ค์ด๋ฒ„ ์ง€๋„ ๋ทฐ ์ถ”๊ฐ€
  • ๊ฒ€์ƒ‰ ํƒญ ์ถ”๊ฐ€
  • ํ˜„์žฌ ์œ„์น˜ ๋ฒ„ํŠผ ์ถ”๊ฐ€

ํšŒ์›๊ฐ€์ž… ์ถ”๊ฐ€

๐Ÿ—’๏ธ ์„ค๋ช…

  • ํšŒ์›๊ฐ€์ž… ์ถ”๊ฐ€
  • ๋กœ๊ทธ์ธ -> ์ตœ์ดˆ ์œ ์ € -> ํšŒ์›๊ฐ€์ž…
  • ๋กœ๊ทธ์ธ -> ์ตœ์ดˆ ์œ ์ € X -> ํ™ˆ ํ™”๋ฉด

โœ… ํ•  ์ผ

  • ํšŒ์›๊ฐ€์ž… ํ™”๋ฉด ์ถ”๊ฐ€
  • ํšŒ์›๊ฐ€์ž… ๊ธฐ๋Šฅ ์ถ”๊ฐ€

๋ฒˆ๋“ค ์„ค์ •

๐Ÿ—’๏ธ ์„ค๋ช…

  • ๋งˆ์Šคํ„ฐํด๋ž˜์Šค์—์„œ ์•Œ๋ ค์ฃผ์‹  ๋„ค์ด๋ฐ์œผ๋กœ ํ†ต์ผํ•˜๊ธฐ ์œ„ํ•ด ๋ฒˆ๋“ค ID ๋ณ€๊ฒฝ

โœ… ํ•  ์ผ

  • ๋ฒˆ๋“ค ID ๋ณ€๊ฒฝ

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.