๐Ÿš€ NoSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ™œ์šฉ: MongoDB์™€ PyMongo ๐Ÿš€

์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐Ÿš€ NoSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ™œ์šฉ: MongoDB์™€ PyMongo ๐Ÿš€

 

 

์•ˆ๋…•, ์นœ๊ตฌ๋“ค! ์˜ค๋Š˜์€ ์ •๋ง ํฅ๋ฏธ์ง„์ง„ํ•œ ์ฃผ์ œ๋กœ ์ฐพ์•„์™”์–ด. ๋ฐ”๋กœ NoSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ๊ทธ ์ค‘์—์„œ๋„ ํŠนํžˆ MongoDB, ๊ทธ๋ฆฌ๊ณ  Python์—์„œ MongoDB๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” PyMongo์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•ด๋ณผ ๊ฑฐ์•ผ. ๐Ÿ˜Ž

์ด ๊ธ€์„ ์ฝ๋‹ค ๋ณด๋ฉด ๋„ˆ๋„ ๋ชจ๋ฅด๊ฒŒ NoSQL์˜ ๋งค๋ ฅ์— ํ‘น ๋น ์งˆ ๊ฑฐ์•ผ. ๊ทธ๋ฆฌ๊ณ  ํ˜น์‹œ ๋ชจ๋ฅด์ง€, ์ด๋Ÿฐ ์ง€์‹์„ ๋ฐ”ํƒ•์œผ๋กœ ์žฌ๋Šฅ๋„ท์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ จ ์žฌ๋Šฅ์„ ๊ณต์œ ํ•˜๊ฒŒ ๋ ์ง€๋„? ๐Ÿค” ์ž, ๊ทธ๋Ÿผ ์‹œ์ž‘ํ•ด๋ณผ๊นŒ?

๐Ÿ’ก ์ž ๊น! NoSQL์ด ๋ญ”์ง€ ์ „ํ˜€ ๋ชจ๋ฅด๊ฒ ๋‹ค๊ณ ? ๊ฑฑ์ • ๋งˆ. ์šฐ๋ฆฌ ํ•จ๊ป˜ ์ฒœ์ฒœํžˆ ์•Œ์•„๊ฐ€ ๋ณด์ž๊ณ . ์ด ์—ฌ์ •์ด ๋๋‚  ๋•Œ์ฏค์ด๋ฉด, ๋„Œ NoSQL ์ „๋ฌธ๊ฐ€๊ฐ€ ๋˜์–ด ์žˆ์„ ๊ฑฐ์•ผ!

๐Ÿค” NoSQL์ด ๋ญ์•ผ? ์™œ ๊ฐ‘์ž๊ธฐ ๋“ฑ์žฅํ•œ ๊ฑฐ์•ผ?

์ž, ๋จผ์ € NoSQL์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž. NoSQL์€ "Not Only SQL"์˜ ์•ฝ์ž์•ผ. ์ด๋ฆ„๋ถ€ํ„ฐ ์ข€ ํŠน์ดํ•˜์ง€? ๐Ÿง

NoSQL์€ ๊ธฐ์กด์˜ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€๋Š” ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œ์Šคํ…œ์ด์•ผ. ๊ทผ๋ฐ ์™œ ์ด๋Ÿฐ ๊ฒŒ ํ•„์š”ํ–ˆ์„๊นŒ?

๐ŸŽญ ์ƒ์ƒํ•ด๋ณด์ž: ๋„ˆ๊ฐ€ ์—„์ฒญ๋‚œ ์ธ๊ธฐ๋ฅผ ๋Œ๊ณ  ์žˆ๋Š” ์†Œ์…œ ๋ฏธ๋””์–ด ์•ฑ์„ ๋งŒ๋“ค์—ˆ์–ด. ์ „ ์„ธ๊ณ„ ์‚ฌ๋žŒ๋“ค์ด ๋„ˆ์˜ ์•ฑ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์ง€. ๋งค์ผ ์ˆ˜๋ฐฑ๋งŒ ๊ฐœ์˜ ๊ฒŒ์‹œ๋ฌผ, ๋Œ“๊ธ€, ์ข‹์•„์š”๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ์žˆ์–ด. ์–ด๋–ป๊ฒŒ ์ด ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์„๊นŒ?

๋ฐ”๋กœ ์ด๋Ÿฐ ์ƒํ™ฉ์—์„œ NoSQL์ด ๋น›์„ ๋ฐœํ•˜๋Š” ๊ฑฐ์•ผ! NoSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŠน์ง•์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด:

  • ๐Ÿš€ ํ™•์žฅ์„ฑ: ๋ฐ์ดํ„ฐ๊ฐ€ ๋Š˜์–ด๋‚˜๋„ ์‰ฝ๊ฒŒ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์–ด.
  • ๐Ÿ”„ ์œ ์—ฐ์„ฑ: ๋‹ค์–‘ํ•œ ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ์–ด.
  • โšก ์„ฑ๋Šฅ: ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด.
  • ๐Ÿ›  ๊ฐœ๋ฐœ ํŽธ์˜์„ฑ: ๊ฐœ๋ฐœ์ž ์นœํ™”์ ์ธ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด.

์ด๋Ÿฐ ํŠน์ง•๋“ค ๋•Œ๋ฌธ์— NoSQL์€ ๋น…๋ฐ์ดํ„ฐ, ์‹ค์‹œ๊ฐ„ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜, IoT ๋“ฑ ๋‹ค์–‘ํ•œ ๋ถ„์•ผ์—์„œ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์–ด. ์žฌ๋Šฅ๋„ท ๊ฐ™์€ ํ”Œ๋žซํผ์—์„œ๋„ ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๋‚˜ ๊ฑฐ๋ž˜ ์ •๋ณด๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ NoSQL์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๊ฒ ์ง€?

