๋ณธ๋ฌธ์œผ๋กœ ๊ฑด๋„ˆ๋›ฐ๊ธฐ

๐Ÿญ 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๋ž€ ํด๋ž˜์Šค๋Š” ํ™•์žฅ์— ๊ฐœ๋ฐฉ์ ์ด๊ณ  ์ˆ˜์ •์— ํ์‡„์ ์ด์–ด์•ผ ํ•œ๋‹ค๋Š” ์›์น™์ด๋‹ค.

์ƒˆ ๊ธฐ๋Šฅ์„ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ๊ธฐ์กด ๊ธฐ๋Šฅ์„ ๋ณ€๊ฒฝํ•  ๋•Œ ๊ฑด๋“œ๋ฆด ์ฝ”๋“œ๊ฐ€ ์ตœ์†Œ์ธ ์‹œ์Šคํ…œ ๊ตฌ์กฐ๊ฐ€ ๋ฐ”๋žŒ์งํ•˜๋‹ค. ์ด์ƒ์ ์ธ ์‹œ์Šคํ…œ์ด๋ผ๋ฉด ์ƒˆ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ๋•Œ ์‹œ์Šคํ…œ์„ ํ™•์žฅํ•  ๋ฟ ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค.

๐ŸŽˆ ๋ณ€๊ฒฝ์œผ๋กœ๋ถ€ํ„ฐ ๊ฒฉ๋ฆฌโ€‹

์š”๊ตฌ์‚ฌํ•ญ์€ ๋ณ€ํ•˜๊ธฐ ๋งˆ๋ จ์ด๋‹ค. ๋”ฐ๋ผ์„œ ์ฝ”๋“œ๋„ ๋ณ€ํ•˜๊ธฐ ๋งˆ๋ จ์ด๋‹ค. ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ž…๋ฌธ์—์„œ ์šฐ๋ฆฌ๋Š” ๊ตฌ์ฒด์ ์ธ ํด๋ž˜์Šค์™€ ์ถ”์ƒ ํด๋ž˜์Šค๊ฐ€ ์žˆ๋‹ค๊ณ  ๋ฐฐ์› ๋‹ค. ๊ตฌ์ฒด์ ์ธ ํด๋ž˜์Šค๋Š” ์ƒ์„ธํ•œ ๊ตฌํ˜„์„ ํฌํ•จํ•˜๋ฉฐ ์ถ”์ƒ ํด๋ž˜์Šค๋Š” ๊ฐœ๋…๋งŒ ํฌํ•จํ•œ๋‹ค๊ณ ๋„ ๋ฐฐ์› ๋‹ค. ์ƒ์„ธํ•œ ๊ตฌํ˜„์— ์˜์กดํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ ํด๋ž˜์Šค๋Š” ๊ตฌํ˜„์ด ๋ฐ”๋€Œ๋ฉด ์œ„ํ—˜์— ๋น ์ง„๋‹ค. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ์ธํ„ฐํŽ˜์ด์Šค์™€ ์ถ”์ƒ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•ด ๊ตฌํ˜„์ด ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ๊ฒฉ๋ฆฌํ•œ๋‹ค.

์ƒ์„ธํ•œ ๊ตฌํ˜„์— ์˜์กดํ•˜๋Š” ์ฝ”๋“œ๋Š” ํ…Œ์ŠคํŠธ๊ฐ€ ์–ด๋ ต๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Portfolio ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž. ๊ทธ๋Ÿฐ๋ฐ Portfolio ํด๋ž˜์Šค๋Š” ์™ธ๋ถ€ TokyoStockExchange API๋ฅผ ์‚ฌ์šฉํ•ด ํฌํŠธํด๋ฆฌ์˜ค ๊ฐ’์„ ๊ณ„์‚ฐํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋Š” ์‹œ์„ธ ๋ณ€ํ™”์— ์˜ํ–ฅ์„ ๋ฐ›๋Š”๋‹ค. 5๋ถ„๋งˆ๋‹ค ๊ฐ’์ด ๋‹ฌ๋ผ์ง€๋ฏ€๋กœ API๋กœ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์งœ๊ธฐ๋ž€ ์‰ฝ์ง€ ์•Š๋‹ค.

Portfolio ํด๋ž˜์Šค์—์„œ TokyoStockExchange API๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜๋Š” ๋Œ€์‹  StockExchange๋ผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์„ฑํ•œ ํ›„ ๋ฉ”์„œ๋“œ ํ•˜๋‚˜๋ฅผ ์„ ์–ธํ•œ๋‹ค.

public interface StockExchange {
Money currentPrice(String symbol);
}

๋‹ค์Œ์œผ๋กœ StockExchange ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” TokyoStockExchange ํด๋ž˜์Šค๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค. ๋˜ํ•œ Portfolio ์ƒ์„ฑ์ž๋ฅผ ์ˆ˜์ •ํ•ด StockExchange ์ฐธ์กฐ์ž๋ฅผ ์ธ์ˆ˜๋กœ ๋ฐ›๋Š”๋‹ค.

public Portfolio {
private StockExchange exchange;
public Portfolio(StockExchange exchange) {
this.exchange = exchange;
}
// ...
}

