0627 ~ 0703
# 0627 ~ 0703
# 0627 - ๊ฐ์ฒด์งํฅ ์ํ ์ฒด์กฐ ์์น 9๊ฐ์ง
# 1. ํ ๋ฉ์๋์ ์ค์ง ํ ๋จ๊ณ์ ๋ค์ฌ์ฐ๊ธฐ๋ง ํ๋ค.
ํ ๋ฉ์๋์ ๋ค์ฌ์ฐ๊ธฐ๊ฐ ์ฌ๋ฌ ๊ฐ ์กด์ฌํ๋ค๋ฉด, ํด๋น ๋ฉ์๋๋ ์ฌ๋ฌ๊ฐ์ง ์ผ์ ํ๊ณ ์๋ค๊ณ ๋ด๋ ๋ฌด๊ดํ๋ค.
๋ฉ์๋๋ ๋งก์ ์ผ์ด ์ ์์๋ก ์ฌ์ฌ์ฉ์ฑ์ด ๋๊ณ ๋๋ฒ๊น
๋ ์ฉ์ดํ๋ค.
# 2. else ํค์๋๋ฅผ ์ฐ์ง ์๋๋ค.
์กฐ๊ฑด๋ฌธ์ ๋ณต์ ์ ์์ธ์ด ๋๊ธฐ๋ ํ๋ฉฐ ๊ฐ๋
์ฑ ๋ํ ์ข์ง ์๋ค.
๋์์ธ ํจํด์ Strategy ํจํด - ์ํ ์ธ๋ผ์ธ(status inline)์ ๋ถ๊ธฐ๋ฅผ ๋ง๊ธฐ ์ํ ๋คํ์ฑ(polymorphism) ์์ ๊ฐ ์๋ค.
์ํ์ ๋ํ ๋ถ๊ธฐ๊ฐ ๋ช ๊ตฐ๋ฐ ๊ฑธ์ณ ์ค๋ณต๋ผ ์์ ๋ Strategy ํจํด์ ํนํ ์ ์ฉ
๊ฐ๋จํ ๊ฒฝ์ฐ์ guard clause(๋ณดํธ ๊ตฌ๋ฌธ) ์ฌ์ฉ : if์ return์ ์ธ ๊ฒ(early return) - ๋จ, ๋ง์ด ์ฐ๋ฉด ๊ฐ๊ฒฐํจ์ ํด์น ์ ์๋ค.
# 3. ๋ชจ๋ ์์๊ฐ๊ณผ ๋ฌธ์์ด์ ํฌ์ฅ(wrap)ํ๋ค.
์์ํ ๋ณ์๋ก๋ ์ปดํ์ผ๋ฌ๊ฐ ์๋ฏธ์ ์ผ๋ก ๋ง๋ ํ๋ก๊ทธ๋จ ์์ฑ์ ์๋ดํ ์ ์๋ค. (์ - ๋
๋์ ๋ํ ์ ํจ์ฑ ๊ฒ์ฌ)
ํฌ์ฅํ ๊ฐ์ฒด๋ก๋ผ๋ฉด ์์ฃผ ์ฌ์ํ๋๋ผ๋ ์ปดํ์ผ๋ฌ์ ๊ฐ๋ฐ์์๊ฒ ํด๋น ๊ฐ์ด ์ด๋ค ๊ฐ์ด๋ฉฐ ์ ์ฐ๋์ง์ ๋ํด ์ ๋ณด๋ฅผ ์ ๋ฌํ ์ ์๋ค.
๋ํ ์๊ฐ์ด๋ ๋์ฒ๋ผ ์์ ๋จ์๋ฅผ ํฌ์ฅํ ๊ฐ์ฒด์ ๊ฒฝ์ฐ์, ํ์(๋ฉ์๋)๋ฅผ ๋์ ๊ณณ์ ๋ง๋ จํด์ค๋ค.
# 4. ํ ์ค์ ์ ์ ํ๋๋ง ์ฐ๋๋ค.
(์คํธ๋ฆผ ๋ฑ ์ฒด์ด๋ํ๋ ์ผ๋ถ๋ฅผ ์ ์ธ)
์ด๋ ์ฝ๋ ํ ๊ณณ์์ ์ ์ด ๋ ์ด์ ์๋ค๋ฉด, ํด๋น ๋ถ๋ถ์ ๋ค์ ๋ฆฌํฉํ ๋ง ํด์ผ ํ๋ค.
- ์ด์ฉ๋ฉด ๋ค๋ฅธ ๋ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ๋์ ์กฐ์ํ๊ณ ์๋ ๊ฒ์ผ ์๋ ์๋ค.
๋๋ฏธํฐ(Demeter)์ ๋ฒ์น : "์น๊ตฌํ๊ณ ๋ง ๋ํํ๋ผ"
์์ ์์ ์ ๊ฐ์ฒด, ์์ ์ด ์์ฑํ ๊ฐ์ฒด, ๊ทธ๋ฆฌ๊ณ ๋๊ตฐ๊ฐ ์ค(ํ๋ผ๋ฏธํฐ๋ก) ๊ฐ์ฒด์๋ง ๋ฉ์์ง๋ฅผ ๋ณด๋ผ ๊ฒ
- ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ, ๋ค๋ฅธ ๊ฐ์ฒด์ ๋๋ฌด ๊น์์ด ๊ด์ฌํ๊ฒ ๋๋ค : ์บก์ํ๋ฅผ ์ด๊ธฐ๋ ๊ฒ
๋ฉ์์ง๋ฅผ ๋ฐ๋ ๊ฐ์ฒด๋ ์์ ์ ์์ ์คํํ๊ธฐ๋ณด๋ค๋, ์์ ์ ํด์ฃผ๋๋ก ํด์ผ ํ๋ค.
# 5. ์ค์ฌ์ฐ์ง ์๋๋ค.
๊ณผ๋ํ ์ถ์ฝ์ ์ฝ๋ ๊ฐ๋
์ฑ์ ์ ํดํ๋ค. ๋ฌด์กฐ๊ฑด ์งง๋ค๊ณ ์ข์ ๊ฒ์ ์๋๋ค.
๋ฉ์๋์ ์ด๋ฆ์ด ๊ธด ์ด์ ์ค ํ๋๋, ์ฑ
์์ ๋๋ฌด ๋ง์ด ๊ฐ๊ณ ์๊ฑฐ๋, ์ ์ ํ ํด๋์ค์ ์๋์ ์์นํ์ง ์์์ ์ผ ์ ์๋ค.
# 6. entity๋ฅผ ์๊ฒ ์ ์งํ๋ค.
50์ค ์ด์ ๋๋ ํด๋์ค ๋๋ 10๊ฐ ํ์ผ ์ด์์ ํจํค์ง๋ ์์ด์ผ ํ๋ค.
[ ํด๋์ค ]
- 50์ค ์ด์์ธ ๊ฒฝ์ฐ ๋ณดํต ํด๋์ค๊ฐ ํ ๊ฐ์ง ์ผ๋ง ํ์ง ์๋๋ค.
- 50์ค ์ ๋๋ฉด ์คํฌ๋กค์ ๋ด๋ฆฌ์ง ์์๋ ๋๋ค.
[ ํจํค์ง ]
- ํ๋์ ๋ชฉ์ ์ ๋ฌ์ฑํ๊ธฐ ์ํ ์ฐ๊ด๋ ํด๋์ค๋ค์ ๋ชจ์.
- ์๊ฒ ์ ์งํ๋ฉด ํจํค์ง๊ฐ ์ง์ ํ ์ ์ฒด์ฑ์ ๊ฐ์ง๊ฒ ๋๋ค.
# 7. 2๊ฐ ์ด์์ ์ธ์คํด์ค ๋ณ์๋ฅผ ๊ฐ์ง ํด๋์ค๋ฅผ ์ฐ์ง ์๋๋ค.
์๋ก์ด ์ธ์คํด์ค ๋ณ์๋ฅผ ๊ฐ์ง ํด๋์ค๋ ์์ง๋๊ฐ ๋จ์ด์ง๋ค. ๋ง์ ์ธ์คํด์ค ๋ณ์๋ฅผ ๊ฐ์ง ํด๋์ค๋ก ์์ง๋ ฅ์๋ ๋จ์ผ ์์
์ ์ค๋ช
ํ ์ ์๋ ๊ฒฝ์ฐ๋ ๊ฑฐ์ ์๋ค.
์ธ์คํด์ค ๋ณ์์ ๋ถํด๋ ์ฌ๋ฌ ๊ฐ์ ๊ด๋ จ ์ธ์คํด์ค ๋ณ์์ ๊ณตํต์ฑ์ ์ดํดํ๊ฒ ํ์ฌ ์๋ฃ๊ตฌ์กฐํ์ผ๋ก ๋ฌถ์ด ์ผ๊ธ ์ปฌ๋ ์
์ผ๋ก ์์ฑํ ์ ์๊ฒ ํด์ค๋ค.
์ธ์คํด์ค ๋ณ์๋ค์ ์งํฉ์ ๊ฐ๊ณ ์๋ ๊ฒ์์, ํ๋ ฅ ๊ฐ์ฒด(์ผ๊ธ ์ปฌ๋ ์
/Wrapper ๊ฐ์ฒด)์ ๊ณ์ธต ๊ตฌ์กฐ๋ก ๋ถํดํ๋ฉด ๋ ํจ์จ์ ์ธ ๊ฐ์ฒด ๋ชจ๋ธ์ด ๋ ์ ์๋ค. ๋ณต์กํ๊ณ ๋ฉ์น ํฐ ๊ฐ์ฒด๋ฅผ ์ดํดํ๋ ๊ฒ์ ์ด๋ ต์ง๋ง, ๋ถํดํ๋ฉด ๊ฐ๋จํด์ง๋ค.
๋ถํดํ๋ ๊ฒ์ด ์ด๋ ต๊ฑฐ๋ ๋ง๋งํ๋ค๋ฉด, ๊ฐ์ฒด๋ฅผ ์๊ด ๊ด๊ณ๊ฐ ์๋ ๋ฐ(half)์ฉ ๋๋๊ฑฐ๋, ์ธ์คํด์ค ๋ณ์๋ฅผ ๋ ๊ณจ๋ผ์ ๊ทธ๋ก๋ถํฐ ํ๋์ ๊ฐ์ฒด๋ฅผ ๋ง๋๋ ๋ฑ์ ํ๋ ๊ฒ์ ์ถ์ฒํ๋ค.
# 8. ์ผ๊ธ ์ปฌ๋ ์ ์ ์ด๋ค.
์ฝ๋ ์ (Collection)์ ๊ฐ์ง ํด๋์ค๋ ์ฝ๋ ์ ์ธ์๋ ๋ค๋ฅธ ๋ฉค๋ฒ ๋ณ์๋ฅผ ๊ฐ์ง๋ฉด ์๋๋ค๋ ์์น์ด๋ค. ์ด๋ค ๋ฐ์ดํฐ ์ธํธ(Set)๋ฅผ ๊ฐ์ง๊ณ ์๋๋ฐ ์กฐ์์ด ํ์ํ๋ค๋ฉด ๊ทธ ๋ฐ์ดํฐ์๋ง ์ง์ค๋ ํด๋์ค๋ฅผ ๋ง๋ค์ด์ผ ํ๋ค.
# 9. getter/setter/property๋ฅผ ์ฐ์ง ์๋๋ค.
์ด ๊ท์น์ "๋ง์ ํ๋, ๋ฌป์ง๋ ๋ง๋ผ.(Tell, don't ask)"๋ก ๋๋ณ๋๋ค. ๊ฐ์ฒด์ ์ํ๋ฅผ ๊ฐ์ ธ์ค๋ ์ ๊ทผ์(accessor)๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ด์ฐฎ์ง๋ง, ๊ฐ์ฒด ๋ฐ๊นฅ์์ ๊ทธ ๊ฒฐ๊ณผ๊ฐ์ ์ฌ์ฉํด ๊ฐ์ฒด์ ๋ํ ๊ฒฐ์ ์ ๋ด๋ฆฌ๋ ๊ฒ์ ์๋๋ค. ํ ๊ฐ์ฒด์ ์ํ์ ๋ํ ๊ฒฐ์ ์ ์ด๋ค ๊ฒ์ด๋ ๊ทธ ๊ฐ์ฒด ์์์๋ง ์ด๋ฃจ์ด์ ธ์ผ ํ๋ค.
# 0701 - ๋๋ผ์ด๋น ํ ์ด๋ธ(DRIVING TABLE)
# ๋๋ผ์ด๋น ํ ์ด๋ธ์ด๋?
JOIN์ ๋จผ์ ์ก์ธ์ค ๋ผ์ ACCESS PATH๋ฅผ ์ฃผ๋ํ๋ ํ ์ด๋ธ์ ๋๋ผ์ด๋น ํ ์ด๋ธ์ด๋ผ๊ณ ํ๋ค.
์ฆ, ์กฐ์ธ์ ๋จผ์ ์ก์ธ์ค๋๋ ์ชฝ์ ๋๋ผ์ด๋น ํ ์ด๋ธ(DRIVING TABLE, OUTER TABLE)์ด๋ผ๊ณ ํ๋ฉฐ, ๋์ค์ ์ก์ธ์ค ๋๋ ํ ์ด๋ธ์ ๋๋ฆฌ๋ธ ํ ์ด๋ธ(DRIVEN TABLE, INNER TABLE)์ด๋ผ๊ณ ํ๋ค.
์ธ๋ฑ์ค์ ์กด์ฌ ๋ฐ ์ฐ์ ์์ ํน์ FROM์ ์์์ TABLE ์ง์ ์์์ ์ํฅ์ ๋ฐ์ผ๋ฉฐ ์ด๋ ํ ์ด๋ธ์ด ๋จผ์ ์์ธ์ค๋๋๋์ ๋ฐ๋ผ ์๋์ ์ฐจ์ด๊ฐ ํฌ๊ฒ ๋ ์ ์์ผ๋ฏ๋ก ๋ง์ ์์ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ๋, ๋๋ผ์ด๋น ํ ์ด๋ธ์ ๋งค์ฐ ์ฆ์ํ๋ค
์กฐ๊ฑด์ ๋ง์กฑํ๋ 5000๋ง ๊ฑด์ธ Aํ
์ด๋ธ๊ณผ
์กฐ๊ฑด์ ๋ง์กฑํ๋ 1000๊ฑด์ธ Bํ
์ด๋ธ๊ณผ
์กฐ์ธ ์ ๋๋ผ์ด๋น ์์์ ๋ฐ๋ผ ์๋์ ํ์ฐํ ์ฐจ์ด๊ฐ ์๋ค.
ย
5000๋ง ๊ฑด์ ๋จผ์ ๋๋ผ์ด๋นํ๋ฉด
5000๋ง ๋ฒ์ ๋ฐ๋ณตํ๋ฉฐ Bํ
์ด๋ธ ํ์ํ๋ฉฐ,
ย
1000๊ฑด์ธ B๊ฐ ๋จผ์ ๋๋ผ์ด๋น๋๋ฉด
์ต๋ 1000๋ฒ Aํ
์ด๋ธ ํ์์ด ๋ฐ๋ณต์ด ๋๋ค.
์ฆ, ์์ ๋์์ด ๋๋ ํ(rows)์ ์๊ฐ ์ ์ ํ ์ด๋ธ๋ถํฐ ์ก์ธ์ค ๋์ด์ผ ์ ์ฒด ํ์์ด ์ค์ด๋ ๋ค.
# ๋๋ผ์ด๋น ํ ์ด๋ธ ๊ฒฐ์ ๊ท์น
- ๊ท์น ๊ธฐ๋ฐ ์ตํฐ๋ง์ด์ (Rule-Based Optimizer, RBO)์์๋ ์ฐ์ฐ์, ์ธ๋ฑ์ค์ ์ ๋ฌด, ์กฐ๊ฑด์ ์ ํํ ๋ฑ ์ ํด์ง ๊ท์น์ ์ฐ์ ์์์ ๋ฐ๋ผ ์คํ๊ณํ์ ์์ฑํ๋ค.
- ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํ ์ก์ธ์ค ๋ฐฉ์์ด ์ ์ฒด ํ ์ด๋ธ ์ก์ธ์ค ๋ฐฉ์๋ณด๋ค ์ฐ์ ์์๊ฐ ๋์
- ์กฐ์ธ ์นผ๋ผ์ ๋ํ ์ธ๋ฑ์ค๊ฐ ์์ชฝ ํ ์ด๋ธ์ ๋ชจ๋ ์กด์ฌํ ๋, ์ฐ์ ์์๊ฐ ๋์ ํ ์ด๋ธ์ ์ ใ ํ
- ์กฐ์ธ ์นผ๋ผ์๋ง ์ธ๋ฑ์ค๊ฐ ์กด์ฌํ๋ ๊ฒฝ์ฐ์๋ ์ธ๋ฑ์ค๊ฐ ์๋ ํ ์ด๋ธ์ ๋จผ์ ์ ํํ์ฌ ์กฐ์ธ ์ํ
- ๋ง์ฝ ์กฐ์ธ ํ ์ด๋ธ์ ์ฐ์ ์์๊ฐ ๋์ผํ์ง ์๋ค๋ฉด, FROM ์ ์ ๋์ด๋ ํ ์ด๋ธ์ ์ญ์์ผ๋ก ์ํ
- ๋น์ฉ๊ธฐ๋ฐ ์ตํฐ๋ง์ด์ (Cost-Based Optimizer, CBO)๋ ๊ท์น์ ์ฐ์ ์์๊ฐ ์๋ ์ฟผ๋ฆฌ๋ฅผ ์ํํ๋๋ฐ ์์๋๋ ์์ ๋น์ฉ์ ๋ฐํ์ผ๋ก ์คํ๊ณํ์ ์์ฑํ๋ค. ํต๊ณ์ ๋ณด, DBMS ์ค์ ์ ๋ณด, DBMS ๋ฒ์ ๋ฑ์ ์ฐจ์ด๋ก ์ธํด ๋๊ฐ์ SQL๋ฌธ์ด๋ผ๋ ์๋ก ๋ค๋ฅธ ์คํ๊ณํ์ธ ์์ฑ ๋ ์ ์๋ค
SELECT *
FROM employees e, dept_emp de
WHERE e.emp_no=de.emp_no;
์ด ๋ ํ ์ด๋ธ์ ์กฐ์ธ ์ฟผ๋ฆฌ์์ emp_no ์นผ๋ผ๊ณผ dept_emp ํ ์ด๋ธ์ emp_no์นผ๋ผ์ ๊ฐ๊ฐ ์ธ๋ฑ์ค๊ฐ ์์ ๋์ ์์ ๋์ ์กฐ์ธ์์๋ฅผ ๋น๊ตํด ๋ณด๋ฉด ์๋์ ๊ฐ๋ค.
๋ ์นผ๋ผ ๋ชจ๋ ๊ฐ๊ฐ ์ธ๋ฑ์ค๊ฐ ์๋ ๊ฒฝ์ฐ
์ตํฐ๋ง์ด์ ์ ํ๋จ์ผ๋ก ๊ฐ ํ ์ด๋ธ์ ํต๊ณ ์ ๋ณด์ ์๋ ๋ ์ฝ๋ ๊ฑด์์ ๋ฐ๋ผ employees๊ฐ ๋๋ผ์ด๋น ํ ์ด๋ธ์ด ๋ ์๋ ์๊ณ , dept_emp ํ ์ด๋ธ์ด ๋๋ผ์ด๋น ํ ์ด๋ธ์ด ๋ ์๋ ์๋ค.dept_emp.emp_no ์๋ง ์ธ๋ฑ์ค๊ฐ ์๋ ๊ฒฝ์ฐ
employees ํ ์ด๋ธ์ ๋ฐ๋ณต๋ ํ ์ค์บ์ ๋ง๊ธฐ ์ํด employees ํ ์ด๋ธ์ ๋๋ผ์ด๋น ํ ์ด๋ธ๋ก ์ ํํ๊ณ ์ธ๋ฑ์ค๊ฐ ์๋ dept_emp ํ ์ด๋ธ์ ๋๋ฆฌ๋ธ ํ ์ด๋ธ๋ก ์กฐ์ธ์ ์ํํ๋๋ก ์คํ ๊ณํ์ ์๋ฆฝํ๋ค.employees.emp_no์๋ง ์ธ๋ฑ์ค๊ฐ ์๋ ๊ฒฝ์ฐ
dept_emp ํ ์ด๋ธ์ด ๋๋ฆฌ๋ธ ํ ์ด๋ธ๋ก ์ ํ๋๋ค๋ฉด employees ํ ์ด๋ธ์ ๋ ์ฝ๋ ๊ฑด์๋งํผ dept_emp ํ ์ด๋ธ์ ํ ์ค์บํด์ผ๋ง "e.emp_no=de.emp_no" ์กฐ๊ฑด์ ์ผ์นํ๋ ๋ ์ฝ๋๋ฅผ ์ฐพ์ ์ ์๋ค. ๊ทธ๋์ ์ตํฐ๋ง์ด์ ๋ ํญ์ dept_emp ํ ์ด๋ธ์ ๋๋ผ์ด๋น ํ ์ด๋ธ๋ก, employees ํ ์ด๋ธ์ ๋๋ฆฌ๋ธ ํ ์ด๋ธ๋ก ์ ํํ๊ฒ ๋๋ค.๋ ์นผ๋ผ ๋ชจ๋ ์ธ๋ฑ์ค๊ฐ ์๋ ๊ฒฝ์ฐ
์ด๋ ํ ์ด๋ธ์ ๋๋ผ์ด๋น์ผ๋ก ์ ํํ๋๋ผ๋ ๋๋ฆฌ๋ธ ํ ์ด๋ธ์ ํ ์ค์บ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ์ค์บ๋๋ ๋ ์ฝ๋ ์์ ๋ฐ๋ผ ์ตํฐ๋ง์ด์ ๊ฐ ์ ์ ํ ๋๋ผ์ด๋น ํ ์ด๋ธ์ ์ ํํ๊ฒ ๋๋ค. ์กฐ์ธ์ด ์ํ๋ ๋ ์์ชฝ ํ ์ด๋ธ์ ์นผ๋ผ์ ๋ชจ๋ ์ธ๋ฑ์ค๊ฐ ์์ ๋๋ง ๋๋ฆฌ๋ธ ํ ์ด๋ธ์ ํ์ค์บํ๋ค. ๋๋จธ์ง ๊ฒฝ์ฐ์๋ ๋๋ผ์ด๋น ํ ์ด๋ธ์ ํ ํ ์ด๋ธ ์ค์บ์ ์ฌ์ฉํ ์๋ ์์ด๋ ๋๋ฆฌ๋ธ ํ ์ด๋ธ์ ํ ํ ์ด๋ธ ์ค์บ์ผ๋ก ์ ๊ทผํ๋ ์คํ ๊ณํ์ ์ตํฐ๋ง์ด์ ๊ฐ ๊ฑฐ์ ๋ง๋ค์ด๋ด์ง ์๋๋ค.