NoSQL vs SQL ๋น„๊ต SQL NoSQL ํ…Œ์ด๋ธ” ๊ธฐ๋ฐ˜ ๊ณ ์ • ์Šคํ‚ค๋งˆ ์ˆ˜์ง ํ™•์žฅ ACID ํŠธ๋žœ์žญ์…˜ ๋ฌธ์„œ, ํ‚ค-๊ฐ’, ๊ทธ๋ž˜ํ”„ ๋“ฑ ์œ ์—ฐํ•œ ์Šคํ‚ค๋งˆ ์ˆ˜ํ‰ ํ™•์žฅ BASE ๋ชจ๋ธ

์œ„์˜ ๊ทธ๋ฆผ์„ ๋ณด๋ฉด SQL๊ณผ NoSQL์˜ ์ฐจ์ด์ ์„ ํ•œ๋ˆˆ์— ๋ณผ ์ˆ˜ ์žˆ์ง€? SQL์€ ์šฐ๋ฆฌ๊ฐ€ ํ”ํžˆ ์•Œ๊ณ  ์žˆ๋Š” ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œ์Šคํ…œ์ด์•ผ. ํ…Œ์ด๋ธ” ํ˜•ํƒœ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ , ๊ฐ ํ…Œ์ด๋ธ” ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ์ •์˜ํ•ด์„œ ์‚ฌ์šฉํ•ด. ๋ฐ˜๋ฉด์— NoSQL์€ ์ข€ ๋” ์ž์œ ๋กœ์šด ํ˜•ํƒœ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ์–ด.

NoSQL์˜ "No"๊ฐ€ SQL์„ ์™„์ „ํžˆ ๋ถ€์ •ํ•œ๋‹ค๋Š” ๋œป์€ ์•„๋‹ˆ์•ผ. ์˜คํžˆ๋ ค SQL๋งŒ์œผ๋กœ๋Š” ํ•ด๊ฒฐํ•˜๊ธฐ ์–ด๋ ค์šด ๋ฌธ์ œ๋“ค์„ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ•œ ๊ฑฐ์ง€. ๊ทธ๋ž˜์„œ "Not Only SQL"์ด๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๊ฑฐ์•ผ. ๋‘ ๊ฐ€์ง€๋ฅผ ์ ์ ˆํžˆ ์„ž์–ด ์“ฐ๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ !

๐ŸŒŸ ์žฌ๋Šฅ๋„ท Tip: ๋งŒ์•ฝ ๋„ค๊ฐ€ ์žฌ๋Šฅ๋„ท์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ จ ์žฌ๋Šฅ์„ ๊ณต์œ ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, SQL๊ณผ NoSQL ๋ชจ๋‘์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฑฐ์•ผ. ๊ฐ๊ฐ์˜ ์žฅ๋‹จ์ ์„ ์•Œ๊ณ  ์ ์ ˆํ•œ ์ƒํ™ฉ์— ๋งž๊ฒŒ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ์€ ์ •๋ง ๊ฐ€์น˜ ์žˆ๋Š” ์žฌ๋Šฅ์ด ๋  ์ˆ˜ ์žˆ์–ด!

์ž, ์ด์ œ NoSQL์— ๋Œ€ํ•ด ์กฐ๊ธˆ์€ ๊ฐ์ด ์™”์ง€? ๊ทธ๋Ÿผ ์ด์ œ NoSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋Œ€ํ‘œ ์ฃผ์ž์ธ MongoDB์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž๊ณ !

๐Ÿƒ MongoDB: NoSQL์˜ ์Šˆํผ์Šคํƒ€

MongoDB๋Š” NoSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ค‘์—์„œ๋„ ๊ฐ€์žฅ ์ธ๊ธฐ ์žˆ๋Š” ๋…€์„ ์ค‘ ํ•˜๋‚˜์•ผ. ์™œ ์ด๋ ‡๊ฒŒ ์ธ๊ธฐ๊ฐ€ ๋งŽ์„๊นŒ? ํ•œ๋ฒˆ ์ž์„ธํžˆ ๋“ค์—ฌ๋‹ค๋ณด์ž!

๐Ÿค“ MongoDB๊ฐ€ ๋ญ์•ผ?

MongoDB๋Š” ๋ฌธ์„œ ์ง€ํ–ฅ(document-oriented) ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์•ผ. ์—ฌ๊ธฐ์„œ '๋ฌธ์„œ'๋ผ๋Š” ๊ฒŒ ๋ญ”์ง€ ๊ถ๊ธˆํ•˜์ง€? ์šฐ๋ฆฌ๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ ์•„๋Š” ๊ทธ ๋ฌธ์„œ๊ฐ€ ๋งž์•„. ๊ทผ๋ฐ ์กฐ๊ธˆ ํŠน๋ณ„ํ•ด.

๐Ÿ“„ MongoDB์˜ ๋ฌธ์„œ: MongoDB์—์„œ ๋งํ•˜๋Š” ๋ฌธ์„œ๋Š” JSON๊ณผ ๋น„์Šทํ•œ ํ˜•ํƒœ์˜ BSON(Binary JSON) ํ˜•์‹์œผ๋กœ ์ €์žฅ๋ผ. ์ด ๋ฌธ์„œ๋“ค์€ ํ•„๋“œ์™€ ๊ฐ’์˜ ์Œ์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๊ณ , ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ์ง€์›ํ•ด.

์˜ˆ๋ฅผ ๋“ค์–ด, ์žฌ๋Šฅ๋„ท์—์„œ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์ €์žฅํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž. MongoDB์—์„œ๋Š” ์ด๋ ‡๊ฒŒ ์ €์žฅํ•  ์ˆ˜ ์žˆ์–ด:


