2.1 NoSQL์ด๋ผ๋ ์ฉ์ด์ ๋ฑ์ฅ
์ต๊ทผ "NoSQL"์ด๋ผ๋ ์ฉ์ด๊ฐ ๋งค์ฐ ์ ํํ๊ณ ์ธ๊ธฐ๋ฅผ ์ป์์ผ๋ฉฐ ๋ชจ๋ ์ข ๋ฅ์ ์ํํธ์จ์ด ์๋ฃจ์ ์ด ์ด ๊ธฐํธ ์๋์์ ์ ๊ทน์ ์ผ๋ก ๊ฐ๋ฐ ๋ฐ ํ๋ณด๋๊ณ ์์ต๋๋ค. NoSQL์ ์์ฒญ๋ ์์ ๋ฐ์ดํฐ, ์ ํ ํ์ฅ์ฑ, ํด๋ฌ์คํฐ, ๋ด๊ฒฐํจ์ฑ, ๋น๊ด๊ณ์ฑ๊ณผ ๋์์ด๊ฐ ๋์์ต๋๋ค. ๊ทธ๋ฌ๋ NoSQL ์คํ ๋ฆฌ์ง๊ฐ ๋ฌด์์ธ์ง, ์ฉ์ด๊ฐ ์ด๋ป๊ฒ ๋ฑ์ฅํ๋์ง, ๊ทธ๋ฆฌ๊ณ ๊ณตํต์ ์ธ ํน์ง์ด ๋ฌด์์ธ์ง ๋ช ํํ๊ฒ ์ดํดํ๋ ์ฌ๋์ ๊ฑฐ์ ์์ต๋๋ค. ์ด ๊ฒฉ์ฐจ๋ฅผ ๋ฉ์ฐ๋๋ก ๋ ธ๋ ฅํฉ์๋ค.
์ด ์ฉ์ด์ ๊ฐ์ฅ ํฅ๋ฏธ๋ก์ด ์ ์ 90๋ ๋ ํ๋ฐ์ ์ฒ์ ์ฌ์ฉ๋์์์๋ ๋ถ๊ตฌํ๊ณ 2009๋ ์ค๋ฐ์ ํ์ฌ ์ฌ์ฉ๋๋ ํํ์์๋ง ์ง์ ํ ์๋ฏธ๋ฅผ ์ป์๋ค๋ ๊ฒ์ ๋๋ค. - ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ASCII ํ์ผ๋ก ์ ์ฅํ๊ณ SQL ๋์ ์ ธ ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ์ ์ก์ธ์คํ๋ Carlo Strozzi๊ฐ ๋ง๋ ์์ค ๋ฐ์ดํฐ๋ฒ ์ด์ค. ํ์ฌ ํํ์ "NoSQL"๊ณผ๋ ์๋ฌด๋ฐ ๊ด๋ จ์ด ์์ต๋๋ค.
2009๋ 6์ Johan Oskarsson์ ์ํ๋์์ค์ฝ์์ ํ์๋ฅผ ์กฐ์งํ์ฌ IT ์คํ ๋ฆฌ์ง ๋ฐ ์ฒ๋ฆฌ ์์ฅ์ ์๋ก์ด ๊ฒฝํฅ์ ๋ํด ๋ ผ์ํ์ต๋๋ค. ํ์์ ์ฃผ์ ์ถ์ง๋ ฅ์ BigTable ๋ฐ Dynamo์ ๊ฐ์ ์๋ก์ด ์คํ ์์ค ์ ํ์ด์์ต๋๋ค. ํ์์ ๋ฐ์ ํ์๋ฅผ ์ํด ํธ์ํฐ ํด์ํ๊ทธ์ ๋ฑ ๋ง๋ ํฌ๊ณ ๊ฐ๊ฒฐํ ์ฉ์ด๋ฅผ ์ฐพ์์ผ ํ์ต๋๋ค. ์ด๋ฌํ ์ฉ์ด ์ค ํ๋๋ RackSpace์ Eric Evans๊ฐ ์ ์ํ "NoSQL"์ ๋๋ค. ์ด ์ฉ์ด๋ ๋จ ํ ๋ฒ์ ํ์๋ฅผ ์ํด ๊ณํ๋์๊ณ ์๋ฏธ ๋ก ์ ์ผ๋ก ๊น์ ๋ถํ๊ฐ ์์์ง๋ง ๋ฐ์ด๋ด ๊ด๊ณ ์ฒ๋ผ ๊ธ๋ก๋ฒ ๋คํธ์ํฌ ์ ์ฒด์ ํผ์ ธ ์ฌ์ค์ IT ์ฐ์ ์ ์ ์ฒด ํธ๋ ๋์ ์ด๋ฆ์ด๋์์ต๋๋ค. ๊ทธ๊ฑด ๊ทธ๋ ๊ณ , Voldemort (Amazon Dynamo ํด๋ก ), Cassandra, Hbase (Google BigTable์ ์๋ ๋ก๊ทธ), Hypertable, CouchDB, MongoDB๊ฐ ํ์์์ ์ฐ์คํ์ต๋๋ค.
"NoSQL"์ด๋ผ๋ ์ฉ์ด๋ ๊ทธ ๊ธฐ์์ด ์์ ํ ์๋ฐ์ ์ด๋ฉฐ ์ผ๋ฐ์ ์ผ๋ก ์ธ์ ๋๋ ์ ์๋ ๊ณผํ์ ์ ๋๊ฐ ์๋ค๋ ์ ์ ๋ค์ ํ ๋ฒ ๊ฐ์กฐํ ๊ฐ์น๊ฐ ์์ต๋๋ค. ์ด ์ด๋ฆ์ ์คํ๋ ค ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ฒ์ด๋ IT ๊ฐ๋ฐ ๋ฒกํฐ์ ํน์ง์ ๋ํ๋ ๋๋ค. No SQL์ ์ง์ ์ ์ธ ์ ์๋ฅผ ์ง์งํ๋ ์ฌ๋๋ค์ด ์์ง๋ง Not Only SQL์ ์ฝ์์ ๋๋ค. Pramod Sadalaj์ Martin Fowler๋ ์ต๊ทผ ์ ์ "NoSQL Distilled"์์ NoSQL ์ธ๊ณ์ ๋ํ ์ง์์ ๊ทธ๋ฃนํํ๊ณ ์ฒด๊ณํํ๋ ค๊ณ ํ์ต๋๋ค.
2.2 NoSQL ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ธฐ๋ณธ ํน์ฑ
๋ง์ ์ด๊ธฐ์ข ์์คํ ์ด ํ์ฌ NoSQL ๋ ์ด๋ธ ์๋ ์จ๊ฒจ์ ธ ์๊ธฐ ๋๋ฌธ์ ๋ชจ๋ NoSQL์ ๋ํ ๊ณตํต์ ์ธ ํน์ฑ์ ๊ฑฐ์ ์์ต๋๋ค(์๋ง๋ ๊ฐ์ฅ ์์ ํ ๋ชฉ๋ก์ http://nosql-database.org/์์ ์ฐพ์ ์ ์์). ๋ง์ ํน์ฑ์ ํน์ NoSQL ๋ฐ์ดํฐ๋ฒ ์ด์ค์๋ง ํด๋น๋๋ฉฐ ๋์ดํ ๋ ๋ถ๋ช ํ ์ธ๊ธํ๊ฒ ์ต๋๋ค.
1. SQL์ ์ฌ์ฉํ์ง ์๋๋ค
๋ง์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์ ์๋ ค์ง ์ ํธ ๊ตฌ๋ฌธ๊ณผ ์ ์ฌํ ์ฟผ๋ฆฌ ์ธ์ด๋ฅผ ์ฌ์ฉํ๋ ค๊ณ ์๋ํ์ง๋ง ์๋ฌด๋ ์์ ํ ๊ตฌํํ์ง ๋ชปํ๊ณ ์ฑ๊ณตํ ๊ฐ๋ฅ์ฑ์ด ์๊ธฐ ๋๋ฌธ์ ANSI SQL DML์ ์๋ฏธํฉ๋๋ค. ์๋ฅผ ๋ค์ด hadup( http://www.drawntoscalehq.com/ ๋ฐ http://www.hadapt.com/ ) ์์ SQL์ ๊ตฌํํ๋ ค๊ณ ์๋ํ๋ ์ ์ ๊ธฐ์ ์ด ์๋ค๋ ์๋ฌธ์ด ์์ง๋ง .
2. ๋น์ ํ(์คํค๋ง๋ฆฌ์ค)
์๋ฏธ๋ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฌ๋ฆฌ NoSQL ๋ฐ์ดํฐ๋ฒ ์ด์ค์์๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๊ฐ ๊ท์ ๋์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค(ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ์ ์ถํ ๊ฒฝ์ฐ ์ฝํ๊ฒ ์ ๋ ฅ๋จ). ๋จผ์ ์ ์ธ์ ์ผ๋ก ๊ตฌ์กฐ๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ ๋ณ๋์ ์ค์ด๋ ๋ฌธ์์ ์์์ ํ๋๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค. ์ ์ฒด ํ ์ด๋ธ์. ๋ฐ๋ผ์ ๋ฐ์ดํฐ ๋ชจ๋ธ์ ๋ณ๊ฒฝํด์ผ ํ๋ ๊ฒฝ์ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ฐ์ํ๋ ๊ฒ๋ง์ผ๋ก๋ ์ถฉ๋ถํฉ๋๋ค.
์๋ฅผ ๋ค์ด MongoDB์์ ํ๋ ์ด๋ฆ์ ๋ฐ๊ฟ ๋:
BasicDBObject order = new BasicDBObject();
order.put("date", orderDate); // this field was a long time ago
order.put("totalSum", total); // before we just used "sum"
์์ฉ ํ๋ก๊ทธ๋จ ๋ ผ๋ฆฌ๋ฅผ ๋ณ๊ฒฝํ๋ฉด ์ฝ์ ๋๋ ์ ํ๋๊ฐ ํ์ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ฐ์ดํฐ ์คํค๋ง๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ด๋ฏธ ์กด์ฌํ๋ ๋ค๋ฅธ ์ฃผ๋ฌธ ๊ฐ์ฒด์์ totalSum ํ๋๊ฐ ๋๋ฝ๋์์ต๋๋ค. ์ด ์ํฉ์์ ์ถ๊ฐ ์กฐ์น๋ฅผ ์ํ ๋ ๊ฐ์ง ์ต์ ์ด ์์ต๋๋ค.
์ฒซ ๋ฒ์งธ๋ ๋ชจ๋ ๋ฌธ์๋ฅผ ํฌ๋กค๋งํ๊ณ ๋ชจ๋ ๊ธฐ์กด ๋ฌธ์์์ ์ด ํ๋๋ฅผ ์ ๋ฐ์ดํธํ๋ ๊ฒ์ ๋๋ค. ๋ฐ์ดํฐ์ ์์ผ๋ก ์ธํด ์ด ํ๋ก์ธ์ค๋ ์ ๊ธ ์์ด ๋ฐ์ํ๋ฏ๋ก(alter table rename column ๋ช ๋ น๊ณผ ์ ์ฌ) ์ ๋ฐ์ดํธ ์ค์ ์ด๋ฏธ ์กด์ฌํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฅธ ํ๋ก์ธ์ค์์ ์ฝ์ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋๋ฅผ ํ์ธํ๋ ๋ ๋ฒ์งธ ์ต์ ์ ๋ถ๊ฐํผํฉ๋๋ค.
BasicDBObject order = new BasicDBObject();
Double totalSum = order.getDouble("sum"); // This is the old model
if (totalSum == null)
totalSum = order.getDouble("totalSum"); // This is the updated model
๊ทธ๋ฆฌ๊ณ ์ด๋ฏธ ๋ค์ ๋ น์ํ ๋ ์ด ํ๋๋ฅผ ์๋ก์ด ํ์์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ธ ๊ฒ์ ๋๋ค.
์คํค๋ง๊ฐ ์๋ ์ ์พํ ๊ฒฐ๊ณผ๋ ํฌ์ ๋ฐ์ดํฐ ์์ ์ ํจ์จ์ฑ์ ๋๋ค. ํ ๋ฌธ์์ date_published ํ๋๊ฐ ์๊ณ ๋ ๋ฒ์งธ ๋ฌธ์์๋ ์์ผ๋ฉด ๋ ๋ฒ์งธ ๋ฌธ์์ ๋ํด ๋น date_published ํ๋๊ฐ ์์ฑ๋์ง ์์ต๋๋ค. ์ด๊ฒ์ ์์น์ ์ผ๋ก ๋ ผ๋ฆฌ์ ์ด์ง๋ง ๋ ๋ถ๋ช ํ ์๋ ์น์ํ ํ ์ด๋ธ/์ด ๊ฐ๋ ์ ์ฌ์ฉํ๋ ์ด ๊ณ์ด NoSQL ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋๋ค. ๊ทธ๋ฌ๋ ์คํค๋ง๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ด์ ์ ์ธ์ ์ผ๋ก ์ ์ธ๋์ง ์์ผ๋ฉฐ ์ฌ์ฉ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ธ์ ์ค์ ๋ณ๊ฒฝ/์ถ๊ฐ๋ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ํนํ ๋ชฉ๋ก ๊ตฌํ์ ์ํด ๋์ ์ด์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๊ตฌ์กฐํ๋์ง ์์ ์คํค๋ง์๋ ๋จ์ ์ด ์์ต๋๋ค. ์์์ ์ธ๊ธํ ๋ฐ์ดํฐ ๋ชจ๋ธ์ ๋ณ๊ฒฝํ ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋์ ์ค๋ฒํค๋ ์ธ์๋ ๊ธฐ๋ณธ์์ ๋ชจ๋ ์ข ๋ฅ์ ์ ํ์ด ์๋ค๋ ์ (null, ๊ณ ์ , ๊ฒ์ฌ ์ ์ฝ ์กฐ๊ฑด ๋ฑ)์ด ์์ต๋๋ค. ๋ค๋ฅธ ํ๋ก์ ํธ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ณ๋ ฌ๋ก ์์ ํ ๋ ๊ตฌ์กฐ ๋ฐ์ดํฐ๋ฅผ ์ดํดํ๊ณ ์ ์ดํ๋ โโ๋ฐ ์ถ๊ฐ์ ์ธ ์ด๋ ค์์ด ์์ต๋๋ค(๋ฐ์ดํฐ๋ฒ ์ด์ค ์ธก๋ฉด์ ์ฌ์ ์ด ์์). ๊ทธ๋ฌ๋ ๊ธ๋ณํ๋ ํ๋ ์ฌํ์์ ์ด๋ฌํ ์ ์ฐ์ฑ์ ์ฌ์ ํ โโ์ฅ์ ์ ๋๋ค. ์๋ฅผ ๋ค์ด Twitter๋ 5๋ ์ ์๋ ํธ์๊ณผ ํจ๊ป ์ฝ๊ฐ์ ์ถ๊ฐ ์ ๋ณด(์๊ฐ, Twitter ํธ๋ค ๋ฐ ๋ช ๋ฐ์ดํธ์ ์ถ๊ฐ ๋ฉํ ์ ๋ณด)๋ง ์ ์ฅํ์ง๋ง ์ง๊ธ์ ๋ฉ์์ง ์์ฒด ์ธ์๋ ๋ช ๊ฐ์ง ๋ ๋ง์ ์ ๋ณด๋ฅผ ์ ์ฅํ์ต๋๋ค. ํฌ๋ก๋ฐ์ดํธ์ ๋ฉํ๋ฐ์ดํฐ๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋ฉ๋๋ค.
(์ดํ ์ฃผ๋ก key-value, document ๋ฐ column-family ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํด ์ค๋ช ํ๋ฉฐ, ๊ทธ๋ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์๋ ์ด๋ฌํ ์์ฑ์ด ์์ ์ ์์)
2.3. ์ง๊ณ(aggregates) ํ์์ ๋ฐ์ดํฐ ํํ
์ ๊ทํ ๋ชฉ์ ์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ ผ๋ฆฌ์ ๋น์ฆ๋์ค ์ํฐํฐ๋ฅผ ๋ค์ํ ๋ฌผ๋ฆฌ์ ํ ์ด๋ธ์ ์ ์ฅํ๋ ๊ด๊ณํ ๋ชจ๋ธ๊ณผ ๋ฌ๋ฆฌ NoSQL ์ ์ฅ์๋ ์ด๋ฌํ ์ํฐํฐ์์ ์ ์ฒด์ ์ธ ๊ฐ์ฒด๋ก ์๋ํฉ๋๋ค.
์ด ์๋ ํ์ค ์ ์ ์๊ฑฐ๋ ๊ฐ๋ ์ ๊ด๊ณํ ๋ชจ๋ธ "์ฃผ๋ฌธ - ์ฃผ๋ฌธ ํญ๋ชฉ - ๊ฒฐ์ - ์ ํ"์ ๋ํ ์ง๊ณ๋ฅผ ๋ณด์ฌ์ค๋๋ค. ๋ ๊ฒฝ์ฐ ๋ชจ๋ ์ฃผ๋ฌธ์ ์์น์ ํ๋์ ๋ ผ๋ฆฌ์ ๊ฐ์ฒด๋ก ๊ฒฐํฉ๋๋ ๋ฐ๋ฉด ๊ฐ ์์น๋ ์ ํ์ ๋ํ ๋งํฌ์ ์ผ๋ถ ์์ฑ(์: ์ด๋ฆ)์ ์ ์ฅํฉ๋๋ค(์ด๋ฌํ ๋น์ ๊ทํ๋ ๊ฒ์ํ ๋ ์ ํ ๊ฐ์ฒด๋ฅผ ์์ฒญํ์ง ์๊ธฐ ์ํด ํ์ํฉ๋๋ค. ์ฃผ๋ฌธ - ๋ถ์ฐ ์์คํ ์ ๊ธฐ๋ณธ ๊ท์น์ ๊ฐ์ฒด ๊ฐ์ "์กฐ์ธ"์ ๋๋ค. ํ๋์ ์ง๊ณ์์ ์ง๋ถ์ ์ฃผ๋ฌธ๊ณผ ๊ฒฐํฉ๋๊ณ ๊ฐ์ฒด์ ํ์ ๋ถ๋ถ์ด๋ฉฐ ๋ค๋ฅธ ํ๋๋ ๋ณ๋์ ๊ฐ์ฒด์ ๋ฐฐ์น๋ฉ๋๋ค. ์ด๊ฒ์ NoSQL ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ค๊ณํ๊ธฐ ์ํ ๊ธฐ๋ณธ ๊ท์น์ ๋ณด์ฌ์ค๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ์๊ตฌ ์ฌํญ์ ์ค์ํ๊ณ ๊ฐ์ฅ ๋น๋ฒํ ์์ฒญ์ ๋ํด ๊ฐ๋ฅํ ํ ๋ง์ด ์ต์ ํ๋์ด์ผ ํฉ๋๋ค.
์ฟผ๋ฆฌ๊ฐ ์ง๊ณ ๊ตฌ์กฐ์ ์ ํฉํ์ง ์์ ๋ ๋ฐ์ดํฐ์ ๋ํ ์์ ์ฟผ๋ฆฌ๋ฅผ ์๋ํ ๋ ์ข ์ข ๋น์ ๊ทํ๋ ๋ํ ๊ฐ์ฒด๋ก ์์ ํ๋ ๋ฐ ๋ง์ ๋ฌธ์ ๊ฐ ์๋ค๋ ์ ์ ์ง์ ํ๋ฉด์ ๋ง์ ์ฌ๋๋ค์ด ์ด์๋ฅผ ์ ๊ธฐํ ๊ฒ์ ๋๋ค. ์ฃผ๋ฌธ ๋ผ์ธ ํญ๋ชฉ ๋ฐ ๊ฒฐ์ ์ ํจ๊ป ์ฃผ๋ฌธ์ ์ฌ์ฉํ์ง๋ง(์ฑ์ด ์๋ํ๋ ๋ฐฉ์์) ๋น์ฆ๋์ค์์ ์ง๋ ๋ฌ์ ํ๋งค๋ ํน์ ์ ํ์ ๋จ์ ์๋ฅผ ์ธ๋๋ก ์์ฒญํ๋ ๊ฒฝ์ฐ ์ด๋ป๊ฒ ๋ฉ๋๊น? ์ด ๊ฒฝ์ฐ OrderItem ํ ์ด๋ธ์ ์ค์บํ๋ ๋์ (๊ด๊ณํ ๋ชจ๋ธ์ ๊ฒฝ์ฐ) NoSQL ์คํ ๋ฆฌ์ง์์ ์ ์ฒด ์ฃผ๋ฌธ์ ๊ฒ์ํด์ผ ํ์ง๋ง ์ด ์ ๋ณด๊ฐ ๋ง์ด ํ์ํ์ง๋ ์์ต๋๋ค. ๋ถํํ๋ ์ด๊ฒ์ ๋ถ์ฐ ์์คํ ์์ ์ด๋ฃจ์ด์ ธ์ผ ํ๋ ์ ์ถฉ์์ ๋๋ค. ๊ธฐ์กด์ ๋จ์ผ ์๋ฒ ์์คํ ์์์ฒ๋ผ ๋ฐ์ดํฐ๋ฅผ ์ ๊ทํํ ์ ์์ต๋๋ค.
๋ ์ ๊ทผ ๋ฐฉ์์ ์ฅ๋จ์ ์ ํ๋ก ๊ทธ๋ฃนํํ๋ ค๊ณ ํ์ต๋๋ค.
GO TO FULL VERSION