์ฑ„๋„ํ†ก ์•„์ด์ฝ˜

๋ฐฐ๋‹ฌ์•ฑ์€ ์–ด๋–ป๊ฒŒ ๋‚ด ์ฃผ๋ณ€์˜ ๋ง›์ง‘์„ ์ฐพ์„๊นŒ?

์ œ๊ฐ€ ๋งŒ์•ฝ ๋ฐฐ๋‹ฌ์•ฑ์„ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋งŒ๋“ ๋‹ค๋ฉด ์ด๋ ‡๊ฒŒ ๋งŒ๋“ค๊ฒ ์Šต๋‹ˆ๋‹ค. ์‹ค์ „ ๋ ˆ๋ฒจ์˜ fastapi, mongodb, ๋ชจ๋ธ๋ง๊ณผ ์ธ๋ฑ์Šค ์„ค๊ณ„, redis ์บ์‹ฑ๊ณผ ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ๋ฅผ ๋ชจ๋‘ ์ด ๊ฐ•์˜์— ๋‹ด์•˜์Šต๋‹ˆ๋‹ค.

Thumbnail

์ค‘๊ธ‰์ž๋ฅผ ์œ„ํ•ด ์ค€๋น„ํ•œ
[๋ฐฑ์—”๋“œ, ์›น ๊ฐœ๋ฐœ] ๊ฐ•์˜์ž…๋‹ˆ๋‹ค.

์ด๋Ÿฐ ๊ฑธ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์–ด์š”

  • Geo Spatial Search (๊ณต๊ฐ„ ๊ฒ€์ƒ‰)

  • Mongodb

  • FastAPI

๋ฐฐ๋‹ฌ์•ฑ ๊ฐœ๋ฐœ์ž๊ฐ€ ์•Œ๋ ค์ฃผ๋Š”
Geospatial Search! ๐Ÿงญ

๋ฐฐ๋‹ฌ์•ฑ์€ ์–ด๋–ป๊ฒŒ ์šฐ๋ฆฌ ์ฃผ๋ณ€์˜ ๋ง›์ง‘์„ ์ฐพ์•„์ฃผ๋Š” ๊ฑธ๊นŒ์š”? ๐Ÿค”

๋‹ต์€ geospatial query์— ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€๋„ ์•ฑ, ์†Œ๊ฐœํŒ… ์•ฑ, ๋ฐฐ๋‹ฌ ์•ฑ ๋“ฑ๋“ฑ ์ˆ˜๋งŽ์€ ๋ฉ”์ด์ € ์•ฑ๋“ค์˜ ์š”๊ตฌ์‚ฌํ•ญ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ์ˆ ์ด ๋ฐ”๋กœ geospatial query์ž…๋‹ˆ๋‹ค.

๋ณธ ๊ฐ•์˜์—์„œ FastAPI์™€ MongoDB๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ฐ€์žฅ ๋ชจ๋˜ํ•˜๊ฒŒ ๊ฐ€๊ฒŒ ๊ฒ€์ƒ‰์„ ๋‹ด๋‹นํ•˜๋Š” Micro Service๋ฅผ ๋งŒ๋“ค์–ด ๋ด…๋‹ˆ๋‹ค. FastAPI Dependency Injection, MongoDB์˜ compound index์™€ query plan ๋“ฑ ๊นŠ์ด ์žˆ๋Š” ์ฃผ์ œ๋ฅผ ๋‹ค๋ฃน๋‹ˆ๋‹ค. ํ”ผ์ƒ์ ์ธ ํŠœํ† ๋ฆฌ์–ผ์— ์ง€์น˜์…จ๋‹ค๋ฉด ์ด ๊ฐ•์˜์—์„œ production ready ์ƒํƒœ์˜ application์„ ๋งŒ๋“ค๋ฉด์„œ ๋‹ค์‹œ ์ฝ”๋”ฉ์˜ ๋‘๊ทผ๊ฑฐ๋ฆผ์„ ๋˜์ฐพ์•„ ๋ณด์„ธ์š”!