{
  "_id": ObjectId("5f8a7b2b9d3b2a1b3c4d5e6f"),
  "username": "์ฝ”๋”ฉ์˜์‹ ",
  "email": "coding_god@jaenung.net",
  "skills": ["Python", "MongoDB", "์›น ๊ฐœ๋ฐœ"],
  "rating": 4.9,
  "projects_completed": 42
}

์–ด๋•Œ? ๊ฝค ์ง๊ด€์ ์ด์ง€? ์ด๋Ÿฐ ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋ฉด ๊ฐœ๋ฐœํ•  ๋•Œ ์ •๋ง ํŽธ๋ฆฌํ•ด. JSON ํ˜•์‹๊ณผ ๋น„์Šทํ•˜๋‹ˆ๊นŒ JavaScript๋‚˜ Python ๊ฐ™์€ ์–ธ์–ด์™€ ๊ถํ•ฉ์ด ์ข‹๊ฑฐ๋“ .

๐ŸŒŸ MongoDB์˜ ํŠน์ง•

MongoDB๊ฐ€ ์ด๋ ‡๊ฒŒ ์ธ๊ธฐ ์žˆ๋Š” ์ด์œ , ์ข€ ๋” ์ž์„ธํžˆ ์•Œ์•„๋ณผ๊นŒ?

  • ๐Ÿ”„ ์œ ์—ฐํ•œ ์Šคํ‚ค๋งˆ: ๋ฏธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ •์˜ํ•˜์ง€ ์•Š์•„๋„ ๋ผ. ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์–ด.
  • ๐Ÿ“Š ๊ฐ•๋ ฅํ•œ ์ฟผ๋ฆฌ ๊ธฐ๋Šฅ: ๋ณต์žกํ•œ ์ฟผ๋ฆฌ๋„ ์ง€์›ํ•ด. ์‹ฌ์ง€์–ด ์ „๋ฌธ ๊ฒ€์ƒ‰(full-text search)๋„ ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ !
  • ๐Ÿš€ ๋†’์€ ์„ฑ๋Šฅ: ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด.
  • ๐Ÿ”’ ๋ณด์•ˆ: ๋‹ค์–‘ํ•œ ์ธ์ฆ ๋ฐฉ์‹๊ณผ ์•”ํ˜ธํ™”๋ฅผ ์ง€์›ํ•ด.
  • ๐ŸŒ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ ์ง€์›: ์ƒค๋”ฉ(Sharding)์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์—ฌ๋Ÿฌ ์„œ๋ฒ„์— ๋ถ„์‚ฐ ์ €์žฅํ•  ์ˆ˜ ์žˆ์–ด.
MongoDB์˜ ์ฃผ์š” ํŠน์ง• MongoDB ์œ ์—ฐํ•œ ์Šคํ‚ค๋งˆ ๊ฐ•๋ ฅํ•œ ์ฟผ๋ฆฌ ๋†’์€ ์„ฑ๋Šฅ ๋ณด์•ˆ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ

์ด๋Ÿฐ ํŠน์ง•๋“ค ๋•Œ๋ฌธ์— MongoDB๋Š” ๋‹ค์–‘ํ•œ ๋ถ„์•ผ์—์„œ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์–ด. ํŠนํžˆ ์‹ค์‹œ๊ฐ„ ๋ถ„์„, ์ฝ˜ํ…์ธ  ๊ด€๋ฆฌ, ๋ชจ๋ฐ”์ผ ์•ฑ ๋ฐฑ์—”๋“œ ๋“ฑ์—์„œ ๋งŽ์ด ์“ฐ์ด์ง€.

๐Ÿ’ก ์žฌ๋Šฅ๋„ท ํ™œ์šฉ Tip: ๋งŒ์•ฝ ๋„ค๊ฐ€ ์žฌ๋Šฅ๋„ท์—์„œ ์›น ๊ฐœ๋ฐœ์ด๋‚˜ ์•ฑ ๊ฐœ๋ฐœ ๊ด€๋ จ ์žฌ๋Šฅ์„ ๊ณต์œ ํ•˜๊ณ  ์žˆ๋‹ค๋ฉด, MongoDB ์Šคํ‚ฌ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๋„ ์ข‹์€ ์•„์ด๋””์–ด์•ผ. ์š”์ฆ˜ ๋งŽ์€ ์Šคํƒ€ํŠธ์—…์ด๋‚˜ ํ˜„๋Œ€์ ์ธ ์›น ์„œ๋น„์Šค๋“ค์ด MongoDB๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ฑฐ๋“ !

๐Ÿค” MongoDB vs ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค

MongoDB์™€ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(์˜ˆ: MySQL, PostgreSQL)๋Š” ๊ฐ๊ฐ ์žฅ๋‹จ์ ์ด ์žˆ์–ด. ์–ด๋–ค ์ƒํ™ฉ์—์„œ MongoDB๋ฅผ ์„ ํƒํ•˜๋Š” ๊ฒŒ ์ข‹์„๊นŒ?

  • ๐Ÿ“Š ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๊ฐ€ ์ž์ฃผ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒฝ์šฐ: MongoDB์˜ ์œ ์—ฐํ•œ ์Šคํ‚ค๋งˆ๊ฐ€ ์œ ๋ฆฌํ•ด.
  • ๐Ÿš€ ๋น ๋ฅธ ๊ฐœ๋ฐœ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ: ์Šคํ‚ค๋งˆ ์„ค๊ณ„์— ์‹œ๊ฐ„์„ ๋œ ์“ฐ๊ณ  ๋น ๋ฅด๊ฒŒ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ์–ด.
  • ๐Ÿ“ˆ ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ: MongoDB์˜ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ ์ง€์›์ด ๋„์›€์ด ๋ผ.
  • ๐ŸŒ ๋ณต์žกํ•œ ๊ณ„์ธต ๊ตฌ์กฐ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ: ๋ฌธ์„œ ๋ชจ๋ธ์ด ์ด๋Ÿฐ ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ ์ข‹์•„.

