๐ NoSQL ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ์ฉ: MongoDB์ PyMongo ๐

์๋ , ์น๊ตฌ๋ค! ์ค๋์ ์ ๋ง ํฅ๋ฏธ์ง์งํ ์ฃผ์ ๋ก ์ฐพ์์์ด. ๋ฐ๋ก NoSQL ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ทธ ์ค์์๋ ํนํ MongoDB, ๊ทธ๋ฆฌ๊ณ Python์์ MongoDB๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ํด์ฃผ๋ PyMongo์ ๋ํด ์ด์ผ๊ธฐํด๋ณผ ๊ฑฐ์ผ. ๐
์ด ๊ธ์ ์ฝ๋ค ๋ณด๋ฉด ๋๋ ๋ชจ๋ฅด๊ฒ NoSQL์ ๋งค๋ ฅ์ ํน ๋น ์ง ๊ฑฐ์ผ. ๊ทธ๋ฆฌ๊ณ ํน์ ๋ชจ๋ฅด์ง, ์ด๋ฐ ์ง์์ ๋ฐํ์ผ๋ก ์ฌ๋ฅ๋ท์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ จ ์ฌ๋ฅ์ ๊ณต์ ํ๊ฒ ๋ ์ง๋? ๐ค ์, ๊ทธ๋ผ ์์ํด๋ณผ๊น?
๐ก ์ ๊น! NoSQL์ด ๋ญ์ง ์ ํ ๋ชจ๋ฅด๊ฒ ๋ค๊ณ ? ๊ฑฑ์ ๋ง. ์ฐ๋ฆฌ ํจ๊ป ์ฒ์ฒํ ์์๊ฐ ๋ณด์๊ณ . ์ด ์ฌ์ ์ด ๋๋ ๋์ฏค์ด๋ฉด, ๋ NoSQL ์ ๋ฌธ๊ฐ๊ฐ ๋์ด ์์ ๊ฑฐ์ผ!
๐ค NoSQL์ด ๋ญ์ผ? ์ ๊ฐ์๊ธฐ ๋ฑ์ฅํ ๊ฑฐ์ผ?
์, ๋จผ์ NoSQL์ ๋ํด ์์๋ณด์. NoSQL์ "Not Only SQL"์ ์ฝ์์ผ. ์ด๋ฆ๋ถํฐ ์ข ํน์ดํ์ง? ๐ง
NoSQL์ ๊ธฐ์กด์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์๋ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ๊ด๋ฆฌํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์คํ ์ด์ผ. ๊ทผ๋ฐ ์ ์ด๋ฐ ๊ฒ ํ์ํ์๊น?
๐ญ ์์ํด๋ณด์: ๋๊ฐ ์์ฒญ๋ ์ธ๊ธฐ๋ฅผ ๋๊ณ ์๋ ์์ ๋ฏธ๋์ด ์ฑ์ ๋ง๋ค์์ด. ์ ์ธ๊ณ ์ฌ๋๋ค์ด ๋์ ์ฑ์ ์ฌ์ฉํ๊ณ ์์ง. ๋งค์ผ ์๋ฐฑ๋ง ๊ฐ์ ๊ฒ์๋ฌผ, ๋๊ธ, ์ข์์๊ฐ ์์ฑ๋๊ณ ์์ด. ์ด๋ป๊ฒ ์ด ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ์ ์ฅํ๊ณ ๊ด๋ฆฌํ ์ ์์๊น?
๋ฐ๋ก ์ด๋ฐ ์ํฉ์์ NoSQL์ด ๋น์ ๋ฐํ๋ ๊ฑฐ์ผ! NoSQL ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๋ค์๊ณผ ๊ฐ์ ํน์ง์ ๊ฐ์ง๊ณ ์์ด:
- ๐ ํ์ฅ์ฑ: ๋ฐ์ดํฐ๊ฐ ๋์ด๋๋ ์ฝ๊ฒ ํ์ฅํ ์ ์์ด.
- ๐ ์ ์ฐ์ฑ: ๋ค์ํ ํํ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ ์์ด.
- โก ์ฑ๋ฅ: ๋๋์ ๋ฐ์ดํฐ๋ฅผ ๋น ๋ฅด๊ฒ ์ฒ๋ฆฌํ ์ ์์ด.
- ๐ ๊ฐ๋ฐ ํธ์์ฑ: ๊ฐ๋ฐ์ ์นํ์ ์ธ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์์ด.
์ด๋ฐ ํน์ง๋ค ๋๋ฌธ์ NoSQL์ ๋น ๋ฐ์ดํฐ, ์ค์๊ฐ ์น ์ ํ๋ฆฌ์ผ์ด์ , IoT ๋ฑ ๋ค์ํ ๋ถ์ผ์์ ์ฌ์ฉ๋๊ณ ์์ด. ์ฌ๋ฅ๋ท ๊ฐ์ ํ๋ซํผ์์๋ ์ฌ์ฉ์ ๋ฐ์ดํฐ๋ ๊ฑฐ๋ ์ ๋ณด๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐ NoSQL์ ํ์ฉํ ์ ์๊ฒ ์ง?
์์ ๊ทธ๋ฆผ์ ๋ณด๋ฉด 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๋ ๋ค์ํ ๋ถ์ผ์์ ์ฌ์ฉ๋๊ณ ์์ด. ํนํ ์ค์๊ฐ ๋ถ์, ์ฝํ ์ธ ๊ด๋ฆฌ, ๋ชจ๋ฐ์ผ ์ฑ ๋ฐฑ์๋ ๋ฑ์์ ๋ง์ด ์ฐ์ด์ง.
๐ก ์ฌ๋ฅ๋ท ํ์ฉ Tip: ๋ง์ฝ ๋ค๊ฐ ์ฌ๋ฅ๋ท์์ ์น ๊ฐ๋ฐ์ด๋ ์ฑ ๊ฐ๋ฐ ๊ด๋ จ ์ฌ๋ฅ์ ๊ณต์ ํ๊ณ ์๋ค๋ฉด, MongoDB ์คํฌ์ ์ถ๊ฐํ๋ ๊ฒ๋ ์ข์ ์์ด๋์ด์ผ. ์์ฆ ๋ง์ ์คํํธ์ ์ด๋ ํ๋์ ์ธ ์น ์๋น์ค๋ค์ด MongoDB๋ฅผ ์ฌ์ฉํ๊ณ ์๊ฑฐ๋ !
๐ค MongoDB vs ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค
MongoDB์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค(์: MySQL, PostgreSQL)๋ ๊ฐ๊ฐ ์ฅ๋จ์ ์ด ์์ด. ์ด๋ค ์ํฉ์์ MongoDB๋ฅผ ์ ํํ๋ ๊ฒ ์ข์๊น?
- ๐ ๋ฐ์ดํฐ ๊ตฌ์กฐ๊ฐ ์์ฃผ ๋ณ๊ฒฝ๋๋ ๊ฒฝ์ฐ: MongoDB์ ์ ์ฐํ ์คํค๋ง๊ฐ ์ ๋ฆฌํด.
- ๐ ๋น ๋ฅธ ๊ฐ๋ฐ์ด ํ์ํ ๊ฒฝ์ฐ: ์คํค๋ง ์ค๊ณ์ ์๊ฐ์ ๋ ์ฐ๊ณ ๋น ๋ฅด๊ฒ ๊ฐ๋ฐํ ์ ์์ด.
- ๐ ๋์ฉ๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๊ฐ ํ์ํ ๊ฒฝ์ฐ: MongoDB์ ๋ถ์ฐ ์์คํ ์ง์์ด ๋์์ด ๋ผ.
- ๐ ๋ณต์กํ ๊ณ์ธต ๊ตฌ์กฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ๋: ๋ฌธ์ ๋ชจ๋ธ์ด ์ด๋ฐ ๋ฐ์ดํฐ๋ฅผ ํํํ๊ธฐ ์ข์.
ํ์ง๋ง ๋ชจ๋ ์ํฉ์์ MongoDB๊ฐ ์ต์ ์ ์๋์ผ. ์๋ฅผ ๋ค์ด, ๋ฐ์ดํฐ ๊ฐ์ ๋ณต์กํ ๊ด๊ณ๋ฅผ ๋ค๋ค์ผ ํ๊ฑฐ๋, ํธ๋์ญ์ ์ ์ผ๊ด์ฑ์ด ๋งค์ฐ ์ค์ํ ๊ฒฝ์ฐ(์: ๊ธ์ต ์์คํ )์๋ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ๋ ์ ํฉํ ์ ์์ด.
์ค์ํ ๊ฑด ์ํฉ์ ๋ง๋ ์ ์ ํ ๋๊ตฌ๋ฅผ ์ ํํ๋ ๊ฑฐ์ผ. MongoDB๋ฅผ ๊ณต๋ถํ๋ฉด์ ์ด๋ฐ ํ๋จ์ ํ ์ ์๋ ๋ฅ๋ ฅ๋ ํจ๊ป ๊ธฐ๋ฅด๋ฉด ์ข๊ฒ ์ด!
๐ MongoDB ์ค์นํ๊ธฐ
์, ์ด์ MongoDB์ ๋ํด ์ด๋ ์ ๋ ์๊ฒ ๋์ผ๋๊น ์ค์ ๋ก ์ฌ์ฉํด๋ณผ ์ฐจ๋ก์ผ. ๋จผ์ MongoDB๋ฅผ ์ค์นํด๋ณด์!
MongoDB๋ ๋ค์ํ ์ด์ ์ฒด์ ๋ฅผ ์ง์ํด. Windows, macOS, Linux ๋ชจ๋ ์ค์นํ ์ ์์ด. ์ฌ๊ธฐ์๋ Windows ๊ธฐ์ค์ผ๋ก ์ค๋ช ํ ๊ฒ.
- MongoDB ๊ณต์ ์น์ฌ์ดํธ(https://www.mongodb.com/try/download/community)์ ์ ์ํด.
- 'Community Server' ํญ์ ์ ํํ๊ณ , ์ต์ ๋ฒ์ ์ ๋ค์ด๋ก๋ํด.
- ๋ค์ด๋ก๋ํ ์ค์น ํ์ผ์ ์คํํ๊ณ , ์๋ด์ ๋ฐ๋ผ ์ค์น๋ฅผ ์งํํด.
- ์ค์น๊ฐ ์๋ฃ๋๋ฉด 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 ์ ๋ฌธ๊ฐ์ ๊ธธ์ ํ ๋ฐ์ง ๋ค๊ฐ์ฐ์ด! ๐ ๊ณ์ํด์ ์ค์ตํ๊ณ ๊ฒฝํ์ ์๋ค ๋ณด๋ฉด ์ด๋์ ๋๊ท๋ชจ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋ ํ๋ก์ ํธ๋ ์์ ์๊ฒ ํ ์ ์์ ๊ฑฐ์ผ. ํ์ดํ ! ๐ช
๊ด๋ จ ํค์๋
- ์ง์์ธ์ ์ฒ - ์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
- ์ ์๊ถ ๋ฐ ์์ ๊ถ: ๋ณธ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ๋ ์ AI ๊ธฐ์ ๋ก ์์ฑ๋์์ผ๋ฉฐ, ๋ํ๋ฏผ๊ตญ ์ ์๊ถ๋ฒ ๋ฐ ๊ตญ์ ์ ์๊ถ ํ์ฝ์ ์ํด ๋ณดํธ๋ฉ๋๋ค.
- AI ์์ฑ ์ปจํ ์ธ ์ ๋ฒ์ ์ง์: ๋ณธ AI ์์ฑ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ์ง์ ์ฐฝ์๋ฌผ๋ก ์ธ์ ๋๋ฉฐ, ๊ด๋ จ ๋ฒ๊ท์ ๋ฐ๋ผ ์ ์๊ถ ๋ณดํธ๋ฅผ ๋ฐ์ต๋๋ค.
- ์ฌ์ฉ ์ ํ: ์ฌ๋ฅ๋ท์ ๋ช ์์ ์๋ฉด ๋์ ์์ด ๋ณธ ์ปจํ ์ธ ๋ฅผ ๋ณต์ , ์์ , ๋ฐฐํฌ, ๋๋ ์์ ์ ์ผ๋ก ํ์ฉํ๋ ํ์๋ ์๊ฒฉํ ๊ธ์ง๋ฉ๋๋ค.
- ๋ฐ์ดํฐ ์์ง ๊ธ์ง: ๋ณธ ์ปจํ ์ธ ์ ๋ํ ๋ฌด๋จ ์คํฌ๋ํ, ํฌ๋กค๋ง, ๋ฐ ์๋ํ๋ ๋ฐ์ดํฐ ์์ง์ ๋ฒ์ ์ ์ฌ์ ๋์์ด ๋ฉ๋๋ค.
- AI ํ์ต ์ ํ: ์ฌ๋ฅ๋ท์ AI ์์ฑ ์ปจํ ์ธ ๋ฅผ ํ AI ๋ชจ๋ธ ํ์ต์ ๋ฌด๋จ ์ฌ์ฉํ๋ ํ์๋ ๊ธ์ง๋๋ฉฐ, ์ด๋ ์ง์ ์ฌ์ฐ๊ถ ์นจํด๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
์ฌ๋ฅ๋ท์ ์ต์ AI ๊ธฐ์ ๊ณผ ๋ฒ๋ฅ ์ ๊ธฐ๋ฐํ์ฌ ์์ฌ์ ์ง์ ์ฌ์ฐ๊ถ์ ์ ๊ทน์ ์ผ๋ก ๋ณดํธํ๋ฉฐ,
๋ฌด๋จ ์ฌ์ฉ ๋ฐ ์นจํด ํ์์ ๋ํด ๋ฒ์ ๋์์ ํ ๊ถ๋ฆฌ๋ฅผ ๋ณด์ ํฉ๋๋ค.
ยฉ 2025 ์ฌ๋ฅ๋ท | All rights reserved.
๋๊ธ 0๊ฐ