Common sense
Software Engineering
ํด๋ฆฐ์ฝ๋ & ๋ฆฌํฉํ ๋ง & ์ํ์ด ์ฝ๋ฉ
โจ ํด๋ฆฐ์ฝ๋
ํด๋ฆฐ์ฝ๋๋, ๊ฐ๋ ์ฑ์ด ๋์ ์ฝ๋๋ฅผ ๋งํ๋ค.
๊ฐ๋ ์ฑ์ ๋์ด๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๊ตฌํํด์ผ ํ๋ค.
๋ค์ด๋ฐ์ด ์ ๋์ด์ผ ํจ
์ค๋ฅ๊ฐ ์์ด์ผ ํจ
์ค๋ณต์ด ์์ด์ผ ํจ
์์กด์ฑ์ ์ต๋ํ ์ค์ฌ์ผ ํจ
ํด๋์ค ํน์ ๋ฉ์๋๊ฐ ํ๊ฐ์ง ์ผ๋ง ์ฒ๋ฆฌํด์ผ ํจ
์ผ๋ง๋ ์ฝ๋๊ฐ ์ ์ฝํ๋ ์ง, ์ฝ๋๊ฐ ์ง์ ๋ถํ์ง ์๊ณ ์ ๋ฆฌ๋ ์ฝ๋์ธ์ง๋ฅผ ๋ํ๋ด๋ ๊ฒ์ด ๋ฐ๋ก 'ํด๋ฆฐ ์ฝ๋'
public int AAA(int a, int b){ return a+b; } public int BBB(int a, int b){ return a-b; }
๋ ๊ฐ์ง ๋ฌธ์ ์ ์ด ์๋ค.
public int sum(int a, int b){ return a+b; }
public int sub(int a, int b){ return a-b; }
์ฒซ์งธ๋ ํจ์ ๋ค์ด๋ฐ์ด๋ค. ๋ค๋ฅธ ์ฌ๋๋ค์ด ๋ด๋ ๋ฌด์จ ์ญํ ์ ํ๋ ํจ์์ธ ์ง ์ ์ ์๋ ์ด๋ฆ์ ์ฌ์ฉํด์ผ ํ๋ค.
๋์งธ๋ ํจ์์ ํจ์ ์ฌ์ด์ ๊ฐ๊ฒฉ์ด๋ค. ์ฌ๋ฌ ํจ์๊ฐ ์กด์ฌํ ๋ ๊ฐ๊ฒฉ์ ๋๋์ง ์์ผ๋ฉด ์์๊ณผ ๋์ ๊ตฌ๋ถํ๋ ๊ฒ์ด ๋งค์ฐ ํ๋ค๋ค.
โจ ๋ฆฌํฉํ ๋ง
ํ๋ก๊ทธ๋จ์ ์ธ๋ถ ๋์์ ๊ทธ๋๋ก ๋ ์ฑ, ๋ด๋ถ์ ์ฝ๋๋ฅผ ์ ๋ฆฌํ๋ฉด์ ๊ฐ์ ํ๋ ๊ฒ์ ๋งํจ
์ด๋ฏธ ๊ณต์ฌ๊ฐ ๋๋ ์ง์ด์ง๋ง, ๋ ํผํผํ๊ณ ๋ฉ์ง ์ง์ ๋ง๋ค๊ธฐ ์ํด ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ ํ๋ ๋ฆฌ๋ชจ๋ธ๋ง ์์
ํ๋ก์ ํธ๊ฐ ๋๋๋ฉด, ์ง์ ๋ถํ ์ฝ๋๋ฅผ ๋ณผ ๋ ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง๋ ๋ถ๋ถ์ด ์กด์ฌํ๋ค. ์ด ๋ถ๋ถ์ ๊ฐ์ ์ํค๊ธฐ ์ํด ํ์ํ ๊ฒ์ด ๋ฐ๋ก '๋ฆฌํฉํ ๋ง ๊ธฐ๋ฒ'
๋ฆฌํฉํ ๋ง ์์ ์ ์ฝ๋์ ๊ฐ๋ ์ฑ์ ๋์ด๊ณ , ํฅํ ์ด๋ฃจ์ด์ง ์ ์ง๋ณด์์ ํฐ ๋์์ด ๋๋ค.
โจ ๋ฆฌํฉํ ๋ง์ด ํ์ํ ์ฝ๋๋?
์ค๋ณต ์ฝ๋
๊ธด ๋ฉ์๋
๊ฑฐ๋ํ ํด๋์ค
Switch ๋ฌธ
์ ์ฐจ์งํฅ์ผ๋ก ๊ตฌํํ ์ฝ๋
๋ฆฌํฉํ ๋ง์ ๋ชฉ์ ์, ์ํํธ์จ์ด๋ฅผ ๋ ์ดํดํ๊ธฐ ์ฝ๊ณ ์์ ํ๊ธฐ ์ฝ๊ฒ ๋ง๋๋ ๊ฒ
๋ฆฌํฉํ ๋ง์ ์ฑ๋ฅ์ ์ต์ ํ์ํค๋ ๊ฒ์ด ์๋๋ค. ์ฝ๋๋ฅผ ์ ์ํ๊ฒ ๊ฐ๋ฐํ ์ ์๊ฒ ๋ง๋ค์ด์ฃผ๊ณ , ์ฝ๋ ํ์ง์ ์ข๊ฒ ๋ง๋ค์ด์ค๋ค.
์ดํดํ๊ธฐ ์ฝ๊ณ , ์์ ํ๊ธฐ ์ฌ์ฐ๋ฉด? โ ๊ฐ๋ฐ ์๋๊ฐ ์ฆ๊ฐ!
โจ ๋ฆฌํฉํ ๋ง์ด ํ์ํ ์ํฉ
์ํํธ์จ์ด์ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํด์ผ ํ ๋
๋ช
์ฌํด์ผํ ๊ฒ์, ์ฐ์ ์ฝ๋๊ฐ ์ ๋๋ก ๋์๊ฐ์ผ ํ๋ค๋ ๊ฒ. ๋ฆฌํฉํ ๋ง์ ์ฐ์ ์ ์ผ๋ก ํด์ผ ํ ์ผ์ด ์๋์ ๋ช
์ฌํ์
๊ฐ์ฒด์งํฅ ํน์ง์ ์ด๋ฆฌ๋ ค๋ฉด, switch-case ๋ฌธ์ ์ ๊ฒ ์ฌ์ฉํด์ผ ํจ
(switch๋ฌธ์ ์ค๋ฒ๋ผ์ด๋๋ก ๋ค ๋ฐ๊ฟ๋ฒ๋ฆฌ์)
โจ ๋ฆฌํฉํ ๋ง ์์
โจ ํด๋ฆฐ์ฝ๋์ ๋ฆฌํฉํ ๋ง์ ์ฐจ์ด?
๋ฆฌํฉํ ๋ง์ด ๋ ํฐ ์๋ฏธ๋ฅผ ๊ฐ์ง ๊ฒ ๊ฐ๋ค. ํด๋ฆฐ ์ฝ๋๋ ๋จ์ํ ๊ฐ๋ ์ฑ์ ๋์ด๊ธฐ ์ํ ์์ ์ผ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค๋ฉด, ๋ฆฌํฉํ ๋ง์ ํด๋ฆฐ ์ฝ๋๋ฅผ ํฌํจํ ์ ์ง๋ณด์๋ฅผ ์ํ ์ฝ๋ ๊ฐ์ ์ด ์ด๋ฃจ์ด์ง๋ค.
ํด๋ฆฐ์ฝ๋์ ๊ฐ์ ๋ถ๋ถ์ ์ค๊ณ๋ถํฐ ์ ์ด๋ฃจ์ด์ ธ ์๋ ๊ฒ์ด ์ค์ํ๊ณ , ๋ฆฌํฉํ ๋ง์ ๊ฒฐ๊ณผ๋ฌผ์ด ๋์จ ์ดํ ์์ ์ด๋ ์ถ๊ฐ ์์ ์ด ์งํ๋ ๋ ๊ฐ์ ํด๋๊ฐ๋ ๊ฒ์ด ์ฌ๋ฐ๋ฅธ ๋ฐฉํฅ์ด๋ค.
โจ ์ ๋ฌธ๊ฐ๋ค์ด ํํํ 'ํด๋ฆฐ์ฝ๋'
ํ ๊ฐ์ง๋ฅผ ์ ๋๋ก ํ๋ค.
๋จ์ํ๊ณ ์ง์ ์ ์ด๋ค.
ํน์ ๋ชฉ์ ์ ๋ฌ์ฑํ๋ ๋ฐฉ๋ฒ์ ํ๋๋ง ์ ๊ณตํ๋ค.
์ค๋ณต ์ค์ด๊ธฐ, ํํ๋ ฅ ๋์ด๊ธฐ, ์ด๋ฐ๋ถํฐ ๊ฐ๋จํ ์ถ์ํ ๊ณ ๋ คํ๊ธฐ ์ด ์ธ๊ฐ์ง๊ฐ ๋น๊ฒฐ
์ฝ๋๋ฅผ ์ฝ์ผ๋ฉด์ ์ง์ํ๋ ๊ธฐ๋ฅ์ ๊ฐ ๋ฃจํด์ด ๊ทธ๋๋ก ์ํํ๋ ๊ฒ
โจ ํด๋ฆฐ์ฝ๋๋?
์ฝ๋๋ฅผ ์์ฑํ๋ ์๋์ ๋ชฉ์ ์ด ๋ช ํํ๋ฉฐ, ๋ค๋ฅธ ์ฌ๋์ด ์ฝ๊ฒ ์ฝ์ ์ ์์ด์ผ ํจ
์ฆ, ๊ฐ๋ ์ฑ์ด ์ข์์ผ ํ๋ค.
โจ ๊ฐ๋
์ฑ์ ๋์ธ๋ค๋ ๊ฒ์?
๋ค๋ฅธ ์ฌ๋์ด ์ฝ๋๋ฅผ ๋ด๋, ์์ ๋กญ๊ฒ ์์ ์ด ๊ฐ๋ฅํ๊ณ ๋ฒ๊ทธ๋ฅผ ์ฐพ๊ณ ๋ณ๊ฒฝ๋ ๋ด์ฉ์ด ์ด๋ป๊ฒ ์ํธ์์ฉํ๋์ง ์ดํดํ๋ ์๊ฐ์ ์ต์ํ ์ํค๋ ๊ฒ...
ํด๋ฆฐ์ฝ๋๋ฅผ ๋ง๋ค๊ธฐ ์ํ ๊ท์น์ด ์๋ค.
1.๋ค์ด๋ฐ(Naming)
๋ณ์, ํด๋์ค, ๋ฉ์๋์ ์๋๊ฐ ๋ถ๋ช ํ ์ด๋ฆ์ ์ฌ์ฉํ๋ค.
int elapsedTimeInDays; int daysSinceCreation; int fileAgeInDays;
์๋ชป๋ ์ ๋ณด๋ฅผ ์ ๋ฌํ ์ ์๋ ์ด๋ฆ์ ์ฌ์ฉํ์ง ์๋๋ค.
๋ฒ์ฉ์ ์ผ๋ก ์ฌ์ฉ๋๋ ๋จ์ด ์ฌ์ฉX (aix, hp ๋ฑ)
์ฐ์๋ ์ซ์๋ ๋ถ์ฉ์ด๋ฅผ ๋ง๋ถ์ด๋ ๋ฐฉ์์ ํผํด์ผํจ
2.์ฃผ์๋ฌ๊ธฐ(Comment)
์ฝ๋๋ฅผ ์ฝ๋ ์ฌ๋์ด ์ฝ๋๋ฅผ ์์ฑํ ์ฌ๋๋งํผ ์ ์ดํดํ ์ ์๋๋ก ๋์์ผ ํจ
์ฃผ์์ ๋ฐ๋์ ๋ฌ์์ผ ํ ์ด์ ๊ฐ ์๋ ๊ฒฝ์ฐ์๋ง ์์ฑํ๋๋ก ํ๋ค.
์ฆ, ์ฝ๋๋ฅผ ๋น ๋ฅด๊ฒ ์ ์ถํ ์ ์๋ ๋ด์ฉ์๋ ์ฃผ์์ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ด ์ข๋ค.
์ค๋ช ์ ์ํ ์ค๋ช ์ ๋ฌ์ง ์๋๋ค.
3.๊พธ๋ฏธ๊ธฐ(Aesthetics)
๋ณด๊ธฐ์ข๊ฒ ๋ฐฐ์นํ๊ณ ๊พธ๋ฏผ๋ค. ๋ณด๊ธฐ ์ข์ ์ฝ๋๊ฐ ์ฝ๊ธฐ๋ ์ข๋ค.
๊ท์น์ ์ธ ๋ค์ฌ์ฐ๊ธฐ์ ์ค๋ฐ๊ฟ์ผ๋ก ๊ฐ๋ ์ฑ์ ํฅ์์ํค์
์ผ๊ด์ฑ์๊ณ ๊ฐ๊ฒฐํ ํจํด์ ์ ์ฉํด ์ค๋ฐ๊ฟํ๋ค.
๋ฉ์๋๋ฅผ ์ด์ฉํด ๋ถ๊ท์นํ ์ค๋ณต ์ฝ๋๋ฅผ ์ ๊ฑฐํ๋ค.
ํด๋์ค ์ ์ฒด๋ฅผ ํ๋์ ๊ทธ๋ฃน์ด๋ผ๊ณ ์๊ฐํ์ง ๋ง๊ณ , ๊ทธ ์์์๋ ์ฌ๋ฌ ๊ทธ๋ฃน์ผ๋ก ๋๋๋ ๊ฒ์ด ์ฝ๊ธฐ์ ์ข๋ค.
4.ํ๋ฆ์ ์ด ๋ง๋ค๊ธฐ(Making control flow easy to read)
์ผ์ชฝ์๋ ๋ณ์๋ฅผ, ์ค๋ฅธ์ชฝ์๋ ์์๋ฅผ ๋๊ณ ๋น๊ต
`if(length >= 10)
while(bytes_received < bytest_expected)`
๋ถ์ ์ด ์๋ ๊ธ์ ์ ๋ค๋ฃจ์
if( a == b ) { // a!=b๋ ๋ถ์ // same } else { // different }
if/else๋ฅผ ์ฌ์ฉํ๋ฉฐ, ์ผํญ ์ฐ์ฐ์๋ ๋งค์ฐ ๊ฐ๋จํ ๊ฒฝ์ฐ๋ง ์ฌ์ฉ
do/while ๋ฃจํ๋ ํผํ์
5.์ฐฉํ ํจ์(Function)
ํจ์๋ ๊ฐ๊ธ์ ์๊ฒ, ํ๋ฒ์ ํ๋์ ์์ ๋ง ์ํํ๋๋ก ์์ฑ
์จ๋ผ์ธ ํฌํ๋ก ์๋ฅผ ๋ค์ด๋ณด์
์ฌ์ฉ์๊ฐ ์ถ์ฒ์ ํ๊ฑฐ๋, ์ด๋ฏธ ์ ํํ ์ถ์ฒ์ ๋ณ๊ฒฝํ๊ธฐ ์ํด ๋ฒํผ์ ๋๋ฅด๋ฉด vote_change(old_vote, new_vote) ํจ์๋ฅผ ํธ์ถํ๋ค๊ณ ๊ฐ์ ํด๋ณด์
var vote_changed = function (old_vote, new_vote) {
var score = get_score();
if (new_vote !== old_vote) {
if (new_vote == 'Up') {
score += (old_vote === 'Down' ? 2 : 1);
} else if (new_vote == 'Down') {
score -= (old_vote === 'Up' ? 2 : 1);
} else if (new_vote == '') {
score += (old_vote === 'Up' ? -1 : 1);
}
}
set_score(score);
};
์ด์ ์ ๋ณ๊ฒฝํด์ฃผ๋ ํ ๊ฐ์ง ์ญํ ์ ํ๋ ํจ์๊ฐ์ง๋ง, ๋๊ฐ์ง ์ผ์ ํ๊ณ ์๋ค.
old_vote์ new_vote์ ์ํ์ ๋ฐ๋ฅธ score ๊ณ์ฐ
์ด์ ์ ๊ณ์ฐ
๋ณ๋๋ก ํจ์๋ก ๋ถ๋ฆฌํ์ฌ ๊ฐ๋ ์ฑ์ ํฅ์์ํค์
var vote_value = function (vote) {
if(vote === 'Up') {
return +1;
}
if(vote === 'Down') {
return -1;
}
return 0;
};
var vote_changed = function (old_vote, new_vote) {
var score = get_score();
score -= vote_value(old_vote); // ์ด์ ๊ฐ ์ ๊ฑฐ
score += vote_value(new_vote); // ์๋ก์ด ๊ฐ ๋ํจ
set_score(score);
};
ํจ์ฌ ๊น๋ํ ์ฝ๋๊ฐ ๋์๋ค!
โจ ์ฝ๋๋ฆฌ๋ทฐ & ๋ฆฌํฉํ ๋ง
๋ ๊ฑฐ์ ์ฝ๋(ํ ์คํธ๊ฐ ๋ถ๊ฐ๋ฅํ๊ฑฐ๋ ์ด๋ ค์ด ์ฝ๋)๋ฅผ ํด๋ฆฐ ์ฝ๋๋ก ๋ง๋๋ ๋ฐฉ๋ฒ
์ฝ๋๋ฆฌ๋ทฐ๋ฅผ ํตํด ๋์๋๋ ์ฝ๋๋ฅผ ๋ฐ๊ฒฌํ๋ฉด, ๋ฆฌํฉํ ๋ง์ ํตํด ์ ์ง์ ์ผ๋ก ๊ฐ์ ํด๋๊ฐ๋ค.
โจ ์ฝ๋ ์ธ์คํ์
(code inspection)
์์ฑํ ๊ฐ๋ฐ ์์ค ์ฝ๋๋ฅผ ๋ถ์ํ์ฌ ๊ฐ๋ฐ ํ์ค์ ์๋ฐฐ๋์๊ฑฐ๋ ์๋ชป ์์ฑ๋ ๋ถ๋ถ์ ์์ ํ๋ ์์
โจ ์ ์ฐจ ๊ณผ์
Planning : ๊ณํ ์๋ฆฝ
Overview : ๊ต์ก๊ณผ ์ญํ ์ ์
Preparation : ์ธ์คํ์ ์ ์ํ ์ธํฐ๋ทฐ, ์ฐ์ถ๋ฌผ, ๋๊ตฌ ์ค๋น
Meeting : ๊ฒํ ํ์๋ก ๊ฐ์ ์ญํ ์ ๋งก์ ์๋ฌด ์ํ
Rework : ๋ฐ๊ฒฌํ ๊ฒฐํจ์ ์์ ํ๊ณ ์ฌ๊ฒํ ํ์ํ์ง ์ฌ๋ถ ๊ฒฐ์
Follow-up : ๋ณด๊ณ ๋ ๊ฒฐํจ ๋ฐ ์ด์๊ฐ ์์ ๋์๋์ง ํ์ธํ๊ณ ์์ ์กฐ์น ์ดํ
โจ ๋ฆฌํฉํ ๋ง
๋์๋๋ ์ฝ๋๋ฅผ ์ ์ง์ ์ผ๋ก ๋ฐ๋ณต ์ํ๋๋ ๊ณผ์ ์ ํตํด ์ฝ๋๋ฅผ ์กฐ๊ธ์ฉ ๊ฐ์ ํด๋๊ฐ๋ ๊ฒ
โจ ๋ฆฌํฉํ ๋ง ๋์
๋ฉ์๋ ์ ๋ฆฌ : ๊ทธ๋ฃน์ผ๋ก ๋ฌถ์ ์ ์๋ ์ฝ๋, ์์์ ๋ฉ์๋๋ก ๋ณ๊ฒฝํจ
๊ฐ์ฒด ๊ฐ์ ๊ธฐ๋ฅ ์ด๋ : ๋ฉ์๋ ๊ธฐ๋ฅ์ ๋ฐ๋ฅธ ์์น ๋ณ๊ฒฝ, ํด๋์ค ๊ธฐ๋ฅ์ ๋ช ํํ ๊ตฌ๋ถ
๋ฐ์ดํฐ ๊ตฌ์ฑ : ์บก์ํ ๊ธฐ๋ฒ์ ์ ์ฉํด ๋ฐ์ดํฐ ์ ๊ทผ ๊ด๋ฆฌ
์กฐ๊ฑด๋ฌธ ๋จ์ํ : ์กฐ๊ฑด ๋ ผ๋ฆฌ๋ฅผ ๋จ์ํ๊ณ ๋ช ํํ๊ฒ ์์ฑ
๋ฉ์๋ ํธ์ถ ๋จ์ํ : ๋ฉ์๋ ์ด๋ฆ์ด๋ ๋ชฉ์ ์ด ๋ง์ง ์์ ๋ ๋ณ๊ฒฝ
ํด๋์ค ๋ฐ ๋ฉ์๋ ์ผ๋ฐํ : ๋์ผ ๊ธฐ๋ฅ ๋ฉ์๋๊ฐ ์ฌ๋ฌ๊ฐ ์์ผ๋ฉด ์ํผํด๋์ค๋ก ์ด๋
โจ ๋ฆฌํฉํ ๋ง ์งํ ๋ฐฉ๋ฒ
์ํคํ ์ฒ ๊ด์ ์์ โ ๋์์ธ ํจํด ์ ์ฉ โ ๋จ๊ณ์ ์ผ๋ก ํ์ ๊ธฐ๋ฅ์ ๋ํ ๋ณ๊ฒฝ์ผ๋ก ์งํ
์๋ํ์ง ์์ ๊ธฐ๋ฅ ๋ณ๊ฒฝ์ด๋ ๋ฒ๊ทธ ๋ฐ์ ๋๋นํด ํ๊ทํ ์คํธ ์งํ
์ดํด๋ฆฝ์ค์ ๊ฐ์ IDE ๋๊ตฌ๋ก ์ด์ฉ
โจ ์ํ์ด ์ฝ๋ฉ
์์ ํ ์ํํธ์จ์ด๋ฅผ ๊ฐ๋ฐํ๊ธฐ ์ํด, ์์ค์ฝ๋ ๋ฑ์ ์กด์ฌํ ์ ์๋ ์ ์ฌ์ ์ธ ๋ณด์์ฝ์ ์ ์ ๊ฑฐํ๋ ๊ฒ
โจ ๋ณด์ ์ฝ์ ์ ๋
ธ๋ ค ๋ฐ์ํ๋ ์ฌ๊ณ ์ฌ๋ก๋ค
SQL ์ธ์ ์ ์ทจ์ฝ์ ์ผ๋ก ๊ฐ์ธ์ ์ถ ์ฌ๊ณ ๋ฐ์
URL ํ๋ผ๋ฏธํฐ ์กฐ์ ๊ฐ์ธ์ ๋ณด ๋ ธ์ถ
๋ฌด์์ ๋์ ๊ณต๊ฒฉ ๊ธฐํํธ์นด๋ ์ ๋ณด ์ ์ถ
โจ SQL ์ธ์ ์
์์
์์ ํ์ง ์์ ์ฝ๋
String query "SELECT * FROM users WHERE userid = '" + userid + "'" + "AND password = '" + password + "'";
Statement stmt = connection.createStatement(); ResultSet rs = stmt.executeQuery(query);
์ ์ ํ ๊ฒ์ฆ ์์ ์ด ์ํ๋์ด์ผ ์์ ํจ
์
๋ ฅ๋ฐ๋ ๊ฐ์ ๋ณ์๋ฅผ $
๋์ #
์ ์ฌ์ฉํ๋ฉด์ ๋ฐ์ธ๋ฉ ์ฒ๋ฆฌ๋ก ์ํ์ด ์ฝ๋ฉ์ด ๊ฐ๋ฅํ๋ค.
TDD
โจ TDD : ํ
์คํธ ์ฃผ๋ ๊ฐ๋ฐ
'ํ ์คํธ๊ฐ ๊ฐ๋ฐ์ ์ด๋์ด ๋๊ฐ๋ค.'
์ฐ๋ฆฌ๋ ๋ณดํต ๊ฐ๋ฐํ ๋, ์ค๊ณ(๋์์ธ)๋ฅผ ํ ์ดํ ์ฝ๋ ๊ฐ๋ฐ๊ณผ ํ ์คํธ ๊ณผ์ ์ ๊ฑฐ์น๊ฒ ๋๋ค.
ํ์ง๋ง TDD๋ ๊ธฐ์กด ๋ฐฉ๋ฒ๊ณผ๋ ๋ค๋ฅด๊ฒ, ํ ์คํธ์ผ์ด์ค๋ฅผ ๋จผ์ ์์ฑํ ์ดํ์ ์ค์ ์ฝ๋๋ฅผ ๊ฐ๋ฐํ๋ ๋ฆฌํฉํ ๋ง ์ ์ฐจ๋ฅผ ๋ฐ๋๋ค.
`์๊ฐ๊ฐ ์ฑ ์ ์ฐ๋ ๊ณผ์ ์ ๋ํด์ ์๊ฐํด๋ณด์.
์ฑ ์ ์ฐ๊ธฐ ์ , ๋ชฉ์ฐจ๋ฅผ ๋จผ์ ๊ตฌ์ฑํ๋ค. ์ดํ ๋ชฉ์ฐจ์ ๋ง๋ ๋ด์ฉ์ ๋จผ์ ๊ตฌ์ํ ๋ค, ์ด์์ ์์ฑํ๊ณ ๊ณ ์ณ์ฐ๊ธฐ๋ฅผ ๋ฐ๋ณตํ๋ค.
๋ชฉ์ฐจ ๊ตฌ์ฑ : ํ ์คํธ ์ฝ๋ ์์ฑ ์ด์ ์์ฑ : ์ฝ๋ ๊ฐ๋ฐ ๊ณ ์ณ ์ฐ๊ธฐ : ์ฝ๋ ์์ (๋ฆฌํฉํ ๋ง)`
๋ฐ๋ณต์ ์ธ '๊ฒํ '์ '๊ณ ์ณ์ฐ๊ธฐ'๋ฅผ ํตํด ์ข์ ๊ธ์ด ์์ฑ๋๋ค. ์ด๋ฐ ๋ฐฉ๋ฒ์ ์ํํธ์จ์ด์ ์ ์ฉํ ๊ฒ์ด TDD!
์ํํธ์จ์ด ๋ํ ๋ฐ๋ณต์ ์ธ ํ ์คํธ์ ์์ ์ ํตํด ๊ณ ํ์ง์ ์ํํธ์จ์ด๋ฅผ ํ์์ํฌ ์ ์๋ค.
โจ ์ฅ์
์์ ๊ณผ ๋์์ ํ ์คํธ๋ฅผ ์งํํ๋ฉด์ ์ค์๊ฐ์ผ๋ก ์ค๋ฅ ํ์ ์ด ๊ฐ๋ฅํจ ( ์์คํ ๊ฒฐํจ ๋ฐฉ์ง )
์งง์ ๊ฐ๋ฐ ์ฃผ๊ธฐ๋ฅผ ํตํด ๊ณ ๊ฐ์ ์๊ตฌ์ฌํญ ๋น ๋ฅด๊ฒ ์์ฉ ๊ฐ๋ฅ. ํผ๋๋ฐฑ์ด ๊ฐ๋ฅํ๊ณ ์งํ ์ํฉ ํ์ ์ด ์ฌ์
์๋ํ ๋๊ตฌ๋ฅผ ์ด์ฉํ TDD ํ ์คํธ์ผ์ด์ค๋ฅผ ๋จ์ ํ ์คํธ๋ก ์ฌ์ฉ์ด ๊ฐ๋ฅํจ
(์๋ฐ๋ JUnit, C์ C++์ CppUnit ๋ฑ)
๊ฐ๋ฐ์๊ฐ ๊ธฐ๋ํ๋ ์ฑ์ ๋์์ ๊ดํ ๋ฌธ์๋ฅผ ํ
์คํธ๊ฐ ์ ๊ณตํด์ค๋ํ ์ด ํ
์คํธ ์ผ์ด์ค๋ ์ฝ๋์ ํจ๊ป ์
๋ฐ์ดํธ ๋๋ฏ๋ก ๋ฌธ์ ์์ฑ๊ณผ ๊ฑฐ๋ฆฌ๊ฐ ๋จผ ๊ฐ๋ฐ์์๊ฒ ๋งค์ฐ ์ข์
โจ ๋จ์
๊ธฐ์กด ๊ฐ๋ฐ ํ๋ก์ธ์ค์ ํ ์คํธ์ผ์ด์ค ์ค๊ณ๊ฐ ์ถ๊ฐ๋๋ฏ๋ก ์์ฐ ๋น์ฉ ์ฆ๊ฐ
ํ ์คํธ์ ๋ฐฉํฅ์ฑ, ํ๋ก์ ํธ ์ฑ๊ฒฉ์ ๋ฐ๋ฅธ ํ ์คํธ ํ๋ ์์ํฌ ์ ํ ๋ฑ ์ถ๊ฐ๋ก ๊ณ ๋ คํ ๋ถ๋ถ์ ์ฆ๊ฐ
โจ ์ ์ ๊ณ์ฐ ํ๋ก๊ทธ๋จ์ ํตํ TDD ์์ ์งํ
์ค๊ฐ๊ณ ์ฌ, ๊ธฐ๋ง๊ณ ์ฌ, ๊ณผ์ ์ ์๋ฅผ ํตํ ์ฑ์ ์ ๋ด๋ ๊ฐ๋จํ ํ๋ก๊ทธ๋จ์ ๋ง๋ค์ด๋ณด์
์ ์ ์ดํฉ 90์ ์ด์์ A, 80์ ์ด์์ B, 70์ ์ด์์ C, 60์ ์ด์์ D, ๋๋จธ์ง๋ F๋ค.
TDD ํ ์คํธ์ผ์ด์ค๋ฅผ ๋จผ์ ์์ฑํ๋ค.
35 + 25 + 25 = 85์ ์ด๋ฏ๋ก ๋ฑ๊ธ์ด B๊ฐ ๋์์ผ ํ๋ค.
๋ฐ๋ผ์ assertEquals์ ์ธ์๊ฐ์ "B"๋ก ์ฃผ๊ณ , ํ ์คํธ ๊ฒฐ๊ณผ๊ฐ ์ผ์นํ๋์ง ํ์ธํ๋ ๊ณผ์ ์ ์งํํด๋ณด์
public class GradeTest {
@Test
public void scoreResult() {
Score score = new Score(35, 25, 25); // Score ํด๋์ค ์์ฑ
SimpleScoreStrategy scores = new SimpleScoreStrategy();
String resultGrade = scores.computeGrade(score); // ์ ์ ๊ณ์ฐ
assertEquals("B", resultGrade); // ํ์ธ
}
}
ํ์ฌ๋ Score ํด๋์ค์ computeGrade() ๋ฉ์๋๊ฐ ๊ตฌํ๋์ง ์์ ์ํ๋ค. (ํ ์คํธ ์ฝ๋๋ก๋ง ์กด์ฌ)
ํ ์คํธ ์ฝ๋์ ๋ง์ถฐ์ ์ฝ๋ ๊ฐ๋ฐ์ ์งํํ์
์ฐ์ ์ ์๋ฅผ ์ ์ฅํ Score ํด๋์ค๋ฅผ ์์ฑํ๋ค
public class Score {
private int middleScore = 0;
private int finalScore = 0;
private int homeworkScore = 0;
public Score(int middleScore, int finalScore, int homeworkScore) {
this.middleScore = middleScore;
this.finalScore = finalScore;
this.homeworkScore = homeworkScore;
}
public int getMiddleScore(){
return middleScore;
}
public int getFinalScore(){
return finalScore;
}
public int getHomeworkScore(){
return homeworkScore;
}
}
์ด์ ์ ์ ๊ณ์ฐ์ ํตํด ์ฑ์ ์ ๋ฟ๋ ค์ค computeGrade() ๋ฉ์๋๋ฅผ ๊ฐ์ง ํด๋์ค๋ฅผ ๋ง๋ ๋ค.
์ฐ์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ์
public interface ScoreStrategy {
public String computeGrade(Score score);
}
์ธํฐํ์ด์ค๋ฅผ ๊ฐ์ ธ์ ์ค๋ฒ๋ผ์ด๋ฉํ ํด๋์ค๋ฅผ ๊ตฌํํ๋ค
public class SimpleScoreStrategy implements ScoreStrategy {
public String computeGrade(Score score) {
int totalScore = score.getMiddleScore() + score.getFinalScore() + score.getHomeworkScore(); // ์ ์ ์ดํฉ
String gradeResult = null; // ํ์ ์ ์ฅํ String ๋ณ์
if(totalScore >= 90) {
gradeResult = "A";
} else if(totalScore >= 80) {
gradeResult = "B";
} else if(totalScore >= 70) {
gradeResult = "C";
} else if(totalScore >= 60) {
gradeResult = "D";
} else {
gradeResult = "F";
}
return gradeResult;
}
}
์ด์ ํ ์คํธ ์ฝ๋๋ก ๋์๊ฐ์, ์ค์ ๋ก ํต๊ณผํ ์ ๋ณด๋ฅผ ์ ๋ ฅํด๋ณธ ๋ค ๊ฒฐ๊ณผ๋ฅผ ํ์ธํด๋ณด์
์ด๋ ์์ธ ์ฒ๋ฆฌ, ์ค๋ณต ์ ๊ฑฐ, ์ถ๊ฐ ๊ธฐ๋ฅ์ ํตํ ๋ฆฌํฉํ ๋ง ์์ ์ ํตํด ์์ฑ๋ ๋์ ํ๋ก์ ํธ๋ฅผ ๊ตฌํํ ์ ์๋๋ก ๋ ธ๋ ฅํ์!
ํต๊ณผ๊ฐ ๊ฐ๋ฅํ ์ ๋ณด๋ฅผ ๋ฃ๊ณ ์คํํ๋ฉด, ์๋์ ๊ฐ์ด ์๋ฌ ์์ด ์ ๋๋ก ์คํ๋๋ ๋ชจ์ต์ ๋ณผ ์ ์๋ค.
๊ตณ์ด ํ์ํ๋์?
๋ฑ๋ด๋ ๊ท์ฐฎ์ ๋ณด์ธ๋ค. ์ ๋ ๊ฒ ํ์ธ ์ํด๋ ๊ฒฐ๊ณผ๋ฌผ์ ์ ์ ์์ง ์๋๊ณ ๋ฐ๋ฌธํ ์๋ ์๋ค.
ํ์ง๋ง ์์๋ ๊ฐ๋จํ๊ฒ ๋ณด์์ ๋ฟ, ์ค์ ์ค๋ฌด ํ๋ก์ ํธ์์๋ ๋ค์ํ ์ถ๋ ฅ ๊ฒฐ๊ณผ๋ฌผ์ด ํ์ํ๊ณ , ์ํ๋ ํ ์คํธ ๊ฒฐ๊ณผ๊ฐ ๋์ค๋ ์ง ํ์ธํ๋ ๊ณผ์ ์ ํ์์ ์ธ ๋ถ๋ถ์ด๋ค.
TDD๋ฅผ ํ์ฉํ๋ฉด, ์ฒ์ ์์ํ๋ ๋จ๊ณ์์ ํ ์คํธ์ผ์ด์ค๋ฅผ ์ค๊ณํ๊ธฐ ์ํ ์ด๊ธฐ ๋น์ฉ์ด ํ์คํ ๋ ๋ค๊ฒ ๋๋ค. ํ์ง๋ง ๊ฐ๋ฐ ๊ณผ์ ์ ์์ด์ '์ด๊ธฐ ๋น์ฉ'๋ณด๋ค '์ ์ง๋ณด์ ๋น์ฉ'์ด ๋ ํด ์ ์๋ค๋ ๊ฒ์ ๋ช ์ฌํ์
๋ํ ์์ ์ฑ์ด ํ์ํ ์ํํธ์จ์ด ํ๋ก์ ํธ์์๋ ๊ฐ๋ฐ ์ด๊ธฐ ๋จ๊ณ๋ถํฐ ํ์คํ๊ฒ ๋ค์ ธ๋๊ณ ๊ฐ๋ ๊ฒ์ด ์ค์ํ๋ค.
์ ์ง๋ณด์ ๋น์ฉ์ด ๋ ํฌ๊ฑฐ๋ ๋นํ๊ธฐ, ๊ธฐ์ฐจ์ ํ์ํ ์ํํธ์จ์ด ๋ฑ ์์ ์ฑ์ด ์ค์ํ ํ๋ก์ ํธ์ ๊ฒฝ์ฐ ํ์ฌ ์ค๋ฌด์์๋ TDD๋ฅผ ํ์ฉํ ๊ฐ๋ฐ์ ํตํด ์ด๋ฃจ์ด์ง๊ณ ์๋ค.
์ ์์ผ
์ ์์ผ์ ํตํ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํ๋ ๊ฐ๋ฐ ๋ฐฉ๋ฒ๋ก ์ด '์คํฌ๋ผ'
๋ญ๋น ๊ฒฝ๊ธฐ์์ ์ฌ์ฉ๋๋ ์ฉ์ด์ธ๋ฐ, ๋ฐ์น์ผ๋ก ์ธํด ๊ฒฝ๊ธฐ๊ฐ ์ค๋จ๋์ ๋ ์ฐ๋ ๋ํ์ ๋งํจ
์ฆ, ์ํํธ์จ์ด ์ธก๋ฉด์์ ํ์ด๋ผ๋ ๋จ์ด๊ฐ ์ฃผ๋ ์๋ฏธ๋ฅผ ์ ์ฉ์ํค๊ณ , ํจ์จ์ ์ธ ์ฑ๊ณผ๋ฅผ ์ป๊ธฐ ์ํ ๊ฒ
์ ํ ๊ธฐ๋ฅ ๋ชฉ๋ก ์์ฑ
๊ฐ๋ฐํ ์ ํ์ ๋ํ ์๊ตฌ์ฌํญ ๋ชฉ๋ก ์์ฑ
์ฐ์ ์์๊ฐ ๋งค๊ฒจ์ง, ์ฌ์ฉ์์ ์๊ตฌ์ฌํญ ๋ชฉ๋ก์ด๋ผ๊ณ ๋งํ ์ ์์
๊ฐ๋ฐ ์ค์ ์์ ์ด ๊ฐ๋ฅํ๊ธฐ๋ ํ์ง๋ง, ์ผ๋ฐ์ ์ผ๋ก ํ ์ฃผ๊ธฐ๊ฐ ๋๋ ๋๊น์ง๋ ์ ํ ๊ธฐ๋ฅ ๋ชฉ๋ก์ ์์ ํ์ง ์๋ ๊ฒ์ด ์์น
์คํ๋ฆฐํธ Backlog
์คํ๋ฆฐํธ ๊ฐ๊ฐ์ ๋ชฉํ์ ๋๋ฌํ๊ธฐ ์ํด ํ์ํ ์์ ๋ชฉ๋ก
์ธ๋ถ์ ์ผ๋ก ์ด๋ค ๊ฒ์ ๊ตฌํํด์ผ ํ๋์ง
์์ ์
์์ ์์ ์๊ฐ
์ต์ข ์ ์ผ๋ก ๊ฐ๋ฐ์ด ์ด๋ป๊ฒ ์งํ๋๊ณ ์๋์ง ์ํฉ ํ์ ๊ฐ๋ฅ
์คํ๋ฆฐํธ
์์ ๋จ์์ ๊ฐ๋ฐ ์ ๋ฌด๋ฅผ ๋จ๊ธฐ๊ฐ ๋ด์ ์ ๋ ฅ์ง์ฃผํ์ฌ ๊ฐ๋ฐํ๋ค
ํ๋ฌ๋์์ ํฐ ๊ณํ์ 3~5์ผ ๋จ์๋ก ๋ฐ๋ณต ์ฃผ๊ธฐ๋ฅผ ์ ํ๋ค๋ฉด ์ด๊ฒ์ด ์คํฌ๋ผ์์ ์คํ๋ฆฐํธ์ ํด๋นํจ
์ฃผ๊ธฐ๊ฐ ํ์๋ฅผ ํตํด ๊ฒฐ์ ๋๋ฉด (๋ณดํต 2์ฃผ ~ 4์ฃผ) ๋ชฉํ์ ๋ด์ฉ์ด ๊ฐ๋ฐ ๋์ค์ ๋ฐ๋์ง ์์์ผ ํ๊ณ , ํ์๋ค ๋์ ์์ด ๋ฐ๊ฟ ์ ์๋ ๊ฒ์ด ์์น
์ผ์ผ ์คํฌ๋ผ ํ์
๋ช๊ฐ์ง ๊ท์น์ด ์๋ค.
๋ชจ๋ ํ์์ด ์ฐธ์ํ์ฌ ๋งค์ผํ๊ณ , ์งง๊ฒ(15๋ถ)ํ๊ณ , ์งํ ์ํฉ ์ ๊ฒํ๋ค.
ํ์ฌ๋์ฉ ์ด์ ํ ์ผ, ์ค๋ ํ ์ผ, ๋ฌธ์ ์ ๋ฐ ์ด๋ ค์ด ์ ์ ์ด์ผ๊ธฐํจ
์๋ฃ๋ ์ธ๋ถ ์์ ํญ๋ชฉ์ ์คํ๋ฆฐํธ ํํฉํ์์ ์ ๋ฐ์ดํธ ์ํด
์ ํ์์ฑ ๋ฐ ์คํ๋ฆฐํธ ๊ฒํ ํ์
๋ชจ๋ ์คํ๋ฆฐํธ ์ฃผ๊ธฐ๊ฐ ๋๋๋ฉด, ์ ํ ๊ธฐ๋ฅ ๋ชฉ๋ก์์ ์์ฑํ ์ ํ์ด ์์ฑ๋๋ค.
์ต์ข ์ ํ์ด ๋์ค๋ฉด ๊ณ ๊ฐ๋ค ์์์ ์์ฐ์ ํตํ ์คํ๋ฆฐํธ ๊ฒํ ํ์ ์งํ
๊ณ ๊ฐ์ ์๊ตฌ์ฌํญ์ ์ผ๋ง๋ ๋ถํฉํ๋๊ฐ?
๊ฐ์ ์ ๋ฐ ํผ๋๋ฐฑ
์คํ๋ฆฐํธ ํ๊ณ
์คํ๋ฆฐํธ์์ ์ํํ ํ๋๊ณผ ๊ฐ๋ฐํ ๊ฒ์ ๋๋์๋ณด๋ฉฐ ๊ฐ์ ์ ์ด๋ ๊ท์น ๋ฐ ํ์ค์ ์ ์ค์ํ๋์ง ๊ฒํ
ํ์ ๋จ์ ๋ณด๋ค๋ ๊ฐ์ ๊ณผ ์ฅ์ ์ ์ฐพ์ ๋ ๊ทน๋ํํ๋๋ฐ ์ด์ ์ ๋๋ค
์คํฌ๋ผ ์ฅ์
์คํ๋ฆฐํธ๋ง๋ค ์์ฐ๋๋ ์คํ ๊ฐ๋ฅํ ์ ํ์ ํตํด ์ฌ์ฉ์์ ์๊ฒฌ์ ๋๋ ์ ์์
ํ์๋ฅผ ํตํด ํ์๋ค๊ฐ ์ ์ํ ํ์กฐ์ ์กฐ์จ์ด ๊ฐ๋ฅ
์์ ์ ์ผ์ ์ ์ง์ ๋ฐํํจ์ผ๋ก์จ ์ ๋ฌด ์ง์ค ํ๊ฒฝ ์กฐ์ฑ
ํ๋ก์ ํธ ์งํ ํํฉ์ ํตํด ์ ์ํ๊ฒ ๋ชฉํ์ ๊ฒฐ๊ณผ ์ถ์ ์ด ๊ฐ๋ฅํ๋ฉฐ ๋ณํ ์๋๊ฐ ์ฉ์ดํจ
์คํฌ๋ผ ๋จ์
์ถ๊ฐ ์์ ์๊ฐ์ด ํ์ํจ (์คํ๋ฆฐํธ๋ง๋ค ํ ์คํธ ์ ํ์ ๋ง๋ค์ด์ผํ๊ธฐ ๋๋ฌธ)
15๋ถ์ด๋ผ๋ ํ์ ์๊ฐ์ ์งํค๊ธฐ ํ๋ฌ ( ์๊ฐ์ด ์ด๊ณผ๋๋ฉด ๊ทธ๋งํผ ์์ ์๊ฐ์ด ์ค์ด๋ฌ)
์คํฌ๋ผ์ ํ๋ก์ ํธ ๊ด๋ฆฌ์ ๋ฌด๊ฒ์ค์ฌ์ ๋๊ธฐ ๋๋ฌธ์ ํ๋ก์ธ์ค ํ์ง ํ๊ฐ์๋ ๋ฏธ์ฝํจ
๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ
๋ณดํต OOP๋ผ๊ณ ๋ง์ด ๋ถ๋ฅธ๋ค. ๊ฐ์ฒด์งํฅ์ ์ ์์ด ๋ง์ด ๋ค์ด์์ง๋ง, ์ด๊ฒ ๋ญ์ง ์ค๋ช ํด๋ฌ๋ผ๊ณ ํ๋ฉด ์ด๋์๋ถํฐ ํด์ผํ ์ง ๋ง๋งํด์ง๋ค.. ๊ฐ๋ ์ ์ก์๋ณด์
๊ฐ์ฒด์งํฅ ํจ๋ฌ๋ค์์ด ๋์ค๊ธฐ ์ด์ ์ ํจ๋ฌ๋ค์๋ค๋ถํฐ ๊ฐ๋จํ๊ฒ ์ดํด๋ณด์.
ํจ๋ฌ๋ค์์ ๋ฐ์ ๊ณผ์ ์ ๋ณด๋ฉด ์ ์ ๊ฐ๋ฐ์๋ค์ด ํธํ๊ฒ ๊ฐ๋ฐํ ์ ์๋๋ก ๊ฐ์ ๋๋ ๋ฐฉ์์ผ๋ก ๋์๊ฐ๊ณ ์๋ ๊ฑธ ํ์ธํ ์ ์๋ค.
๊ฐ์ฅ ๋จผ์ ์์ฐจ์ , ๋น๊ตฌ์กฐ์ ํ๋ก๊ทธ๋๋ฐ์ด ์๋ค. ๋ง ๊ทธ๋๋ก ์์ฐจ์ ์ผ๋ก ์ฝ๋ฉํด๋๊ฐ๋ ๊ฒ!
ํ์ํ ๊ฒ ์์ผ๋ฉด ๊ณ์ ์์๋๋ก ์ถ๊ฐํด๊ฐ๋ฉฐ ๊ตฌํํ๋ ๋ฐฉ์์ด๋ค. ์ง๊ด์ ์ผ ๊ฒ์ฒ๋ผ ์๊ฐ๋์ง๋ง, ์ ์ ๊ท๋ชจ๊ฐ ์ปค์ง๊ฒ ๋๋ฉด ์ด๋ป๊ฒ ๋ ๊น?
์ด๋ฐ ๋น๊ตฌ์กฐ์ ํ๋ก๊ทธ๋๋ฐ์์๋ goto๋ฌธ์ ํ์ฉํ๋ค. ๋ง์ฝ ์ด์ ์ ์์ฑํ๋ ์ฝ๋๊ฐ ๋ค์ ํ์ํ๋ฉด ๊ทธ ๊ณณ์ผ๋ก ์ด๋ํ๊ธฐ ์ํ ๊ฒ์ด๋ค. ์ ์ ๊ท๋ชจ๊ฐ ์ปค์ง๋ฉด goto๋ฌธ์ ๋ฌด๋ถ๋ณํ๊ฒ ์ฌ์ฉํ๊ฒ ๋๊ณ , ๋ง์น ์ค๋จ๊ธฐ๋ฅผ ํ๋ ๊ฒ์ฒ๋ผ ๋ฒ ๋ฒ ๊ผฌ์ด๊ฒ ๋๋ค. (์ฝ๋ ์์์ ์๋ก ๊ฐ๋ค๊ฐ ์๋๋ก ๊ฐ๋ค๊ฐ..๋ค์ฃฝ๋ฐ์ฃฝ) ๋์ค์ ์ฝ๋๊ฐ ์ด๋ป๊ฒ ์ฐ๊ฒฐ๋์ด ์๋์ง ํ์ธ์กฐ์ฐจ ํ์ง ๋ชปํ๊ฒ ๋ ๋ฌธ์ ์ ์ด ์กด์ฌํ๋ค.
์ด๋ฌ๋ฉด, ์ฝ๋ฉ๋ณด๋ค ํ๋ฆ์ ์ดํดํ๋ ๋ฐ ์๊ฐ์ ๋ค ์๋นํ ๊ฐ๋ฅ์ฑ์ด ํฌ๋ค
์ค๋๋ ์์
์ ๋ฃ๊ฑฐ๋ ๊ณต๋ถํ๋ฉด์ goto๋ฌธ์ ์ฌ์ฉํ์ง ์๋๊ฒ ์ข๋ค!
๋ผ๋ ๋ง์ ๋ถ๋ช
๋ค์ด๋ดค์ ๊ฒ์ด๋ค. goto๋ฌธ์ ์ฅ๊ธฐ์ ์ผ๋ก ๋ดค์ ๋ ํฌ๊ฒ ๋์์ด ๋์ง ์๋ ๊ตฌํ ๋ฐฉ์์ด๊ธฐ ๋๋ฌธ์ ๊ทธ๋ฐ ๊ฒ์ด์๋ค.
์ด๋ฐ ๋ฌธ์ ์ ์ ํด๊ฒฐํ๊ธฐ ์ํด ํ์ํ ๊ฒ์ด ๋ฐ๋ก ์ ์ฐจ์ , ๊ตฌ์กฐ์ ํ๋ก๊ทธ๋๋ฐ์ด๋ค. ์ด๊ฑด ๋๋ถ๋ถ ๋ง์ด ๋ค์ด๋ณธ ํจ๋ฌ๋ค์์ผ ๊ฒ์ด๋ค.
๋ฐ๋ณต๋ ๊ฐ๋ฅ์ฑ์ด ์๋ ๊ฒ๋ค์ ์ฌ์ฌ์ฉ์ด ๊ฐ๋ฅํ ํจ์(ํ๋ก์์ )๋ก ๋ง๋ค์ด ์ฌ์ฉํ๋ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ด๋ค.
์ฌ๊ธฐ์ ๋ณดํต ์ ์ฐจ๋ผ๋ ์๋ฏธ๋ ํจ์(ํ๋ก์์ )๋ฅผ ๋ปํ๊ณ , ๊ตฌ์กฐ๋ ๋ชจ๋์ ๋ปํ๋ค. ๋ชจ๋์ด ํจ์๋ณด๋ค ๋ ์์ ์๋ฏธ์ด๊ธด ํ์ง๋ง, ์์ฆ์ ํฐ ํ๋ก ๊ฐ์ ์๋ฏธ๋ก ์ฐ์ด๊ณ ์๋ค.
โจ ํ๋ก์์ ๋ ๋ญ๊ฐ์?
๋ฐํ๊ฐ(๋ฆฌํด)์ด ๋ฐ๋ก ์กด์ฌํ์ง ์๋ ํจ์๋ฅผ ๋ปํ๋ค. ์๋ฅผ ๋ค๋ฉด, printf์ ๊ฐ์ ํจ์๋ ๋ฐํ๊ฐ์ ์ป๊ธฐ ์ํ ๊ฒ๋ณด๋จ, ํ๋ฉด์ ์ถ๋ ฅํ๋ ์ฉ๋๋ก ์ฐ์ด๋ ํจ์๋ค. ์ด์ ๊ฐ์ ํจ์๋ฅผ ํ๋ก์์ ๋ก ๋ถ๋ฅธ๋ค.
(์ ํํ ๋งํ๋ฉด printf๋ intํ์ ๋ฆฌํดํด์ฃผ๊ธฐ๋ ํจ. ํ์ง๋ง ๋ชฉ์ ์์ฒด๋ ํ๋ก์์ ์ ๊ฐ๊น์)
ํ์ง๋ง ์ด๋ฐ ํจ๋ฌ๋ค์๋ ๋ฌธ์ ์ ์ด ์กด์ฌํ๋ค. ๋ฐ๋ก ๋๋ฌด ์ถ์์
์ด๋ผ๋ ๊ฒ..
์ค์ ๋ก ์ฌ์ฉ๋๋ ํ๋ก๊ทธ๋จ๋ค์ ์ถ์์ ์ด์ง๋ง์ ์๋ค. ํจ์๋ ๋ ผ๋ฆฌ์ ๋จ์๋ก ํํ๋์ง๋ง, ์ค์ ๋ฐ์ดํฐ์ ํด๋นํ๋ ๋ณ์๋ ์์ ๊ฐ๋ค์ ๋ฌผ๋ฆฌ์ ์์๋ก ๋์ด์๊ธฐ ๋๋ฌธ์ด๋ค.
๋์๊ด๋ฆฌ ํ๋ก๊ทธ๋จ์ด ์๋ค๊ณ ๊ฐ์ ํด๋ณด์.
์ฑ ์ ํด๋นํ๋ ์๋ฃํ(ํ๋)๋ฅผ ๊ตฌํํด์ผ ํ๋ค. ๋ํ ์ฑ ๊ณผ ๊ด๋ จ๋ ํจ์๋ฅผ ๊ตฌํํด์ผ ํ๋ค. ๊ตฌ์กฐ์ ์ธ ํ๋ก๊ทธ๋๋ฐ์์๋ ์ด๋ค์ ๋ฐ๋ก ๋ง๋ค์ด์ผ ํ๋ค. ๊ฒฐ๊ตญ ๋ง์ ๋ฐ์ดํฐ๋ฅผ ๋ง๋ค์ด์ผ ํ ๋, ๊ตฌ๋ถํ๊ธฐ ํ๋ค๊ณ ๋นํจ์จ์ ์ผ๋ก ์ฝ๋ฉํ ๊ฐ๋ฅ์ฑ์ด ๋์์ง๋ค.
์ฑ ์ ๋ํ ์๋ฃํ, ์ฑ ์ ๋ํ ํจ์๊ฐ ๋ฌผ๋ฆฌ์ ์ผ๋ก ๊ฐ์ด ์์ ์ ์์ง๋ง (๊ฐ์ ์์น์ ๊ธฐ๋ก)
๋ ผ๋ฆฌ์ ์ผ๋ก๋ ํจ๊ปํ ์ ์๋ ๊ตฌ์กฐ๊ฐ ๋ฐ๋ก
๊ตฌ์กฐ์ ํ๋ก๊ทธ๋๋ฐ
๋ฐ๋ผ์, ์ด๋ฅผ ํ๋ฒ์ ๋ฌถ๊ธฐ ์ํ ํจ๋ฌ๋ค์์ด ํ์ํ๋ค.
๋ฐ๋ก ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์ด๋ค.
์ฐ๋ฆฌ๊ฐ vo๋ฅผ ๋ง๋ค ๋์ ๊ฐ์ ํํ๋ค. ํด๋์ค๋ง๋ค ํ์ํ ํ๋๋ฅผ ์ ์ธํ๊ณ , getter์ setter๋ก ๊ตฌ์ฑ๋ ๋ชจ์ต์ผ๋ก ํด๊ฒฐํ๋ค. ๋ฐ๋ก ํน์ ํ ๊ฐ๋ ์ ํจ์์ ์๋ฃํ์ ํจ๊ป ๋ฌถ์ด์ ๊ด๋ฆฌํ๊ธฐ ์ํด ํ์ํ ๊ฒ!
๊ฐ์ฅ ์ค์ํ ์ ์, ๊ฐ์ฒด ๋ด๋ถ์ ์๋ฃํ(ํ๋)์ ํจ์(๋ฉ์๋)๊ฐ ๊ฐ์ด ์กด์ฌํ๋ ๊ฒ์ด๋ค.
์ด์ ๋์๊ด๋ฆฌ ํ๋ก๊ทธ๋จ์ ๋ง๋ค ๋, ํด๋นํ๋ ์ฑ ์ ์ ๋ชฉ, ์ ์, ํ์ด์ง์ ๊ฐ์ ์๋ฃํ๊ณผ ์ฝ๊ธฐ, ์์ฝํ๊ธฐ ๋ฑ ๋ฉ์๋๋ฅผ '์ฑ '์ด๋ผ๋ ๊ฐ์ฒด์ ํ๋ฒ์ ๋ฌถ์ด์ ์ ์ฅํ๋ ๊ฒ์ด ๊ฐ๋ฅํด์ก๋ค.
์ด์ฒ๋ผ ๊ฐ๋ฅํ ๋ชจ๋ ๋ฌผ๋ฆฌ์ , ๋
ผ๋ฆฌ์ ์์๋ฅผ ๊ฐ์ฒด๋ก ๋ง๋๋ ค๋ ๊ฒ์ด ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ
์ด๋ผ๊ณ ๋งํ ์ ์๋ค.
๊ฐ์ฒด์งํฅ์ผ๋ก ๊ตฌํํ๊ฒ ๋๋ฉด, ๊ฐ์ฒด ๊ฐ์ ๋ ๋ฆฝ์ฑ์ด ์๊ธฐ๊ณ ์ค๋ณต์ฝ๋์ ์์ด ์ค์ด๋๋ ์ฅ์ ์ด ์๋ค. ๋ํ ๋ ๋ฆฝ์ฑ์ด ํ๋ฆฝ๋๋ฉด ์ ์ง๋ณด์์๋ ๋์์ด ๋ ๊ฒ์ด๋ค.
โจ ํน์ง
๊ฐ์ฒด์งํฅ์ ํจ๋ฌ๋ค์์ด ์๊ฒจ๋๋ฉด์ ํฌ๊ฒ 4๊ฐ์ง ํน์ง์ ๊ฐ์ถ๊ฒ ๋์๋ค.
์ด 4๊ฐ์ง ํน์ฑ์ ์ ์ดํดํ๊ณ ๊ตฌํํด์ผ ๊ฐ์ฒด๋ฅผ ํตํ ํจ์จ์ ์ธ ๊ตฌํ์ด ๊ฐ๋ฅํด์ง๋ค.
์ถ์ํ(Abstraction)
ํ์๋ก ํ๋ ์์ฑ์ด๋ ํ๋์ ์ถ์ถํ๋ ์์
์ถ์์ ์ธ ๊ฐ๋ ์ ์์กดํ์ฌ ์ค๊ณํด์ผ ์ ์ฐํจ์ ๊ฐ์ถ ์ ์๋ค.
์ฆ, ์ธ๋ถ์ ์ธ ์ฌ๋ฌผ๋ค์ ๊ณตํต์ ์ธ ํน์ง์ ํ์ ํ ํ ํ๋์ ์งํฉ์ผ๋ก ๋ง๋ค์ด๋ด๋ ๊ฒ์ด ์ถ์ํ๋ค
`ex. ์์ฐ๋, BMW, ๋ฒค์ธ ๋ ๋ชจ๋ '์๋์ฐจ'๋ผ๋ ๊ณตํต์ ์ด ์๋ค.
์๋์ฐจ๋ผ๋ ์ถ์ํ ์งํฉ์ ๋ง๋ค์ด๋๊ณ , ์๋์ฐจ๋ค์ด ๊ฐ์ง ๊ณตํต์ ์ธ ํน์ง๋ค์ ๋ง๋ค์ด ํ์ฉํ๋ค.`
'์ ํ์ํ์ฃ ?'
์๋ฅผ ๋ค๋ฉด, 'ํ๋'์ ๊ฐ์ ๋ค๋ฅธ ์๋์ฐจ ๋ธ๋๋๊ฐ ์ถ๊ฐ๋ ์๋ ์๋ค. ์ด๋ ์ถ์ํ๋ก ๊ตฌํํด๋๋ฉด ๋ค๋ฅธ ๊ณณ์ ์ฝ๋๋ ์์ ํ ํ์ ์์ด ์ถ๊ฐ๋ก ๋ง๋ค ๋ถ๋ถ๋ง ์๋ก ์์ฑํด์ฃผ๋ฉด ๋๋ค.
์บก์ํ(Encapsulation)
๋ฎ์ ๊ฒฐํฉ๋๋ฅผ ์ ์งํ ์ ์๋๋ก ์ค๊ณํ๋ ๊ฒ
์ฝ๊ฒ ๋งํ๋ฉด, ํ ๊ณณ์์ ๋ณํ๊ฐ ์ผ์ด๋๋ ๋ค๋ฅธ ๊ณณ์ ๋ฏธ์น๋ ์ํฅ์ ์ต์ํ ์ํค๋ ๊ฒ์ ๋งํ๋ค.
(๊ฐ์ฒด๊ฐ ๋ด๋ถ์ ์ผ๋ก ๊ธฐ๋ฅ์ ์ด๋ป๊ฒ ๊ตฌํํ๋์ง ๊ฐ์ถ๋ ๊ฒ!)
๊ฒฐํฉ๋๊ฐ ๋ฎ๋๋ก ๋ง๋ค์ด์ผ ํ๋ ์ด์ ๊ฐ ๋ฌด์์ผ๊น? ๊ฒฐํฉ๋(coupling)๋, ์ด๋ค ๊ธฐ๋ฅ์ ์คํํ ๋ ๋ค๋ฅธ ํด๋์ค๋ ๋ชจ๋์ ์ผ๋ง๋ ์์กด์ ์ธ๊ฐ๋ฅผ ๋ํ๋ด๋ ๋ง์ด๋ค.
์ฆ, ๋ ๋ฆฝ์ ์ผ๋ก ๋ง๋ค์ด์ง ๊ฐ์ฒด๋ค ๊ฐ์ ์์กด๋๊ฐ ์ต๋ํ ๋ฎ๊ฒ ๋ง๋๋ ๊ฒ์ด ์ค์ํ๋ค. ๊ฐ์ฒด๋ค ๊ฐ์ ์์กด๋๊ฐ ๋์์ง๋ฉด ๊ตณ์ด ๊ฐ์ฒด ์งํฅ์ผ๋ก ์ค๊ณํ๋ ์๋ฏธ๊ฐ ์์ด์ง๋ค.
์ฐ๋ฆฌ๋ ์ํํธ์จ์ด ๊ณตํ์์ ๊ฐ์ฒด ์์ ๋ชจ๋ ๊ฐ์ ์์๊ฐ ๋ฐ์ ํ ๊ด๋ จ์ด ์๋ ๊ฒ์ผ๋ก ๊ตฌ์ฑํ์ฌ ์์ง๋๋ฅผ ๋์ด๊ณ ๊ฒฐํฉ๋๋ฅผ ์ค์ฌ์ผ ์๊ตฌ์ฌํญ ๋ณ๊ฒฝ์ ๋์ฒํ๋ ์ข์ ์ค๊ณ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ๋ฐฐ์ด๋ค.
์ด๊ฒ์ด ๋ฐ๋ก
์บก์ํ
์ ํฌ๊ฒ ์ฐ๊ด๋ ๋ถ๋ถ์ด๋ผ๊ณ ํ ์ ์๋ค.๊ทธ๋ ๋ค๋ฉด, ์บก์ํ๋ ์ด๋ป๊ฒ ๋์ ์์ง๋์ ๋ฎ์ ๊ฒฐํฉ๋๋ฅผ ๊ฐ๊ฒ ํ ๊น?
๋ฐ๋ก ์ ๋ณด ์๋์ ํ์ฉํ๋ค.
์ธ๋ถ์์ ์ ๊ทผํ ํ์๊ฐ ์๋ ๊ฒ๋ค์ private์ผ๋ก ์ ๊ทผํ์ง ๋ชปํ๋๋ก ์ ํ์ ๋๋ ๊ฒ์ด๋ค.
(๊ฐ์ฒด์์ ํ๋๋ฅผ ์ ์ธํ ๋ private์ผ๋ก ์ ์ธํ๋ผ๋ ๋ง์ด ๋ฐ๋ก ์ด ๋๋ฌธ!!)
์์
์ผ๋ฐํ ๊ด๊ณ(Generalization)๋ผ๊ณ ๋ ํ๋ฉฐ, ์ฌ๋ฌ ๊ฐ์ฒด๋ค์ด ์ง๋ ๊ณตํต๋ ํน์ฑ์ ๋ถ๊ฐ์์ผ ํ๋์ ๊ฐ๋ ์ด๋ ๋ฒ์น์ผ๋ก ์ฑ๋ฆฝํ๋ ๊ณผ์
์ผ๋ฐํ(์์)์ ๋ ๋ค๋ฅธ ์บก์ํ๋ค.
์์ ํด๋์ค๋ฅผ ์ธ๋ถ๋ก๋ถํฐ ์๋ํ๋ ์บก์ํ์ ์ผ์ข ์ด๋ผ๊ณ ๋งํ ์ ์๋ค.
์๊น ์๋์ฐจ๋ฅผ ํตํด ์๋ฅผ ๋ค์ด ์ถ์ํ๋ฅผ ์ค๋ช ํ์๋ค. ์ฌ๊ธฐ์ ์ถ๊ฐ๋ก ๋๋ฆฌ ์ด์ ์ ํ๋ ์ฌ๋ ํด๋์ค๊ฐ ์๋ค๊ณ ์๊ฐํด๋ณด์. ์ด๋, ์๋์ฐจ์ ์์ ํด๋์ค์ ํด๋นํ๋ ๋ฒค์ธ , BMW, ์์ฐ๋ ๋ฑ์ ์บก์ํ๋ฅผ ํตํด ์๋ํด๋ ์ํ๋ค.
์ฌ๋ ํด๋์ค์ ๊ด์ ์ผ๋ก๋, ๊ตฌ์ฒด์ ์ธ ์๋์ฐจ์ ์ข ๋ฅ๊ฐ ์จ๊ฒจ์ ธ ์๋ ์ํ๋ค. ๋๋ฆฌ ์ด์ ์ ์ ์ฅ์์๋ ์๋์ฐจ์ ์ข ๋ฅ๊ฐ ์ด๋ค ๊ฒ์ธ์ง๋ ์ด์ ํ๋๋ฐ ํฌ๊ฒ ์ค์ํ์ง ์๋ค.
์๋ก์ด ์๋์ฐจ๋ค์ด ์ถ๊ฐ๋๋ค๊ณ ํด๋, ์ฌ๋ ํด๋์ค๋ ์ํฅ์ ๋ฐ์ง ์๋ ๊ฒ์ด ์ค์ํ๋ค. ๊ทธ๋ฌ๋ฏ๋ก ์บก์ํ๋ฅผ ํตํด ์ฌ๋ ํด๋์ค ์ ์ฅ์์๋ ํ์ธํ ์ ์๋๋ก ๊ตฌํํ๋ ๊ฒ์ด๋ค.
์ด์ฒ๋ผ, ์์ ๊ด๊ณ์์๋ ๋จ์ํ ํ๋์ ํด๋์ค ์์์ ์์ฑ ๋ฐ ์ฐ์ฐ๋ค์ ์บก์ํ์ ํ์ ๋์ง ์๋๋ค. ์ฆ, ์์ ํด๋์ค ์์ฒด๋ฅผ ์บก์ํํ์ฌ '์ฌ๋ ํด๋์ค'์ ๊ฐ์ ์ธ๋ถ์ ์๋ํ๋ ๊ฒ์ผ๋ก ํ์ฅ๋๋ ๊ฒ์ด๋ค.
์ด์ฒ๋ผ ์์ ํด๋์ค๋ฅผ ์บก์ํํด๋๋ฉด, ์ธ๋ถ์์ ์ด๋ฌํ ํด๋์ค๋ค์ ์ํฅ์ ๋ฐ์ง ์๊ณ ๊ฐ๋ฐ์ ์ด์ด๊ฐ ์ ์๋ ์ฅ์ ์ด ์๋ค.
โจ ์์ ์ฌ์ฌ์ฉ์ ๋จ์ ์์์ ํตํ ์ฌ์ฌ์ฉ์ ํ ๋ ๋ํ๋๋ ๋จ์ ๋ ์กด์ฌํ๋ค.
์์ ํด๋์ค(๋ถ๋ชจ ํด๋์ค)์ ๋ณ๊ฒฝ์ด ์ด๋ ค์์ง๋ค.
๋ถ๋ชจ ํด๋์ค์ ์์กดํ๋ ์์ ํด๋์ค๊ฐ ๋ง์ ๋, ๋ถ๋ชจ ํด๋์ค์ ๋ณ๊ฒฝ์ด ํ์ํ๋ค๋ฉด?
์ด๋ฅผ ์์กดํ๋ ์์ ํด๋์ค๋ค์ด ์ํฅ์ ๋ฐ๊ฒ ๋๋ค.
๋ถํ์ํ ํด๋์ค๊ฐ ์ฆ๊ฐํ ์ ์๋ค.
์ ์ฌ๊ธฐ๋ฅ ํ์ฅ์, ํ์ ์ด์์ ๋ถํ์ํ ํด๋์ค๋ฅผ ๋ง๋ค์ด์ผ ํ๋ ์ํฉ์ด ๋ฐ์ํ ์ ์๋ค.
์์์ด ์๋ชป ์ฌ์ฉ๋ ์ ์๋ค.
๊ฐ์ ์ข ๋ฅ๊ฐ ์๋ ํด๋์ค์ ๊ตฌํ์ ์ฌ์ฌ์ฉํ๊ธฐ ์ํด ์์์ ๋ฐ๊ฒ ๋๋ฉด, ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค. ์์ ๋ฐ๋ ํด๋์ค๊ฐ ๋ถ๋ชจ ํด๋์ค์ IS-A ๊ด๊ณ๊ฐ ์๋ ๋ ์ด์ ํด๋นํ๋ค.
ํด๊ฒฐ์ฑ ์?
๊ฐ์ฒด ์กฐ๋ฆฝ(Composition), ์ปดํฌ์ง์ ์ด๋ผ๊ณ ๋ถ๋ฅด๊ธฐ๋ ํ๋ค.
๊ฐ์ฒด ์กฐ๋ฆฝ์, ํ๋์์ ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํ๋๋ค.
์์์ ๋นํด ๋น๊ต์ ๋ฐํ์ ๊ตฌ์กฐ๊ฐ ๋ณต์กํด์ง๊ณ , ๊ตฌํ์ด ์ด๋ ค์ด ๋จ์ ์ด ์กด์ฌํ์ง๋ง ๋ณ๊ฒฝ ์ ์ ์ฐํจ์ ํ๋ณดํ๋๋ฐ ์ฅ์ ์ด ๋งค์ฐ ํฌ๋ค.
๋ฐ๋ผ์ ๊ฐ์ ์ข ๋ฅ๊ฐ ์๋ ํด๋์ค๋ฅผ ์์ํ๊ณ ์ถ์ ๋๋ ๊ฐ์ฒด ์กฐ๋ฆฝ์ ์ฐ์ ์ ์ผ๋ก ์ ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
๊ทธ๋ผ ์์์ ์ธ์ ์ฌ์ฉ?
IS-A ๊ด๊ณ๊ฐ ์ฑ๋ฆฝํ ๋
์ฌ์ฌ์ฉ ๊ด์ ์ด ์๋, ๊ธฐ๋ฅ์ ํ์ฅ ๊ด์ ์ผ ๋
๋คํ์ฑ(Polymorphism)
์๋ก ๋ค๋ฅธ ํด๋์ค์ ๊ฐ์ฒด๊ฐ ๊ฐ์ ๋ฉ์์ง๋ฅผ ๋ฐ์์ ๋ ๊ฐ์์ ๋ฐฉ์์ผ๋ก ๋์ํ๋ ๋ฅ๋ ฅ
๊ฐ์ฒด ์งํฅ์ ํต์ฌ๊ณผ๋ ๊ฐ์ ๋ถ๋ถ์ด๋ค.
๋คํ์ฑ์, ์์๊ณผ ํจ๊ป ํ์ฉํ ๋ ํฐ ํ์ ๋ฐํํ๋ค. ์ด์ ๊ฐ์ ๊ตฌํ์ ์ฝ๋๋ฅผ ๊ฐ๊ฒฐํ๊ฒ ํด์ฃผ๊ณ , ์ ์ฐํจ์ ๊ฐ์ถ๊ฒ ํด์ค๋ค.
์ฆ, ๋ถ๋ชจ ํด๋์ค์ ๋ฉ์๋๋ฅผ ์์ ํด๋์ค๊ฐ ์ค๋ฒ๋ผ์ด๋ฉํด์ ์์ ์ ์ญํ ์ ๋ง๊ฒ ํ์ฉํ๋ ๊ฒ์ด ๋คํ์ฑ์ด๋ค.
์ด์ฒ๋ผ ๋คํ์ฑ์ ์ฌ์ฉํ๋ฉด, ๊ตฌ์ฒด์ ์ผ๋ก ํ์ฌ ์ด๋ค ํด๋์ค ๊ฐ์ฒด๊ฐ ์ฐธ์กฐ๋๋ ์ง๋ ๋ฌด๊ดํ๊ฒ ํ๋ก๊ทธ๋๋ฐํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค.
์์ ๊ด๊ณ์ ์์ผ๋ฉด, ์๋ก์ด ์์ ํด๋์ค๊ฐ ์ถ๊ฐ๋์ด๋ ๋ถ๋ชจ ํด๋์ค์ ํจ์๋ฅผ ์ฐธ์กฐํด์ค๋ฉด ๋๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ํด๋์ค๋ ์ํฅ์ ๋ฐ์ง ์๊ฒ ๋๋ค.
โจ ๊ฐ์ฒด ์งํฅ ์ค๊ณ ๊ณผ์
์ ๊ณตํด์ผ ํ ๊ธฐ๋ฅ์ ์ฐพ๊ณ ์ธ๋ถํํ๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ๊ธฐ๋ฅ์ ์๋ง์ ๊ฐ์ฒด์ ํ ๋นํ๋ค.
๊ธฐ๋ฅ์ ๊ตฌํํ๋๋ฐ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ฒด์ ์ถ๊ฐํ๋ค.
๊ทธ ๋ฐ์ดํฐ๋ฅผ ์ด์ฉํ๋ ๊ธฐ๋ฅ์ ๋ฃ๋๋ค.
๊ธฐ๋ฅ์ ์ต๋ํ ์บก์ํํ์ฌ ๊ตฌํํ๋ค.
๊ฐ์ฒด ๊ฐ์ ์ด๋ป๊ฒ ๋ฉ์๋ ์์ฒญ์ ์ฃผ๊ณ ๋ฐ์ ์ง ๊ฒฐ์ ํ๋ค.
โจ ๊ฐ์ฒด ์งํฅ ์ค๊ณ ์์น
SOLID๋ผ๊ณ ๋ถ๋ฅด๋ 5๊ฐ์ง ์ค๊ณ ์์น์ด ์กด์ฌํ๋ค.
SRP(Single Responsibility) - ๋จ์ผ ์ฑ ์ ์์น
ํด๋์ค๋ ๋จ ํ ๊ฐ์ ์ฑ ์์ ๊ฐ์ ธ์ผ ํ๋ค.
ํด๋์ค๋ฅผ ๋ณ๊ฒฝํ๋ ์ด์ ๋ ๋จ ํ๊ฐ์ฌ์ผ ํ๋ค.
์ด๋ฅผ ์งํค์ง ์์ผ๋ฉด, ํ ์ฑ ์์ ๋ณ๊ฒฝ์ ์ํด ๋ค๋ฅธ ์ฑ ์๊ณผ ๊ด๋ จ๋ ์ฝ๋์ ์ํฅ์ด ๊ฐ ์ ์๋ค.
OCP(Open-Closed) - ๊ฐ๋ฐฉ-ํ์ ์์น
ํ์ฅ์๋ ์ด๋ ค ์์ด์ผ ํ๊ณ , ๋ณ๊ฒฝ์๋ ๋ซํ ์์ด์ผ ํ๋ค.
๊ธฐ๋ฅ์ ๋ณ๊ฒฝํ๊ฑฐ๋ ํ์ฅํ ์ ์์ผ๋ฉด์, ๊ทธ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ์ฝ๋๋ ์์ ํ์ง ์๋๋ค.
์ด๋ฅผ ์งํค์ง ์์ผ๋ฉด, instanceof์ ๊ฐ์ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ๋ค์ด ์บ์คํ ์ด ์ผ์ด๋๋ค.
LSP(Liskov Substitution) - ๋ฆฌ์ค์ฝํ ์นํ ์์น
์์ ํ์ ์ ๊ฐ์ฒด๋ฅผ ํ์ ํ์ ์ ๊ฐ์ฒด๋ก ์นํํด๋, ์์ ํ์ ์ ์ฌ์ฉํ๋ ํ๋ก๊ทธ๋จ์ ์ ์์ ์ผ๋ก ๋์ํด์ผ ํ๋ค.
์์ ๊ด๊ณ๊ฐ ์๋ ํด๋์ค๋ค์ ์์ ๊ด๊ณ๋ก ์ค์ ํ๋ฉด, ์ด ์์น์ด ์๋ฐฐ๋๋ค.
ISP(Interface Segregation) - ์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น
์ธํฐํ์ด์ค๋ ๊ทธ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ํด๋ผ์ด์ธํธ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ถ๋ฆฌํด์ผ ํ๋ค.
๊ฐ ํด๋ผ์ด์ธํธ๊ฐ ํ์๋ก ํ๋ ์ธํฐํ์ด์ค๋ค์ ๋ถ๋ฆฌํจ์ผ๋ก์จ, ๊ฐ ํด๋ผ์ด์ธํธ๊ฐ ์ฌ์ฉํ์ง ์๋ ์ธํฐํ์ด์ค์ ๋ณ๊ฒฝ์ด ๋ฐ์ํ๋๋ผ๋ ์ํฅ์ ๋ฐ์ง ์๋๋ก ๋ง๋ค์ด์ผ ํ๋ค.
DIP(Dependency Inversion) - ์์กด ์ญ์ ์์น
๊ณ ์์ค ๋ชจ๋์ ์ ์์ค ๋ชจ๋์ ๊ตฌํ์ ์์กดํด์๋ ์๋๋ค.
์ ์์ค ๋ชจ๋์ด ๊ณ ์์ค ๋ชจ๋์์ ์ ์ํ ์ถ์ ํ์ ์ ์์กดํด์ผ ํ๋ค.
์ฆ, ์ ์์ค ๋ชจ๋์ด ๋ณ๊ฒฝ๋ผ๋ ๊ณ ์์ค ๋ชจ๋์ ๋ณ๊ฒฝํ ํ์๊ฐ ์๋ ๊ฒ์ด๋ค.
ํจ์ํ ํ๋ก๊ทธ๋๋ฐ
์์ ํจ์๋ฅผ ์กฐํฉํ๊ณ ๊ณต์ ์ํ, ๋ณ๊ฒฝ ๊ฐ๋ฅํ ๋ฐ์ดํฐ ๋ฐ ๋ถ์์ฉ์ ํผํด ์ํํธ์จ์ด๋ฅผ ๋ง๋๋ ํ๋ก์ธ์ค

'์ ์ธํ' ํ๋ก๊ทธ๋๋ฐ์ผ๋ก, ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ๋ ์์ ํจ์๋ฅผ ํตํด ์ ๋ฌ๋๋ค.
์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ๊ฐ ์ผ๋ฐ์ ์ผ๋ก ๊ณต์ ๋๊ณ ๊ฐ์ฒด์ ๋ฉ์๋์ ํจ๊ป ๋ฐฐ์น๋๋ OOP์๋ ๋์กฐ๋๋ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์
๋ช ๋ นํ ํ๋ก๊ทธ๋๋ฐ(์ ์ฐจ์งํฅ, ๊ฐ์ฒด์งํฅ)
์ํ์ ์ํ๋ฅผ ๋ณ๊ฒฝ์ํค๋ ๊ด์ ์์ ์ฐ์ฐ์ ์ค๋ช ํ๋ ๋ฐฉ์
์๊ณ ๋ฆฌ์ฆ์ ๋ช ์ํ๊ณ , ๋ชฉํ๋ ๋ช ์ํ์ง ์์
์ ์ธํ ํ๋ก๊ทธ๋๋ฐ
How๋ณด๋ค๋ What์ ์ค๋ช ํ๋ ๋ฐฉ์ (์ด๋ป๊ฒ๋ณด๋จ ๋ฌด์์)
์๊ณ ๋ฆฌ์ฆ์ ๋ช ์ํ์ง ์๊ณ ๋ชฉํ๋ง ๋ช ์ํจ
๋ช
๋ นํ ํ๋ก๊ทธ๋๋ฐ์ ์ด๋ป๊ฒ ํ ์ง ํํํ๊ณ , ์ ์ธํ ํ๋ก๊ทธ๋๋ฐ์ ๋ฌด์์ ํ ๊ฑด์ง ํํํ๋ค.
ํจ์ํ ์ฝ๋๋ ๋ช ๋ นํ ํ๋ก๊ทธ๋๋ฐ์ด๋ OOP ์ฝ๋๋ณด๋ค ๋ ๊ฐ๊ฒฐํ๊ณ ์์ธก๊ฐ๋ฅํ์ฌ ํ ์คํธํ๋ ๊ฒ์ด ์ฝ๋ค.
(ํ์ง๋ง ์ต์์น ์์ผ๋ฉด ๋ ๋ณต์กํด๋ณด์ด๊ณ ์ดํดํ๊ธฐ ์ด๋ ค์)
ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ ๋ฐฉ์์ ๋ฐฐ์ฐ๋ ๊ฒ์ด ์๋, ํจ์๋ก ํ๋ก๊ทธ๋๋ฐํ๋ ์ฌ๊ณ ๋ฅผ ๋ฐฐ์ฐ๋ ๊ฒ์ด๋ค.
๊ธฐ์กด์ ์ฌ๊ณ ๋ฐฉ์์ ์ ํํ์ฌ ํ๋ก๊ทธ๋๋ฐ์ ๋ ์ ์ฐํ๊ฒ ๋ฌธ์ ํด๊ฒฐ ํ๋๋ก ์ ๊ทผํ๋ ๊ฒ
โจ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ์๋ฏธ๋ฅผ ํ์
ํ๊ธฐ ์ ๊ผญ ์์์ผ ํ ๊ฒ๋ค
์์ ํจ์ (Pure functions)
์ ์ถ๋ ฅ์ด ์์ํด์ผํจ : ๋ฐ๋์ ํ๋ ์ด์์ ์ธ์๋ฅผ ๋ฐ๊ณ , ๋ฐ์ ์ธ์๋ฅผ ์ฒ๋ฆฌํด ๋ฐ๋์ ๊ฒฐ๊ณผ๋ฌผ์ ๋๋ ค์ค์ผ ํจ. ์ธ์ ์ธ ๋ค๋ฅธ ๋ณ์ ์ฌ์ฉ ๊ธ์ง
ํฉ์ฑ ํจ์ (Function composition)
๊ณต์ ์ํ ํผํ๊ธฐ (Avoid shared state)
์ํ๋ณํ ํผํ๊ธฐ (Avoid mutating state)
๋ถ์์ฉ ํผํ๊ธฐ (Avoid side effects)
ํ๋ก๊ทธ๋๋จธ๊ฐ ๋ฐ๊พธ๊ณ ์ ํ๋ ๋ณ์ ์ธ์๋ ๋ณ๊ฒฝ๋๋ฉด ์๋จ. ์๋ณธ ๋ฐ์ดํฐ๋ ์ ๋ ๋ถ๋ณ!
๋ํ์ ์ธ ์๋ฐ์คํฌ๋ฆฝํธ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ํจ์ : map, filter, reduce
โจ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ์์
var arr = [1, 2, 3, 4, 5];
var map = arr.map(function(x) { return x * 2; }); // [2, 4, 6, 8, 10]
arr์ ๋ฃ์ด์ map์ ์ป์์. arr์ ์ฌ์ฉํ์ง๋ง ๊ฐ์ ๋ณํ์ง ์์๊ณ map์ด๋ผ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ด๊ณ ์ด๋ ํ ๋ถ์์ฉ๋ ๋ณ์ง ์์
์ด๋ฐ ๊ฒ์ด ๋ฐ๋ก ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ์์ํจ์๋ผ๊ณ ๋งํ๋ค.
var arr = [1, 2, 3, 4, 5];
var condition = function(x) { return x % 2 === 0; }
var ex = function(array) { return array.filter(condition); };
ex(arr); // [2, 4]
์ด๋ ์์ํจ์๊ฐ ์๋๋ค. ์ด์ ๋ ex ๋ฉ์๋์์ ์ธ์๊ฐ ์๋ condition์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ.
์์ํจ์๋ก ๊ณ ์น๋ฉด ์๋์ ๊ฐ๋ค.
var ex = function(array, cond) { return array.filter(cond); }; ex(arr, condition);
์์ํจ์๋ก ๋ง๋ค๋ฉด, ์๋ฌ๋ฅผ ์ถ์ ํ๋ ๊ฒ์ด ์ฌ์์ง๋ค. ์ธ์์ ๋ฌธ์ ๊ฐ ์๊ฑฐ๋ ํจ์ ๋ด๋ถ์ ๋ฌธ์ ๊ฐ ์๊ฑฐ๋ ๋ ์ค ํ๋์ผ ์ ๋ฐ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
โจ Java์์์ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ
Java 8์ด ๋ฆด๋ฆฌ์ฆ๋๋ฉด์, Java์์๋ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ด ๊ฐ๋ฅํด์ก๋ค.
ํจ์ํ ํ๋ก๊ทธ๋๋ฐ : ๋ถ์ํจ๊ณผ๋ฅผ ์์ ๊ณ ์์ ํจ์๋ฅผ ๋ง๋ค์ด ๋ชจ๋ํ ์์ค์ ๋์ด๋ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์
๋ถ์ํจ๊ณผ : ์ฃผ์ด์ง ๊ฐ ์ด์ธ์ ์ธ๋ถ ๋ณ์ ๋ฐ ํ๋ก๊ทธ๋๋ฐ ์คํ์ ์ํฅ์ ๋ผ์น์ง ์์์ผ ๋๋ค๋ ์๋ฏธ
์ต๋ํ ์์ํจ์๋ฅผ ์งํฅํ๊ณ , ์จ๊ฒจ์ง ์ ์ถ๋ ฅ์ ์ต๋ํ ์ ๊ฑฐํ์ฌ ์ฝ๋๋ฅผ ์์ํ ์ ์ถ๋ ฅ ๊ด๊ณ๋ก ์ฌ์ฉํ๋ ๊ฒ์ด ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ๋ชฉ์ ์ด๋ค.
Java์ ๊ฐ์ฒด ์งํฅ์ ๋ช ๋ นํ ํ๋ก๊ทธ๋๋ฐ์ด๊ณ , ํจ์ํ์ ์ ์ธํ ํ๋ก๊ทธ๋๋ฐ์ด๋ค.
๋์ ์ฐจ์ด๋ ๋ฌธ์ ํด๊ฒฐ์ ๊ด์
์ฌํ๊น์ง ์ฐ๋ฆฌ๋ Java์์ ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ํ ๋ '๋ฐ์ดํฐ๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ์ง์ ๋ํด ๋ช ๋ น์ ํตํด ํด๊ฒฐ'ํ๋ค.
ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ์ ์ธ์ ํจ์๋ฅผ ํตํด '๋ฌด์์ ํ์ด๋๊ฐ์ผํ ์ง ๊ฒฐ์ 'ํ๋ ๊ฒ์ด๋ค.
โจ Java์์ ํ์ฉํ ์ ์๋ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ
๋๋ค์
stream api
ํจ์ํ ์ธํฐํ์ด์ค
Java 8์๋ Stream API๊ฐ ์ถ๊ฐ๋์๋ค.
import java.util.Arrays;
import java.util.List;
public class stream {
public static void main(String[] args) {
List<String> myList = Arrays.asList("a", "b", "c", "d", "e");
// ๊ธฐ์กด๋ฐฉ์
for(int i=0; i<myList.size(); i++){
String s = myList.get(i);
if(s.startsWith("c")){
System.out.println(s.toUpperCase());
}
}
// stream API๋ฅผ ์ด์ฉํ ๋ฐฉ์
myList.stream()
.filter(s -> s.startsWith("c"))
.map(String::toUpperCase)
.forEach(System.out::println);
}
}
๋ญ๊ฐ ๋ค๋ฅธ๊ฑด์ง ํฌ๊ฒ ์๋ฟ์ง ์์ ์ ์์ง๋ง, ์ค์ํ๊ฑด ํ๋ก๊ทธ๋๋ฐ์ ํจ๋ฌ๋ค์ ๋ณํ๋ผ๋ ๊ฒ์ด๋ค.
๋จ์ํ ํจ์๋ฅผ ์ ์ธํด์ ๋ฐ์ดํฐ๋ฅผ ๋ด๊ฐ ์ํ๋ ๋ฐฉํฅ์ผ๋ก ์ฒ๋ฆฌํด๋๊ฐ๋ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ ๋ณผ ์ ์๋ค. ํ๋์ ๋ณด๋๋ผ๋ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ๋ด๊ฐ ๋ฌด์์ ๊ตฌํํ๋์ง ๋ช ํํ ์ ์ ์๋ค. (๋ฌด์จ ํจ์์ธ์ง ์ฌ์ ํ์ต์ด ํ์ํ ์ ์ด ์์)
์๋ ํํฐ๋ ?
๊ฐํน ์จ๋ ํํฐ๋ผ๋ ๋ง์ ์ข ์ข ๋ณผ ์ ์๋ค. ๊ฒฝ์ ์ฉ์ด๊ฐ IT์์ ์ฐ์ด๋ ๋ถ๋ถ์ด๋ค.
โจ 3rd party
ํ๋์จ์ด ์์ฐ์์ ์ํํธ์จ์ด ๊ฐ๋ฐ์์ ๊ด๊ณ๋ฅผ ๋ํ๋ผ ๋ ์ฌ์ฉํ๋ค.
๊ทธ ์ค์์ ์๋ํํฐ๋, ํ๋ก๊ทธ๋๋ฐ์ ๋์์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง๋๋ ์ธ๋ถ ์์ฐ์๋ฅผ ๋ปํ๋ค.
ex) ๊ฒ์์ ์กฐ์ฌ์ ์๋น์๋ฅผ ์ฐ๊ฒฐํด์ฃผ๋ ๊ฒ์ํ์ฌ(ํผํ๋ฆฌ์ฑ) ์ค๋ง์ผ๊ฒ์ดํธ์ ๊ฐ์ ํ์ฌ
โจ ๊ฐ๋ฐ์ ์ธก๋ฉด์ผ๋ก ๋ณด๋ฉด?
ํ๋์จ์ด ์์ฐ์๊ฐ '์ง์ ' ์ํํธ์จ์ด๋ฅผ ๊ฐ๋ฐํ๋ ๊ฒฝ์ฐ : ํผ์คํธ ํํฐ ๊ฐ๋ฐ์
ํ๋์จ์ด ์์ฐ์์ธ ๊ธฐ์ ๊ณผ ์์ฌ๊ฐ์ ๊ด๊ณ(๋๋ ํ์ฒญ์ ์ฒด)์ ์ํ ์ํํธ์จ์ด ๊ฐ๋ฐ์ : ์ธ์ปจ๋ ํํฐ ๊ฐ๋ฐ์
์๋ฌด ๊ด๋ จ์๋ ์ 3์ ์ํํธ์จ์ด ๊ฐ๋ฐ์ : ์๋ ํํฐ ๊ฐ๋ฐ์
์ฃผ๋ก ํธํ ๊ฐ๋ฐ์ ์ํด ํ๋ฌ๊ทธ์ธ
์ด๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
ํน์ ํ๋ ์์ํฌ
๋ฅผ ์ฌ์ฉํ๋๋ฐ, ์ด์ฒ๋ผ ์ 3์๋ก ์ค๊ฐ๋ค๋ฆฌ ์ญํ ๋ก ๋์์ ์ฃผ๋ ๊ฒ์ด ์๋ ํํฐ๋ก ๋ณผ ์ ์๊ณ , ์ด๋ฐ ๊ฒ์ ๋ง๋๋ ๊ฐ๋ฐ์๊ฐ ์๋ ํํฐ ๊ฐ๋ฐ์๋ค.
MSA
MSA๋ ์ํํธ์จ์ด ๊ฐ๋ฐ ๊ธฐ๋ฒ ์ค ํ๋๋ก, ์ดํ๋ฆฌ์ผ์ด์
๋จ์๋ฅผ '๋ชฉ์ '์ผ๋ก ๋๋๋ ๊ฒ์ด ํต์ฌ
โจ Monolithic vs MSA
MSA๊ฐ ๋์ ๋๊ธฐ ์ , Monolithic ์ํคํ ์ฒ ๋ฐฉ์์ผ๋ก ๊ฐ๋ฐ์ด ์ด๋ฃจ์ด์ก๋ค. Monolithic์ ์ฌ์ ์ ์ ์์ ๋ง๊ฒ 'ํ ๋ฉ์ด๋ฆฌ'์ ํด๋นํ๋ ๊ตฌ์กฐ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค. ๋ชจ๋ ๊ธฐ๋ฅ์ ํ๋์ ์ดํ๋ฆฌ์ผ์ด์ ์์ ๋น์ฆ๋์ค ๋ก์ง์ ๊ตฌ์ฑํด ์ด์ํ๋ค. ๋ฐ๋ผ์ ๊ฐ๋ฐ์ ํ๊ฑฐ๋ ํ๊ฒฝ์ค์ ์ ์์ด์ ๊ฐ๋จํ ์ฅ์ ์ด ์์ด ์์ ์ฌ์ด์ฆ์ ํ๋ก์ ํธ์์๋ ์ ๋ฆฌํ์ง๋ง, ์์คํ ์ด ์ ์ ํ์ฅ๋๊ฑฐ๋ ํฐ ํ๋ก์ ํธ์์๋ ๋จ์ ๋ค์ด ์กด์ฌํ๋ค.
๋น๋/ํ ์คํธ ์๊ฐ์ ์ฆ๊ฐ : ํ๋๋ฅผ ์์ ํด๋ ์์คํ ์ ์ฒด๋ฅผ ๋น๋ํด์ผ ํจ. ์ฆ, ์ ์ง๋ณด์๊ฐ ํ๋ค๋ค
์์ ๋ฌธ์ ๊ฐ ์์คํ ์ ์ฒด์ ๋ฌธ์ ๋ฅผ ์ผ์ผํด : ๋ง์ฝ ํ๋์ ์๋น์ค ๋ถ๋ถ์ ํธ๋ํฝ ๋ฌธ์ ๋ก ์๋ฒ๊ฐ ๋ค์ด๋๋ฉด, ๋ชจ๋ ์๋น์ค ์ด์ฉ์ด ๋ถ๊ฐ๋ฅํ ๊ฒ์ด๋ค.
ํ์ฅ์ฑ์ ๋ถ๋ฆฌ : ์๋น์ค ๋ง๋ค ์ด์ฉ๋ฅ ์ด ๋ค๋ฅผ ์ ์๋ค. ํ๋์ ์๋น์ค๋ฅผ ํ์ฅํ๊ธฐ ์ํด ์ ์ฒด ํ๋ก์ ํธ๋ฅผ ํ์ฅํด์ผ ํ๋ค.
MSA๋ ์ข ๋ ์ธ๋ถํ ์ํจ ์ํคํ ์ฒ๋ผ๊ณ ๋งํ ์ ์๋ค. ํ๊บผ๋ฒ์ ๋น์ฆ๋์ค ๋ก์ง์ ๊ตฌ์ฑํ๋ Monolithic ๋ฐฉ์๊ณผ๋ ๋ค๋ฅด๊ฒ ๊ธฐ๋ฅ(๋ชฉ์ )๋ณ๋ก ์ปดํฌ๋ํธ๋ฅผ ๋๋๊ณ ์กฐํฉํ ์ ์๋๋ก ๊ตฌ์ถํ๋ค.
MSA์์ ๊ฐ ์ปดํฌ๋ํธ๋ API๋ฅผ ํตํด ๋ค๋ฅธ ์๋น์ค์ ํต์ ์ ํ๋๋ฐ, ๋ชจ๋ ์๋น์ค๋ ๊ฐ๊ฐ ๋ ๋ฆฝ๋ ์๋ฒ๋ก ์ด์ํ๊ณ ๋ฐฐํฌํ๊ธฐ ๋๋ฌธ์ ์๋ก ์์กด์ฑ์ด ์๋ค. ํ๋์ ์๋น์ค์ ๋ฌธ์ ๊ฐ ์๊ฒจ๋ ๋ค๋ฅธ ์๋น์ค์๋ ์ํฅ์ ๋ผ์น์ง ์์ผ๋ฉฐ, ์๋น์ค ๋ณ๋ก ๋ถ๋ถ์ ์ธ ํ์ฅ์ด ๊ฐ๋ฅํ ์ฅ์ ์ด ์๋ค.


