๐ค Chapter 4. ์ข์ ๋จ์ ํ ์คํธ์ 4๋ ์์
๐ฅ ์ข์ ๋จ์ ํ ์คํธ์ 4๋ ์์ ์์ธํ ์ดํด๋ณด๊ธฐโ
์ข์ ๋จ์ ํ ์คํธ์๋ ๋ค์ ๋ค ๊ฐ์ง ํน์ฑ์ด ์๋ค.
- ํ๊ท ๋ฐฉ์ง
- ๋ฆฌํฉํฐ๋ง ๋ด์ฑ
- ๋น ๋ฅธ ํผ๋๋ฐฑ
- ์ ์ง ๋ณด์์ฑ
์ด ๋ค ๊ฐ์ง ํน์ฑ์ด ๊ธฐ๋ณธ์ด๋ค. ์ด ํน์ฑ์ผ๋ก ์ด๋ค ์๋ํ๋ ํ ์คํธ๋ ๋ถ์ํ ์ ์๋ค.
๐ ์ฒซ ๋ฒ์งธ ์์: ํ๊ท ๋ฐฉ์งโ
ํ๊ท๋ ์ํํธ์จ์ด ๋ฒ๊ทธ๋ค. ์ฝ๋๋ฅผ ์์ ํ ํ ๊ธฐ๋ฅ์ด ์๋ํ ๋๋ก ์๋ํ์ง ์๋ ๊ฒฝ์ฐ๋ค.
ํ๊ท ๋ฐฉ์ง ์งํ์ ๋ํ ํ ์คํธ ์ ์๊ฐ ์ผ๋ง๋ ์ ๋์ค๋์ง ํ๊ฐํ๋ ค๋ฉด ๋ค์ ์ฌํญ์ ๊ณ ๋ คํด์ผ ํ๋ค.
- ํ ์คํธ ์ค์ ์คํ๋๋ ์ฝ๋์ ์
- ์ฝ๋ ๋ณต์ก๋
- ์ฝ๋์ ๋๋ฉ์ธ ์ ์์ฑ
์ผ๋ฐ์ ์ผ๋ก ์คํ๋๋ ์ฝ๋๊ฐ ๋ง์ ์๋ก ํ
์คํธ์์ ํ๊ท๊ฐ ๋ํ๋ ๊ฐ๋ฅ์ฑ์ด ๋๋ค.
์ฝ๋์ ์๋ฟ๋ง ์๋๋ผ ๋ณต์ก๋์ ๋๋ฉ์ธ ์ ์์ฑ๋ ์ค์ํ๋ค. ๋ณต์กํ ๋น์ฆ๋์ค ๋ก์ง์ ๋ํ๋ด๋ ์ฝ๋๊ฐ ๋ณด์ผ๋ฌํ๋ ์ดํธ ์ฝ๋๋ณด๋ค ํจ์ฌ ๋ ์ค์ํ๋ค. ๋น์ฆ๋์ค์ ์ค์ํ ๊ธฐ๋ฅ์์ ๋ฐ์ํ ๋ฒ๊ทธ๊ฐ ๊ฐ์ฅ ํฐ ํผํด๋ฅผ ์
ํ๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฐ๋ฉด์ ๋จ์ํ ์ฝ๋๋ฅผ ํ
์คํธํ๋ ๊ฒ์ ๊ฐ์น๊ฐ ๊ฑฐ์ ์๋ค. ์ด๋ฌํ ์ฝ๋๋ ์งง๊ณ , ๋น์ฆ๋์ค ๋ก์ง์ ๋ง์ด ๋ด๊ณ ์์ง๋ ์๋ค. ๋จ์ํ ์ฝ๋๋ฅผ ๋ค๋ฃจ๋ ํ
์คํธ๋ ์ค์ํ ์ฌ์ง๊ฐ ๋ง์ง ์๊ธฐ ๋๋ฌธ์ ํ๊ท ์ค๋ฅ๊ฐ ๋ง์ด ์๊ธฐ์ง ์๋๋ค. ๋จ์ํ ์ฝ๋์ ์๋ก ๋ค์๊ณผ ๊ฐ์ด ์์ฑ ํ ์ค์ด ์๋ค.
public class User {
public string Name { get; set; }
}
๊ฒ๋ค๊ฐ ์ฌ๋ฌ๋ถ์ ์ฝ๋ ์ธ์ ์์ฑํ์ง ์์ ์ฝ๋๋ ์ค์ํ๋ค. ์ด ์ฝ๋๋ ์์ฑํ ์ฝ๋๋งํผ์ด๋ ์ํํธ์จ์ด ์๋์ ์ํฅ์ ๋ฏธ์น๋ค. ์ต์์ ๋ณดํธ๋ฅผ ์ํด์๋ ํ ์คํธ๊ฐ ํด๋น ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ํ ๋ ์์ํฌ, ์ธ๋ถ ์์คํ ์ ํ ์คํธ ๋ฒ์ฃผ์ ํฌํจ์์ผ์ ์ํํธ์จ์ด๊ฐ ์ด๋ฌํ ์์กด์ฑ์ ๋ํด ๊ฒ์ฆ์ด ์ฌ๋ฐ๋ฅธ์ง ํ์ธํ๋ค.
๐ ๋ ๋ฒ์งธ ์์: ๋ฆฌํฉํฐ๋ง ๋ด์ฑโ
์ข์ ๋จ์ ํ ์คํธ์ ๋ ๋ฒ์งธ ํน์ฑ์ ๋ฆฌํฉํฐ๋ง ๋ด์ฑ์ด๋ค. ์ด๋ ํ ์คํธ๋ฅผ ๋นจ๊ฐ์(์คํจ)์ผ๋ก ๋ฐ๊พธ์ง ์๊ณ ๊ธฐ๋ณธ ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋๋ฅผ ๋ฆฌํฉํฐ๋งํ ์ ์๋์ง์ ๋ํ ์ฒ๋๋ค.
๋ฆฌํฉํฐ๋ง์ผ๋ก ์ ํํ ๋ฌด์์ด ๊ณ ์ฅ ๋ฌ๋์ง๋ฅผ ์์ธํ ์ดํด๋ดค์ง๋ง, ์๊ณ ๋ณด๋ ์๋ฌด๊ฒ๋ ๊ณ ์ฅ ๋์ง ์์๋ค. ๊ธฐ๋ฅ์ ์์ ๊ณผ ๊ฐ์ด ์๋ฒฝํ๊ฒ ์๋ํ๋ค. ๋ฌธ์ ๋ ๊ธฐ๋ฐ ์ฝ๋๋ฅผ ์์ ํ๋ฉด ํ ์คํธ๊ฐ ๋นจ๊ฐ์์ผ๋ก ๋ฐ๋๊ฒ๋ ์์ฑ๋๋ค๋ ๊ฒ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ์ค์ ๋ก ๊ธฐ๋ฅ์ด ์๋ํ์ง ์๋์ง๋ ์๊ด์๋ค.
์ด๋ฌํ ์ํฉ์ ๊ฑฐ์ง ์์ฑ์ด๋ผ๊ณ ํ๋ค. ๊ฑฐ์ง ์์ฑ์ ํ์ ๊ฒฝ๋ณด๋ค. ์ค์ ๋ก ๊ธฐ๋ฅ์ด ์๋ํ ๋๋ก ์๋ํ์ง๋ง ํ ์คํธ๋ ์คํจ๋ฅผ ๋ํ๋ด๋ ๊ฒฐ๊ณผ๋ค. ์ด๋ฌํ ๊ฑฐ์ง ์์ฑ์ ์ผ๋ฐ์ ์ผ๋ก ์ฝ๋๋ฅผ ๋ฆฌํฉํฐ๋งํ ๋, ์ฆ ๊ตฌํ์ ์์ ํ์ง๋ง ์๋ณํ ์ ์๋ ๋์์ ์ ์งํ ๋ ๋ฐ์ํ๋ค.
๋ฆฌํฉํฐ๋ง ๋ด์ฑ ์งํ์์ ํ
์คํธ ์ ์๊ฐ ์ผ๋ง๋ ์ ๋์ค๋์ง ํ๊ฐํ๋ ค๋ฉด ํ
์คํธ์์ ์ผ๋ง๋ ๋ง์ด ๊ฑฐ์ง ์์ฑ์ด ๋ฐ์ํ๋์ง ์ดํด๋ด์ผ ํ๋ค. ์ ์์๋ก ์ข๋ค.
๋จ์ ํ
์คํธ์ ๋ชฉํ๋ ํ๋ก์ ํธ ์ฑ์ฅ์ ์ง์ ๊ฐ๋ฅํ๊ฒ ํ๋ ๊ฒ์ด๋ค. ํ
์คํธ๊ฐ ์ง์ ๊ฐ๋ฅํ ์ฑ์ฅ์ ํ๊ฒ ํ๋ ๋ฉ์ปค๋์ฆ์ ํ๊ท ์์ด ์ฃผ๊ธฐ์ ์ผ๋ก ๋ฆฌํฉํฐ๋งํ๊ณ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ ์ ์๋ ๊ฒ์ด๋ค. ์ด๊ธฐ์๋ ๋ ๊ฐ์ง ์ฅ์ ์ด ์๋ค.
- ๊ธฐ์กด ๊ธฐ๋ฅ ์ด ๊ณ ์ฅ ๋ฌ์ ๋ ํ ์คํธ๊ฐ ์กฐ๊ธฐ ๊ฒฝ๊ณ ๋ฅผ ์ ๊ณตํ๋ค. ์ด๋ฌํ ์กฐ๊ธฐ ๊ฒฝ๊ณ ๋๋ถ์ ๊ฒฐํจ์ด ์๋ ์ฝ๋๊ฐ ์ดํ ํ๊ฒฝ์ ๋ฐฐํ๋๊ธฐ ํจ์ฌ ์ ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค. ์ด์ ํ๊ฒฝ์ด์์ผ๋ฉด ๋ฌธ์ ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐ ํจ์ฌ ๋ ๋ง์ ๋ ธ๋ ฅ์ด ํ์ํ์ ๊ฒ์ด๋ค.
- ์ฝ๋ ๋ณ๊ฒฝ์ด ํ๊ท๋ก ์ด์ด์ง์ง ์์ ๊ฒ์ด๋ผ๊ณ ํ์ ํ๊ฒ ๋๋ค. ์ด๋ฌํ ํ์ ์ด ์์ผ๋ฉด ๋ฆฌํฉํฐ๋ง์ ํ๋ ๋ฐ ์ฃผ์ ํ๊ฒ ๋๊ณ ์ฝ๋๋ฒ ์ด์ค๊ฐ ๋๋น ์ง ๊ฐ๋ฅ์ฑ์ด ํจ์ฌ ๋์์ง๋ค.
๊ฑฐ์ง ์์ฑ์ ์ด ๋ ๊ฐ์ง ์ด์ ์ ๋ชจ๋ ๋ฐฉํดํ๋ค.
- ํ ์คํธ๊ฐ ํ๋นํ ์ด์ ์์ด ์คํจํ๋ฉด, ์ฝ๋ ๋ฌธ์ ์ ๋์ํ๋ ๋ฅ๋ ฅ๊ณผ ์์ง๊ฐ ํฌ์๋๋ค. ์๊ฐ์ด ํ๋ฅด๋ฉด์ ๊ทธ๋ฌํ ์คํจ์ ์ต์ํด์ง๊ณ ๊ทธ๋งํผ ์ ๊ฒฝ์ ๋ง์ด ์ฐ์ง ์๋๋ค.
- ๋ฐ๋ฉด์ ๊ฑฐ์ง ์์ฑ์ด ๋น๋ฒํ๊ฒ ํ ์คํธ ์ค์ํธ์ ๋ํ ์ ๋ขฐ๊ฐ ์์ํ ๋จ์ด์ง๋ฉฐ, ๋ ์ด์ ๋ฏฟ์ ๋งํ ์์ ๋ง์ผ๋ก ์ธ์ํ์ง ์๋๋ค. ์ฆ, ํ์ ๊ฒฝ๋ณด๋ก ์ธ์์ด ๋๋น ์ง๋ค. ์ด๋ ๊ฒ ์ ๋ขฐ๊ฐ ๋ถ์กฑํด์ง๋ฉด ๋ฆฌํฉํฐ๋ง์ด ์ค์ด๋ ๋ค. ํ๊ท๋ฅผ ํผํ๋ ค๊ณ ์ฝ๋ ๋ณ๊ฒฝ์ ์ต์ํ์ผ๋ก ํ๊ธฐ ๋๋ฌธ์ด๋ค.
๐ ๋ฌด์์ด ๊ฑฐ์ง ์์ฑ์ ์์ธ์ธ๊ฐ?โ
ํ ์คํธ์์ ๋ฐ์ํ๋ ๊ฑฐ์ง ์์ฑ์ ์๋ ํ ์คํธ ๊ตฌ์ฑ ๋ฐฉ์๊ณผ ์ง์ ์ ์ธ ๊ด๋ จ์ด ์๋ค. ํ ์คํธ์ ํ ์คํธ ๋์ ์์คํ ์ ๊ตฌํ ์ธ๋ถ ์ฌํญ์ด ๋ง์ด ๊ฒฐํฉํ ์๋ก ํ์ ๊ฒฝ๋ณด๊ฐ ๋ ๋ง์ด ์๊ธด๋ค. ๊ฑฐ์ง ์์ฑ์ด ์๊ธธ ๊ฐ๋ฅ์ฑ์ ์ค์ด๋ ๋ฐฉ๋ฒ์ ํด๋น ๊ตฌํ ์ธ๋ถ ์ฌํญ์์ ํ ์คํธ๋ฅผ ๋ถ๋ฆฌํ๋ ๊ฒ๋ฟ์ด๋ค. ํ ์คํธ๋ฅผ ํตํด SUT๊ฐ ์ ๊ณตํ๋ ์ต์ข ๊ฒฐ๊ณผ๋ฅผ ๊ฒ์ฆํ ๋์ง ํ์ธํด์ผ ํ๋ค. ํ ์คํธ๋ ์ต์ข ์ฌ์ฉ์์ ๊ด์ ์์ SUT๋ฅผ ๊ฒ์ฆํด์ผ ํ๊ณ ์ต์ข ์ฌ์ฉ์์๊ฒ ์๋ฏธ ์๋ ๊ฒฐ๊ณผ๋ง ํ์ธํด์ผ ํ๋ค. ๋ค๋ฅธ ๋ชจ๋ ๊ฒ์ ๋ฌด์ํด์ผ ํ๋ค.
ํ ์คํธ๋ฅผ ๊ตฌ์ฑํ๊ธฐ์ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ๋ฌธ์ ์์ญ์ ๋ํด ์ด์ผ๊ธฐํ๋ ๊ฒ์ด๋ค. ์ด๋ฌํ ํ ์คํธ๊ฐ ์คํจํ๋ฉด, ์ด์ผ๊ธฐ์ ์ค์ ์ ํ๋ฆฌ์ผ์ด์ ๋์์ด ์๋ก ๊ฑฐ๋ฆฌ๊ฐ ๋ฉ์ด์ง ๊ฒ์ ์๋ฏธํ๋ค. ์ด๋ ํ ์คํธ ์คํจ ์ ํ ์ค ์ ์ผํ๊ฒ ๋์์ด ๋๋ ์ ํ์ด๋ค.
๋ค์ ์๋ฅผ ์ดํด๋ณด์. ์ฌ๊ธฐ์ MessageRenderer
ํด๋์ค๋ ๋จธ๋ฆฌ๊ธ, ๋ณธ๋ฌธ, ๋ฐ๋ฅ๊ธ์ ํฌํจํ๋ ๋ฉ์์ง์ HTML ํํ์ ์์ฑํ๋ค.
public class Message {
public string Header { get; set; }
public string Body { get; set; }
public string Footer { get; set; }
}
public interface IRenderer {
string Render(Message message);
}
public class MessageRenderer : IRenderer {
public IReadOnlyList<IRenderer> SubRenderers { get; }
public MessageRenderer() {
SubRenderers = new List<IRenderer> {
new HeaderRenderer(),
new BodyRenderer(),
new FooterRenderer(),
};
}
public string Render(Message message) {
return SubRenderers
.Select(x => x.Render(message))
.Aggregate("", (str1, str2) => str1 + str2);
}
}
MessageRenderer
๋ฅผ ์ด๋ป๊ฒ ํ
์คํธํ ์ ์์๊น? ํ ๊ฐ์ง ๊ฐ๋ฅํ ๋ฐฉ๋ฒ์ ์ด ํด๋์ค๊ฐ ๋ฐ๋ฅด๋ ์๊ณ ๋ฆฌ์ฆ์ ๋ถ์ํ๋ ๊ฒ์ด๋ค.
[Fact]
public void MessageRenderer_uses_correct_sub_renderers() {
var sut = new MessageRenderer();
IReadOnlyList<IRenderer> renderers = sut.SubRenderers;
Assert.Equal(3, renderers.Count);
Assert.IsAssignableFrom<HeaderRenderer>(renderers[0]);
Assert.IsAssignableFrom<BodyRenderer>(renderers[1]);
Assert.IsAssignableFrom<FooterRenderer>(renderers[2]);
}
์ด ํ ์คํธ๋ ํ์ ๋ ๋๋ง ํด๋์ค๊ฐ ์์ํ๋ ๋ชจ๋ ์ ํ์ด๊ณ ์ฌ๋ฐ๋ฅธ ์์๋ก ๋ํ๋๋์ง ์ฌ๋ถ๋ฅผ ํ์ธํ๋ค.
์ต์ข ๊ฒฐ๊ณผ๊ฐ ๋ฐ๋์ง ์์์ง๋ผ๋, ํ ์คํธ๋ฅผ ์ํํ๋ฉด ๋นจ๊ฐ์์ผ๋ก ๋ณํ ๊ฒ์ด๋ค. ์ด๋ ํ ์คํธ๊ฐ SUT๊ฐ ์์ฑํ ๊ฒฐ๊ณผ๊ฐ ์๋๋ผ SUT์ ๊ตฌํ ์ธ๋ถ ์ฌํญ๊ณผ ๊ฒฐํฉํ๊ธฐ ๋๋ฌธ์ด๋ค. ์ด ํ ์คํธ๋ ๋๊ฐ์ด ์ ์ฉํ ์ ์๋ ๋ค๋ฅธ ๊ตฌํ์ ๊ณ ๋ คํ์ง ์๊ณ ํน์ ๊ตฌํ๋ง ์์ํด์ ์๊ณ ๋ฆฌ์ฆ์ ๊ฒ์ฌํ๋ค.
MessageRenderer
ํด๋์ค์ ์๋น ๋ถ๋ถ์ ๋ฆฌํฉํฐ๋งํ๋ฉด ํ
์คํธ๊ฐ ์คํจํ๋ค. ๋งํ์๋ฉด, ๋ฆฌํฉํฐ๋ง ๊ณผ์ ์ ์ ํ๋ฆฌ์ผ์ด์
์ ์๋ณํ ์ ์๋ ๋์์ ์ํฅ์ ์ฃผ์ง ์์ผ๋ฉด์ ๊ตฌํ์ ๋ณ๊ฒฝํ๋ ๊ฒ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ๋ณ๊ฒฝํ ๋๋ง๋ค ๋นจ๊ฐ์์ผ๋ก ๋ณํ๋ ๊ฒ์ ๋ฐํธ ํ
์คํธ๊ฐ ๊ตฌํ ์ธ๋ถ ์ฌํญ์ ๊ด๊ณ๋ผ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ด๋ฌํ ํ
์คํธ๋ ์์์ ์ค๋ช
ํ ๋ชจ๋ ๋จ์ ์ ๋ณด์ฌ์ค๋ค.
- ํ๊ท ๋ฐ์ ์ ์กฐ๊ธฐ ๊ฒฝ๊ณ ๋ฅผ ์ ๊ณตํ์ง ์๋๋ค.
- ๋ฆฌํฉํฐ๋ง์ ๋ํ ๋ฅ๋ ฅ๊ณผ ์์ง๋ฅผ ๋ฐฉํดํ๋ค.
๐ ๊ตฌํ ์ธ๋ถ ์ฌํญ ๋์ ์ต์ข ๊ฒฐ๊ณผ๋ฅผ ๋ชฉํ๋ก ํ๊ธฐโ
ํ ์คํธ๋ฅผ ๊นจ์ง์ง ์๊ณ ๋ฆฌํฉํฐ๋ง ๋ด์ฑ์ ๋์ด๋ ๋ฐฉ๋ฒ์ SUT์ ๊ตฌํ ์ธ๋ถ ์ฌํญ๊ณผ ํ ์คํธ ๊ฐ์ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๋ ๊ฒ๋ฟ์ด๋ค. ์ฆ, ์ฝ๋์ ๋ด๋ถ ์์ ๊ณผ ํ ์คํธ ์ฌ์ด์ ๊ฐ๋ฅํ ํ ๋ฉ๋ฆฌ ๋จ์ด๋จ๋ฆฌ๊ณ ์ต์ข ๊ฒฐ๊ณผ๋ฅผ ๋ชฉํ๋ก ํ๋ ๊ฒ์ด๋ค.
๋จผ์ ๋ค์ ์ฌํญ์ ํ์ธํด์ผ ํ๋ค. MessageRenderer
์์ ์ป์ ์ต์ข
๊ฒฐ๊ณผ๋ ๋ฌด์์ธ๊ฐ? ๋ฉ์์ง์ HTML ํํ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ํด๋์ค์์ ์ป์ ์ ์๋ ๊ด์ฐฐ ๊ฐ๋ฅํ ๊ฒฐ๊ณผ์ด๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ํ์ธํ๋ ๊ฒ์ด ๋ง๋
ํ๋ค. ์ด HTML ํํ์ด ๊ทธ๋๋ก ์ ์ง๋๋ ํ ์ ํํ ์ด๋ป๊ฒ ์์ฑ๋๋์ง๋ ๊ฑฑ์ ํ ํ์๊ฐ ์๋ค. ์ด๋ฌํ ๊ตฌํ ์ธ๋ถ ์ฌํญ์ ์๊ด์๋ค. ๋ค์ ์ฝ๋๋ ํ
์คํธ์ ์ ๋ฒ์ ์ด๋ค.
[Fact]
public void Rendering_a_message() {
var sut = new MessageRenderer();
var message = new Message {
Header = "h",
Body = "b",
Footer = "f"
};
string html = sut.Render(message);
Assert.Equal("<h1><h</h1><b>b</b><i>f</i>", html);
}
์ด ํ
์คํธ๋ MessageRenderer
๋ฅผ ๋ธ๋๋ฐ์ค๋ก ์ทจ๊ธํ๊ณ ์๋ณํ ์ ์๋ ๋์์๋ง ์ ๊ฒฝ ์ด๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ํ
์คํธ๋ ๋ฆฌํฉํฐ๋ง ๋ด์ฑ์ด ๋ถ์ฉ ๋์๋ค. ์ฆ HTML ์ถ๋ ฅ์ ๋๊ฐ์ด ์งํค๋ ํ, SUT์ ๋ณ๊ฒฝ ์ฌํญ์ ํ
์คํธ์ ์ํฅ์ ๋ฏธ์น์ง ์๋๋ค.
์ด ํ ์คํธ๋ ์๋ ๋ฒ์ ๋ณด๋ค ํฌ๊ฒ ๊ฐ์ ๋๋ค. ์ต์ข ์ฌ์ฉ์์๊ฒ ์๋ฏธ ์๋ ์ ์ผํ ๊ฒฐ๊ณผ, ์ฆ ๋ธ๋ผ์ฐ์ ์ ๋ฉ์์ง๊ฐ ํ์๋๋ ๋ฐฉ์์ ๊ฒ์ฆํด ๋น์ฆ๋์ค ์๊ตฌ ์ฌํญ์ ๋ค์ด๋ง๋๋ค. ์ด ํ ์คํธ๋ ํญ์ ์ ์์ ์คํจํ๊ณ ๊ณ ๊ฐ์๊ฒ ์ํฅ์ ์ค ์ ์๋ ์ ํ๋ฆฌ์ผ์ด์ ๋์์ ๋ณ๊ฒฝ์ ์๋ ค์ฃผ๋ฏ๋ก ๊ฐ๋ฐ์๊ฐ ์ฃผ์๋ฅผ ๊ธฐ์ธ์ฌ์ผ ํ๋ค. ์ด ํ ์คํธ์ ๊ฑฐ์ง ์์ฑ์ ๊ฑฐ์ ์์ ๊ฒ์ด ๋ค.
๐ฅ ์ฒซ ๋ฒ์งธ ํน์ฑ๊ณผ ๋ ๋ฒ์งธ ํน์ฑ ๊ฐ์ ๋ณธ์ง์ ์ธ ๊ด๊ณโ
๐ ํ ์คํธ ์ ํ๋ ๊ทน๋ํโ
์ฝ๋ ์ ํ๋์ ํ ์คํธ ๊ฒฐ๊ณผ์ ๋ํด์๋ ์ฌ๋ฐ๋ฅธ ์ถ๋ก (์ฐธ ์์ฑ / ํ ์คํธ ํต๊ณผ / ์๋), 2์ข ์ค๋ฅ(๊ฑฐ์ง ์์ฑ / ํ ์คํธ ํต๊ณผ / ๊ณ ์ฅ / ํ๊ท ๋ฐฉ์ง), 1์ข ์ค๋ฅ(๊ฑฐ์ง ์์ฑ / ํ ์คํธ ์คํจ / ์๋ / ๋ฆฌํฉํฐ๋ง ๋ด์ฑ), ์ฌ๋ฐ๋ฅธ ์ถ๋ก (์ฐธ ์์ฑ / ํ ์คํธ ์คํจ / ๊ณ ์ฅ) ๋ค ๊ฐ์ง ๊ฒฐ๊ณผ๊ฐ ์์ ์ ์๋ค. ํ ์คํธ๋ ํต๊ณผํ๊ฑฐ๋ ์คํจํ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ๊ธฐ๋ฅ์ด ์ ์๋ํ ์๋ ์๊ณ ๊ณ ์ฅ ๋ ์๋ ์๋ค.
ํ ์คํธ๊ฐ ํต๊ณผํ๊ณ ๊ธฐ๋ณธ ๊ธฐ๋ฅ์ด ์๋ํ ๋๋ก ์ ์๋ํ๋ ์ํฉ์ ์ฌ๋ฐ๋ฅธ ์ถ๋ก ์ด๋ค. ํ ์คํธ๋ ์์คํ ์ ์ํ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ ์ถํ๋ค. ์๋ ๊ธฐ๋ฅ๊ณผ ํต๊ณผ ํ ์คํธ์ ์กฐํฉ์ ๋ํ ์ฉ์ด๋ก "์ฐธ ์์ฑ"์ด๋ผ๊ณ ํ๋ค.
๊ธฐ๋ฅ์ด ๊ณ ์ฅ ๋์ ํ ์คํธ๊ฐ ์คํจํด๋ ์ฌ๋ฐ๋ฅธ ์ถ๋ก ์ด๋ค. ๊ธฐ๋ฅ์ด ์ ๋๋ก ์๋ํ์ง ์์ผ๋ฉด ํ ์คํธ๊ฐ ์คํจํ ๊ฒ์ผ๋ก ์์ํ๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๊ฒ์ด ๋จ์ ํ ์คํธ์ ํต์ฌ์ด๋ค. ์ด ์ํฉ์ ํด๋นํ๋ ์ฉ์ด๋ "์ฐธ ์์ฑ"์ด๋ค.
ํ ์คํธ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์์ผ๋ฉด ๋ฌธ์ ๊ฐ ๋๋ค. ์ด๋ "๊ฑฐ์ง ์์ฑ"์ด๋ค. ๊ฑฐ์ง ์์ฑ์ ํผ ํ๋ ๋ฐ ์ข์ ํ ์คํธ์ ์ฒซ ๋ฒ์งธ ํน์ฑ์ธ ํ๊ท ๋ฐฉ์ง๊ฐ ๋์์ด ๋๋ค.
๊ธฐ๋ฅ์ ์ฌ๋ฐ๋ฅด์ง๋ง ํ ์คํธ๊ฐ ์ฌ์ ํ ์คํจ๋ก ํ์๋๋ ๋์นญ์ ์ธ ์ํฉ์ด ์๋ค. ์ด๋ "๊ฑฐ์ง ์์ฑ", ์ฆ ํ์ ๊ฒฝ๋ณด๋ค. ๊ฑฐ์ง ์์ฑ์ ํผํ๋ ๋ฐ ๋ ๋ฒ์งธ ํน์ฑ์ธ ๋ฆฌํฉํฐ๋ง ๋ด์ฑ์ด ๋์์ด ๋๋ค.
ํ๊ท ๋ฐฉ์ง์ ๋ฆฌํฉํฐ๋ง ๋ด์ฑ์ ํ ์คํธ ์ค์ํธ์ ์ ํ๋๋ฅผ ๊ทน๋ํํ๋ ๊ฒ์ ๋ชฉํ๋ก ํ๋ค. ์ ํ๋ ์งํ๋ ๋ค์ ๋ ๊ฐ์ง ์์๋ฅผ ๊ตฌ์ฑ๋๋ค.
- ํ ์คํธ๊ฐ ๋ฒ๊ทธ ์์์ ์ผ๋ง๋ ์ ๋ํ๋ด๋๊ฐ(๊ฑฐ์ง ์์ฑ(ํ์ ๋ฐฉ์ง ์์ญ) ์ ์ธ).
- ํ ์คํธ๊ฐ ๋ฒ๊ทธ ์์์ ์ผ๋ง๋ ์ ๋ํ๋ด๋๊ฐ(๊ฑฐ์ง ์์ฑ(๋ฆฌํฉํฐ๋ง ๋ด์ฑ ์์ญ) ์ ์ธ).
ํ ์คํธ ์ ํ๋๋ฅผ ํฅ์์ํค๋ ๋ฐฉ๋ฒ์ ๋ ๊ฐ์ง๊ฐ ์๋ค. ์ฒซ ๋ฒ์งธ๋ ๋ถ์, ์ฆ ์ ํธ(๋ฐ๊ฒฌ๋ ๋ฒ๊ทธ ์)๋ฅผ ์ฆ๊ฐ์ํค๋ ๊ฒ์ด๋ค. ์ด๋ ํ๊ท๋ฅผ ๋ ์ ์ฐพ์๋ด๋ ํ ์คํธ๋ก ๊ฐ์ ํ๋ ๊ฒ์ด๋ค. ๋ ๋ฒ์งธ๋ ๋ถ๋ชจ, ์ฆ ์์(ํ์ ๊ฒฝ๋ณด ๋ฐ์ ์)์ ์ค์ด๋ ๊ฒ์ด๋ค. ์ด๋ ํ์ ๊ฒฝ๋ณด๋ฅผ ๋ฐ์์ํค์ง ์๋ ํ ์คํธ๋ก ๊ฐ์ ํ๋ ๊ฒ์ด๋ค.
๋ ๋ค ๋งค์ฐ ์ค์ํ๋ค. ๊ฒฝ๋ณด๊ฐ ํ์๋ก ์ธ๋ฆฌ์ง ์๋๋ผ๋ ๋ฒ๊ทธ๋ฅผ ์ฐพ์ ์ ์๋ ํ ์คํธ๋ ์์ฉ์ด ์๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก ์ฝ๋์์ ๋ชจ๋ ๋ฒ๊ทธ๋ฅผ ์ฐพ์ ์ ์๋๋ผ๋ ์์์ด ๋ง์ด ๋ฐ์ํ๋ฉด ํ ์คํธ์ ์ ํ๋๋ 0์ ๊ฐ๊น์์ง๋ค. ์ด๋ ๊ฒ ์ฐพ์๋ ์จํต ์ธ๋ฐ์๋ ์ ๋ณด๊ฐ ๋ผ๋ฒ๋ฆฐ๋ค.
๐ ๊ฑฐ์ง ์์ฑ๊ณผ ๊ฑฐ์ง ์์ฑ์ ์ค์์ฑ: ์ญํ ๊ด๊ณโ
ํ๋ก์ ํธ๊ฐ ์ฑ์ฅํจ์ ๋ฐ๋ผ ๊ฑฐ์ง ์์ฑ์ ํ ์คํธ ์ค์ํธ์ ์ ์ ๋ ํฐ ์ํฅ์ ๋ฏธ์น๊ธฐ ์์ํ๋ค.
์ด๊ธฐ์๋ ์ ๊ฑฐ์ง ์์ฑ์ด ์ค์ํ์ง ์์๊ฐ? ๋ฆฌํฉํฐ๋ง์ ๋ฐ๋ก ์ค์ํ์ง๋ ์์ผ๋ฉฐ, ์๊ฐ์ด ์ง๋๋ฉด์ ์ ์ฐจ ์ค์ํด์ง๋ค.
๋ฆฌํฉํฐ๋ง์ด ์ ์ ๋ ํ์ํด์ง์ ๋ฐ๋ผ ํ
์คํธ์์ ๋ฆฌํฉํฐ๋ง ๋ด์ฑ๋ ์ ์ ๋ ์ค์ํด์ง๋ค.
(ํนํ ํ๋ก์ ํธ ํ๋ฐ์) ๊ฑฐ์ง ์์ฑ์ผ๋ก๋ถํฐ ์ฝ๋๋ฅผ ๋ณดํธํ๋ ๊ฒ์ด ์ค์ํด๋, ์ด๋ ๊ฒ ๊ฑฐ์ง ์์ฑ์ ์ ๊ฒฝ ์ฐ๋ ๊ฐ๋ฐ์๋ ๊ฑฐ์ ์๋ค. ๋๋ถ๋ถ ์ข์ ๋จ์ ํ ์คํธ์ ์ฒซ ๋ฒ์งธ ํน์ฑ์ธ ํ๊ท ๋ฐฉ์ง์๋ง ์ค์ ์ ๋๋ ๊ฒฝํฅ์ด ์๋๋ฐ, ํ๊ท ๋ฐฉ์ง๋ ํ๋ก์ ํธ ์ฑ์ฅ์ ์ ์งํ๋ ๋ฐ ๋์์ด ๋๊ณ , ๊ฐ์น๊ฐ ์์ผ๋ฉฐ, ๋งค์ฐ ์ ํํ ํ ์คํธ ์ค์ํธ๋ฅผ ๊ตฌ์ถํ๊ธฐ์ ์ถฉ๋ถํ์ง ์๋ค.
๋ฌผ๋ก ๊ทธ ์ด์ ๋ ํ๋ฐ๊น์ง ๊ฐ๋ ํ๋ก์ ํธ๊ฐ ํจ์ฌ ์ ๋ค๋ ๋ฐ ์์ผ๋ฉฐ, ์ด๋ ๋ค์ ๋๋ถ๋ถ์ ํ๋ก์ ํธ๋ ์๊ณ ๋ํ ํ๋ก์ ํธ๊ฐ ๋๋ฌด ์ปค์ง๊ธฐ ์ ์ ๊ฐ๋ฐ์ด ๋๋๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฐ๋ผ์ ํ๋ก์ ํธ์ ๊ฐ๋ํ ์์ด๊ณ ๋ชจ๋ ๋ฆฌํฉํฐ๋ง ์์ ์ ๋ฐฉํดํ๋ ์๋ชป๋ ๊ฒฝ๋ณด๋ณด๋ค ๋์ ๋์ง ์๋ ๋ฒ๊ทธ ๋ฌธ์ ์ ์ง๋ฉดํ๋ค. ๊ทธ๋์ ์ฌ๋๋ค์ ๋ฒ๊ทธ์ ๋ฐ๋ผ ์ต์ ํํ๋ค. ์ค๋ํ ํ๋ก์ ํธ์์ ์์ ํ๋ฉด, ๊ฑฐ์ง ์์ฑ(์๋ ค์ง์ง ์์ ๋ฒ๊ทธ)๊ณผ ๊ฑฐ์ง ์์ฑ(ํ์ ๊ฒฝ๋ณด)์ ๋ํด ๋๊ฐ์ด ์ฃผ์๋ฅผ ๊ธฐ์ธ์ฌ์ผ ํ๋ค.
๐ฅ ์ธ ๋ฒ์งธ ์์์ ๋ค ๋ฒ์งธ ์์: ๋น ๋ฅธ ํผ๋๋ฐฑ๊ณผ ์ ์ง ๋ณด์์ฑโ
๋น ๋ฅธ ํผ๋ ๋ฐฑ์ ๋จ์ ํ ์คํธ์ ํ์ ์์ฑ์ด๋ค. ํ ์คํธ ์๋๊ฐ ๋น ๋ฅผ์๋ก ํ ์คํธ ์ค์ํธ์์ ๋ ๋ง์ ํ ์คํธ๋ฅผ ์ํํ ์ ์๊ณ ๋ ์์ฃผ ์คํํ ์ ์๋ค. ํ ์คํธ๊ฐ ๋น ๋ฅด๊ฒ ์คํ๋๋ฉด ์ฝ๋์ ๊ฒฐํจ์ด ์๊ธฐ์๋ง์ ๋ฒ๊ทธ์ ๋ํด ๊ฒฝ๊ณ ํ๊ธฐ ์์ํ ์ ๋๋ก ํผ๋๋ฐฑ ๋ฃจํ๋ฅผ ๋ํญ ์ค์ฌ์, ๋ฒ๊ทธ๋ฅผ ์์ ํ๋ ๋น์ฉ์ ๊ฑฐ์ 0๊น์ง ์ค์ผ ์ ์๋ค. ๋ฐ๋ฉด์ ๋๋ฆฐ ํ ์คํธ๋ ํผ๋๋ฐฑ์ ๋๋ฆฌ๊ฒ ํ๊ณ ์ ์ฌ์ ์ผ๋ก ๋ฒ๊ทธ๋ฅผ ๋ค๋ฆ๊ฒ ๋์ ๋๊ฒ ํด์ ๋ฒ๊ทธ ์์ ๋น์ฉ์ด ์ฆ๊ฐํ๋ค. ์ค๋ ๊ฑธ๋ฆฌ๋ ํ ์คํธ๋ ์์ฃผ ์คํํ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ์๋ชป๋ ๋ฐฉํฅ์ผ๋ก ๊ฐ๋ฉด์ ์๊ฐ์ ๋ ๋ง์ด ๋ญ๋นํ๊ฒ ๋๋ค.
๋ง์ง๋ง์ผ๋ก ์ข์ ๋จ์ ํ ์คํธ์ ๋ค ๋ฒ์งธ ํน์ฑ์ธ ์ ์ง ๋ณด์์ฑ ์งํ๋ ์ ์ง๋น๋ฅผ ํ๊ฐํ๋ค. ์ด ์งํ๋ ๋ค์ ๋ ๊ฐ์ง ์ฃผ์ ์์๋ก ๊ตฌ์ฑ๋๋ค.
- ํ ์คํธ๊ฐ ์ผ๋ง๋ ์ดํดํ๊ธฐ ์ด๋ ค์ด๊ฐ: ์ด ๊ตฌ์ฑ ์์๋ ํ ์คํธ์ ํฌ๊ธฐ์ ๊ด๋ จ์ด ์๋ค. ํ ์คํธ๋ ์ฝ๋ ๋ผ์ธ์ด ์ ์์๋ก ๋ ์ฝ๊ธฐ ์ฝ๋ค. ์์ ํ ์คํธ๋ ํ์ํ ๋ ๋ณ๊ฒฝํ๋ ๊ฒ๋ ์ฝ๋ค. ๋ฌผ๋ก ๋จ์ง ๋ผ์ธ ์๋ฅผ ์ค์ด๋ ค๊ณ ํ ์คํธ ์ฝ๋๋ฅผ ์ธ์์ ์ผ๋ก ์์ถํ์ง ์๋๋ค๊ณ ๊ฐ์ ํ ๋๋ค. ํ ์คํธ ์ฝ๋์ ํ์ง์ ์ ํ ์ฝ๋๋งํผ ์ค์ํ๋ค. ํ ์คํธ๋ฅผ ์์ฑํ ๋ ์ ์ฐจ๋ฅผ ์๋ตํ์ง ๋ง๋ผ. ํ ์คํธ ์ฝ๋๋ฅผ ์ผ๊ธ ์๋ฏผ(first-class citizen)์ผ๋ก ์ทจ๊ธํ๋ผ.
- ํ ์คํธ๊ฐ ์ผ๋ง๋ ์คํํ๊ธฐ ์ด๋ ค์ด๊ฐ: ํ ์คํธ๊ฐ ํ๋ก์ธ์ค ์ธ๋ถ ์ข ์์ฑ์ผ๋ก ์๋ํ๋ฉด, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์๋ฒ๋ฅผ ์ฌ๋ถํ ํ๊ณ ๋คํธ์ํฌ ์ฐ๊ฒฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฑ ์์กด์ฑ์ ์์ ์ด์ํ๋ ๋ฐ ์๊ฐ์ ๋ค์ฌ์ผ ํ๋ค