์ด ๊ฐ•์˜๋งŒ์˜ ํŠน์ง•์„ ํ™•์ธํ•˜์„ธ์š”! โญ

๐Ÿ“Œ ๋ฐฐ๋‹ฌ์•ฑ์— ํŠนํ™”๋œ ๊ฐ€์žฅ ๋น ๋ฅธ ๊ณต๊ฐ„ ๊ฒ€์ƒ‰ ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ผ๊นŒ? 2๋…„๊ฐ„์˜ ๊ณ ๋ฏผ์— ์ œ๊ฐ€ ๋‚ด๋ฆฐ ๋‹ต์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“Œ ์Šคํ‚ค๋งˆ ์„ค๊ณ„, ์บ์‹ฑ ๋ฐฉ๋ฒ•๋ก  ๋“ฑ ์‹ค์ „์— ์ ์šฉํ–ˆ์„ ๋•Œ ํฐ ๋„์›€์ด ๋˜๋Š” insight๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“Œ ์ด๋ก  10% ์‹ค์Šต 90%. ๋ชจ๋“  ์ฝ”๋“œ๋Š” ์ง์ ‘ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์ •๋ง ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š”์ง€ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“Œ ์ค‘๊ธ‰์ž๋ฅผ ์œ„ํ•œ ๊ฐ•์˜์ž…๋‹ˆ๋‹ค. ๊ผญ python์ด ์•„๋‹ˆ๋”๋ผ๋„ ๊ธฐ๋ณธ์ ์ธ CRUD๋Š” ํ•˜์‹ค ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค :)


์ด๋Ÿฐ ๋ถ„๋“ค๊ป˜ ์ถ”์ฒœํ•ด์š” ๐Ÿ™†โ€โ™€๏ธ

๊ฒŒ์‹œํŒ CRUD๋Š” ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ๊ทธ ์ดํ›„์—๋Š” ๋ญ˜ ํ•ด์•ผ ํ• ์ง€ ๋ชจ๋ฅด๊ฒ ๋Š” ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž / ํ•™์ƒ

๋ฐฐ๋‹ฌ์•ฑ์€ ์–ด๋–ป๊ฒŒ ์ง‘ ์ฃผ๋ณ€์˜ ๊ฐ€๊ฒŒ๋ฅผ ๋ณด์—ฌ์ค„๊นŒ? ๊ณต๊ฐ„ ๊ฒ€์ƒ‰์„ ์–ด๋–ป๊ฒŒ ํ•˜๋Š”์ง€ ๊ถ๊ธˆํ•˜์‹  ๋ถ„

(ํ•œ ๋•Œ) ๊ตญ๋‚ด ์ตœ๋Œ€์˜ ํŒŒ์ด์ฌ ์กฐ์ง์—์„œ๋Š” ์–ด๋–ป๊ฒŒ ๊ฐœ๋ฐœ์„ ํ• ๊นŒ? ๊ถ๊ธˆํ•˜์‹  ๋ถ„

์ด ๊ฐ•์˜์™€ ํ•จ๊ป˜ํ•ด์š”! ๐Ÿ™Œ

  • Mypy, black, pytest. CI๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ฝ”๋“œ ํ€„๋ฆฌํ‹ฐ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๋ ค๋“œ๋ฆฝ๋‹ˆ๋‹ค.
  • mongodb์™€ ๋‚ด์žฅ๋œ google s2๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์•ผ๋ฌด์ง€๊ฒŒ ๊ณต๊ฐ„ ๊ฒ€์ƒ‰ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๋ ค ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๊ณต๊ฐ„๊ฒ€์ƒ‰๋„ ๋” ์ด์ƒ ๋‘๋ ต์ง€ ์•Š๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • ๋ถ€ํ•˜ํ…Œ์ŠคํŠธ ์—†์ด production ready๋ผ๊ณ  ํ•  ์ˆ˜ ์—†์ฃ . ๊ฐ„๋‹จํ•œ ๋ถ€ํ•˜ํ…Œ์ŠคํŠธ๋Š” ์–ด๋–ป๊ฒŒ ํ• ๊นŒ? ์„ฑ๋Šฅ ํ–ฅ์ƒ์ด ๋˜์—ˆ๋Š”์ง€ ์ฆ๋ช…ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๋ ค ๋“œ๋ฆฝ๋‹ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค != RDBMS. ๋ชฝ๊ณ ๋””๋น„๋ฅผ ์‚ฌ์šฉํ•ด ์ง„์งœ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค์–ด ๋ด…๋‹ˆ๋‹ค.
  • ์ˆจ ์‰ฌ๋“ฏ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ์™€ CI๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

