๐ Contents
- 4. Database
- Connection Pool
- ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ฐ๋ผ ๊ฐ ์ดํ๋ฆฌ์ผ์ด์ ์ ์ค๋ ๋์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผํ๊ธฐ ์ํด์๋ Connection์ด ํ์ํ๋ค.
- Connection pool์ ์ด๋ฐ Connection์ ์ฌ๋ฌ ๊ฐ ์์ฑํด ๋์ด ์ ์ฅํด ๋์ ๊ณต๊ฐ(์บ์), ๋๋ ์ด ๊ณต๊ฐ์ Connection์ ํ์ํ ๋ ๊บผ๋ด ์ฐ๊ณ ๋ฐํํ๋ ๊ธฐ๋ฒ์ ๋งํ๋ค.
- DB์ ์ ๊ทผํ๋ ๋จ๊ณ
- Connction์ด ๋ถ์กฑํ๋ฉด?
- ๋ชจ๋ ์์ฒญ์ด DB์ ์ ๊ทผํ๊ณ ์๊ณ ๋จ์ Conncetion์ด ์๋ค๋ฉด, ํด๋น ํด๋ผ์ด์ธํธ๋ ๋๊ธฐ ์ํ๋ก ์ ํ์ํค๊ณ Pool์ Connection์ด ๋ฐํ๋๋ฉด ๋๊ธฐ ์ํ์ ์๋ ํด๋ผ์ด์ธํธ์๊ฒ ์์ฐจ์ ์ผ๋ก ์ ๊ณต๋๋ค.
- ์ ์ฌ์ฉํ ๊น?
- ๋งค ์ฐ๊ฒฐ๋ง๋ค Connection ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ์๋ฉธ์ํค๋ ๋น์ฉ์ ์ค์ผ ์ ์๋ค.
- ๋ฏธ๋ฆฌ ์์ฑ๋ Connection ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์, DB ์ ๊ทผ ์๊ฐ์ด ๋จ์ถ๋๋ค.
- DB์ ์ ๊ทผํ๋ Connection์ ์๋ฅผ ์ ํํ์ฌ, ๋ฉ๋ชจ๋ฆฌ์ DB์ ๊ฑธ๋ฆฌ๋ ๋ถํ๋ฅผ ์กฐ์ ํ ์ ์๋ค.
- Thread Pool
- ๋น์ทํ ๋งฅ๋ฝ์ผ๋ก Thread pool์ด๋ผ๋ ๊ฐ๋ ๋ ์๋ค.
- ์ด ์ญ์ ๋งค ์์ฒญ๋ง๋ค ์์ฒญ์ ์ฒ๋ฆฌํ Thread๋ฅผ ๋ง๋๋๊ฒ์ด ์๋, ๋ฏธ๋ฆฌ ์์ฑํ pool ๋ด์ Thread๋ฅผ ์๋ฉธ์ํค์ง ์๊ณ ์ฌ์ฌ์ฉํ์ฌ ํจ์จ์ ์ผ๋ก ์์์ ํ์ฉํ๋ ๊ธฐ๋ฒ.
- Thread Pool๊ณผ Connection pool
- WAS์์ Thread pool๊ณผ Connection pool๋ด์ Thread์ Connection์ ์๋ ์ง์ ์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ์ ๊ด๋ จ์ด ์๊ธฐ ๋๋ฌธ์, ๋ง์ด ์ฌ์ฉํ๋ฉด ํ ์๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ง์ด ์ ์ ํ๊ฒ ๋๋ค. ๊ทธ๋ ๋ค๊ณ ๋ฐ๋๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ํด ์ ๊ฒ ์ง์ ํ๋ค๋ฉด, ์๋ฒ์์๋ ๋ง์ ์์ฒญ์ ์ฒ๋ฆฌํ์ง ๋ชปํ๊ณ ๋๊ธฐ ํ ์ ๋ฐ์ ์๋ค.
- ๋ณดํต WAS์ Thread์ ์๊ฐ Conncetion์ ์๋ณด๋ค ๋ง์ ๊ฒ์ด ์ข์๋ฐ, ๊ทธ ์ด์ ๋ ๋ชจ๋ ์์ฒญ์ด DB์ ์ ๊ทผํ๋ ์์ ์ด ์๋๊ธฐ ๋๋ฌธ์ด๋ค.
- ํธ๋์ญ์
(Transaction) ์ด๋
- ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํ๋ฅผ ๋ณํ์ํค๋ ํ๋์ ๋
ผ๋ฆฌ์ ์ธ ์์
๋จ์๋ฅผ ๊ตฌ์ฑํ๋ ์ฐ์ฐ๋ค์ ์งํฉ์ด๋ค.
- ์๋ฅผ๋ค์ด, A๊ณ์ข์์ B๊ณ์ข๋ก ์ผ์ ๊ธ์ก์ ์ด์ฒดํ๋ค๊ณ ๊ฐ์ ํ์.
- A๊ณ์ข์ ์์ก์ ํ์ธํ๋ค.
- A๊ณ์ข์ ๊ธ์ก์์ ์ด์ฒดํ ๊ธ์ก์ ๋นผ๊ณ ๋ค์ ์ ์ฅํ๋ค.
- B๊ณ์ข์ ์์ก์ ํ์ธํ๋ค.
- B๊ณ์ข์ ๊ธ์ก์์ ์ด์ฒดํ ๊ธ์ก์ ๋ํ๊ณ ๋ค์ ์ ์ฅํ๋ค.
- ์ด๋ฌํ ๊ณผ์ ๋ค์ด ๋ชจ๋ ํฉ์ณ์ ธ ๊ณ์ข์ด์ฒด๋ผ๋ ํ๋์ ์์ ๋จ์๋ฅผ ๊ตฌ์ฑํ๋ค.
- ์๋ฅผ๋ค์ด, A๊ณ์ข์์ B๊ณ์ข๋ก ์ผ์ ๊ธ์ก์ ์ด์ฒดํ๋ค๊ณ ๊ฐ์ ํ์.
- ํ๋์ ํธ๋์ญ์
์ Commit ๋๊ฑฐ๋ Rollback ๋๋ค.
- Commit ์ฐ์ฐ
- ํ๊ฐ์ ๋ ผ๋ฆฌ์ ๋จ์(ํธ๋์ญ์ )์ ๋ํ ์์ ์ด ์ฑ๊ณต์ ์ผ๋ก ๋๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ๋ค์ ์ผ๊ด๋ ์ํ์ ์์ ๋, ์ด ํธ๋์ญ์ ์ด ํํ ๊ฐฑ์ ์ฐ์ฐ์ด ์๋ฃ๋ ๊ฒ์ ํธ๋์ญ์ ๊ด๋ฆฌ์์๊ฒ ์๋ ค์ฃผ๋ ์ฐ์ฐ์ด๋ค.
- Rollback ์ฐ์ฐ
- ํ๋์ ํธ๋์ญ์ ์ฒ๋ฆฌ๊ฐ ๋น์ ์์ ์ผ๋ก ์ข ๋ฃ๋์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ผ๊ด์ฑ์ ๊นจ๋จ๋ ธ์ ๋, ์ด ํธ๋์ญ์ ์ ์ผ๋ถ๊ฐ ์ ์์ ์ผ๋ก ์ฒ๋ฆฌ๋์๋๋ผ๋ ํธ๋์ญ์ ์ ์์์ฑ์ ๊ตฌํํ๊ธฐ ์ํด ์ด ํธ๋์ญ์ ์ด ํํ ๋ชจ๋ ์ฐ์ฐ์ ์ทจ์(Undo)ํ๋ ์ฐ์ฐ์ด๋ค.
- Rollback ์์๋ ํด๋น ํธ๋์ญ์ ์ ์ฌ์์ํ๊ฑฐ๋ ํ๊ธฐํ๋ค.
- Commit ์ฐ์ฐ
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ฉ ํ๋ก๊ทธ๋จ์ ํธ๋์ญ์ ๋ค์ ์งํฉ์ผ๋ก ์ ์ ํ ์ ์๋ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํ๋ฅผ ๋ณํ์ํค๋ ํ๋์ ๋
ผ๋ฆฌ์ ์ธ ์์
๋จ์๋ฅผ ๊ตฌ์ฑํ๋ ์ฐ์ฐ๋ค์ ์งํฉ์ด๋ค.
- ํธ๋์ญ์
์ ์ฑ์ง(ACID)
- ์์์ฑ(Atomicity), All or nothing
- ํธ๋์ญ์ ์ ๋ชจ๋ ์ฐ์ฐ๋ค์ ์ ์์ ์ผ๋ก ์ํ ์๋ฃ๋๊ฑฐ๋ ์๋๋ฉด ์ ํ ์ด๋ ํ ์ฐ์ฐ๋ ์ํ๋์ง ์์ ์ํ๋ฅผ ๋ณด์ฅํด์ผ ํ๋ค.
- ์ผ๊ด์ฑ(Consistency)
- ํธ๋์ญ์ ์๋ฃ ํ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์ผ๊ด๋ ์ํ๋ก ์ ์ง๋์ด์ผ ํ๋ค.
- ๋
๋ฆฝ์ฑ(Isolation)
- ํ๋์ ํธ๋์ญ์ ์ด ์คํํ๋ ๋์ค์ ๋ณ๊ฒฝํ ๋ฐ์ดํฐ๋ ์ด ํธ๋์ญ์ ์ด ์๋ฃ๋ ๋๊น์ง ๋ค๋ฅธ ํธ๋์ญ์ ์ด ์ฐธ์กฐํ์ง ๋ชปํ๋ค.
- ์ง์์ฑ(Durability)
- ์ฑ๊ณต์ ์ผ๋ก ์ํ๋ ํธ๋์ญ์ ์ ์์ํ ๋ฐ์๋์ด์ผ ํ๋ค.
- ์์์ฑ(Atomicity), All or nothing
- ํธ๋์ญ์
์ ํ์์ฑ
- ํ๊ธ ์ธ์ถ๊ธฐ๋ฅผ ์๋ํ๋ ๋์ค์ ๊ธฐ๊ณ์ค๋ฅ๋ ์ ์ ๋ฑ๊ณผ ๊ฐ์ ์๊ธฐ์น ์์ ์ํฉ์ด ๋ฐ์ํ์ฌ ์นด๋๊ฐ ๋์ค์ง ์๊ฑฐ๋ ๊ธฐ๊ณ๊ฐ ๋ฉ์ถ๋ ๊ฒฝ์ฐ
- ๊ฐ๊ฐ ๋ค๋ฅธ ์ง์ ์ ์ํ์์ ๋์์ ์ธ์ถํ ๋, ํ๋์ ์ง์ ์ด ๋ค๋ฅธ ์ง์ ์์ ์ ์ฅํ ์์ก์ ๋ฎ์ด ์ฐ๋ ๊ฒฝ์ฐ
- ์์ ๊ฐ์ ์ํฉ์ด ๋ฐ์๋์ง ์๋๋ก ๋ฐฉ์งํ๊ธฐ ์ํด, ์ฆ, ํธ๋์ญ์ ์ ์ฑ์ง์ธ ACID๋ฅผ ์ ๊ณต๋ฐ๊ธฐ์ํด ํธ๋์ญ์ ์ ์ฌ์ฉํ๋ค.
- ํธ๋์ญ์
์ ์ํ
- ํ๋(Active)
- ํธ๋์ญ์ ์ด ์คํ ์ค์ ์๋ ์ํ, ์ฐ์ฐ๋ค์ด ์ ์์ ์ผ๋ก ์คํ ์ค์ธ ์ํ
- ์ฅ์ (Failed)
- ํธ๋์ญ์ ์ด ์คํ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ฌ ์ค๋จ๋ ์ํ
- ์ฒ ํ(Aborted)
- ํธ๋์ญ์ ์ด ๋น์ ์์ ์ผ๋ก ์ข ๋ฃ๋์ด Rollback ์ฐ์ฐ์ ์ํํ ์ํ
- ๋ถ๋ถ ์๋ฃ(Partially Committed)
- ํธ๋์ญ์ ์ด ๋ง์ง๋ง ์ฐ์ฐ๊น์ง ์คํํ์ง๋ง, Commit ์ฐ์ฐ์ด ์คํ๋๊ธฐ ์ง์ ์ ์ํ
- ์๋ฃ(Committed)
- ํธ๋์ญ์ ์ด ์ฑ๊ณต์ ์ผ๋ก ์ข ๋ฃ๋์ด Commit ์ฐ์ฐ์ ์คํํ ํ์ ์ํ
- ํ๋(Active)
- Isolation Level ์ด๋?
- ํธ๋์ญ์ ์์ ์ผ๊ด์ฑ์ด ์๋ ๋ฐ์ดํฐ๋ฅผ ํ์ฉํ๋๋ก ํ๋ ์์ค
- Isolation Level ์ ํ์์ฑ
- ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ACID ๊ฐ์ด ํธ๋์ญ์ ์ด ์์์ ์ด๋ฉด์๋ ๋ ๋ฆฝ์ ์ธ ์ํ์ ํ๋๋ก ํ๋ค.
- ๊ทธ๋์ Locking ์ด๋ผ๋ ๊ฐ๋
์ด ๋ฑ์ฅํ๋ค.
- ํธ๋์ญ์ ์ด DB๋ฅผ ๋ค๋ฃจ๋ ๋์ ๋ค๋ฅธ ํธ๋์ญ์ ์ด ๊ด์ฌํ์ง ๋ชปํ๊ฒ ๋ง๋ ๊ฒ
- ํ์ง๋ง ๋ฌด์กฐ๊ฑด์ ์ธ Locking์ผ๋ก ๋์์ ์ํ๋๋ ๋ง์ ํธ๋์ญ์ ๋ค์ ์์๋๋ก ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํ๋๋ฉด DB์ ์ฑ๋ฅ์ ๋จ์ด์ง๊ฒ ๋๋ค.
- ๋ฐ๋๋ก ์๋ต์ฑ์ ๋์ด๊ธฐ ์ํด Locking ๋ฒ์๋ฅผ ์ค์ธ๋ค๋ฉด ์๋ชป๋ ๊ฐ์ด ์ฒ๋ฆฌ ๋ ์ฌ์ง๊ฐ ์๋ค.
- ๊ทธ๋์ ์ต๋ํ ํจ์จ์ ์ธ Locking ๋ฐฉ๋ฒ์ด ํ์ํ๋ค.
- Isolation Level ์ ์ข
๋ฅ
- Read Uncommitted (๋ ๋ฒจ 0)
- SELECT ๋ฌธ์ฅ์ด ์ํ๋๋ ๋์ ํด๋น ๋ฐ์ดํฐ์ Shared Lock์ด ๊ฑธ๋ฆฌ์ง ์๋ Level
- ํธ๋์ญ์ ์ ์ฒ๋ฆฌ์ค์ธ ํน์ ์์ง ์ปค๋ฐ๋์ง ์์ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฅธ ํธ๋์ญ์ ์ด ์ฝ๋ ๊ฒ์ ํ์ฉํ๋ค.
- ๋ฐ๋ผ์, ์ด๋ค ์ฌ์ฉ์๊ฐ A๋ผ๋ ๋ฐ์ดํฐ๋ฅผ B๋ผ๋ ๋ฐ์ดํฐ๋ก ๋ณ๊ฒฝํ๋ ๋์ ๋ค๋ฅธ ์ฌ์ฉ์๋ ์์ง ์๋ฃ๋์ง ์์(Uncommitted ํน์ Dirty) ํธ๋์ญ์ ์ด์ง๋ง ๋ณ๊ฒฝ๋ ๋ฐ์ดํฐ์ธ B๋ฅผ ์ฝ์ ์ ์๋ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ผ๊ด์ฑ์ ์ ์งํ ์ ์๋ค.
- Read Committed (๋ ๋ฒจ 1)
- SELECT ๋ฌธ์ฅ์ด ์ํ๋๋ ๋์ ํด๋น ๋ฐ์ดํฐ์ Shared Lock์ด ๊ฑธ๋ฆฌ๋ Level
- ํธ๋์ญ์ ์ด ์ํ๋๋ ๋์ ๋ค๋ฅธ ํธ๋์ญ์ ์ด ์ ๊ทผํ ์ ์์ด ๋๊ธฐํ๊ฒ ๋๋ค.
- Commit์ด ์ด๋ฃจ์ด์ง ํธ๋์ญ์ ๋ง ์กฐํํ ์ ์๋ค.
- ๋ฐ๋ผ์, ์ด๋ค ์ฌ์ฉ์๊ฐ A๋ผ๋ ๋ฐ์ดํฐ๋ฅผ B๋ผ๋ ๋ฐ์ดํฐ๋ก ๋ณ๊ฒฝํ๋ ๋์ ๋ค๋ฅธ ์ฌ์ฉ์๋ ํด๋น ๋ฐ์ดํฐ์ ์ ๊ทผํ ์ ์๋ค.
- SQL Server๊ฐ Default๋ก ์ฌ์ฉํ๋ Isolation Level
- Repeatable Read (๋ ๋ฒจ 2)
- ํธ๋์ญ์ ์ด ์๋ฃ๋ ๋๊น์ง SELECT ๋ฌธ์ฅ์ด ์ฌ์ฉํ๋ ๋ชจ๋ ๋ฐ์ดํฐ์ Shared Lock์ด ๊ฑธ๋ฆฌ๋ Level
- ํธ๋์ญ์ ์ด ๋ฒ์ ๋ด์์ ์กฐํํ ๋ฐ์ดํฐ์ ๋ด์ฉ์ด ํญ์ ๋์ผํจ์ ๋ณด์ฅํ๋ค.
- ๋ฐ๋ผ์, ๋ค๋ฅธ ์ฌ์ฉ์๋ ๊ทธ ์์ญ์ ํด๋น๋๋ ๋ฐ์ดํฐ์ ๋ํ ์์ ์ด ๋ถ๊ฐ๋ฅํ๋ค.
- Serializable (๋ ๋ฒจ 3)
- ํธ๋์ญ์ ์ด ์๋ฃ๋ ๋๊น์ง SELECT ๋ฌธ์ฅ์ด ์ฌ์ฉํ๋ ๋ชจ๋ ๋ฐ์ดํฐ์ Shared Lock์ด ๊ฑธ๋ฆฌ๋ Level
- ์๋ฒฝํ ์ฝ๊ธฐ ์ผ๊ด์ฑ ๋ชจ๋๋ฅผ ์ ๊ณตํ๋ค.
- ๋ฐ๋ผ์, ๋ค๋ฅธ ์ฌ์ฉ์๋ ๊ทธ ์์ญ์ ํด๋น๋๋ ๋ฐ์ดํฐ์ ๋ํ ์์ ๋ฐ ์ ๋ ฅ์ด ๋ถ๊ฐ๋ฅํ๋ค.
- Isolation level ์กฐ์ ์ ๋์์ฑ์ด ์ฆ๊ฐ๋๋๋ฐ ๋ฐํด ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๊ณ , ๋ฐ์ดํฐ์ ๋ฌด๊ฒฐ์ฑ์ ์ ์งํ๋ ๋ฐ ๋ฐํด ๋์์ฑ์ด ๋จ์ด์ง ์ ์๋ค.
- ๋ ๋ฒจ์ด ๋์์ง์๋ก ๋น์ฉ์ด ๋์์ง๋ค.
- Read Uncommitted (๋ ๋ฒจ 0)
- ๋ฎ์ ๋จ๊ณ์ Isolation Level ์ด์ฉ์ ๋ฐ์ํ๋ ํ์
- Dirty Read
- ์ปค๋ฐ๋์ง ์์ ์์ ์ค์ธ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฅธ ํธ๋์ญ์ ์์ ์ฝ์ ์ ์๋๋ก ํ์ฉํ ๋ ๋ฐ์ํ๋ ํ์
- ์ด๋ค ํธ๋์ญ์ ์์ ์์ง ์คํ์ด ๋๋์ง ์์ ๋ค๋ฅธ ํธ๋์ญ์ ์ ์ํ ๋ณ๊ฒฝ ์ฌํญ์ ๋ณด๊ฒ ๋๋ ๋๋ ๊ฒฝ์ฐ
- Non-Repeatable Read
- ํ ํธ๋์ญ์ ์์ ๊ฐ์ ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ฒ ์ํํ ๋ ๊ทธ ์ฌ์ด์ ๋ค๋ฅธ ํธ๋์ญ์ ์ด ๊ฐ์ ์์ ๋๋ ์ญ์ ํจ์ผ๋ก์จ ๋ ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๊ฐ ์์ดํ๊ฒ ๋ํ๋๋ ๋น ์ผ๊ด์ฑ ํ์
- Phantom Read
- ํ ํธ๋์ญ์ ์์์ ์ผ์ ๋ฒ์์ ๋ ์ฝ๋๋ฅผ ๋ ๋ฒ ์ด์ ์ฝ์ ๋, ์ฒซ ๋ฒ์งธ ์ฟผ๋ฆฌ์์ ์๋ ๋ ์ฝ๋๊ฐ ๋ ๋ฒ์งธ ์ฟผ๋ฆฌ์์ ๋ํ๋๋ ํ์
- ์ด๋ ํธ๋์ญ์ ๋์ค ์๋ก์ด ๋ ์ฝ๋๊ฐ ์ฝ์ ๋๋ ๊ฒ์ ํ์ฉํ๊ธฐ ๋๋ฌธ์ ๋ํ๋๋ค.
- Dirty Read
- ์กฐ์ธ์ด๋
- ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ด์ ์ฌ๋ฌ ํ ์ด๋ธ์ ๋ ์ฝ๋๋ฅผ ์กฐํฉํ์ฌ ํ๋์ ์ด๋ก ํํํ ๊ฒ์ด๋ค.
- ๋ฐ๋ผ์ ์กฐ์ธ์ ํ ์ด๋ธ๋ก์ ์ ์ฅ๋๊ฑฐ๋, ๊ทธ ์์ฒด๋ก ์ด์ฉํ ์ ์๋ ๊ฒฐ๊ณผ ์ ์ ๋ง๋ค์ด ๋ธ๋ค.
- ์กฐ์ธ์ ํ์์ฑ
- ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ตฌ์กฐ์ ํน์ง์ผ๋ก ์ ๊ทํ๋ฅผ ์ํํ๋ฉด ์๋ฏธ ์๋ ๋ฐ์ดํฐ์ ์งํฉ์ผ๋ก ํ ์ด๋ธ์ด ๊ตฌ์ฑ๋๊ณ , ๊ฐ ํ ์ด๋ธ๋ผ๋ฆฌ๋ ๊ด๊ณ(Relationship)๋ฅผ ๊ฐ๊ฒ ๋๋ค.
- ์ด์ ๊ฐ์ ํน์ง์ผ๋ก ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์ ์ฅ ๊ณต๊ฐ์ ํจ์จ์ฑ๊ณผ ํ์ฅ์ฑ์ด ํฅ์๋๊ฒ ๋๋ค.
- ๋ค๋ฅธ ํํธ์ผ๋ก๋ ์๋ก ๊ด๊ณ์๋ ๋ฐ์ดํฐ๊ฐ ์ฌ๋ฌ ํ ์ด๋ธ๋ก ๋๋์ด ์ ์ฅ๋๋ฏ๋ก, ๊ฐ ํ ์ด๋ธ์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๊ฒ์ํ๊ธฐ ์ํด ์กฐ์ธ์ด ํ์ํ๋ค.
- ์กฐ์ธ์ ์ข
๋ฅ
- ๋ด๋ถ ์กฐ์ธ(INNER JOIN)
- ์ฌ๋ฌ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉ๋๋ ๊ฐ์ฅ ํํ ๊ฒฐํฉ ๋ฐฉ์์ด๋ฉฐ, ๊ธฐ๋ณธ ์กฐ์ธ ํ์์ผ๋ก ๊ฐ์ฃผ๋๋ค.
- ๋ด๋ถ ์กฐ์ธ์ ์กฐ์ธ ๊ตฌ๋ฌธ์ ๊ธฐ๋ฐํ 2๊ฐ์ ํ ์ด๋ธ(A, B)์ ์ปฌ๋ผ ๊ฐ์ ๊ฒฐํฉํจ์ผ๋ก์จ ์๋ก์ด ๊ฒฐ๊ณผ ํ ์ด๋ธ์ ์์ฑํ๋ค.
- ๋ช ์์ ์กฐ์ธ ํํ(explicit)๊ณผ ์์์ ์กฐ์ธ ํํ(implicit) 2๊ฐ์ ๋ค๋ฅธ ์กฐ์ธ์ ๊ตฌ๋ฌธ์ด ์๋ค.
- ๋ช
์์ ์กฐ์ธ ํํ
- ํ
์ด๋ธ์ ์กฐ์ธ์ ํ๋ผ๋ ๊ฒ์ ์ง์ ํ๊ธฐ ์ํด JOIN ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉฐ, ๊ทธ๋ฆฌ๊ณ ๋์ ๋ค์์ ์์ ์ ๊ฐ์ด ON ํค์๋๋ฅผ ์กฐ์ธ์ ๋ํ ๊ตฌ๋ฌธ์ ์ง์ ํ๋๋ฐ ์ฌ์ฉํ๋ค.
SELECT * FROM employee INNER JOIN department ON employee.DepartmentID = department.DepartmentID;
- ํ
์ด๋ธ์ ์กฐ์ธ์ ํ๋ผ๋ ๊ฒ์ ์ง์ ํ๊ธฐ ์ํด JOIN ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉฐ, ๊ทธ๋ฆฌ๊ณ ๋์ ๋ค์์ ์์ ์ ๊ฐ์ด ON ํค์๋๋ฅผ ์กฐ์ธ์ ๋ํ ๊ตฌ๋ฌธ์ ์ง์ ํ๋๋ฐ ์ฌ์ฉํ๋ค.
- ์์์ ์กฐ์ธ ํํ
- SELECT ๊ตฌ๋ฌธ์ FROM ์ ์์ ๊ทธ๊ฒ๋ค์ ๋ถ๋ฆฌํ๋ ์ปด๋ง๋ฅผ ์ฌ์ฉํด์ ๋จ์ํ ์กฐ์ธ์ ์ํ ์ฌ๋ฌ ํ
์ด๋ธ์ ๋์ดํ๊ธฐ๋ง ํ๋ค.
SELECT * FROM employee, department WHERE employee.DepartmentID = department.DepartmentID;
- SELECT ๊ตฌ๋ฌธ์ FROM ์ ์์ ๊ทธ๊ฒ๋ค์ ๋ถ๋ฆฌํ๋ ์ปด๋ง๋ฅผ ์ฌ์ฉํด์ ๋จ์ํ ์กฐ์ธ์ ์ํ ์ฌ๋ฌ ํ
์ด๋ธ์ ๋์ดํ๊ธฐ๋ง ํ๋ค.
- ๊ฒฐ๊ณผ
- ๋๋ฑ ์กฐ์ธ(EQUI JOIN)
- ๋น๊ต์ ๊ธฐ๋ฐ์ ์กฐ์ธ์ด๋ฉฐ, ์กฐ์ธ ๊ตฌ๋ฌธ์์ ๋๋ฑ๋น๊ต๋ง์ ์ฌ์ฉํ๋ค.
- ๋ค๋ฅธ ๋น๊ต ์ฐ์ฐ์(<์ ๊ฐ์)๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ฑ ์กฐ์ธ์ผ๋ก์์ ์กฐ์ธ์ ์๊ฒฉ์ ๋ฐํํ๋ ๊ฒ์ด๋ค.
- ์์ฐ ์กฐ์ธ(NATURAL JOIN)
- ๋๋ฑ ์กฐ์ธ์ ํ ์ ํ์ผ๋ก ์กฐ์ธ ๊ตฌ๋ฌธ์ด ์กฐ์ธ๋ ํ ์ด๋ธ์์ ๋์ผํ ์ปฌ๋ผ๋ช ์ ๊ฐ์ง 2๊ฐ์ ํ ์ด๋ธ์์ ๋ชจ๋ ์ปฌ๋ผ๋ค์ ๋น๊ตํจ์ผ๋ก์จ, ์์์ ์ผ๋ก ์ผ์ด๋๋ ๊ตฌ๋ฌธ์ด๋ค.
- ๊ฒฐ๊ณผ์ ์ผ๋ก ๋์จ ์กฐ์ธ๋ ํ ์ด๋ธ์ ๋์ผํ ์ด๋ฆ์ ๊ฐ์ง ์ปฌ๋ผ์ ๊ฐ ์์ ๋ํ ๋จ ํ๋์ ์ปฌ๋ผ๋ง ํฌํจํ๊ณ ์๋ค.
- SQL
SELECT * FROM employee NATURAL JOIN department;
- ๊ฒฐ๊ณผ
- ๊ต์ฐจ ์กฐ์ธ(CROSS JOIN)
- ์กฐ์ธ๋๋ ๋ ํ ์ด๋ธ์์ ๊ณฑ์งํฉ์ ๋ฐํํ๋ค.
- ์ฆ, ๋ ๋ฒ์งธ ํ ์ด๋ธ๋ก๋ถํฐ ๊ฐ ํ๊ณผ ์ฒซ ๋ฒ์งธ ํ ์ด๋ธ์์ ๊ฐ ํ์ด ํ๋ฒ์ฉ ๊ฒฐํฉ๋ ์ด์ ๋ง๋ค ๊ฒ์ด๋ค.
- ์๋ฅผ ๋ค์ด mํ์ ๊ฐ์ง ํ ์ด๋ธ๊ณผ nํ์ ๊ฐ์ง ํ ์ด๋ธ์ด ๊ต์ฐจ ์กฐ์ธ๋๋ฉด m*n ๊ฐ์ ํ์ ์์ฑํ๋ค
- ๋ช
์์ ์กฐ์ธ ํํ
SELECT * FROM employee CROSS JOIN department;
- ์์์ ์กฐ์ธ ํํ
SELECT * FROM employee, department;
- ๊ฒฐ๊ณผ
- ์ธ๋ถ ์กฐ์ธ(OUTER JOIN)
- ์กฐ์ธ ๋์ ํ ์ด๋ธ์์ ํน์ ํ ์ด๋ธ์ ๋ฐ์ดํฐ๊ฐ ๋ชจ๋ ํ์ํ ์ํฉ์์ ์ธ๋ถ ์กฐ์ธ์ ํ์ฉํ์ฌ ํจ๊ณผ์ ์ผ๋ก ๊ฒฐ๊ณผ ์งํฉ์ ์์ฑํ ์ ์๋ค.
- ์ผ์ชฝ ์ธ๋ถ ์กฐ์ธ(LEFT OUTER JOIN)
- ์ค๋ฅธ์ชฝ ์ธ๋ถ ์กฐ์ธ(RIGHT OUTER JOIN)
- ์์ ์ธ๋ถ ์กฐ์ธ(FULL OUTER JOIN)
- ์
ํ ์กฐ์ธ(SELF JOIN)
- ํ ํ ์ด๋ธ์์ ์๊ธฐ ์์ ์ ์กฐ์ธ์ ์ํค๋ ๊ฒ์ด๋ค.
- ๋ด๋ถ ์กฐ์ธ(INNER JOIN)
- ์กฐ์ธ์ ์ฌ์ฉํ ๋ ์ฃผ์์ฌํญ
- SQL ๋ฌธ์ฅ์ ์๋ฏธ๋ฅผ ์ ๋๋ก ํ์
- SQL์ ์ด๋ป๊ฒ ์์ฑํ๋๋์ ๋ฐ๋ผ ์ฑ๋ฅ์ด ํฌ๊ฒ ์ข์ฐ๋๋ค. ์ด๋ค ์ง์๋ฅผ ์ํํ ๊ฒ์ธ์ง๋ฅผ ๋ช ํํ๊ฒ ์ ์ํ ํ, ๋นํจ์จ์ ์ ๊ฑฐํ์ฌ ์ต์ ์ SQL์ ์์ฑํด์ผ ํ๋ค.
- ๋ช
ํํ ์กฐ์ธ ์กฐ๊ฑด ์ ๊ณต
- ์กฐ์ธ ์กฐ๊ฑด์ ๋ช ํํ๊ฒ ์ ๊ณตํ์ง ์์ ๊ฒฝ์ฐ, ์๋์น ์๊ฒ CROSS JOIN(Cartesian Product)์ด ์ํ๋ ์ ์๋ค.
- SQL ๋ฌธ์ฅ์ ์๋ฏธ๋ฅผ ์ ๋๋ก ํ์
- ์กฐ์ธ์ ์ฌ์ฉํ ๋ ๊ณ ๋ ค์ฌํญ
- ์กฐ์ธํ ๋์์ ์งํฉ์ ์ต์ํ
- ์งํฉ์ ์ต์ํํ ๋ฐฉ๋ฒ์ด ์์ผ๋ฉด, ์กฐ๊ฑด์ ๋จผ์ ์ ์ฉํ์ฌ ๊ด๊ณ๋ฅผ ๋งบ์ ์งํฉ์ ์ต์ํํ ํ, ์กฐ์ธ์ ๋งบ๋ ๊ฒ์ด ํจ์จ์ ์ด๋ค.
- ํจ๊ณผ์ ์ธ ์ธ๋ฑ์ค์ ํ์ฉ
- ์ธ๋ฑ์ค๋ฅผ ํ์ฉํ๋ฉด, ์กฐ์ธ ์ฐ์ฐ์ ๋น์ฉ์ ๊ทน์ ์ผ๋ก ๋ฎ์ถ ์ ์๋ค.
- ์กฐ์ธํ ๋์์ ์งํฉ์ ์ต์ํ
์ธ๋ฑ์ค(index)์ ์๋ ๋ป์ ์์ธ. ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์กฐํ ๋ฐ ๊ฒ์์ ๋ ๋น ๋ฅด๊ฒ ํ ์ ์๋ ๋ฐฉ๋ฒ/๊ธฐ์ , ํน์ ์ด์ ์ฐ์ด๋ ์๋ฃ๊ตฌ์กฐ ์์ฒด๋ฅผ ์๋ฏธํ๊ธฐ๋ ํ๋ค.
select
๋ฌธ์ ์ฌ์ฉํ์ฌ ์ํ๋ ์กฐ๊ฑด์ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ ๋, ์ ์ฅ๋ ๋ฐ์ดํฐ์ ์์ด ์์ฒญ๋๊ฒ ๋ง๋ค๋ฉด ๊ฒ์์ ์ํ ์ํ์ ๋ง์ ์์๊ณผ ์๊ฐ์ด ์๋ชจ๋ ๊ฒ์ด๋ค. ์ด๋ ๋์์ด ๋๋๊ฒ ์ธ๋ฑ์ค์ด๋ค.
์์ฃผ ์กฐํ๋๋ Column ์ ๋ํ Index Table์ ๋ฐ๋ก ๋ง๋ค์ด SELECT ๋ฌธ์ด ๋ค์ด์์ ๋ Index ํ ์ด๋ธ์ ์๋ ๊ฐ๋ค๋ก ๊ฒฐ๊ณผ ๊ฐ์ ์กฐํํด ์จ๋ค. ๊ทธ๋์ Index๋ฅผ ์ ์ฌ์ฉํ๋ค๋ฉด "๊ฒ์" ์ฐ์ฐ์ ์คํํ์ ๋ ์ฑ๋ฅ์ ์ฌ๋ฆด ์ ์๊ฒ ๋๋ค.
- Index Table์์
where
์ ํฌํจ๋ ๊ฐ์ ๊ฒ์ - ํด๋น ๊ฐ์ table_id PK๋ฅผ ํ๋
- ๊ฐ์ ธ์จ table_id PK๊ฐ์ผ๋ก ์๋ณธ ํ ์ด๋ธ์์ ๊ฐ์ ์กฐํ
DBMS๋ ์ธ๋ฑ์ค๋ฅผ ๋ค์ํ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๊ด๋ฆฌ๋ฅผ ํ๊ณ ์๋๋ฐ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ ์๊ณ ๋ฆฌ์ฆ์ B+ Tree ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
- ์ค์ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋ ๋ฆฌํ๋ ธ๋(Leaf nodes)
- ๋ฆฌํ๋ ธ๋๊น์ง์ ๊ฒฝ๋ก ์ญํ ์ ํ๋ ๋ ผ๋ฆฌํ๋ ธ๋(Non-leaf nodes)
- ๊ฒฝ๋ก์ ์ถ๋ฐ์ ์ด ๋๋ ๋ฃจํธ ๋ ธ๋(Root node)
B+tree๋ ๋ฆฌํ๋ ธ๋์ ์ด๋ฅด๊ธฐ๊น์ง์ ๋ํ ์์ ๋ ธ๋์ ํฌ์ธํฐ๊ฐ ์ ์ฅ๋์ด ์๋ค. ์ฆ, B+ํธ๋ฆฌ์ ๊ฒ์์ ๋ฃจํธ๋ ธ๋์์ ์ด๋ค ๋ฆฌํ ๋ ธ๋์ ์ด๋ฅด๋ ํ ๊ฐ์ ๊ฒฝ๋ก๋ง ๊ฒ์ํ๋ฉด ๋๋ฏ๋ก ๋งค์ฐ ํจ์จ์ ์ด๋ค.
- ์ index ์์ฑ ์ b-tree๋ฅผ ์ฌ์ฉํ๋์ง? hash table์ด ๋ ํจ์จ์ ์ด์ง ์์์ง?
- SELECT ์ง์ ์กฐ๊ฑด์๋ ๋ถ๋ฑํธ ์ฐ์ฐ(<>)๋ ํฌํจ
- hash table์ ๋๋ฑ ์ฐ์ฐ์ ํนํ๋ ์๋ฃ๊ตฌ์กฐ์ด๊ธฐ ๋๋ฌธ์ ๋ถ๋ฑํธ ์ฐ์ฐ ์ฌ์ฉ ์ ๋ฌธ์ ๋ฐ์
-
์ธ๋ฑ์ค๋ ๋ฐ๋ก ํ ์ด๋ธ์ ํํ๋ก ๊ด๋ฆฌ๊ฐ ๋๋ค. ์์์ ์๋ชจํ๋ค๋ ์๋ฏธ. ๋๋ฌธ์ ๋ฌด๋ถ๋ณํ ์ธ๋ฑ์ค์ ์ฌ์ฉ์ ์ฑ๋ฅ์ ๋ถ์ ์ ์ธ ์ํฅ์ ๋ฏธ์น ์ ์๋ค.
-
๋ํ ์ธ๋ฑ์ค๋ ์ด์งํธ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๋ ฌ๋์ด ์๋ค. ์ด๋ก์ธํด ๊ฒ์๊ณผ ์กฐํ์ ์๋๋ฅผ ํฅ์์ํฌ ์ ์์ง๋ง ์ฆ์ ๋ฐ์ดํฐ์ ๋ณ๊ฒฝ(์ฝ์ , ์์ ์ญ์ )๊ฐ ๋๋ค๋ฉด ์ธ๋ฑ์ค ๋ฐ์ด๋ธ์ ๋ณ๊ฒฝ๊ณผ ์ ๋ ฌ์ ๋๋ ์ค๋ฒํค๋ ๋๋ฌธ์ ์คํ๋ ค ์ฑ๋ฅ ์ ํ๊ฐ ์ผ์ด๋ ์ ์๋ค.
- INSERT : ํ ์ด๋ธ์๋ ์ ๋ ฅ ์์๋๋ก ์ ์ฅ๋์ง๋ง, ์ธ๋ฑ์ค ํ ์ด๋ธ์๋ ์ ๋ ฌํ์ฌ ์ ์ฅํ๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ ์ ํ ๋ฐ์
- DELETE : ํ ์ด๋ธ์์๋ง ์ญ์ ๋๊ณ ์ธ๋ฑ์ค ํ ์ด๋ธ์๋ ๋จ์์์ด ์ฟผ๋ฆฌ ์ํ ์๋ ์ ํ
- UPDATE : ์ธ๋ฑ์ค์๋ UPDATE๊ฐ ์๊ธฐ ๋๋ฌธ์ DELETE, INSERT ๋ ์์ ์ํํ์ฌ ๋ถํ ๋ฐ์
-
๋ฐ์ดํฐ์ ์ค๋ณต์ด ๋์ ์ปฌ๋ผ(์นด๋๋๋ฆฌํฐ๊ฐ ๋ฎ์ ์ปฌ๋ผ)์ ์ธ๋ฑ์ค๋ก ๋ง๋ค์ด๋ ๋ฌด์ฉ์ง๋ฌผ (์: ์ฑ๋ณ)
-
๋ค์ค ์ปฌ๋ผ ์ธ๋ฑ์ฑํ ๋ ์นด๋๋๋ฆฌํฐ๊ฐ ๋์ ์ปฌ๋ผ->๋ฎ์ ์ปฌ๋ผ ์์ผ๋ก ์ธ๋ฑ์ฑํด์ผ ํจ์จ์
- ๋ฐฐ๊ฒฝ
- ์๋น์ค์ ํฌ๊ธฐ๊ฐ ์ ์ ์ปค์ง๊ณ DB์ ์ ์ฅํ๋ ๋ฐ์ดํฐ์ ๊ท๋ชจ ๋ํ ๋์ฉ๋ํ ๋๋ฉด์, ๊ธฐ์กด์ ์ฌ์ฉํ๋ DB ์์คํ ์ ์ฉ๋(storage)์ ํ๊ณ์ ์ฑ๋ฅ(performance)์ ์ ํ ๋ฅผ ๊ฐ์ ธ์ค๊ฒ ๋์๋ค.
- ์ฆ, VLDB(Very Large DBMS)์ ๊ฐ์ด ํ๋์ DBMS์ ๋๋ฌด ํฐ table์ด ๋ค์ด๊ฐ๋ฉด์ ์ฉ๋๊ณผ ์ฑ๋ฅ ์ธก๋ฉด์์ ๋ง์ ์ด์๊ฐ ๋ฐ์ํ๊ฒ ๋์๊ณ , ์ด๋ฐ ์ด์๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ผ๋ก table์ 'ํํฐ์ (partition)'์ด๋ผ๋ ์์ ๋จ์๋ก ๋๋์ด ๊ด๋ฆฌํ๋ 'ํํฐ์ ๋(Partitioning)'๊ธฐ๋ฒ ์ด ๋ํ๋๊ฒ ๋์๋ค.
- ํํฐ์
๋์ ๊ฐ๋
- ํฐ table์ด๋ index๋ฅผ, ๊ด๋ฆฌํ๊ธฐ ์ฌ์ด partition์ด๋ผ๋ ์์ ๋จ์๋ก ๋ฌผ๋ฆฌ์ ์ผ๋ก ๋ถํ ํ๋ ๊ฒ์ ์๋ฏธํ๋ค.
- ๋ฌผ๋ฆฌ์ ์ธ ๋ฐ์ดํฐ ๋ถํ ์ด ์๋๋ผ๋, DB์ ์ ๊ทผํ๋ application์ ์ ์ฅ์์๋ ์ด๋ฅผ ์ธ์ํ์ง ๋ชปํ๋ค.
- 'ํํฐ์ ๋(Partitioning)'๊ธฐ๋ฒ์ ํตํด ์ํํธ์จ์ด์ ์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ถ์ฐ ์ฒ๋ฆฌํ์ฌ ์ฑ๋ฅ์ด ์ ํ๋๋ ๊ฒ์ ๋ฐฉ์งํ๊ณ ๊ด๋ฆฌ๋ฅผ ๋ณด๋ค ์์ํ๊ฒ ํ ์ ์๊ฒ ๋์๋ค.
- ํฐ table์ด๋ index๋ฅผ, ๊ด๋ฆฌํ๊ธฐ ์ฌ์ด partition์ด๋ผ๋ ์์ ๋จ์๋ก ๋ฌผ๋ฆฌ์ ์ผ๋ก ๋ถํ ํ๋ ๊ฒ์ ์๋ฏธํ๋ค.
- ํํฐ์
๋์ ๋ชฉ์
- ์ฑ๋ฅ(Performance)
- ํน์ DML๊ณผ Query์ ์ฑ๋ฅ์ ํฅ์์ํจ๋ค.
- ์ฃผ๋ก ๋์ฉ๋ Data WRITE ํ๊ฒฝ์์ ํจ์จ์ ์ด๋ค.
- ํนํ, Full Scan์์ ๋ฐ์ดํฐ Access์ ๋ฒ์๋ฅผ ์ค์ฌ ์ฑ๋ฅ ํฅ์์ ๊ฐ์ ธ์จ๋ค.
- ๋ง์ INSERT๊ฐ ์๋ OLTP ์์คํ ์์ INSERT ์์ ์ ์์ ๋จ์์ธ partition๋ค๋ก ๋ถ์ฐ์์ผ ๊ฒฝํฉ์ ์ค์ธ๋ค.
- ๊ฐ์ฉ์ฑ(Availability)
- ๋ฌผ๋ฆฌ์ ์ธ ํํฐ์ ๋์ผ๋ก ์ธํด ์ ์ฒด ๋ฐ์ดํฐ์ ํผ์ ๊ฐ๋ฅ์ฑ์ด ์ค์ด๋ค๊ณ ๋ฐ์ดํฐ ๊ฐ์ฉ์ฑ์ด ํฅ์๋๋ค.
- ๊ฐ ๋ถํ ์์ญ(partition๋ณ๋ก)์ ๋ ๋ฆฝ์ ์ผ๋ก ๋ฐฑ์ ํ๊ณ ๋ณต๊ตฌํ ์ ์๋ค.
- table์ partition ๋จ์๋ก Disk I/O์ ๋ถ์ฐํ์ฌ ๊ฒฝํฉ์ ์ค์ด๊ธฐ ๋๋ฌธ์ UPDATE ์ฑ๋ฅ์ ํฅ์์ํจ๋ค.
- ๊ด๋ฆฌ์ฉ์ด์ฑ(Manageability)
- ํฐ table๋ค์ ์ ๊ฑฐํ์ฌ ๊ด๋ฆฌ๋ฅผ ์ฝ๊ฒ ํด์ค๋ค.
- ์ฑ๋ฅ(Performance)
- ํํฐ์
๋์ ์ฅ์
- ๊ด๋ฆฌ์ ์ธก๋ฉด : partition ๋จ์ ๋ฐฑ์
, ์ถ๊ฐ, ์ญ์ , ๋ณ๊ฒฝ
- ์ ์ฒด ๋ฐ์ดํฐ๋ฅผ ์์คํ ๊ฐ๋ฅ์ฑ์ด ์ค์ด๋ค์ด ๋ฐ์ดํฐ ๊ฐ์ฉ์ฑ์ด ํฅ์๋๋ค.
- partition๋ณ๋ก ๋ฐฑ์ ๋ฐ ๋ณต๊ตฌ๊ฐ ๊ฐ๋ฅํ๋ค.
- partition ๋จ์๋ก I/O ๋ถ์ฐ์ด ๊ฐ๋ฅํ์ฌ UPDATE ์ฑ๋ฅ์ ํฅ์์ํจ๋ค.
- ์ฑ๋ฅ์ ์ธก๋ฉด : partition ๋จ์ ์กฐํ ๋ฐ DML์ํ
- ๋ฐ์ดํฐ ์ ์ฒด ๊ฒ์ ์ ํ์ํ ๋ถ๋ถ๋ง ํ์ํด ์ฑ๋ฅ์ด ์ฆ๊ฐํ๋ค.
- ์ฆ, Full Scan์์ ๋ฐ์ดํฐ Access์ ๋ฒ์๋ฅผ ์ค์ฌ ์ฑ๋ฅ ํฅ์์ ๊ฐ์ ธ์จ๋ค.
- ํ์ํ ๋ฐ์ดํฐ๋ง ๋น ๋ฅด๊ฒ ์กฐํํ ์ ์๊ธฐ ๋๋ฌธ์ ์ฟผ๋ฆฌ ์์ฒด๊ฐ ๊ฐ๋ณ๋ค.
- ๊ด๋ฆฌ์ ์ธก๋ฉด : partition ๋จ์ ๋ฐฑ์
, ์ถ๊ฐ, ์ญ์ , ๋ณ๊ฒฝ
- ํํฐ์
๋์ ๋จ์
- table๊ฐ JOIN์ ๋ํ ๋น์ฉ์ด ์ฆ๊ฐํ๋ค.
- table๊ณผ index๋ฅผ ๋ณ๋๋ก ํํฐ์
๋ํ ์ ์๋ค.
- table๊ณผ index๋ฅผ ๊ฐ์ด ํํฐ์ ๋ํด์ผ ํ๋ค.
- ํํฐ์
๋์ ์ข
๋ฅ
- ์ํ(horizontal) ํํฐ์
๋
- ์ค๋ฉ(Sharding) ๊ณผ ๋์ผํ ๊ฐ๋
- ์์ง(vertical) ํํฐ์ ๋
- ์ํ(horizontal) ํํฐ์
๋
- ํํฐ์
๋์ ๋ถํ ๊ธฐ์ค
- ๋ฒ์ ๋ถํ (range partitioning)
- ๋ชฉ๋ก ๋ถํ (list partitioning)
- ํด์ ๋ถํ (hash partitioning)
- ํฉ์ฑ ๋ถํ (composite partitioning)
Object-Relational Mapping ๊ฐ์ฒด-๊ด๊ณ ๋งคํ
- ๊ฐ์ฒด์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ดํฐ๋ฅผ ์๋์ผ๋ก ๋งคํ(์ฐ๊ฒฐ)ํด์ฃผ๋ ๊ฒ์ ๋งํ๋ค.
- ๋ฐ์ดํฐ๋ฅผ ์์ฑํ ํ๋ก๊ทธ๋จ์ ์คํ์ด ์ข ๋ฃ๋๋๋ผ๋ ์ฌ๋ผ์ง์ง ์๋ ๋ฐ์ดํฐ์ ํน์ฑ.
- ์์์ฑ์ ๊ฐ์ง ์๋ ๋ฐ์ดํฐ๋ ๋จ์ง ๋ฉ๋ชจ๋ฆฌ์์๋ง ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ํ๋ก๊ทธ๋จ์ ์ข ๋ฃํ๋ฉด ๋ชจ๋ ์์ด๋ฒ๋ฆฌ๊ฒ ๋๋ค. ๋๋ฌธ์ ํ์ผ ์์คํ , ๊ด๊ณํ ํ ์ดํฐ๋ฒ ์ด์ค ํน์ ๊ฐ์ฒด ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฑ์ ํ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์๊ตฌํ๊ฒ ์ ์ฅํ์ฌ ์์์ฑ ๋ถ์ฌํ๋ค.
ํ๋ก๊ทธ๋จ์ ์ํคํ ์ฒ์์, ๋ฐ์ดํฐ์ ์์์ฑ์ ๋ถ์ฌํด์ฃผ๋ ๊ณ์ธต. JDBC๋ฅผ ์ด์ฉํ์ฌ ์ง์ ๊ตฌํํ ์ ์์ง๋ง Persistence framework๋ฅผ ์ด์ฉํ ๊ฐ๋ฐ์ด ๋ง์ด ์ด๋ฃจ์ด์ง๋ค.
JDBC ํ๋ก๊ทธ๋๋ฐ์ ๋ณต์กํจ์ด๋ ๋ฒ๊ฑฐ๋ก์ ์์ด ๊ฐ๋จํ ์์ ๋ง์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๋๋๋ ์์คํ ์ ๋น ๋ฅด๊ฒ ๊ฐ๋ฐํ ์ ์์ผ๋ฉฐ ์์ ์ ์ธ ๊ตฌ๋์ ๋ณด์ฅํ๋ค.
- ์ข
๋ฅ
- SQL ๋ฌธ์ฅ์ผ๋ก ์ง์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋ SQL ๋งตํผ
- Mybatis ๋ฑ
- ๊ฐ์ฒด๋ฅผ ํตํด ๊ฐ์ ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋ ๊ฐ์ฒด ๊ด๊ณ ๋งตํผ(ORM)
- Hibernate ๋ฑ
- SQL ๋ฌธ์ฅ์ผ๋ก ์ง์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋ SQL ๋งตํผ
- JDBC example
public String getPersonName(long personId) throws SQLException {
PreparedStatement st = null;
try {
st = connection.prepareStatement (
"SELECT name FROM people WHERE id = ?");
st.setLong(1, personId);
ResultSet rs = st.excuteQuery();
if (ts.next()) {
String result = rs.getString("name");
assert !rs.next();
return result;
} else {
return null;
}
} finally {
if (st != null) {
st.close();
}
}
}
- JPA example
public String getPersonName(long personId) {
Person p = em.find(Person.class, personId);
return p.getName();
}
- ๊ฐ์ฒด ์งํฅ์ ์ธ ์ฝ๋๋ก ์ธํด ๋ ์ง๊ด์ ์ด๊ณ ๋น์ฆ๋์ค ๋ก์ง์ ๋ ์ง์คํ ์ ์๊ฒ ๋์์ค๋ค.
- ์ ์ธ๋ฌธ, ํ ๋น, ์ข ๋ฃ ๊ฐ์ ๋ถ์์ ์ธ ์ฝ๋๊ฐ ์๊ฑฐ๋ ๊ธ๊ฒฉํ ์ค์ด๋ ๋ค.
- ๊ฐ์ข ๊ฐ์ฒด์ ๋ํ ์ฝ๋๋ฅผ ๋ณ๋๋ก ์์ฑํ๊ธฐ ๋๋ฌธ์ ์ฝ๋์ ๊ฐ๋ ์ฑ์ ์ฌ๋ ค์ค๋ค.
- SQL์ ์ ์ฐจ์ ์ด๊ณ ์์ฐจ์ ์ธ ์ ๊ทผ์ด ์๋ ๊ฐ์ฒด ์งํฅ์ ์ธ ์ ๊ทผ์ผ๋ก ์ธํด ์์ฐ์ฑ์ด ์ฆ๊ฐํ๋ค.
- ์ฌ์ฌ์ฉ ๋ฐ ์ ์ง๋ณด์์ ํธ๋ฆฌ์ฑ์ด ์ฆ๊ฐํ๋ค.
- ORM์ ๋ ๋ฆฝ์ ์ผ๋ก ์์ฑ๋์ด์๊ณ , ํด๋น ๊ฐ์ฒด๋ค์ ์ฌํ์ฉ ํ ์ ์๋ค.
- ๋๋ฌธ์ ๋ชจ๋ธ์์ ๊ฐ๊ณต๋ ๋ฐ์ดํฐ๋ฅผ ์ปจํธ๋กค๋ฌ์ ์ํด ๋ทฐ์ ํฉ์ณ์ง๋ ํํ๋ก ๋์์ธ ํจํด์ ๊ฒฌ๊ณ ํ๊ฒ ๋ค์ง๋๋ฐ ์ ๋ฆฌํ๋ค.
- ๋งคํ์ ๋ณด๊ฐ ๋ช ํํ์ฌ, ERD๋ฅผ ๋ณด๋ ๊ฒ์ ๋ํ ์์กด๋๋ฅผ ๋ฎ์ถ ์ ์๋ค.
- DBMS์ ๋ํ ์ข
์์ฑ์ด ์ค์ด๋ ๋ค.
- ๋๋ถ๋ถ ORM ์๋ฃจ์ ์ DB์ ์ข ์์ ์ด์ง ์๋ค.
- ์ข ์์ ์ด์ง ์๋ค๋๊ฒ์ ๊ตฌํ ๋ฐฉ๋ฒ ๋ฟ๋ง์๋๋ผ ๋ง์ ์๋ฃจ์ ์์ ์๋ฃํ ํ์ ๊น์ง ์ ํจํ๋ค.
- ํ๋ก๊ทธ๋๋จธ๋ Object์ ์ง์คํจ์ผ๋ก ๊ทน๋จ์ ์ผ๋ก DBMS๋ฅผ ๊ต์ฒดํ๋ ๊ฑฐ๋ํ ์์ ์๋ ๋น๊ต์ ์ ์ ๋ฆฌ์คํฌ์ ์๊ฐ์ด ์์๋๋ค.
- ๋ํ ์๋ฐ์์ ๊ฐ๊ณตํ ๊ฒฝ์ฐ equals, hashCode์ ์ค๋ฒ๋ผ์ด๋ ๊ฐ์ ์๋ฐ์ ๊ธฐ๋ฅ์ ์ด์ฉํ ์ ์๊ณ , ๊ฐ๊ฒฐํ๊ณ ๋น ๋ฅธ ๊ฐ๊ณต์ด ๊ฐ๋ฅํ๋ค.
- ์๋ฒฝํ ORM ์ผ๋ก๋ง ์๋น์ค๋ฅผ ๊ตฌํํ๊ธฐ๊ฐ ์ด๋ ต๋ค.
- ์ฌ์ฉํ๊ธฐ๋ ํธํ์ง๋ง ์ค๊ณ๋ ๋งค์ฐ ์ ์คํ๊ฒ ํด์ผํ๋ค.
- ํ๋ก์ ํธ์ ๋ณต์ก์ฑ์ด ์ปค์ง๊ฒฝ์ฐ ๋์ด๋ ๋ํ ์ฌ๋ผ๊ฐ ์ ์๋ค.
- ์๋ชป ๊ตฌํ๋ ๊ฒฝ์ฐ์ ์๋ ์ ํ ๋ฐ ์ฌ๊ฐํ ๊ฒฝ์ฐ ์ผ๊ด์ฑ์ด ๋ฌด๋์ง๋ ๋ฌธ์ ์ ์ด ์๊ธธ ์ ์๋ค.
- ์ผ๋ถ ์์ฃผ ์ฌ์ฉ๋๋ ๋ํ ์ฟผ๋ฆฌ๋ ์๋๋ฅผ ์ํด SP๋ฅผ ์ฐ๋๋ฑ ๋ณ๋์ ํ๋์ด ํ์ํ ๊ฒฝ์ฐ๊ฐ ์๋ค.
- DBMS์ ๊ณ ์ ๊ธฐ๋ฅ์ ์ด์ฉํ๊ธฐ ์ด๋ ต๋ค. (ํ์ง๋ง ์ด๊ฑด ๋จ์ ์ผ๋ก๋ง ๋ณผ ์ ์๋ค : ํน์ DBMS์ ๊ณ ์ ๊ธฐ๋ฅ์ ์ด์ฉํ๋ฉด ์ด์์ฑ์ด ์ ํ๋๋ค.)
- ํ๋ก์์ ๊ฐ ๋ง์ ์์คํ
์์ ORM์ ๊ฐ์ฒด ์งํฅ์ ์ธ ์ฅ์ ์ ํ์ฉํ๊ธฐ ์ด๋ ต๋ค.
- ์ด๋ฏธ ํ๋ก์์ ๊ฐ ๋ง์ ์์คํ ์์ ๋ค์ ๊ฐ์ฒด๋ก ๋ฐ๊ฟ์ผํ๋ฉฐ, ๊ทธ ๊ณผ์ ์์ ์์ฐ์ฑ ์ ํ๋ ๋ฆฌ์คํฌ๊ฐ ๋ง์ด ๋ฐ์ํ ์ ์๋ค.
JDBC(Java Database Connectivity)๋ DB์ ์ ๊ทผํ ์ ์๋๋ก Java์์ ์ ๊ณตํ๋ API์ด๋ค.
- JDBC๋ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฌ์ฉ๋๋ SQL๋ฌธ์ ์คํํ๊ธฐ ์ํด ์๋ฐ๋ก ์์ฑ๋ ํด๋์ค์ ์ธํฐํ์ด์ค๋ก ๊ตฌ์ฑ๋์ด ์๋ค.
- ํน์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ํน์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฉ์ปค๋์ฆ์ ๊ตฌ์ ๋ฐ์ง์๋ ๋ ๋ฆฝ์ ์ธ ์ธํฐํ์ด์ค๋ฅผ ํตํด ๋ค์ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผํ๋ ์ฝ๋๋ฅผ ๊ตฌํํ ์ ์๋๋ก ์ ๊ณตํ๋ ์๋ฐ ํด๋์ค์ ํ์ค ์งํฉ์ด๋ค.
- JDBC ํด๋์ค๋ ์๋ฐ ํจํค์ง
java.sql
๊ณผjavax.sql
์ ํฌํจ๋์ด ์๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฒค๋๋ค์ด ์ด๋ฌํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ฐ์ ๋ง๋ ๋ค๋ฉด, ์๋ฐ ํ๋ก๊ทธ๋๋จธ๋ ๊ฐ ๋ฒค๋๊ฐ ๋ง๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ๋ฒ์ ์ตํ์ผ ํ ๊ฒ์ด๋ค.
- ๋ค์๊ณผ ๊ฐ์ ์์๋ก ์ด๋ฃจ์ด์ง๋ค.
- JDBC driver ๋ก๋ฉ
- Connection ๋งบ๊ธฐ
- SQL ์คํ
- ์์ ๋ฐํ
- ์)
Class.forName("com.mysql.jdbc.Driver"); // mysql ๋๋ฆฌ์ด๋ฒ ๋ก๋ฉ
- Driver๋?
- JDBC Driver๋ ์๋ฐ ํ๋ก๊ทธ๋จ์ ์์ฒญ์ DBMS๊ฐ ์ดํดํ ์ ์๋ ํ๋กํ ์ฝ๋ก ๋ณํํด์ฃผ๋ ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ์ด๋ํฐ
- ์)
Connection conn = null; conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
DriverManager
๋ ์ด๋ฆ ๊ทธ๋๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฒค๋๋ค์ด JDBC API๋ฅผ ๊ตฌํํ ๋๋ผ์ด๋ฒ๋ฅผ ๊ด๋ฆฌํ๋ค.DriverManager.getConnection()
๋ฉ์๋๋ ์ธ์๋ก ๋ค์ด์ค๋ ๊ฐ์ ๋ฐ๋ผ์ ํน์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฒค๋๊ฐ ๊ตฌํํConnection
ํ์ ์ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค.Connection
๊ฐ์ฒด๊ฐ ์์ฑ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ฒฐ์ด ํ๋ฆฝ๋์์์ ์๋ฏธํ๋ค.
- ์ฟผ๋ฆฌ ์ค๋น
Statement stmt = conn.createStatement();
- ์ฟผ๋ฆฌ ์คํ(์ฐ๊ธฐ ์์
์ ๊ฒฝ์ฐ -
insert
,update
,delete
)rs = stmt.executeQuery(SQL_QUERY_STRING);
- ์ฟผ๋ฆฌ ์คํ(์ฝ๊ธฐ ์์
์ ๊ฒฝ์ฐ -
select
)- ๊ฒฐ๊ณผ ๊ฐ์ ๋ฐ์์ค๋ ์์ ์ด๋ผ๋ฉด
ResultSet rs = psmt.executeQuery();
- SQL๋ฌธ์ด
select
๋ฌธ์ด์๋ค๋ฉดResultSet
์ ์ด์ฉํ ์ฒ๋ฆฌ- ๊ฐ ์ถ์ถ
์ด๋ ๊ฒ ์ถ์ถํ ๊ฐ๋ค์ ๋ณดํต DTO๊ฐ์ฒด๋ก ๋ณํํ์ฌ ์ฌ์ฉํ๋ค.while(rs.next()){ String result1 = resultSet.getString(1) // ์ปฌ๋ผ ์ธ๋ฑ์ค String result2 = resultSet.getString("NAME") // ์ปฌ๋ผ๋ช }
rs.close(); // ResultSet๋ฅผ ๋ซ๋๋ค.
stmt.close(); // Statement๋ฅผ ๋ซ๋๋ค.
conn.close(); // Connection๋ฅผ ๋ซ๋๋ค.
- ์ฟผ๋ฆฌ๋ฅผ ์คํํ๊ธฐ ์ ๊ณผ ํ์ ๋ง์ ์ฝ๋๋ฅผ ์์ฑํด์ผํ๋ค. EX) ์ฐ๊ฒฐ ์์ฑ, ๋ช ๋ น๋ฌธ, ResultSet ๋ซ๊ธฐ, ์ฐ๊ฒฐ ๋ฑ
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ก์ง์์ ์์ธ ์ฒ๋ฆฌ ์ฝ๋๋ฅผ ์ํํด์ผ ํ๋ค.
- ํธ๋์ญ์ ์ ์ฒ๋ฆฌํด์ผ ํ๋ค.
- ์ด๋ฌํ ๋ชจ๋ ์ฝ๋๋ฅผ ๋ฐ๋ณตํ๋ ๊ฒ์ผ๋ก, ์๊ฐ์ด ๋ญ๋น๋๋ค.
JDBC Template์ Spring JDBC ์ ๊ทผ ๋ฐฉ๋ฒ ์ค ํ๋๋ก, ๋ด๋ถ์ ์ผ๋ก Plain JDBC API๋ฅผ ์ฌ์ฉํ์ง๋ง ์์ ๊ฐ์ ๋ฌธ์ ์ ๋ค์ ์ ๊ฑฐํ ํํ์ Spring์์ ์ ๊ณตํ๋ class์ด๋ค.
- Spring JDBC๊ฐ ํ๋ ์ผ
- ์์์ ์์ฑ๊ณผ ๋ฐํ(Connection, Statement, ResultSet ๋ฑ)
- Statement ์คํ
- ResultSet Loop ์ฒ๋ฆฌ
- Exception ์ฒ๋ฆฌ์ ๋ฐํ
- Transaction ์ฒ๋ฆฌ
- Spring JDBC์์ ๊ฐ๋ฐ์๊ฐ ํ ์ผ
- ํต์ฌ์ ์ผ๋ก ํด์ผ๋ ์์
๋ง ํด์ฃผ๋ฉด ๋๋จธ์ง๋ Framwork๊ฐ ์์์ ์ฒ๋ฆฌํด์ค๋ค.
- datasource ์ค์
- sql๋ฌธ ์์ฑ
- ๊ฒฐ๊ณผ ์ฒ๋ฆฌ
- ํต์ฌ์ ์ผ๋ก ํด์ผ๋ ์์
๋ง ํด์ฃผ๋ฉด ๋๋จธ์ง๋ Framwork๊ฐ ์์์ ์ฒ๋ฆฌํด์ค๋ค.