ํ•˜์ง€๋งŒ ๋ชจ๋“  ์ƒํ™ฉ์—์„œ MongoDB๊ฐ€ ์ตœ์„ ์€ ์•„๋‹ˆ์•ผ. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฐ์ดํ„ฐ ๊ฐ„์˜ ๋ณต์žกํ•œ ๊ด€๊ณ„๋ฅผ ๋‹ค๋ค„์•ผ ํ•˜๊ฑฐ๋‚˜, ํŠธ๋žœ์žญ์…˜์˜ ์ผ๊ด€์„ฑ์ด ๋งค์šฐ ์ค‘์š”ํ•œ ๊ฒฝ์šฐ(์˜ˆ: ๊ธˆ์œต ์‹œ์Šคํ…œ)์—๋Š” ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ๋” ์ ํ•ฉํ•  ์ˆ˜ ์žˆ์–ด.

์ค‘์š”ํ•œ ๊ฑด ์ƒํ™ฉ์— ๋งž๋Š” ์ ์ ˆํ•œ ๋„๊ตฌ๋ฅผ ์„ ํƒํ•˜๋Š” ๊ฑฐ์•ผ. MongoDB๋ฅผ ๊ณต๋ถ€ํ•˜๋ฉด์„œ ์ด๋Ÿฐ ํŒ๋‹จ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ๋„ ํ•จ๊ป˜ ๊ธฐ๋ฅด๋ฉด ์ข‹๊ฒ ์–ด!

๐Ÿ›  MongoDB ์„ค์น˜ํ•˜๊ธฐ

์ž, ์ด์ œ MongoDB์— ๋Œ€ํ•ด ์–ด๋Š ์ •๋„ ์•Œ๊ฒŒ ๋์œผ๋‹ˆ๊นŒ ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•ด๋ณผ ์ฐจ๋ก€์•ผ. ๋จผ์ € MongoDB๋ฅผ ์„ค์น˜ํ•ด๋ณด์ž!