ํ•™์Šต ๋‚ด์šฉ ๐Ÿ“š

MongoDB: Query Plan, Compound index

๋ชฝ๊ณ ๋””๋น„๋Š” ์‹ค์ „์— ์ ํ•ฉํ•˜์ง€ ์•Š๋‹ค? ๋Š๋ฆฌ๋‹ค? ๋ถˆ์•ˆ์ •ํ•˜๋‹ค? ์•„๋‹ˆ์š”! NoSQL์„ ์ œ๋Œ€๋กœ ๋ฐฐ์›Œ ๋ด…์‹œ๋‹ค. query plan, compound index, aggregation pipeline ๋“ฑ ๋‹จ์ˆœ CRUD์—์„œ ๋ฒ—์–ด๋‚œ ๊นŠ์ด ์žˆ๋Š” ์ฃผ์ œ๋ฅผ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

 

Google S2

์ง€๊ตฌ๋ฅผ ์‚ฌ๊ฐํ˜•์œผ๋กœ ๋ฌดํ•œํžˆ ์ชผ๊ฐœ๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”? google์˜ s2๊ฐ€ ์–ด๋–ค ์›๋ฆฌ๋กœ ๊ณต๊ฐ„ ์ฟผ๋ฆฌ ์†๋„๋ฅผ ํ–ฅ์ƒ์‹œํ‚ค๋Š”์ง€ ๊ทธ ํ˜์‹ ์ ์ธ ์•„์ด๋””์–ด๋ฅผ ์‚ดํŽด๋ด…๋‹ˆ๋‹ค.

 

FastAPI, Concurrent Programming

fastapi ์™€ asyncio.gather() ๋ฅผ ์‚ฌ์šฉํ•œ ๋ณ‘๋ ฌ ์ฟผ๋ฆฌ! ์ฝ”๋ฃจํ‹ด์˜ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์„ ๋ฐฐ์›๋‹ˆ๋‹ค.

 

caption

Redis Cache without TTL

ํ˜น์‹œ [์บ์‹œ == ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด ์—†์–ด์ง€๋Š” ๊ฐ’]์ด๋ผ๊ณ ๋งŒ ์ƒ๊ฐํ•˜์…จ๋‚˜์š”? TTL์˜ ๋ฌธ์ œ์ ์„ ์งš์–ด๋ณด๊ณ  ์บ์‹œ๋ฅผ ๋‹ค์‹œ ์ƒ๊ฐํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


์ˆ˜๊ฐ• ์ „ ์ฐธ๊ณ  ์‚ฌํ•ญ ๐Ÿ“ข

์‹ค์Šต ํ™˜๊ฒฝ

  • ๊ฐ•์˜๋Š” MacOS ๊ธฐ์ค€์œผ๋กœ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์œˆ๋„์šฐ ๋จธ์‹ ์ด๋ผ๋ฉด docker๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ๋‹ค๋ฉด ๋Œ€๋ถ€๋ถ„ ๋”ฐ๋ผ์˜ค์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ฐ•์˜์—์„œ๋Š” pycharm professional์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. educational ๋ฒ„์ „๋„ ๋ฌด๋ฆฌ์—†์ด ๋”ฐ๋ผ์˜ค์‹ค ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

ํ•™์Šต ์ž๋ฃŒ

  • ๋…ธ์…˜ ๋งํฌ๋กœ ์ œ๊ณตํ•ด ๋“œ๋ฆฝ๋‹ˆ๋‹ค!