์ฆ, ์๋น์ค ๋ณ๋ก ๊ฐ๋ฐํ์ด ๊พธ๋ ค์ง๋ฉด ๋ค๋ฅธ ํ๊ณผ ์์กด์์ด ํ ๋ด์์ ํผ๋๋ฐฑ์ ๋น ๋ฅด๊ฒ ํ ์ ์๊ณ , ๋น๊ต์ ์ ์ฐํ๊ฒ ์ด์์ด ๊ฐ๋ฅํ ๊ฒ์ด๋ค.
์ข์ ์ ๋ง ์์ง๋ ์๋ค. MSA๋ ์๋น์ค ๋ณ๋ก ํธ์ถํ ๋ API๋ก ํต์ ํ๋ฏ๋ก ์๋๊ฐ ๋๋ฆฌ๋ค. ๊ทธ๋ฆฌ๊ณ ์๋น์ค ๋ณ๋ก ํต์ ์ ๋ง๋ ๋ฐ์ดํฐ๋ก ๋ง์ถ๋ ๊ณผ์ ์ด ํ์ํ๊ธฐ๋ ํ๋ค. Monolithic ๋ฐฉ์์ ํ๋์ ํ๋ก์ธ์ค ๋ด์์ ์งํ๋๊ธฐ ๋๋ฌธ์ ์๋ ๋ฉด์์๋ MSA๋ณด๋ค ํจ์ฌ ๋น ๋ฅผ ๊ฒ์ด๋ค. ๋ํ, MSA๋ DB ๋ํ ๊ฐ๋ณ์ ์ผ๋ก ์ด์๋๊ธฐ ๋๋ฌธ์ ํธ๋์ญ์ ์ผ๋ก ๋ฌถ๊ธฐ ํ๋ ์ ๋ ์๋ค.
๋ฐ๋ผ์, ์๋น์ค๋ณ๋ก ๋ถ๋ฆฌ๋ฅผ ํ๋ฉด์ ์ป์ ์ ์๋ ์ฅ์ ๋ ์์ง๋ง, ๊ทธ๋งํผ ์ฒด๊ณ์ ์ผ๋ก ์ค๋น๋ผ ์์ง ์์ผ๋ฉด MSA๋ก ์ธํด ์คํ๋ ค ํ๋ก์ ํธ ์ฑ๋ฅ์ด ๋จ์ด์ง ์๋ ์๋ค๋ ์ ์ ์๊ณ ์์ด์ผ ํ๋ค. ์ ๋ต์ด ์ ํด์ ธ ์๋ ๊ฒ์ด ์๋๋ผ, ํ๋ก์ ํธ ๋ชฉ์ , ํ์ฌ ์ํฉ์ ๋ง๋ ์ํคํ ์ฒ ๋ฐฉ์์ด ๋ฌด์์ธ์ง ์ค๊ณํ ๋๋ถํฐ ์ ๊ณ ๋ฏผํด์ ์ ํํ์.
DDD
reference
CQRS
CQRS๋ ์ ๋ณด๋ฅผ ์ ๋ฐ์ดํธ ํ ๋์ ์กฐํํ ๋ ๋ค๋ฅธ ๋ชจ๋ธ์ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ฐ์ฅ ํต์ฌ์ด๋ค.
์ข์ ์ฝ๋๋?
โ์ข์ ์ฝ๋๋?โ์ด๋ผ๊ณ ๊ตฌ๊ธ๋งํด๋ณด๋ฉด ๋ง์ ๊ฒ์ ๊ฒฐ๊ณผ๊ฐ ๋์จ๋ค. ๋๋ ๊ทธ๋ ๊ณ ๋ค๋ค ๊ถ๊ธํ๋๋ฏํ๋ค. โ์ข์ ์ฝ๋โ๋ ๋ ์์ ์ ์ฒด๋, ์ค์ฒด๋ ์์ด ์ด ์ธ์์ ๋ ๋๊ณ ์๋ค. ๋ชจ๋๊ฐ โ์ข์ ์ฝ๋โ์ ๊ธฐ์ค์ด ์กฐ๊ธ์ฉ ๋ค๋ฅด๊ณ ๊ฐ๊ฐ์ ๊ฒฝํ์ ๊ธฐ๋ฐ์ผ๋ก ์ข์ ์ฝ๋๋ฅผ ์ ์ํ๊ณ ์๋ค. ์ธ๊ฐ์ ์ข์ ์ฝ๋์ ์ ์๋ ์ ๋ง ๋ง๋ค.
์ฝ๊ธฐ ์ฌ์ด ์ฝ๋
์ค๋ณต์ด ์๋ ์ฝ๋
ํ ์คํธ๊ฐ ์ฉ์ดํ ์ฝ๋
RESTful API๋ ?
์ฐ์ , ์ํค๋ฐฑ๊ณผ์ ์ ์๋ฅผ ์์ฝํด๋ณด์๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
์๋ ์์ด๋ ์น(World Wide Web a.k.a WWW)๊ณผ ๊ฐ์ ๋ถ์ฐ ํ์ดํผ๋ฏธ๋์ด ์์คํ ์ ์ํ ์ํํธ์จ์ด ์ํคํ ์ฒ์ ํ ํ์์ผ๋ก ์์์ ์ ์ํ๊ณ ์์์ ๋ํ ์ฃผ์๋ฅผ ์ง์ ํ๋ ๋ฐฉ๋ฒ ์ ๋ฐ์ ๋ํ ํจํด
REST
๋, REpresentational State Transfer ์ ์ฝ์์ด๋ค. ์ฌ๊ธฐ์ ~ful ์ด๋ผ๋ ํ์ฉ์ฌํ ์ด๋ฏธ๋ฅผ ๋ถ์ฌ ~ํ API ๋ผ๋ ํํ์ผ๋ก ์ฌ์ฉ๋๋ค. ์ฆ, REST ์ ๊ธฐ๋ณธ ์์น์ ์ฑ์คํ ์งํจ ์๋น์ค ๋์์ธ์ 'RESTful'ํ๋ค๋ผ๊ณ ํํํ ์ ์๋ค.
REST
๊ฐ ๋์์ธ ํจํด์ด๋ค, ์ํคํ
์ฒ๋ค ๋ง์ ์ด์ผ๊ธฐ๊ฐ ์กด์ฌํ๋๋ฐ, ํ๋์ ์ํคํ
์ฒ๋ก ๋ณผ ์ ์๋ค. ์ข ๋ ์ ํํ ํํ์ผ๋ก ๋งํ์๋ฉด, REST ๋ Resource Oriented Architecture
์ด๋ค. API ์ค๊ณ์ ์ค์ฌ์ ์์(Resource)์ด ์๊ณ HTTP Method ๋ฅผ ํตํด ์์์ ์ฒ๋ฆฌํ๋๋ก ์ค๊ณํ๋ ๊ฒ์ด๋ค.
โจ REST 6 ๊ฐ์ง ์์น
Uniform Interface
Stateless
Caching
Client-Server
Hierarchical system
Code on demandcf) ๋ณด๋ค ์์ธํ ๋ด์ฉ์ ๋ํด์๋ Reference ๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์.
โจ RESTful ํ๊ฒ API ๋ฅผ ๋์์ธ ํ๋ค๋ ๊ฒ์ ๋ฌด์์ ์๋ฏธํ๋๊ฐ.(์์ฝ)
๋ฆฌ์์ค ์ ํ์ ๋ฅผ ๋ช ์์ ์ด๊ณ ์ง๊ด์ ์ผ๋ก ๋ถ๋ฆฌํ๋ค.
๋ฆฌ์์ค๋
URI
๋ก ํํ๋๋๋ฐ ๋ฆฌ์์ค๊ฐ ๊ฐ๋ฆฌํค๋ ๊ฒ์๋ช ์ฌ
๋ก ํํ๋์ด์ผ ํ๋ค.ํ์๋
HTTP Method
๋ก ํํํ๊ณ ,GET(์กฐํ)
,POST(์์ฑ)
,PUT(๊ธฐ์กด entity ์ ์ฒด ์์ )
,PATCH(๊ธฐ์กด entity ์ผ๋ถ ์์ )
,DELETE(์ญ์ )
์ ๋ถ๋ช ํ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉํ๋ค.
Message ๋ Header ์ Body ๋ฅผ ๋ช ํํ๊ฒ ๋ถ๋ฆฌํด์ ์ฌ์ฉํ๋ค.
Entity ์ ๋ํ ๋ด์ฉ์ body ์ ๋ด๋๋ค.
์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ๊ฐ ํ๋ํ ํ๋จ์ ๊ทผ๊ฑฐ๊ฐ ๋๋ ์ปจํธ๋กค ์ ๋ณด์ธ API ๋ฒ์ ์ ๋ณด, ์๋ต๋ฐ๊ณ ์ ํ๋ MIME ํ์ ๋ฑ์ header ์ ๋ด๋๋ค.
header ์ body ๋ http header ์ http body ๋ก ๋๋ ์๋ ์๊ณ , http body ์ ๋ค์ด๊ฐ๋ json ๊ตฌ์กฐ๋ก ๋ถ๋ฆฌํ ์๋ ์๋ค.
API ๋ฒ์ ์ ๊ด๋ฆฌํ๋ค.
ํ๊ฒฝ์ ํญ์ ๋ณํ๊ธฐ ๋๋ฌธ์ API ์ signature ๊ฐ ๋ณ๊ฒฝ๋ ์๋ ์์์ ์ ์ํ์.
ํน์ API ๋ฅผ ๋ณ๊ฒฝํ ๋๋ ๋ฐ๋์ ํ์ํธํ์ฑ์ ๋ณด์ฅํด์ผ ํ๋ค.
์๋ฒ์ ํด๋ผ์ด์ธํธ๊ฐ ๊ฐ์ ๋ฐฉ์์ ์ฌ์ฉํด์ ์์ฒญํ๋๋ก ํ๋ค.
๋ธ๋ผ์ฐ์ ๋ form-data ํ์์ submit ์ผ๋ก ๋ณด๋ด๊ณ ์๋ฒ์์๋ json ํํ๋ก ๋ณด๋ด๋ ์์ ๋ถ๋ฆฌ๋ณด๋ค๋ json ์ผ๋ก ๋ณด๋ด๋ , ๋ ๋ค form-data ํ์์ผ๋ก ๋ณด๋ด๋ ํ๋๋ก ํต์ผํ๋ค.
๋ค๋ฅธ ๋ง๋ก ํํํ์๋ฉด URI ๊ฐ ํ๋ซํผ ์ค๋ฆฝ์ ์ด์ด์ผ ํ๋ค.
โจ ์ด๋ ํ ์ฅ์ ์ด ์กด์ฌํ๋๊ฐ?
Open API ๋ฅผ ์ ๊ณตํ๊ธฐ ์ฝ๋ค
๋ฉํฐํ๋ซํผ ์ง์ ๋ฐ ์ฐ๋์ด ์ฉ์ดํ๋ค.
์ํ๋ ํ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ ์ ์๋ค.
๊ธฐ์กด ์น ์ธํ๋ผ(HTTP)๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ ์ ์๋ค.
โจ ๋จ์ ์ ๋ญ๊ฐ ์์๊น?
์ฌ์ฉํ ์ ์๋ ๋ฉ์๋๊ฐ 4 ๊ฐ์ง ๋ฐ์ ์๋ค.
๋ถ์ฐํ๊ฒฝ์๋ ๋ถ์ ํฉํ๋ค.
HTTP ํต์ ๋ชจ๋ธ์ ๋ํด์๋ง ์ง์ํ๋ค.
์ ๋ด์ฉ์ ๊ฐ๋จํ ์์ฝ๋ ๋ด์ฉ์ด๋ฏ๋ก ๋ณด๋ค ์์ธํ ๋ด์ฉ์ ๋ค์ Reference ๋ฅผ ์ฐธ๊ณ ํ์๋ฉด ๋ฉ๋๋ค :)
โจ Reference
MVC pattern ?
reference
Git & Github ?
Git ์ด๋ VCS(Version Control System)์ ๋ํด์ ๊ธฐ๋ณธ์ ์ธ ์ดํด๋ฅผ ์๊ตฌํ๊ณ ์๋ค.
Git ์ ์ฌ์ฉํ๊ธฐ ์ํ ๊ฐ์ข ์ ๋ต(strategy)๋ค์ด ์กด์ฌํ๋ค. ํด๋น ์ ๋ต๋ค์ ๋ํ ์ดํด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก Git ์ ์ฌ์ฉํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋ฉด์ ์์ ์์ฃผ ๋ฌผ์ด๋ณธ๋ค. ์ฃผ๋ก ์ฌ์ฉ๋๋ strategy ์ค์ฌ์ผ๋ก ์ง๋ฌธ์ด ๋ค์ด์ค๋ฉฐ ์ ๋ช ํ ์ธ ๊ฐ์ง๋ฅผ ๋น๊ตํ ๊ธ์ ์ฒจ๋ถํ๋ค.
๋ง์ ํ์ฌ๋ค์ด GitHub ์ ๊ธฐ๋ฐ์ผ๋ก ํ์ ์ ํ๊ฒ ๋๋๋ฐ, (BitBucket ์ด๋ผ๋ ํ๋ฅญํ ๋๊ตฌ๋ ์กด์ฌํฉ๋๋ค.) GitHub ์์ ์ด๋ค ์ผ์ ํ ์ ์๋์ง, ์ด๋ป๊ฒ GitHub Repository ์ ๊ธฐ์ฌ๋ฅผ ํ๋์ง ์ ๋ฆฌํ ๊ธ์ ์ฒจ๋ถํ๋ค.
Last updated