MongoDB๋Š” ๋‹ค์–‘ํ•œ ์šด์˜ ์ฒด์ œ๋ฅผ ์ง€์›ํ•ด. Windows, macOS, Linux ๋ชจ๋‘ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์–ด. ์—ฌ๊ธฐ์„œ๋Š” Windows ๊ธฐ์ค€์œผ๋กœ ์„ค๋ช…ํ• ๊ฒŒ.

  1. MongoDB ๊ณต์‹ ์›น์‚ฌ์ดํŠธ(https://www.mongodb.com/try/download/community)์— ์ ‘์†ํ•ด.
  2. 'Community Server' ํƒญ์„ ์„ ํƒํ•˜๊ณ , ์ตœ์‹  ๋ฒ„์ „์„ ๋‹ค์šด๋กœ๋“œํ•ด.
  3. ๋‹ค์šด๋กœ๋“œํ•œ ์„ค์น˜ ํŒŒ์ผ์„ ์‹คํ–‰ํ•˜๊ณ , ์•ˆ๋‚ด์— ๋”ฐ๋ผ ์„ค์น˜๋ฅผ ์ง„ํ–‰ํ•ด.
  4. ์„ค์น˜๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด MongoDB Compass๋ผ๋Š” GUI ๋„๊ตฌ๋„ ํ•จ๊ป˜ ์„ค์น˜๋˜๋Š”๋ฐ, ์ด๊ฑธ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‰ฝ๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด.

๐ŸŒŸ Pro Tip: MongoDB๋ฅผ ์„ค์น˜ํ•  ๋•Œ "Install MongoDB as a Service"์™€ "Install MongoDB Compass" ์˜ต์…˜์„ ์ฒดํฌํ•˜๋Š” ๊ฑธ ์ถ”์ฒœํ•ด. ์„œ๋น„์Šค๋กœ ์„ค์น˜ํ•˜๋ฉด ์ปดํ“จํ„ฐ๋ฅผ ์ผค ๋•Œ๋งˆ๋‹ค ์ž๋™์œผ๋กœ MongoDB๊ฐ€ ์‹คํ–‰๋˜๊ณ , Compass๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ์ •๋ง ์œ ์šฉํ•ด!

์„ค์น˜๊ฐ€ ์™„๋ฃŒ๋๋‹ค๋ฉด, ์ด์ œ MongoDB๋ฅผ ์‚ฌ์šฉํ•  ์ค€๋น„๊ฐ€ ๋œ ๊ฑฐ์•ผ! ๐ŸŽ‰

๐Ÿš€ MongoDB ์‹œ์ž‘ํ•˜๊ธฐ

MongoDB๋ฅผ ์„ค์น˜ํ–ˆ์œผ๋‹ˆ ์ด์ œ ๊ฐ„๋‹จํžˆ ์‚ฌ์šฉํ•ด๋ณผ๊นŒ? ๋ช…๋ น ํ”„๋กฌํ”„ํŠธ(cmd)๋ฅผ ์—ด๊ณ  ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•ด๋ด:

mongo

์ด ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด MongoDB ์…ธ์— ์ ‘์†ํ•  ์ˆ˜ ์žˆ์–ด. ์—ฌ๊ธฐ์„œ ๋‹ค์–‘ํ•œ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์ง€.

์˜ˆ๋ฅผ ๋“ค์–ด, ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๋ฉด:

use myNewDatabase

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด 'myNewDatabase'๋ผ๋Š” ์ด๋ฆ„์˜ ์ƒˆ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ์„ ํƒ๋ผ.

์ปฌ๋ ‰์…˜(Collection)์— ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด:

db.users.insertOne({name: "ํ™๊ธธ๋™", age: 30, skills: ["Python", "MongoDB"]})

์ด ๋ช…๋ น์–ด๋Š” 'users'๋ผ๋Š” ์ปฌ๋ ‰์…˜์— ์ƒˆ๋กœ์šด ๋ฌธ์„œ๋ฅผ ์ถ”๊ฐ€ํ•ด. MongoDB์—์„œ๋Š” ํ…Œ์ด๋ธ” ๋Œ€์‹  ์ปฌ๋ ‰์…˜์ด๋ผ๋Š” ๊ฐœ๋…์„ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฑธ ๊ธฐ์–ตํ•ด!

๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด:

db.users.find()

์ด ๋ช…๋ น์–ด๋กœ 'users' ์ปฌ๋ ‰์…˜์˜ ๋ชจ๋“  ๋ฌธ์„œ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์–ด.

์–ด๋•Œ? ์ƒ๊ฐ๋ณด๋‹ค ๊ฐ„๋‹จํ•˜์ง€? ์ด๊ฒŒ ๋ฐ”๋กœ MongoDB์˜ ๋งค๋ ฅ์ด์•ผ. ๋ณต์žกํ•œ ์„ค์ • ์—†์ด๋„ ๋น ๋ฅด๊ฒŒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€.

๐Ÿ’ก ์ฐธ๊ณ : MongoDB์˜ ๊ธฐ๋ณธ ํฌํŠธ๋Š” 27017์ด์•ผ. ๋งŒ์•ฝ ์ด ํฌํŠธ๊ฐ€ ์ด๋ฏธ ์‚ฌ์šฉ ์ค‘์ด๋ผ๋ฉด MongoDB ์‹คํ–‰์ด ์•ˆ ๋  ์ˆ˜ ์žˆ์–ด. ๊ทธ๋Ÿด ๋•Œ๋Š” ํฌํŠธ๋ฅผ ๋ณ€๊ฒฝํ•ด์„œ ์‹คํ–‰ํ•ด์•ผ ํ•ด.

์ž, ์ด์ œ MongoDB์˜ ๊ธฐ๋ณธ์ ์ธ ์‚ฌ์šฉ๋ฒ•์„ ์•Œ๊ฒŒ ๋์–ด. ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ์˜ ๋ชฉํ‘œ๋Š” Python๊ณผ ํ•จ๊ป˜ MongoDB๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฑฐ์•ผ. ๊ทธ๋ž˜์„œ ๋‹ค์Œ์œผ๋กœ๋Š” PyMongo์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๊ฑฐ์•ผ. PyMongo๋Š” Python์—์„œ MongoDB๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋“œ๋ผ์ด๋ฒ„์•ผ. ์ค€๋น„๋๋‹ˆ? ๊ณ„์† ๊ฐ€๋ณด์ž๊ณ ! ๐Ÿš€

๐Ÿ PyMongo: Python๊ณผ MongoDB์˜ ํ™˜์ƒ์˜ ์ฝœ๋ผ๋ณด

์ž, ์ด์ œ ์šฐ๋ฆฌ์˜ ์ฃผ์ธ๊ณต PyMongo๊ฐ€ ๋“ฑ์žฅํ•  ์ฐจ๋ก€์•ผ! PyMongo๋Š” ๋ญ๋ƒ๊ณ ? ๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ Python์—์„œ MongoDB๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์•ผ. Python๊ณผ MongoDB๋ฅผ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ๋‹ค๋ฆฌ ์—ญํ• ์„ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋ผ.

๐Ÿค” PyMongo๊ฐ€ ์™œ ํ•„์š”ํ•ด?

PyMongo๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Python ์ฝ”๋“œ ์•ˆ์—์„œ ์ง์ ‘ MongoDB๋ฅผ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์–ด. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ, ๋ฐ์ดํ„ฐ ์‚ฝ์ž…, ์กฐํšŒ, ์ˆ˜์ •, ์‚ญ์ œ ๋“ฑ ๋ชจ๋“  ์ž‘์—…์„ Python ์ฝ”๋“œ๋กœ ํ•  ์ˆ˜ ์žˆ์ง€. ์ด๊ฒŒ ์–ผ๋งˆ๋‚˜ ํŽธ๋ฆฌํ•œ์ง€ ๊ณง ์•Œ๊ฒŒ ๋  ๊ฑฐ์•ผ!

๐Ÿ’ก ์žฌ๋Šฅ๋„ท Tip: Python๊ณผ MongoDB ์Šคํ‚ฌ์„ ๋ชจ๋‘ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด, ์žฌ๋Šฅ๋„ท์—์„œ ๋” ๋‹ค์–‘ํ•œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ˆ˜์ฃผํ•  ์ˆ˜ ์žˆ์„ ๊ฑฐ์•ผ. ์›น ๊ฐœ๋ฐœ, ๋ฐ์ดํ„ฐ ๋ถ„์„, ๋จธ์‹ ๋Ÿฌ๋‹ ๋“ฑ ๋‹ค์–‘ํ•œ ๋ถ„์•ผ์—์„œ ์ด ์กฐํ•ฉ์ด ์‚ฌ์šฉ๋˜๊ฑฐ๋“ !

๐Ÿ›  PyMongo ์„ค์น˜ํ•˜๊ธฐ

PyMongo๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋จผ์ € ์„ค์น˜ํ•ด์•ผ ํ•ด. ๋‹คํ–‰ํžˆ ์„ค์น˜ ๊ณผ์ •์€ ์•„์ฃผ ๊ฐ„๋‹จํ•ด! ๋ช…๋ น ํ”„๋กฌํ”„ํŠธ(cmd)๋‚˜ ํ„ฐ๋ฏธ๋„์„ ์—ด๊ณ  ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ๋ผ:

pip install pymongo

์ด ๋ช…๋ น์–ด๋กœ PyMongo์˜ ์ตœ์‹  ๋ฒ„์ „์ด ์„ค์น˜๋  ๊ฑฐ์•ผ. ํ˜น์‹œ ํŠน์ • ๋ฒ„์ „์„ ์„ค์น˜ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ด๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์žˆ์–ด:

pip install pymongo==3.11.0

์„ค์น˜๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ์ด์ œ PyMongo๋ฅผ ์‚ฌ์šฉํ•  ์ค€๋น„๊ฐ€ ๋œ ๊ฑฐ์•ผ! ๐ŸŽ‰

๐Ÿš€ PyMongo ์‹œ์ž‘ํ•˜๊ธฐ

์ž, ์ด์ œ PyMongo๋ฅผ ์‚ฌ์šฉํ•ด๋ณผ ์ฐจ๋ก€์•ผ. ๋จผ์ € Python ์Šคํฌ๋ฆฝํŠธ์—์„œ PyMongo๋ฅผ ์ž„ํฌํŠธํ•˜๊ณ  MongoDB์— ์—ฐ๊ฒฐํ•ด๋ณด์ž:


from pymongo import MongoClient

# MongoDB์— ์—ฐ๊ฒฐ
client = MongoClient('mongodb://localhost:27017/')

# ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ ํƒ (์—†์œผ๋ฉด ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋จ)
db = client['myNewDatabase']

# ์ปฌ๋ ‰์…˜ ์„ ํƒ (์—†์œผ๋ฉด ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋จ)
collection = db['users']

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด MongoDB์— ์—ฐ๊ฒฐํ•˜๊ณ , 'myNewDatabase'๋ผ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ 'users' ์ปฌ๋ ‰์…˜์„ ์‚ฌ์šฉํ•  ์ค€๋น„๊ฐ€ ๋œ ๊ฑฐ์•ผ.

๐Ÿ“ ๋ฐ์ดํ„ฐ ์‚ฝ์ž…ํ•˜๊ธฐ

์ด์ œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•ด๋ณผ๊นŒ? PyMongo๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Python ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ๊ทธ๋Œ€๋กœ MongoDB ๋ฌธ์„œ๋กœ ์ €์žฅํ•  ์ˆ˜ ์žˆ์–ด. ์ •๋ง ํŽธ๋ฆฌํ•˜์ง€?


# ๋‹จ์ผ ๋ฌธ์„œ ์‚ฝ์ž…
user = {"name": "ํ™๊ธธ๋™", "age": 30, "skills": ["Python", "MongoDB"]}
result = collection.insert_one(user)
print(f"Inserted document ID: {result.inserted_id}")

# ์—ฌ๋Ÿฌ ๋ฌธ์„œ ํ•œ ๋ฒˆ์— ์‚ฝ์ž…
users = [
    {"name": "๊น€์ฒ ์ˆ˜", "age": 25, "skills": ["JavaScript", "React"]},
    {"name": "์ด์˜ํฌ", "age": 28, "skills": ["Java", "Spring"]}
]
result = collection.insert_many(users)
print(f"Inserted document IDs: {result.inserted_ids}")

์ด๋ ‡๊ฒŒ ๊ฐ„๋‹จํžˆ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ์–ด! insert_one()์€ ๋‹จ์ผ ๋ฌธ์„œ๋ฅผ, insert_many()๋Š” ์—ฌ๋Ÿฌ ๋ฌธ์„œ๋ฅผ ํ•œ ๋ฒˆ์— ์‚ฝ์ž…ํ•  ๋•Œ ์‚ฌ์šฉํ•ด.

๐Ÿ” ๋ฐ์ดํ„ฐ ์กฐํšŒํ•˜๊ธฐ

๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ–ˆ์œผ๋‹ˆ ์ด์ œ ์กฐํšŒํ•ด๋ณผ๊นŒ? PyMongo๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์–ด:


# ๋ชจ๋“  ๋ฌธ์„œ ์กฐํšŒ
for user in collection.find():
    print(user)

# ์กฐ๊ฑด์— ๋งž๋Š” ๋ฌธ์„œ ์กฐํšŒ
result = collection.find_one({"name": "ํ™๊ธธ๋™"})
print(result)

# ํŠน์ • ํ•„๋“œ๋งŒ ์กฐํšŒ
for user in collection.find({}, {"name": 1, "age": 1, "_id": 0}):
    print(user)

find()๋Š” ๋ชจ๋“  ๋ฌธ์„œ๋ฅผ ์กฐํšŒํ•˜๊ณ , find_one()์€ ์กฐ๊ฑด์— ๋งž๋Š” ์ฒซ ๋ฒˆ์งธ ๋ฌธ์„œ๋งŒ ๋ฐ˜ํ™˜ํ•ด. ๋‘ ๋ฒˆ์งธ ์ธ์ž๋กœ ํ•„๋“œ๋ฅผ ์ง€์ •ํ•˜๋ฉด ํŠน์ • ํ•„๋“œ๋งŒ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์–ด.

๐Ÿ”„ ๋ฐ์ดํ„ฐ ์ˆ˜์ •ํ•˜๊ธฐ

์ด์ œ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•ด๋ณผ ์ฐจ๋ก€์•ผ. PyMongo์—์„œ๋Š” update_one()๊ณผ update_many()๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์–ด:


# ๋‹จ์ผ ๋ฌธ์„œ ์ˆ˜์ •
result = collection.update_one(
    {"name": "ํ™๊ธธ๋™"},
    {"$set": {"  age": 31}}
)
print(f"Modified {result.modified_count} document")

# ์—ฌ๋Ÿฌ ๋ฌธ์„œ ์ˆ˜์ •
result = collection.update_many(
    {"age": {"$lt": 30}},
    {"$inc": {"age": 1}}
)
print(f"Modified {result.modified_count} documents")

update_one()์€ ์กฐ๊ฑด์— ๋งž๋Š” ์ฒซ ๋ฒˆ์งธ ๋ฌธ์„œ๋ฅผ, update_many()๋Š” ์กฐ๊ฑด์— ๋งž๋Š” ๋ชจ๋“  ๋ฌธ์„œ๋ฅผ ์ˆ˜์ •ํ•ด. $set์€ ํ•„๋“œ ๊ฐ’์„ ์„ค์ •ํ•˜๊ณ , $inc๋Š” ์ˆซ์ž ํ•„๋“œ์˜ ๊ฐ’์„ ์ฆ๊ฐ€์‹œ์ผœ.

๐Ÿ—‘ ๋ฐ์ดํ„ฐ ์‚ญ์ œํ•˜๊ธฐ

๋งˆ์ง€๋ง‰์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์ž:


# ๋‹จ์ผ ๋ฌธ์„œ ์‚ญ์ œ
result = collection.delete_one({"name": "ํ™๊ธธ๋™"})
print(f"Deleted {result.deleted_count} document")

# ์—ฌ๋Ÿฌ ๋ฌธ์„œ ์‚ญ์ œ
result = collection.delete_many({"age": {"$gte": 30}})
print(f"Deleted {result.deleted_count} documents")

delete_one()์€ ์กฐ๊ฑด์— ๋งž๋Š” ์ฒซ ๋ฒˆ์งธ ๋ฌธ์„œ๋ฅผ, delete_many()๋Š” ์กฐ๊ฑด์— ๋งž๋Š” ๋ชจ๋“  ๋ฌธ์„œ๋ฅผ ์‚ญ์ œํ•ด.

๐Ÿ” ๊ณ ๊ธ‰ ์ฟผ๋ฆฌ ๊ธฐ๋Šฅ

PyMongo๋Š” MongoDB์˜ ๊ฐ•๋ ฅํ•œ ์ฟผ๋ฆฌ ๊ธฐ๋Šฅ์„ ๋ชจ๋‘ ์ง€์›ํ•ด. ๋ช‡ ๊ฐ€์ง€ ์˜ˆ๋ฅผ ๋” ์‚ดํŽด๋ณผ๊นŒ?


# ์ •๋ ฌ
for user in collection.find().sort("age", -1):
    print(user)

# ์ œํ•œ
for user in collection.find().limit(5):
    print(user)

# ์ง‘๊ณ„
pipeline = [
    {"$group": {"_id": "$age", "count": {"$sum": 1}}},
    {"$sort": {"count": -1}}
]
for result in collection.aggregate(pipeline):
    print(result)

์ด๋Ÿฐ ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ๋“ค์„ ํ™œ์šฉํ•˜๋ฉด ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ๋ถ„์„๋„ ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ์–ด!

๐ŸŒŸ Pro Tip: MongoDB์˜ ์ฟผ๋ฆฌ ์ตœ์ ํ™”์— ๋Œ€ํ•ด ๊ณต๋ถ€ํ•ด๋ณด๋Š” ๊ฒƒ๋„ ์ข‹์•„. ์ธ๋ฑ์Šค๋ฅผ ์ž˜ ํ™œ์šฉํ•˜๋ฉด ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ์—์„œ๋„ ๋น ๋ฅธ ๊ฒ€์ƒ‰์ด ๊ฐ€๋Šฅํ•ด์ ธ. ์ด๋Ÿฐ ์Šคํ‚ฌ์€ ์žฌ๋Šฅ๋„ท์—์„œ ๊ณ ๊ธ‰ ๊ฐœ๋ฐœ์ž๋กœ ์ธ์ •๋ฐ›๋Š” ๋ฐ ๋„์›€์ด ๋  ๊ฑฐ์•ผ!

๐Ÿ”’ ๋ณด์•ˆ๊ณผ ์ธ์ฆ

์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๋ณด์•ˆ์ด ์ค‘์š”ํ•ด. PyMongo์—์„œ ์ธ์ฆ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์ž:


client = MongoClient('mongodb://username:password@localhost:27017/')

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์‚ฌ์šฉ์ž ์ด๋ฆ„๊ณผ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์‚ฌ์šฉํ•ด MongoDB์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์–ด. ๋ฌผ๋ก  ์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์ด๋Ÿฐ ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋‚˜ ์„ค์ • ํŒŒ์ผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒŒ ์ข‹์•„.

๐Ÿš€ ์‹ค์ „ ์˜ˆ์ œ: ์žฌ๋Šฅ๋„ท ์‚ฌ์šฉ์ž ๊ด€๋ฆฌ ์‹œ์Šคํ…œ

์ž, ์ด์ œ ์šฐ๋ฆฌ๊ฐ€ ๋ฐฐ์šด ๋‚ด์šฉ์„ ํ™œ์šฉํ•ด์„œ ๊ฐ„๋‹จํ•œ ์žฌ๋Šฅ๋„ท ์‚ฌ์šฉ์ž ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์„ ๋งŒ๋“ค์–ด๋ณผ๊นŒ? ์ด ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด PyMongo์˜ ์‹ค์ œ ์‚ฌ์šฉ๋ฒ•์„ ๋” ์ž˜ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์„ ๊ฑฐ์•ผ.


from pymongo import MongoClient
from bson.objectid import ObjectId

class TalentNetUserSystem:
    def __init__(self):
        self.client = MongoClient('mongodb://localhost:27017/')
        self.db = self.client['talentnet']
        self.users = self.db['users']

    def add_user(self, name, email, skills):
        user = {
            "name": name,
            "email": email,
            "skills": skills,
            "rating": 0,
            "projects_completed": 0
        }
        result = self.users.insert_one(user)
        return result.inserted_id

    def get_user(self, user_id):
        return self.users.find_one({"_id": ObjectId(user_id)})

    def update_user_skills(self, user_id, new_skills):
        result = self.users.update_one(
            {"_id": ObjectId(user_id)},
            {"$set": {"skills": new_skills}}
        )
        return result.modified_count

    def complete_project(self, user_id):
        result = self.users.update_one(
            {"_id": ObjectId(user_id)},
            {"$inc": {"projects_completed": 1}}
        )
        return result.modified_count

    def get_top_users(self, limit=5):
        return list(self.users.find().sort("projects_completed", -1).limit(limit))

# ์‹œ์Šคํ…œ ์‚ฌ์šฉ ์˜ˆ
system = TalentNetUserSystem()

# ์‚ฌ์šฉ์ž ์ถ”๊ฐ€
user_id = system.add_user("ํ™๊ธธ๋™", "hong@example.com", ["Python", "MongoDB"])
print(f"Added user with ID: {user_id}")

# ์‚ฌ์šฉ์ž ์ •๋ณด ์กฐํšŒ
user = system.get_user(user_id)
print(f"User info: {user}")

# ์‚ฌ์šฉ์ž ์Šคํ‚ฌ ์—…๋ฐ์ดํŠธ
system.update_user_skills(user_id, ["Python", "MongoDB", "Django"])
user = system.get_user(user_id)
print(f"Updated user skills: {user['skills']}")

# ํ”„๋กœ์ ํŠธ ์™„๋ฃŒ ์ฒ˜๋ฆฌ
system.complete_project(user_id)
user = system.get_user(user_id)
print(f"Projects completed: {user['projects_completed']}")

# ์ƒ์œ„ ์‚ฌ์šฉ์ž ์กฐํšŒ
top_users = system.get_top_users()
print("Top users:")
for user in top_users:
    print(f"{user['name']}: {user['projects_completed']} projects")

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

๐ŸŽ“ ๋งˆ๋ฌด๋ฆฌ

์ž, ์—ฌ๊ธฐ๊นŒ์ง€ PyMongo๋ฅผ ์‚ฌ์šฉํ•ด MongoDB๋ฅผ ๋‹ค๋ฃจ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ดค์–ด. ์–ด๋•Œ? ์ƒ๊ฐ๋ณด๋‹ค ์‰ฝ์ง€? PyMongo๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Python์˜ ํŽธ๋ฆฌํ•จ๊ณผ MongoDB์˜ ๊ฐ•๋ ฅํ•จ์„ ๋™์‹œ์— ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์–ด. ์ด๋Ÿฐ ์Šคํ‚ฌ์€ ํ˜„๋Œ€์ ์ธ ์›น ๊ฐœ๋ฐœ์ด๋‚˜ ๋ฐ์ดํ„ฐ ๋ถ„์„ ํ”„๋กœ์ ํŠธ์—์„œ ์ •๋ง ์œ ์šฉํ•˜๊ฒŒ ์“ฐ์ผ ๊ฑฐ์•ผ.

๊ธฐ์–ตํ•ด, NoSQL๊ณผ SQL์€ ๊ฐ๊ฐ์˜ ์žฅ๋‹จ์ ์ด ์žˆ์–ด. ์ƒํ™ฉ์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ๋„๊ตฌ๋ฅผ ์„ ํƒํ•˜๋Š” ๊ฒŒ ์ค‘์š”ํ•ด. MongoDB์™€ PyMongo๋Š” ํŠนํžˆ ๋น ๋ฅธ ๊ฐœ๋ฐœ๊ณผ ์œ ์—ฐํ•œ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ์ด ํ•„์š”ํ•œ ํ”„๋กœ์ ํŠธ์— ์ ํ•ฉํ•ด. ์žฌ๋Šฅ๋„ท ๊ฐ™์€ ํ”Œ๋žซํผ์„ ๋งŒ๋“ ๋‹ค๋ฉด ์‚ฌ์šฉ์ž ํ”„๋กœํ•„, ํ”„๋กœ์ ํŠธ ์ •๋ณด, ๋ฆฌ๋ทฐ ๋“ฑ์„ ์ €์žฅํ•˜๋Š” ๋ฐ ์•„์ฃผ ์ข‹์„ ๊ฑฐ์•ผ.

์ด์ œ ๋„ˆ๋„ NoSQL ์ „๋ฌธ๊ฐ€์˜ ๊ธธ์— ํ•œ ๋ฐœ์ง ๋‹ค๊ฐ€์„ฐ์–ด! ๐ŸŽ‰ ๊ณ„์†ํ•ด์„œ ์‹ค์Šตํ•˜๊ณ  ๊ฒฝํ—˜์„ ์Œ“๋‹ค ๋ณด๋ฉด ์–ด๋Š์ƒˆ ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋Š” ํ”„๋กœ์ ํŠธ๋„ ์ž์‹  ์žˆ๊ฒŒ ํ•  ์ˆ˜ ์žˆ์„ ๊ฑฐ์•ผ. ํ™”์ดํŒ…! ๐Ÿ’ช