์„ ์ˆ˜ ์ง€์‹ ๋ฐ ์œ ์˜์‚ฌํ•ญ

  • ๊ธฐ๋ณธ์ ์ธ ํŒŒ์ด์ฌ ๋ฌธ๋ฒ•
    • generator, decorater์˜ ๊ธฐ๋ณธ ๋™์ž‘ ์›๋ฆฌ
  • async await์„ ํ•œ ๋ฒˆ์ด๋ผ๋„ ์‚ฌ์šฉํ•ด ๋ณธ ์ ์ด ์žˆ์œผ๋ฉด ์ข‹์Šต๋‹ˆ๋‹ค.
  • ๊ธฐ๋ณธ sql ์ง€์‹

์ง€์‹๊ณต์œ ์ž ์†Œ๊ฐœ โœ’๏ธ

  • 2021 ~ ํ˜„์žฌ: ๋ฐฐ๋‹ฌ W์‚ฌ ํŒŒ์ด์ฌ ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž
  • 2022: S ์ฝ”๋”ฉ ํด๋Ÿฝ python ํŠœํ„ฐ

์ด๋Ÿฐ ๋ถ„๋“ค๊ป˜
์ถ”์ฒœ๋“œ๋ ค์š”!

ํ•™์Šต ๋Œ€์ƒ์€
๋ˆ„๊ตฌ์ผ๊นŒ์š”?

  • ๋ง›์ง‘์•ฑ, ๋ฐฐ๋‹ฌ์•ฑ์„ ๋งŒ๋“ค์–ด๋ณด๊ณ  ์‹ถ์€๋ฐ ๊ณต๊ฐ„ ๊ฒ€์ƒ‰์ด ๋ง‰๋ง‰ํ•œ ๊ฐœ๋ฐœ์ž

  • ๊ธฐ๋ณธ์ ์ธ CRUD์—์„œ ๋ฒ—์–ด๋‚˜ ๋ ˆ๋ฒจ์—… ํ•˜๊ณ  ์‹ถ์€ ๊ฐœ๋ฐœ์ž

  • mongodb๋ฅผ ์ œ๋Œ€๋กœ ์‚ฌ์šฉํ•ด๋ณด๊ณ  ์‹ถ์€ ๊ฐœ๋ฐœ์ž

์„ ์ˆ˜ ์ง€์‹,
ํ•„์š”ํ• ๊นŒ์š”?

  • python

  • ๊ธฐ๋ณธ ๋ฐฑ์—”๋“œ ์ง€์‹

์•ˆ๋…•ํ•˜์„ธ์š”
์ •์Šน์›์ž…๋‹ˆ๋‹ค.

148

๋ช…

์ˆ˜๊ฐ•์ƒ

6

๊ฐœ

์ˆ˜๊ฐ•ํ‰

14

๊ฐœ

๋‹ต๋ณ€

5.0

์ 

๊ฐ•์˜ ํ‰์ 

1

๊ฐœ

๊ฐ•์˜

  • 2021 ~ ํ˜„์žฌ: ๋ฐฐ๋‹ฌ W์‚ฌ ํŒŒ์ด์ฌ ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž

  • 2022: S ์ฝ”๋”ฉ ํด๋Ÿฝ python ํŠœํ„ฐ

 

์ด๋ ฅ์„œ ํŽ˜์ด์ง€:

https://9gagger.gitlab.io/sw/

๋”๋ณด๊ธฐ

์ปค๋ฆฌํ˜๋Ÿผ

์ „์ฒด

45๊ฐœ โˆ™ (6์‹œ๊ฐ„ 29๋ถ„)

๊ฐ•์˜ ๊ฒŒ์‹œ์ผ: 
๋งˆ์ง€๋ง‰ ์—…๋ฐ์ดํŠธ์ผ: 

์ˆ˜๊ฐ•ํ‰

์ „์ฒด

6๊ฐœ

5.0

6๊ฐœ์˜ ์ˆ˜๊ฐ•ํ‰

์›” โ‚ฉ15,400

5๊ฐœ์›” ํ• ๋ถ€ ์‹œ

โ‚ฉ77,000