์ด์ œ TokyoStockExchange ํด๋ž˜์Šค๋ฅผ ํ‰๋‚ด๋‚ด๋Š” ํ…Œ์ŠคํŠธ์šฉ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ํ…Œ์ŠคํŠธ์šฉ ํด๋ž˜์Šค๋Š” StockExchange ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉฐ ๊ณ ์ •๋œ ์ฃผ๊ฐ€๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ํ…Œ์ŠคํŠธ์—์„œ ๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ ์ฃผ์‹ ๋‹ค์„ฏ ์ฃผ๋ฅผ ๊ตฌ์ž…ํ•œ๋‹ค๋ฉด ํ…Œ์ŠคํŠธ์šฉ ํด๋ž˜์Šค๋Š” ์ฃผ๊ฐ€๋กœ ์–ธ์ œ๋‚˜ 100๋ถˆ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์šฐ๋ฆฌ ํ…Œ์ŠคํŠธ์šฉ ํด๋ž˜์Šค๋Š” ๋‹จ์ˆœํžˆ ๋ฏธ๋ฆฌ ์ •ํ•ด๋†“์€ ํ‘œ ๊ฐ’์„ ์ฐธ์กฐํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์šฐ๋ฆฌ๋Š” ์ „์ฒด ํฌํŠธํด๋ฆฌ์˜ค ์ด๊ณ„๊ฐ€ 500๋ถˆ์ธ์ง€ ํ™•์ธํ•˜๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

public class PortfolioTest {
private FixedStockExchangeStub exchange;
private Portfolio portfolio;

@Before
protected void setUp() throws Exception {
exchange = new FixedStockExchangeStub();
exchange.fix("MSFT", 100);
portfolio = new Portfolio(exchange);
}

@Test
public void GivenFiveMSFTTotalShouldBe500() throws Exception {
portfolio.add(5, "MSFT");
Assert.assertEquals(500, portfolio.value());
}
}

์œ„์™€ ๊ฐ™์€ ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•  ์ •๋„๋กœ ์‹œ์Šคํ…œ์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๋ฉด ์œ ์—ฐ์„ฑ๊ณผ ์žฌ์‚ฌ์šฉ์„ฑ๋„ ๋”์šฑ ๋†’์•„์ง„๋‹ค. ๊ฒฐํ•ฉ๋„๊ฐ€ ๋‚ฎ๋‹ค๋Š” ์†Œ๋ฆฌ๋Š” ๊ฐ ์‹œ์Šคํ…œ ์š”์†Œ๊ฐ€ ๋‹ค๋ฅธ ์š”์†Œ๋กœ๋ถ€ํ„ฐ ๊ทธ๋ฆฌ๊ณ  ๋ณ€๊ฒฝ์œผ๋กœ๋ถ€ํ„ฐ ์ž˜ ๊ฒฉ๋ฆฌ๋˜์–ด ์žˆ๋‹ค๋Š” ์˜๋ฏธ๋‹ค. ์‹œ์Šคํ…œ ์š”์†Œ๊ฐ€ ์„œ๋กœ ์ž˜ ๊ฒฉ๋ฆฌ๋˜์–ด ์žˆ์œผ๋ฉด ๊ฐ ์š”์†Œ๋ฅผ ์ดํ•ดํ•˜๊ธฐ๋„ ๋” ์‰ฌ์›Œ์ง„๋‹ค.

์ด๋ ‡๊ฒŒ ๊ฒฐํ•ฉ๋„๋ฅผ ์ตœ์†Œ๋กœ ์ค„์ด๋ฉด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋˜ ๋‹ค๋ฅธ ํด๋ž˜์Šค ์„ค๊ณ„ ์›์น™์ธ DIP(Dependency Inversion Principle)๋ฅผ ๋”ฐ๋ฅด๋Š” ํด๋ž˜์Šค๊ฐ€ ๋‚˜์˜จ๋‹ค. ๋ณธ์งˆ์ ์œผ๋กœ๋Š” DIP๋Š” ํด๋ž˜์Šค๊ฐ€ ์ƒ์„ธํ•œ ๊ตฌํ˜„์ด ์•„๋‹ˆ๋ผ ์ถ”์ƒํ™”์— ์˜์กดํ•ด์•ผ ํ•œ๋‹ค๋Š” ์›์น™์ด๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๊ฐœ์„ ํ•œ Portfolio ํด๋ž˜์Šค๋Š” TokyoStockExchange๋ผ๋Š” ์ƒ์„ธํ•œ ๊ตฌํ˜„ ํด๋ž˜์Šค๊ฐ€ ์•„๋‹ˆ๋ผ StockExchange ์ธํ„ฐํŽ˜์ด์Šค์— ์˜์กดํ•œ๋‹ค. StockExchange ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ฃผ์„ ๊ธฐํ˜ธ๋ฅผ ๋ฐ›์•„ ํ˜„์žฌ ์ฃผ์‹ ๊ฐ€๊ฒฉ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ์ถ”์ƒ์ ์ธ ๊ฐœ๋…์„ ํ‘œํ˜„ํ•œ๋‹ค. ์ด์™€ ๊ฐ™์€ ์ถ”์ƒํ™”๋กœ ์‹ค์ œ๋กœ ์ฃผ๊ฐ€๋ฅผ ์–ป์–ด์˜ค๋Š” ์ถœ์ฒ˜๋‚˜ ์–ป์–ด์˜ค๋Š” ๋ฐฉ์‹ ๋“ฑ๊ณผ ๊ฐ™์€ ๊ตฌ์ฒด์ ์ธ ์‚ฌ์‹ค์„ ๋ชจ๋‘ ์ˆจ๊ธด๋‹ค.