๐ญ Chapter 10: ํด๋์ค
๐ ํด๋์ค ์ฒด๊ณโ
๐ ์บก์ํโ
๋ณ์์ ์ ํธ๋ฆฌํฐ ํจ์๋ ๊ฐ๋ฅํ ๊ณต๊ฐํ์ง ์๋ ํธ์ด ๋ซ์ง๋ง ๋ฐ๋์ ์จ๊ฒจ์ผ ํ๋ค๋ ๋ฒ์น๋ ์๋ค.
๋๋ก๋ ๋ณ์๋ ์ ํฐ๋ฆฌํฐ ํจ์๋ฅผ protected
๋ก ์ ์ธํ์ฌ ํ
์คํธ ์ฝ๋์ ์ ๊ทผ์ ํ์ฉํ๊ธฐ๋ ํ๋ค.
์ฐ๋ฆฌ์๊ฒ ํ
์คํธ๋ ์์ฃผ ์ค์ํ๋ค.
๊ฐ์ ํจํค์ง ์์์ ํ
์คํธ ์ฝ๋๊ฐ ํจ์๋ฅผ ํธ์ถํ๊ฑฐ๋ ๋ณ์๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค๋ฉด ๊ทธ ํจ์๋ ๋ณ์๋ฅผ protected
๋ก ์ ์ธํ๊ฑฐ๋ ํจํค์ง ์ ์ฒด๋ก ๊ณต๊ฐํ๋ค.
ํ์ง๋ง ๊ทธ ์ ์ ๋น๊ณต๊ฐ ์ํ๋ฅผ ์ ์งํ ์จ๊ฐ ๋ฐฉ๋ฒ์ ๊ฐ๊ตฌํด์ผ ํ๋ค. ์บก์ํ๋ฅผ ํ์ด์ฃผ๋ ๊ฒฐ์ ์ ์ธ์ ๋ ์ตํ์ ์๋จ์ด๋ค.
๐ ํด๋์ค๋ ์์์ผ ํ๋ค!โ
ํด๋์ค๋ ๋ง๋ค ๋ ์ฒซ ๋ฒ์งธ ๊ท์น์ ํฌ๊ธฐ๋ค. ํด๋์ค๋ ์์์ผ ํ๋ค.
๋ ๋ฒ์งธ ๊ท์น๋ ํฌ๊ธฐ๋ค. ๋ ์์์ผ ํ๋ค.
์์ ํจ์ ์ฅ์์ ํ๋ ์ด์ผ๊ธฐ๋ฅผ ๋ํ์ดํ ์๋๋ ์๋ค. ๋จ์ง ํด๋์ค๋ฅผ ์ค๊ณํ ๋๋, ํจ์์ ๋ง์ฐฌ๊ฐ์ง๋ก, '์๊ฒ'๊ฐ ๊ธฐ๋ณธ ๊ท์น์ด๋ผ๋ ์๋ฏธ๋ค.
๊ทธ๋ ๋ค๋ฉด ๊ฐ์ฅ ๋จผ์ ๋ ์ค๋ฅด๋ ์๋ฌธ์, ํจ์์ ๋ง์ฐฌ๊ฐ์ง๋ก, ์ผ๋ง๋ ์์์ผ ํ๋๊ฐ?
๊ฒ ๋ค.
ํจ์๋ ๋ฌผ๋ฆฌ์ ์ธ ํ ์๋ก ํฌ๊ธฐ๋ฅผ ์ธก์ ํ๋ค.
Details
ํด๋์ค๋ ๋งก์ ์ฑ ์1์ ์ผ๋ค.
1 : [RDD] : Object Design: Roles, Responsibilities, and Collaborations, Rebecca WirfsBrock et al., Addison-Wesley, 2002.public class SuperDashboard extends JFrame implements MetaDataUser {
public Component getLastFocusedComponent()
public void setLastFocused(Component lastFocused)
public int getMajorVersionNumber()
public int getMinorVersionNumber()
public int getBuildNumber()
}
๋ฉ์๋ ๋ค์ฏ ๊ฐ ์ ๋๋ฉด ๊ด์ฐฎ๋ค. ์ ๊ทธ๋ฐ๊ฐ? ์ฌ๊ธฐ์๋ ์๋๋ค. SuperDashboard
๋ ๋ฉ์๋ ์๊ฐ ์์์๋ ๋ถ๊ตฌํ๊ณ ์ฑ
์์ด ๋๋ฌด ๋ง๋ค.
ํด๋์ค ์ด๋ฆ์ ํด๋น ํด๋์ค ์ฑ ์์ ๊ธฐ์ ํด์ผ ํ๋ค. ์ค์ ๋ก ์๋ช ์ ํด๋์ค ํฌ๊ธฐ๋ฅผ ์ค์ด๋ ์ฒซ ๋ฒ์งธ ๊ด๋ฌธ์ด๋ค. ๊ฐ๊ฒฐํ ์ด๋ฆ์ด ๋ ์ค๋ฅด์ง ์๋๋ค๋ฉด ํ๊ฒฝ ํด๋์ค ํฌ๊ธฐ๊ฐ ๋๋ฌด ์ปค์ ๊ทธ๋ ๋ค. ํด๋์ค ์ด๋ฆ์ด ๋ชจํธํ๋ค๋ฉด ํ๊ฒฝ ํด๋์ค ์ฑ ์์ด ๋๋ฌด ๋ง์์๋ค.
๋ํ ํด๋์ค ์ค๋ช ์ ๋ง์ผ(if), ๊ทธ๋ฆฌ๊ณ (and), -(ํ)๋ฉฐ(or), ํ์ง๋ง(but)์ ์ฌ์ฉํ์ง ์๊ณ ์ 25๋จ์ด ๋ด์ธ๋ก ๊ฐ๋ฅํด์ผ ํ๋ค.
๐ ๋จ์ผ ์ฑ ์ ์ ์นโ
๋จ์ผ ์ฑ ์ ์์น(SRP)์ ํด๋์ค๋ ๋ชจ๋์ ๋ณ๊ฒฝํ ์ด์ ๊ฐ ํ๋, ๋จ ํ๋๋ฟ์ด์ด์ผ ํ๋ค๋ ์์น์ด๋ค. SRP๋ ์ฑ ์์ด๋ผ๋ ๊ฐ๋ ์ ์ ์ํ๋ฉฐ ์ ์ ํ ํด๋์ค ํฌ๊ธฐ๋ฅผ ์ ์ํ๋ค. ํด๋์ค๋ ์ฑ ์, ์ฆ ๋ณ๊ฒฝํ ์ด์ ๊ฐ ํ๋์ฌ์ผ ํ๋ค๋ ์๋ฏธ๋ค.
SuperDashboard
๋ ๋ณ๊ฒฝํ ์ด์ ๊ฐ ๋ ๊ฐ์ง๋ค. ์ฒซ์งธ, SuperDashboard
๋ ์ํํธ์จ์ด ๋ฒ์ ์ ์ถ์ ํ๋ค. ๊ทธ๋ฐ๋ฐ ๋ฒ์ ์ ๋ณด๋ ์ํํธ์จ์ด๋ฅผ ์ถ์ํ ๋๋ง๋ค ๋ฌ๋ผ์ง๋ค. ๋์งธ, SuperDashboard
๋ ์๋ฐ ์ค์ ์ปดํฌ๋ํธ๋ฅผ ๊ด๋ฆฌํ๋ค. ์ฆ, ์ค์ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ ๋๋ง๋ค ๋ฒ์ ๋ฒํธ๊ฐ ๋ฌ๋ผ์ง๋ค.
์ฑ
์, ์ฆ ๋ณ๊ฒฝํ ์ด์ ๋ฅผ ํ์
ํ๋ ค ์ ์ฐ๋ค ๋ณด๋ฉด ์ฝ๋๋ฅผ ์ถ์ํํ๊ธฐ๋ ์ฌ์์ง๋ค. ๋ ์ข์ ์ถ์ํ๊ฐ ๋ ์ฝ๊ฒ ๋ ์ค๋ฅธ๋ค. SuperDashboard
์์ ๋ฒ์ ์ ๋ณด๋ฅผ ๋ค๋ฃจ๋ ๋ฉ์๋ ์ธ ๊ฐ๋ฅผ ๋ฐ๋ก ๋นผ๋ด Version
์ด๋ผ๋ ๋
์์ ์ธ ํด๋์ค๋ฅผ ๋ง๋ ๋ค. Version
ํด๋์ค๋ ๋ค๋ฅธ ์ ํ๋ฆฌ์ผ์ด์
์์ ์ฌ์ฌ์ฉํ๊ธฐ ์์ฃผ ์ฌ์ด ๊ตฌ์กฐ๋ค!
public class Version {
public int getMajorVersionNumber()
public int getMinorVersionNumber()
public int getBuildNumber()
}
SRP๋ ๊ฐ์ฒด ์งํฅ ์ค๊ณ์์ ๋์ฑ ์ค์ํ ๊ฐ๋ ์ด๋ค. ์ฐ๋ฆฌ๋ ์๋ง์ ์ฑ ์์ ๋ ์์ ํด๋์ค๋ฅผ ๊พธ์คํ ์ ํ๋ค. ๊ด์ฌ์ฌ๋ฅผ ๋ถ๋ฆฌํ๋ ์์ ์ ํ๋ก๊ทธ๋จ๋ง์ด ์๋๋ผ ํ๋ก๊ทธ๋๋ฐ ํ๋์์๋ ๋ง์ฐฌ๊ฐ์ง๋ก ์ค์ํ๋ค.
๊ท๋ชจ๊ฐ ์ด๋ ์์ค์ ์ด๋ฅด๋ ์์คํ ์ ๋ ผ๋ฆฌ๊ฐ ๋ง๊ณ ๋ ๋ณต์กํ๋ค. ์ด๋ฐ ๋ณต์ก์ฑ์ ๋ค๋ฃจ๋ ค๋ฉด ์ฒด๊ณ์ ์ธ ์ ๋ฆฌ๊ฐ ํ์๋ค. ๊ทธ๋์ผ ๊ฐ๋ฐ์๊ฐ ๋ฌด์์ด ์ด๋์ ์๋์ง ์ฝ๊ฒ ์ฐพ๋๋ค. ๊ทธ๋์ผ (๋ณ๊ฒฝ์ ๊ฐํ ๋) ์ง์ ์ํฅ์ด ๋ฏธ์น๋ ์ปดํฌ๋ํธ๋ง ์ดํดํด๋ ์ถฉ๋ถํ๋ค. ํผ์งํ ๋ค๋ชฉ์ ํด๋์ค ๋ช ๊ฐ๋ก ์ด๋ค์ง ์์คํ ์ ๋น์ฅ ์ ํ์๊ฐ ์๋ ์ฌ์ค๊น์ง ๋ค์ด๋ฐ์ด ๋ ์๋ฅผ ๋ฐฉํดํ๋ค.
ํฐ ํด๋์ค ๋ช ๊ฐ๊ฐ ์๋๋ผ ์์ ํด๋์ค ์ฌ๋ฟ์ผ๋ก ์ด๋ค์ง ์์คํ ์ด ๋ ๋ฐ๋์งํ๋ค. ์์ ํด๋์ค๋ ๊ฐ์ ๋งก์ ์ฑ ์์ด ํ๋๋ฉฐ, ๋ณ๊ฒฝํ ์ด์ ๊ฐ ํ๋๋ฉฐ, ๋ค๋ฅธ ์์ ํด๋์ค์ ํ๋ ฅํด ์์คํ ์ ํ์ํ ๋์์ ์ํํ๋ค.
๐ ์์ง๋(Cohesion)โ
ํด๋์ค๋ ์ธ์คํด์ค ๋ณ์ ์๊ฐ ์ ์์ผ ํ๋ค. ๊ฐ ํด๋์ค ๋ฉ์๋๋ ํด๋์ค ์ธ์คํด์ค ๋ณ์๋ฅผ ํ๋ ์ด์ ์ฌ์ฉํด์ผ ํ๋ค. ์ผ๋ฐ์ ์ผ๋ก ๋ฉ์๋๊ฐ ๋ณ์๋ฅผ ๋ ๋ง์ด ์ฌ์ฉํ ์๋ก ๋ฉ์๋์ ํด๋์ค๋ ์์ง๋๊ฐ ๋ ๋๋ค. ๋ชจ๋ ์ธ์คํด์ค ๋ณ์๋ฅผ ๋ฉ์๋๋ง๋ค ์ฌ์ฉํ๋ ํด๋์ค๋ ์์ง๋๊ฐ ๊ฐ์ฅ ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ์ด์ฒ๋ผ ์์ง๋๊ฐ ๊ฐ์ฅ ๋์ ํด ๋์ค๋ ๊ฐ๋ฅํ์ง๋ ๋ฐ๋์งํ์ง๋ ์๋ค. ๊ทธ๋ ์ง๋ง ์ฐ๋ฆฌ๋ ์์ง๋๊ฐ ๋์ ํด๋์ค๋ฅผ ์ ํธํ๋ค. ์์ง๋๊ฐ ๋๋ค๋ ๋ง์ ํด๋์ค์ ์ํ ๋ฉ์๋์ ๋ณ์๊ฐ ์๋ก ์์กดํ๋ฉฐ ๋ ผ๋ฆฌ์ ์ธ ๋จ์๋ก ๋ฌถ์ธ๋ค๋ ์๋ฏธ๊ธฐ ๋๋ฌธ์ด๋ค.
์๋ ์์ ์ฝ๋๋ Stack
์ ๊ตฌํํ ์ฝ๋๋ค. ์๋ ํด๋์ค๋ ์์ง๋๊ฐ ์์ฃผ ๋๋ค. size()
๋ฅผ ์ ์ธํ ๋ค๋ฅธ ๋ ๋ฉ์๋๋ ๋ ๋ณ์๋ฅผ ๋ชจ๋ ์ฌ์ฉํ๋ค.
public class Stack {
private int topOfStack = 0;
List<Integer> elements = new LinkedList<Integer>();
public int size() {
return topOfStack;
}
public void push(int element) {
topOfStack++;
elements.add(element);
}
public int pop() throws PoppedWhenEmpty {
if (topOfStack == 0)
throw new PoppedWhenEmpty();
int element = elements.get(--topOfStack);
elements.remove(topOfStack);
return element;
}
}
'ํจ์๋ฅผ ์๊ฒ, ๋งค๊ฐ๋ณ์ ๋ชฉ๋ก์ ์งง๊ฒ'๋ผ๋ ์ ๋ต์ ๋ฐ๋ฅด๋ค ๋ณด๋ฉด ๋๋๋ก ๋ช๋ช ๋ฉ์๋๋ง์ด ์ฌ์ฉํ๋ ์ธ์คํด์ค ๋ณ์๊ฐ ์์ฃผ ๋ง์์ง๋ค. ์ด๋ ์ญ์คํ๊ตฌ ์๋ก์ด ํด๋์ค๋ก ์ชผ๊ฐ์ผ ํ๋ค๋ ์ ํธ๋ค. ์์ง๋๊ฐ ๋์์ง๋๋ก ๋ณ์์ ๋ฉ์๋๋ฅผ ์ ์ ํ ๋ถ๋ฆฌํด ์๋ก์ด ํด๋์ค ๋์ธ ๊ฐ๋ก ์ชผ๊ฐ์ค๋ค.
๐ ์์ง๋๋ฅผ ์ ์งํ๋ฉด ์์ ํด๋์ค ์ฌ๋ฟ์ด ๋์จ๋คโ
ํฐ ํจ์๋ฅผ ์์ ํจ์ ์ฌ๋ฟ์ผ๋ก ๋๋๊ธฐ๋ง ํด๋ ํด๋์ค ์๊ฐ ๋ง์์ง๋ค. ๋ง์ฝ ๋ค ๋ณ์๋ฅผ ํด๋์ค ์ธ์คํด์ค ๋ณ์๋ก ์น๊ฒฉํ๋ค๋ฉด ์ ํจ์๋ ์ธ์๊ฐ ํ์ ์๋ค. ๊ทธ๋งํผ ํจ์๋ฅผ ์ชผ๊ฐ๊ธฐ ์ฌ์์ง๋ค.
๋ถํํ๋ ์ด๋ ๊ฒ ํ๋ฉด ํด๋์ค๊ฐ ์์ง๋ ฅ์ ์๋๋ค. ๋ช๋ช ํจ์๋ง ์ฌ์ฉํ๋ ์ธ์คํด์ค ๋ณ์๊ฐ ์ ์ ๋ ๋์ด๋๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋ฐ๋ฐ ์ ๊น๋ง! ๋ช๋ช ํจ์๊ฐ ๋ช๋ช ๋ณ์๋ง ์ฌ์ฉํ๋ค๋ฉด ๋ ์์ ์ธ ํด๋์ค๋ก ๋ถ๋ฆฌํด๋ ๋์ง ์๋๊ฐ? ๋น์ฐํ๋ค. ํด๋์ค๊ฐ ์์ง๋ ฅ์ ์๋๋ค๋ฉด ์ชผ๊ฐ๋ผ!
๊ทธ๋์ ํฐ ํจ์๋ฅผ ์์ ํจ์ ์ฌ๋ฟ์ผ๋ก ์ชผ๊ฐ๋ค ๋ณด๋ฉด ์ข ์ข ์์ ํด๋์ค ์ฌ๋ฟ์ผ๋ก ์ชผ๊ฐค ๊ธฐํ๊ฐ ์๊ธด๋ค. ๊ทธ๋ฌ๋ฉด์ ํ๋ก๊ทธ๋จ์ ์ ์ ๋ ์ฒด๊ณ๊ฐ ์กํ๊ณ ๊ตฌ์กฐ๊ฐ ํฌ๋ช ํด์ง๋ค.
๋ฆฌํฉํฐ๋ง ํ ๊ฐ์ฅ ๋จผ์ ๋์ ๋๋ ๋ณํ๊ฐ ํ๋ก๊ทธ๋จ์ด ๊ธธ์ด์ก๋ค๋ ์ฌ์ค์ด๋ค. ๊ธธ์ด๊ฐ ๋์ด๋ ์ด์ ๋ ์ฌ๋ฌ ๊ฐ์ง๋ค. ์ฒซ์งธ, ๋ฆฌํฉํฐ๋งํ ํ๋ก๊ทธ๋จ์ ์ข ๋ ๊ธธ๊ณ ์์ ์ ์ธ ๋ณ์ ์ด๋ฆ์ ์ฌ์ฉํ๋ค. ๋์งธ, ๋ฆฌํฉํฐ๋งํ ํ๋ก๊ทธ๋จ์ ์ฝ๋ ์ฃผ์์ ์ถ๊ฐํ๋ ์๋จ์ผ๋ก ํจ์ ์ ์ธ๊ณผ ํด๋์ค ์ ์ธ์ ํ์ฉํ๋ค. ์ ์งธ, ๊ฐ๋ ์ฑ์ ๋์ด๊ณ ์ ๊ณต๋ฐฑ์ ์ถ๊ฐํ๊ณ ํ์์ ๋ง์ถ์๋ค.
๊ฐ์ฅ ๋จผ์ , ์๋ ํ๋ก๊ทธ๋จ์ ์ ํํ ๋์์ ๊ฒ์ฆํ๋ ํ ์คํธ ์ํธ๋ฅผ ์์ฑํ๋ค. ๊ทธ๋ฐ ๋ค์, ํ ๋ฒ์ ํ๋์ฉ ์์ฐจ๋ก์ ๊ฑธ์ณ ์กฐ๊ธ์ฉ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ๋ค. ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ ๋๋ง๋ค ํ ์คํธ๋ฅผ ์ํํด ์๋ ํ๋ก๊ทธ๋จ๊ณผ ๋์ผํ๊ฒ ๋์ํ๋์ง ํ์ธํ๋ค. ์กฐ๊ธ์ฉ ์๋ ํ๋ก๊ทธ๋จ์ ์ ๋ฆฌํ ๊ฒฐ๊ณผ ์ต์ข ํ๋ก๊ทธ๋จ์ด ์ป์ด์ก๋ค.
๐ ๋ณ๊ฒฝํ๊ธฐ ์ฌ์ด ํด๋์คโ
๋๋ค์ ์์คํ ์ ์ง์์ ์ธ ๋ณ๊ฒฝ์ด ๊ฐํด์ง๋ค. ๊ทธ๋ฆฌ๊ณ ๋ญ๊ฐ ๋ณ๊ฒฝํ ๋๋ง๋ค ์์คํ ์ด ์๋๋๋ก ๋์ํ์ง ์์ ์ํ์ด ๋ฐ๋ฅธ๋ค. ๊นจ๋ํ ์์คํ ์ ํด๋์ค๋ฅผ ์ฒด๊ณ์ ์ผ๋ก ์ ๋ฆฌํด ๋ณ๊ฒฝ์ ์๋ฐํ๋ ์ํ์ ๋ฎ์ถ๋ค.
์๋ ์ฝ๋๋ ์ฃผ์ด์ง ๋ฉํ ์๋ฃ๋ก ์ ์ ํ SQL ๋ฌธ์์ด์ ๋ง๋๋ Sql ํด๋์ค๋ค. ์์ง ๋ฏธ์์ฑ์ด๋ผ update ๋ฌธ๊ณผ ๊ฐ์ ์ผ๋ถ SQL ๊ธฐ๋ฅ์ ์ง์ํ์ง ์๋๋ค. ์ธ์ ๊ฐ update ๋ฌธ์ ์ง์ํ ์์ ์ด ์ค๋ฉด ํด๋์ค์ '์๋์ด' ๊ณ ์ณ์ผ ํ๋ค. ๋ฌธ์ ๋ '์๋๋ฉด' ์ํ์ด ์๊ธด๋ค๋ ์ฌ์ค์ด๋ค. ์ด๋ค ๋ณ๊ฒฝ์ด๋ ํด๋์ค์ ์๋๋ฉด ๋ค๋ฅธ ์ฝ๋๋ฅผ ๋ง๊ฐ๋จ๋ฆด ์ ์ ์ ์ธ ์ํ์ด ์กด์ฌํ๋ค. ๊ทธ๋์ ํ ์คํธ๋ ์์ ํ ๋ค์ ํด์ผ ํ๋ค.
public class Sql {
public Sql(String table, Column[] columns)
public String create()
public String insert(Object[] fields)
public String selectAll()
public String findByKey(String keyColumn, String keyValue)
public String select(Column column, String pattern)
public String select(Criteria criteria)
public String preparedInsert()
private String columnList(Column[] columns)
private String valuesList(Object[] fields, final Column[] columns)
private String selectWithCriteria(String criteria)
private String placeholderList(Column[] columns)
}
์๋ก์ด SQL ๋ฌธ์ ์ง์ํ๋ ค๋ฉด ๋ฐ๋์ Sql ํด๋์ค์ ์๋์ผ ํ๋ค. ๋ํ ๊ธฐ์กด SQL๋ฌธ ํ๋๋ฅผ ์์ ํ ๋๋ ๋ฐ๋์ Sql ํด๋์ค์ ์๋์ผ ํ๋ค. ์ด๋ ๋ฏ ๋ณ๊ฒฝํ ์ด์ ๊ฐ ๋ ๊ฐ์ง์ด๋ฏ๋ก Sql ํด๋์ค๋ SRP๋ฅผ ์๋ฐํ๋ค.
๋จ์ํ ๊ตฌ์กฐ์ ์ธ ๊ด์ ์์๋ Sql์ SRP๋ฅผ ์๋ฐํ๋ค. ๋ฉ์๋๋ฅผ ์ญ ํ์ด๋ณด๋ฉด selectWithCriteria
๋ผ๋ ๋น๊ณต๊ฐ ๋ฉ์๋๊ฐ ์๋๋ฐ, ์ด ๋ฉ์๋๋ select
๋ฌธ์ ์ฒ๋ฆฌํ ๋๋ง ์ฌ์ฉํ๋ค.
๋ค์ ์์ ๋ ์ด๋จ๊น? ๊ณต๊ฐ ์ธํฐํ์ด์ค๋ฅผ ๊ฐ๊ฐ Sql ํด๋์ค์์ ํ์ํ๋ ํด๋์ค๋ก ๋ง๋ค์๋ค. valueList
์ ๊ฐ์ ๋น๊ณต๊ฐ ๋ฉ์๋๋ ํด๋นํ๋ ํ์ ํด๋์ค๋ก ์ฎ๊ฒผ๋ค. ๋ชจ๋ ํ์ ํด๋์ค๊ฐ ๊ณตํต์ผ๋ก ์ฌ์ฉํ๋ ๋น๊ณต๊ฐ ๋ฉ์๋๋ Where
์ ColumnList
๋ผ๋ ๋ ์ ํธ๋ฆฌํฐ ํด๋์ค์ ๋ฃ์๋ค.
abstract public class Sql {
public Sql(String table, Column[] columns)
abstract public String generate();
}
public class CreateSql extends Sql {
public CreateSql(String table, Column[] columns)
@Override public String generate()
}
public class SelectSql extends Sql {
public SelectSql(String table, Column[] columns)
@Override public String generate()
}
public class InsertSql extends Sql {
public InsertSql(String table, Column[] columns, Object[] fields)
@Override public String generate()
private String valuesList(Object[] fields, final Column[] columns)
}
public class SelectWithCriteriaSql extends Sql {
public SelectWithCriteriaSql(
String table, Column[] columns, Column column, String pattern
)
@Override public String generate()
}
public class SelectWithMatchSql extends Sql {
public SelectWithMatchSql(
String table, Column[] columns, Column column, String pattern
)
@Override public String generate()
}
public class FindByKeySql extends Sql {
public FindByKeySql(
String table, Column[] columns, String keyColumn, String keyValue
)
@Override public String generate()
}
public class PreparedInsertSql extends Sql {
public PreparedInsertSql(String table, Column[] columns)
@Override public String generate() {
private String placeholderList(Column[] columns)
}
}
public class Where {
public Where(String criteria)
public String generate()
}
public class ColumnList {
public ColumnList(Column[] columns)
public String generate()
}
๊ฐ ํด๋์ค๋ ๊ทน๋๋ก ๋จ์ํ๋ค. ์ฝ๋๋ ์์๊ฐ์ ์ดํด๋๋ค. ํจ์ ํ๋๋ฅผ ์์ ํ๋ค๊ณ ๋ค๋ฅธ ํจ์๊ฐ ๋ง๊ฐ์ง ์ํ๋ ์ฌ์ค์ ์ฌ๋ผ์ก๋ค. ํ ์คํธ ๊ด์ ์์ ๋ชจ๋ ๋ ผ๋ฆฌ๋ฅผ ๊ตฌ์๊ตฌ์ ์ฆ๋ช ํ๊ธฐ๋ ์ฌ์์ก๋ค. ํด๋์ค๊ฐ ์๋ก ๋ถ๋ฆฌ๋์๊ธฐ ๋๋ฌธ์ด๋ค.
update ๋ฌธ์ ์ถ๊ฐํ ๋ ๊ธฐ์กด ํด๋์ค๋ฅผ ๋ณ๊ฒฝํ ํ์๊ฐ ์ ํ ์๋ค๋ ์ฌ์ค ์ญ์ ์ค์ํ๋ค! update ๋ฌธ์ ๋ง๋๋ ๋ ผ๋ฆฌ๋ Sql ํด๋์ค์์ ์ ํด๋์ค UpdateSql์ ์์๋ฐ์ ๊ฑฐ๊ธฐ์ ๋ฃ์ผ๋ฉด ๊ทธ๋ง์ด๋ค. update ๋ฌธ์ ์ง์ํด๋ ๋ค๋ฅธ ์ฝ๋๊ฐ ๋ง๊ฐ์ง ์ผ๋ ค๋ ์ ํ ์๋ค.
์ ์์ ์ฒ๋ผ ์ฌ๊ตฌ์ฑํ Sql ํด๋์ค๋ ์ธ์์ ๋ชจ๋ ์ฅ์ ๋ง ์ทจํ๋ค! ์ฐ์ SRP๋ฅผ ์ง์ํ๋ค. ์ฌ๊ธฐ๋ค ๊ฐ์ฒด ์งํฅ ์ค๊ณ์์ ๋ ๋ค๋ฅธ ํต์ฌ ์์น์ธ OCP๋ ์ง์ํ๋ค. OCP๋ ํด๋์ค๋ ํ์ฅ์ ๊ฐ๋ฐฉ์ ์ด๊ณ ์์ ์ ํ์์ ์ด์ด์ผ ํ๋ค๋ ์์น์ด๋ค.
์ ๊ธฐ๋ฅ์ ์์ ํ๊ฑฐ๋ ๊ธฐ์กด ๊ธฐ๋ฅ์ ๋ณ๊ฒฝํ ๋ ๊ฑด๋๋ฆด ์ฝ๋๊ฐ ์ต์์ธ ์์คํ ๊ตฌ์กฐ๊ฐ ๋ฐ๋์งํ๋ค. ์ด์์ ์ธ ์์คํ ์ด๋ผ๋ฉด ์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ ๋ ์์คํ ์ ํ์ฅํ ๋ฟ ๊ธฐ์กด ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ์ง๋ ์๋๋ค.