๐ญ Chapter 9: ๋จ์ ํ ์คํธ
๐ TDD ๋ฒ์น ์ธ ๊ฐ์งโ
- ์ฒซ์งธ ๋ฒ์น: ์คํจํ๋ ๋จ์ ํ ์คํธ๋ฅผ ์์ฑํ ๋๊น์ง ์ค์ ์ฝ๋๋ฅผ ์์ฑํ์ง ์๋๋ค.
- ๋์งธ ๋ฒ์น: ์ปดํ์ผ์ ์คํจํ์ง ์์ผ๋ฉด์ ์คํ์ด ์คํจํ๋ ์ ๋๋ก๋ง ๋จ์ ํ ์คํธ๋ฅผ ์์ฑํ๋ค.
- ์ ์งธ ๋ฒ์น: ํ์ฌ ์คํจํ๋ ํ ์คํธ๋ฅผ ํต๊ณผํ ์ ๋๋ก๋ง ์ค์ ์ฝ๋๋ฅผ ์์ฑํ๋ค.
์ ์ธ ๊ฐ์ง ๊ท์น์ ๋ฐ๋ฅด๋ฉด ๊ฐ๋ฐ๊ณผ ํ ์คํธ๊ฐ ๋๋ต 30์ด ์ฃผ๊ธฐ๋ก ๋ฌถ์ธ๋ค. ํ ์คํธ ์ฝ๋์ ์ค์ ์ฝ๋๊ฐ ํจ๊ป๋์ฌ๋ฟ๋๋ฌ ํ ์คํธ ์ฝ๋๊ฐ ์ค์ ์ฝ๋๋ณด๋ค ๋ถ๊ณผ ๋ช ์ด ์ ์ ๋์จ๋ค.
์ด๋ ๊ฒ ์ผํ๋ฉด ๋งค์ผ ์์ญ ๊ฐ, ๋งค๋ฌ ์๋ฐฑ ๊ฐ, ๋งค๋ ์์ฒ ๊ฐ์ ๋ฌํ๋ ํ ์คํธ ์ผ์ด์ค๊ฐ ๋์จ๋ค. ์ด๋ ๊ฒ ์ผํ๋ฉด ์ค์ ์ฝ๋๋ฅผ ์ฌ์ค์ ์ ๋ถ ํ ์คํธํ๋ ํ ์คํธ ์ผ์ด์ค๊ฐ ๋์จ๋ค. ํ์ง๋ง ์ค์ ์ฝ๋์ ๋ง๋จน์ ์ ๋๋ก ๋ฐฉ๋ํ ํ ์คํธ ์ฝ๋๋ ์ฌ๊ฐํ ๊ด๋ฆฌ ๋ฌธ์ ๋ฅผ ์ ๋ฐํ๊ธฐ๋ ํ๋ค.
๐ ๊นจ๋ํ ํ ์คํธ ์ฝ๋ ์ ์งํ๊ธฐโ
ํ ์คํธ ์ฝ๋๊ฐ ์ง์ ๋ถํ ์๋ก ๋ณ๊ฒฝํ๊ธฐ ์ด๋ ค์์ง๋ค. ํ ์คํธ ์ฝ ๋๊ฐ ๋ณต์กํ ์๋ก ์ค์ ์ฝ๋๋ฅผ ์ง๋ ์๊ฐ๋ณด๋ค ํ ์คํธ ์ผ์ด์ค๋ฅผ ์ถ๊ฐํ๋ ์๊ฐ์ด ๋ ๊ฑธ๋ฆฌ๊ธฐ ์ญ์์ด๋ค. ์ค์ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํด ๊ธฐ์กด ํ ์คํธ ์ผ์ด์ค๊ฐ ์คํจํ๊ธฐ ์์ํ๋ฉด, ์ง์ ๋ถํ ์ฝ๋๋ก ์ธํด, ์คํจํ๋ ํ ์คํธ ์ผ์ด์ค๋ฅผ ์ ์ ๋ ํต๊ณผ์ํค๊ธฐ ์ด๋ ค์์ง๋ค. ๊ทธ๋์ ํ ์คํธ ์ฝ๋๋ ๊ณ์ํด์ ๋์ด๋๋ ๋ถ๋ด์ด ๋๋ฒ๋ฆฐ๋ค.
ํ ์คํธ ์ํธ๊ฐ ์์ผ๋ฉด ๊ฐ๋ฐ์๋ ์์ ์ด ์์ ํ ์ฝ๋๊ฐ ์ ๋๋ก ๋๋์ง ํ์ธํ ๋ฐฉ๋ฒ์ด ์๋ค. ํ ์คํธ ์ํธ๊ฐ ์์ผ๋ฉด ์์คํ ์ด์ชฝ์ ์์ ํด๋ ์ ์ชฝ์ด ์์ ํ๋ค๋ ์ฌ์ค์ ๊ฒ์ฆํ์ง ๋ชปํ๋ค. ๊ทธ๋์ ๊ฒฐํจ์จ์ด ๋์์ง์ง ์์ํ๋ค. ์๋ํ์ง ์์ ๊ฒฐํจ ์๊ฐ ๋ง์์ง๋ฉด ๊ฐ๋ฐ์๋ ๋ณ๊ฒฝ์ ์ฃผ์ ํ๋ค. ๋ณ๊ฒฝํ๋ฉด ๋๋ณด๋ค ํด๊ฐ ํฌ๋ค ์๊ฐํด ๋ ์ด์ ์ฝ๋๋ฅผ ์ ๋ฆฌํ์ง ์๋๋ค. ๊ทธ๋ฌ๋ฉด์ ์ฝ๋๊ฐ ๋ง๊ฐ์ง๊ธฐ ์์ํ๋ค. ๊ฒฐ๊ตญ ํ ์คํธ ์ํธ๋ ์๊ณ , ์ผ๊ธฐ์ค๊ธฐ ๋ค์์ธ ์ฝ๋์, ์ข์ ํ ๊ณ ๊ฐ๊ณผ, ํ ์คํธ์ ์์ ๋ถ์ ๋ ธ๋ ฅ์ด ํ์ฌ์๋ค๋ ์ค๋ง๊ฐ๋ง ๋จ๊ธด๋ค.
๋ด๊ฐ ์ด์ผ๊ธฐ๊ฐ ์ ํ๋ ๊ตํ์ ๋ค์๊ณผ ๊ฐ๋ค. ํ ์คํธ ์ฝ๋๋ ์ค์ ์ฝ๋ ๋ชป์ง ์๊ฒ ์ค์ํ๋ค. ํ ์คํธ ์ฝ๋๋ ์ด๋ฅ ์๋ฏผ์ด ์๋๋ค. ํ ์คํธ ์ฝ๋๋ ์ฌ๊ณ ์ ์ค๊ณ์ ์ฃผ์๊ฐ ํ์ํ๋ค. ์ค์ ์ฝ๋ ๋ชป์ง ์๊ฒ ๊นจ๋ํ๊ฒ ์ง์ผ ํ๋ค.
๐ ํ ์คํธ๋ ์ ์ฐ์ฑ, ์ ์ง๋ณด์์ฑ, ์ฌ์ฌ์ฉ์ฑ์ ์ ๊ณตํ๋คโ
ํ ์คํธ ์ฝ๋๋ฅผ ๊นจ๋ํ๊ฒ ์ ์งํ์ง ์์ผ๋ฉด ๊ฒฐ๊ตญ ์์ด๋ฒ๋ฆฐ๋ค. ๊ทธ๋ฆฌ๊ณ ํ ์คํธ ์ผ์ด์ค๊ฐ ์์ผ๋ฉด ์ค์ ์ฝ๋๋ฅผ ์ ์ฐํ๊ฒ ๋ง๋๋ ๋ฒํ๋ชฉ๋ ์ฌ๋ผ์ง๋ค. ๋ง๋ค, ์ ๋๋ก ์ฝ์๋ค. ์ฝ๋์ ์ ์ฐ์ฑ, ์ ์ง๋ณด์์ฑ, ์ฌ์ฌ์ฉ์ฑ์ ์ ๊ณตํ๋ ๋ฒํ๋ชฉ์ด ๋ฐ๋ก ๋จ์ ํ ์คํธ๋ค. ์ด์ ๋ ๋จ์ํ๋ค. ํ ์คํธ ์ผ์ด์ค๊ฐ ์์ผ๋ฉด ๋ณ๊ฒฝ์ด ๋๋ ต์ง ์์ผ๋๊น! ํ ์คํธ ์ผ์ด์ค๊ฐ ์๋ค๋ฉด ๋ชจ๋ ๋ณ๊ฒฝ์ด ์ ์ ์ ์ธ ๋ฒ๊ทธ๋ค. ์ํคํ ์ณ๊ฐ ์๋ฌด๋ฆฌ ์ ์ฐํ๋๋ผ๋, ์ค๊ณ๋ฅผ ์๋ฌด๋ฆฌ ์ ๋๋ด๋๋ผ๋, ํ ์คํธ ์ผ์ด์ค๊ฐ ์์ผ๋ฉด ๊ฐ๋ฐ์๋ ๋ณ๊ฒฝ์ ์ฃผ์ ํ๋ค. ๋ฒ๊ทธ๊ฐ ์จ์ด๋ค๊น ๋๋ ต๊ธฐ ๋๋ฌธ์ด๋ค.
ํ์ง๋ง ํ ์คํธ ์ผ์ด์ค๊ฐ ์๋ค๋ฉด ๊ณตํฌ๋ ์ฌ์ค์ ์ฌ๋ผ์ง๋ค. ํ ์คํธ ์ปค๋ฒ๋ฆฌ์ง๊ฐ ๋์์๋ก ๊ณตํฌ๋ ์ค์ด๋ ๋ค. ์ํคํ ์ฒ๊ฐ ๋ถ์คํ ์ฝ๋๋ ์ค๊ณ๊ฐ ๋ชจํธํ๊ณ ์๋ง์ธ ์ฝ๋๋ผ๋ ๋ณ๋ค๋ฅธ ์ฐ๋ ค ์์ด ๋ณ๊ฒฝํ ์ ์๋ค. ์๋, ์คํ๋ ค ์์ฌํ๊ณ ์ํคํ ์ฒ์ ์ค๊ณ๋ฅผ ๊ฐ์ ํ ์ ์๋ค.
๊ทธ๋ฌ๋ฏ๋ก ์ค์ ์ฝ๋๋ฅผ ์ ๊ฒํ๋ ์๋ํ๋ ๋จ์ ํ ์คํธ ์ํธ๋ ์ค๊ณ์ ์ํคํ ์ฒ๋ฅผ ์ต๋ํ ๊นจ๋ํ๊ฒ ๋ณด์กดํ๋ ์ด์ ๋ค. ํ ์คํธ๋ ์ ์ฐ์ฑ, ์ ์ง๋ณด์์ฑ, ์ฌ์ฌ์ฉ์ฑ์ ์ ๊ณตํ๋ค. ํ ์คํธ ์ผ์ด์ค๊ฐ ์์ผ๋ฉด ๋ณ๊ฒฝ์ด ์ฌ์์ง๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฐ๋ผ์ ํ ์คํธ ์ฝ๋๊ฐ ์ง์ ๋ถํ๋ฉด ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ๋ ๋ฅ๋ ฅ์ด ๋จ์ด์ง๋ฉด ์ฝ๋ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ ํ๋ ๋ฅ๋ ฅ๋ ๋จ์ด์ง๋ค. ํ ์คํธ ์ฝ๋๊ฐ ์ง์ ๋ถํ ์๋ก ์ค์ ์ฝ๋๋ ์ง์ ๋ถํด์ง๋ค. ๊ฒฐ๊ตญ ํ ์คํธ ์ฝ๋๋ฅผ ์์ด๋ฒ๋ฆฌ๊ณ ์ค์ ์ฝ๋๋ ๋ง๊ฐ์ง๋ค.
๐ ๊นจ๋ํ ํ ์คํธ ์ฝ๋โ
๊นจ๋ํ ํ ์คํธ ์ฝ๋๋ฅผ ๋ง๋ค๋ ค๋จผ? ์ธ ๊ฐ์ง๊ฐ ํ์ํ๋ค. ๊ฐ๋ ์ฑ, ๊ฐ๋ ์ฑ, ๊ฐ๋ ์ฑ. ์ด์ฉ๋ฉด ๊ฐ ๋ ์ฑ์ ์ค์ ์ฝ๋๋ณด๋ค ํ ์คํธ ์ฝ๋์ ๋๋์ฑ ์ค์ํ๋ค. ํ ์คํธ ์ฝ๋์์ ๊ฐ๋ ์ฑ์ ๋์ด๋ ค๋ฉด? ์ฌ๋ ์ฝ๋์ ๋ง์ฐฌ๊ฐ์ง๋ค. ๋ช ๋ฃ์ฑ, ๋จ์์ฑ, ํ๋ถํ ํํ๋ ฅ์ด ํ์ํ๋ค. ํ ์คํธ ์ฝ๋๋ ์ต์์ ํํ์ผ๋ก ๋ง์ ๊ฒ์ ๋ํ๋ด์ผ ํ๋ค.
public void testGetPageHierarchyAsXml() throws Exception {
makePages("PageOne", "PageOne.ChildOne", "PageTwo");
submitRequest("root", "type:pages");
assertResponseIsXML();
assertResponseContains(
"<name>PageOne</name>", "<name>PageTwo</name>", "<name>ChildOne</name>"
);
}
public void testSymbolicLinksAreNotInXmlPageHierarchy() throws Exception {
WikiPage page = makePage("PageOne");
makePages("PageOne.ChildOne", "PageTwo");
addLinkTo(page, "PageTwo", "SymPage");
submitRequest("root", "type:pages");
assertResponseIsXML();
assertResponseContains(
"<name>PageOne</name>", "<name>PageTwo</name>", "<name>ChildOne</name>"
);
assertResponseDoesNotContain("SymPage");
}
public void testGetDataAsXml() throws Exception {
makePageWithContent("TestPageOne", "test page");
submitRequest("TestPageOne", "type:data");
assertResponseIsXML();
assertResponseContains("test page", "<Test");
}
๊ฐ ํ ์คํธ๋ ๋ช ํํ ์ธ ๋ถ๋ถ์ผ๋ก ๋๋ ์ง๋ค. ์ฒซ ๋ถ๋ถ์ ํ ์คํธ ์๋ฃ๋ฅผ ๋ง๋ ๋ค. ๋ ๋ฒ์งธ ๋ถ๋ถ์ ํ ์คํธ ์๋ฃ๋ฅผ ์กฐ์ํ๋ฉฐ, ์ธ ๋ฒ์งธ ๋ถ๋ถ์ ์กฐ์ํ ๊ฒฐ๊ณผ๊ฐ ์ฌ๋ฐ๋ฅธ์ง ํ์ธํ๋ค.
์ก๋คํ๊ณ ์ธ์ธํ ์ฝ๋๋ฅผ ๊ฑฐ์ ๋ค ์์ด๋ค๋ ์ฌ์ค์ ์ฃผ๋ชฉํ๋ค. ํ ์คํธ ์ฝ๋๋ ๋ณธ๋ก ์ ๋์ ํด ์ง์ง ํ์ํ ์๋ฃ ์ ํ๊ณผ ํจ์๋ง ์ฌ์ฉํ๋ค. ๊ทธ๋ฌ๋ฏ๋ก ์ฝ๋๋ฅผ ์ฝ๋ ์ฌ๋์ ์จ๊ฐ ์ก๋คํ๊ณ ์ธ์ธํ ์ฝ๋์ ์ฃผ๋ ๋ค๊ณ ํท๊ฐ๋ฆด ํ์ ์์ด ์ฝ๋๊ฐ ์ํํ๋ ๊ธฐ๋ฅ์ ์ฌ๋นจ๋ฆฌ ์ดํดํ๋ค.
๐ ํ ์คํธ ๋น assert ํ๋โ
JUnit์ผ๋ก ํ
์คํธ ์ฝ๋๋ฅผ ์งค ๋๋ ํจ์๋ง๋ค assert
๋ฌธ์ ๋จ ํ๋๋ง ์ฌ์ฉํด์ผ ํ๋ค๊ณ ์ฃผ์ฅํ๋ ํํ๊ฐ ์๋ค. ๊ฐํนํ ๊ท์น์ด๋ผ ์ฌ๊ธธ์ง๋ ๋ชจ๋ฅด์ง๋ง, ํ์คํ ์ฅ์ ์ด ์๋ค. assert
๋ฌธ์ด ๋จ ํ๋์ธ ํจ์๋ ๊ฒฐ๋ก ์ด ํ๋๋ผ์ ์ฝ๋๋ฅผ ์ดํดํ๊ธฐ ์ฝ๊ณ ๋น ๋ฅด๋ค.
public void testGetPageHierarchyAsXml() throws Exception {
givenPage("PageOne", "PageOne.ChildOne", "PageTwo");
whenRequestIsIssued("root", "type:pages");
thenResponseShouldBeXML();
}
public void testGetPageHierarchyHasRightTags() throws Exception {
givenPage("PageOne", "PageOne.ChildOne", "PageTwo");
whenRequestIsIssued("root", "type:pages");
thenResponseShouldContain(
"<name>PageOne</name>", "<name>PageTwo</name>", "<name>ChildOne</name>"
);
}
์์์ ํจ์ ์ด๋ฆ์ ๋ฐ๊ฟ given-when-then
์ด๋ผ๋ ๊ด๋ก๋ฅผ ์ฌ์ฉํ๋ค๋ ์ฌ์ค์ ์ฃผ๋ชฉํ๋ค. ๊ทธ๋ฌ๋ฉด ํ
์คํธ ์ฝ๋๋ฅผ ์ฝ๊ธฐ๊ฐ ์ฌ์์ง๋ค. ๋ถํํ๊ฒ๋, ์์์ ๋ณด๋ฏ์ด, ํ
์คํธ๋ฅผ ๋ถ๋ฆฌํ๋ฉด ์ค๋ณต๋๋ ์ฝ๋๊ฐ ๋ง์์ง๋ค.
TEMPLATE METHOD ํจํด์ ์ฌ์ฉํ๋ฉด ์ค๋ณต์ ์ ๊ฑฐํ ์ ์๋ค. given/when
๋ถ๋ถ์ ๋ถ๋ชจ ํด๋์ค์ ๋๊ณ then
๋ถ๋ถ์ ์์ ํด๋์ค์ ๋๋ฉด ๋๋ค. ์๋๋ฉด ์์ ํ ๋
์์ ์ธ ํ
์คํธ ํด๋์ค๋ฅผ ๋ง๋ค์ด @Before
ํจ์์ given/when
๋ถ๋ถ์ ๋ฃ๊ณ @Test
ํจ์์ then
๋ถ๋ถ์ ๋ฃ์ด๋ ๋๋ค. ํ์ง๋ง ๋ชจ๋๊ฐ ๋ฐฐ๋ณด๋ค ๋ฐฐ๊ผฝ์ด ๋ ํฌ๋ค. ์ด๊ฒ์ ๊ฒ ๊ฐ์ํด ๊ฒฐ๊ตญ assert
๋ฌธ์ ์ฌ๋ฟ ์ฌ์ฉํ๋ ํธ์ด ์ข๋ค๊ณ ์๊ฐํ๋ค.
๋๋ ๋จ์ผ assert
๋ฌธ์ด๋ผ๋ ๊ท์น์ด ํ๋ฅญํ ์ง์นจ์ด๋ผ ์๊ฐํ๋ค. ๋์ฒด๋ก ๋๋ ๋จ์ผ assert
๋ฅผ ์ง์ํ๋ ํด๋น ๋ถ์ผ ํ
์คํธ ์ธ์ด๋ฅผ ๋ง๋ค๋ ค ๋
ธ๋ ฅํ๋ค. ํ์ง๋ง ๋๋ก๋ ์ฃผ์ ์์ด ํจ์ ํ๋์ ์ฌ๋ฌ assert
๋ฌธ์ ๋ฃ๊ธฐ๋ ํ๋ค. ๋จ์ง assert
๋ฌธ ๊ฐ์๋ ์ต๋ํ ์ค์ฌ์ผ ์ข๋ค๋ ์๊ฐ์ด๋ค.
๐ ํ ์คํธ ๋น ๊ฐ๋ ํ๋โ
์ด๊ฒ์ ๊ฒ ์ก๋คํ ๊ฐ๋
์ ์ฐ์์ผ๋ก ํ
์คํธํ๋ ๊ธด ํจ์๋ ํผํ๋ค. ๊ฐ ์ ์ assert
๋ฌธ์ด ์ฌ๋ฟ์ด๋ผ๋ ์ฌ์ค์ด ๋ฌธ์ ๊ฐ ์๋๋ค. ํ ํ
์คํธ ํจ์์์ ์ฌ๋ฌ ๊ฐ๋
์ ํ
์คํธํ๋ค๋ ์ฌ์ค์ด ๋ฌธ์ ๋ค. ๊ทธ๋ฌ๋ฏ๋ก ๊ฐ์ฅ ์ข์ ๊ท์น์ ๊ฐ๋
๋น assert
๋ฌธ ์๋ฅผ ์ต์๋ก ์ค์ฌ๋ผ์ ํ
์คํธ ํจ์ ํ๋๋ ๊ฐ๋
ํ๋๋ง ํ
์คํธํ๋ผ๋ผ ํ๊ฒ ๋ค.
๐ F.I.R.S.Tโ
๊นจ๋ํ ํ ์คํธ๋ ๋ค์ ๋ค์ฏ ๊ฐ์ง ๊ท์น์ ๋ฐ๋ฅด๋๋ฐ, ๊ฐ ๊ท์น์์ ์ฒซ ๊ธ์๋ฅผ ๋ฐ์ค๋ฉด FIRST๊ฐ ๋๋ค.
๋น ๋ฅด๊ฒ: ํ ์คํธ๋ ๋นจ๋ผ ์ผ ํ๋ค. ํ ์คํธ๋ ๋นจ๋ฆฌ ๋์์ผ ํ๋ค๋ ๋ง์ด๋ค. ํ ์คํธ๊ฐ ๋๋ฆฌ๋ฉด ์์ฃผ ๋๋ฆด ์๋๋ฅผ ๋ชป ๋ธ๋ค. ์์ฃผ ๋๋ฆฌ์ง ์์ผ๋ฉด ์ด๋ฐ์ ๋ฌธ์ ๋ฅผ ์ฐพ์๋ด ๊ณ ์น์ง ๋ชปํ๋ค. ์ฝ๋๋ฅผ ๋ง์๊ป ์ ๋ฆฌํ์ง๋ ๋ชปํ๋ค. ๊ฒฐ๊ตญ ์ฝ๋ ํ์ง์ด ๋ง๊ฐ์ง๊ธฐ ์์ํ๋ค.
๋ ๋ฆฝ์ ์ผ๋ก: ๊ฐ ํ ์คํธ๋ ์๋ก ์์กดํ๋ฉด ์ ๋๋ค. ํ ํ ์คํธ๊ฐ ๋ค์ ํ ์คํธ๊ฐ ์คํ๋ ํ๊ฒฝ์ ์ค๋นํด์๋ ์ ๋๋ค. ๊ฐ ํ ์คํธ๋ ๋ ๋ฆฝ์ ์ผ๋ก ๊ทธ๋ฆฌ๊ณ ์ด๋ค ์์๋ก ์คํํด๋ ๊ด์ฐฎ์์ผ ํ๋ค. ํ ์คํธ๊ฐ ์๋ก์๊ฒ ์์กดํ๋ฉด ํ๋๊ฐ ์คํจํ ๋ ๋๋จธ์ง๋ ์๋ฌ์ ์คํจํ๋ฏ๋ก ์์ธ์ ์ง๋จํ๊ธฐ ์ด๋ ค์์ง๋ฉฐ ํ๋ฐ ํ ์คํธ๊ฐ ์ฐพ์๋ด์ผ ํ ๊ฒฐํจ์ด ์จ๊ฒจ์ง๋ค.
๋ฐ๋ณต๊ฐ๋ฅํ๊ฒ: ํ ์คํธ๋ ์ด๋ค ํ๊ฒฝ์์๋ ๋ฐ๋ณต ๊ฐ๋ฅํด์ผ ํ๋ค. ์ค์ ํ๊ฒฝ, QA ํ๊ฒฝ, ๋ฒ์ค๋ฅผ ํ๊ณ ์ง์ผ๋ก ๊ฐ๋ ๊ธธ์ ์ฌ์ฉํ๋ ๋ ธํธ๋ถ ํ๊ฒฝ์์๋ ์คํํ ์ ์์ด์ผ ํ๋ค. ํ ์คํธ๊ฐ ๋์๊ฐ์ง ์๋ ํ๊ฒฝ์ด ํ๋๋ผ๋ ์๋ค๋ฉด ํ ์คํธ๊ฐ ์คํจํ ์ด์ ๋ฅผ ๋๋ฌ๋ ๋ณ๋ช ์ด ์๊ธด๋ค. ๊ณ๋ค๊ฐ ํ๊ฒฝ์ด ์ง์๋์ง ์๊ธฐ์ ํ ์คํธ๋ฅผ ์ํํ์ง ๋ชปํ๋ ์ํฉ์ ์ง๋ฉดํ๋ค.
์๊ฐ๊ฒ์งํ๋: ํ ์คํธ๋ ๋ถ์ธ(bool) ๊ฐ์ผ๋ก ๊ฒฐ๊ณผ๋ฅผ ๋ด์ผ ํ๋ค. ์ฑ๊ณต ์๋๋ฉด ์คํจ๋ค. ํต๊ณผ ์ฌ๋ถ๋ฅผ ์๋ ค๊ณ ๋ก๊ทธ ํ์ผ์ ์ฝ๊ฒ ๋ง๋ค์ด์๋ ์ ๋๋ค. ํต๊ณผ ์ฌ๋ถ๋ฅผ ๋ณด๋ ค๊ณ ํ ์คํธ ํ์ผ ๋ ๊ฐ๋ฅผ ์์์ ์ผ๋ก ๋น๊ตํ๊ฒ ๋ง๋ค์ด์๋ ์ ๋๋ค. ํ ์คํธ๊ฐ ์ค์ค๋ก ์ฑ๊ณต๊ณผ ์คํจ๋ฅผ ๊ฐ๋ ํ์ง ์๋๋ค๋ฉด ํ๋จ์ ์ฃผ๊ด์ ์ด ๋๋ฉฐ ์ง๋ฃจํ ์์์ ํ๊ฐ๊ฐ ํ์ํ๊ฒ ๋๋ค.
์ ์์: ํ ์คํธ๋ ์ ์์ ์์ฑํด์ผ ํ๋ค. ๋จ์ ํ ์คํธ๋ ํ ์คํธํ๋ ค๋ ์ค์ ์ฝ๋๋ฅผ ๊ตฌํํ๊ธฐ ์ง์ ์ ๊ตฌํํ๋ค. ์ค์ ์ฝ๋๋ฅผ ๊ตฌํํ ๋ค์์ ํ ์คํธ ์ฝ๋๋ฅผ ๋ง๋ค๋ฉด ์ค์ ์ฝ๋๊ฐ ํ ์คํธํ๊ธฐ ์ด๋ ต๋ค๋ ์ฌ์ค์ ๋ฐ๊ฒฌํ ์ง๋ ๋ชจ๋ฅธ๋ค. ์ด ๋ค ์ค์ ์ฝ๋๋ ํ ์คํธํ๊ธฐ ๋๋ฌด ์ด๋ ต๋ค๊ณ ํ๋ช ๋ ์ง ๋ชจ๋ฅธ๋ค. ํ ์คํธ๊ฐ ๋ถ๊ฐ๋ฅํ๋๋ก ์ค์ ์ฝ๋๋ฅผ ์ค๊ณํ ์ง๋ ๋ชจ๋ฅธ๋ค.
๐ ๊ฒฐ๋ก โ
ํ ์คํธ ์ฝ๋๋ ์ค์ ์ฝ๋๋งํผ์ด๋ ํ๋ก์ ํธ ๊ฑด๊ฐ์ ์ค์ํ๋ค. ์ด์ฉ๋ฉด ์ค์ ์ฝ๋๋ณด๋ค ๋ ์ค์ํ ์ง๋ ๋ชจ๋ฅด๊ฒ ๋ค. ํ ์คํธ ์ฝ๋๋ ์ค์ ์ฝ๋์ ์ ์ฐ์ฑ, ์ ์ง๋ณด์์ฑ, ์ฌ์ฌ์ฉ์ฑ์ ๋ณด์กดํ๊ณ ๊ฐํํ๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋ฌ๋ฏ๋ก ํ ์คํธ ์ฝ๋๋ ์ง์์ ์ผ๋ก ๊บ ๋ํ๊ฒ ๊ด๋ฆฌํ์. ํํ๋ ฅ์ ๋์ด๊ณ ๊ฐ๊ฒฐํ๊ฒ ์ ๋ฆฌํ์. ํ ์คํธ API๋ฅผ ๊ตฌํํด ๋๋ฉ์ธ ํนํ ์ธ์ด(DSL)๋ฅผ ๋ง๋ค์. ๊ทธ๋ฌ๋ฉด ๊ทธ๋งํผ ํ ์คํธ ์ฝ๋๋ฅผ ์ง๊ธฐ๊ฐ ์ฌ์์ง๋ค.
ํ ์คํธ ์ฝ๋๊ฐ ๋ฐฉ์น๋์ด ๋ง๊ฐ์ง๋ฉด ์ค์ ์ฝ๋๋ ๋ง๊ฐ์ง๋ค. ํ ์คํธ ์ฝ๋๋ฅผ ๊นจ๋ํ๊ฒ ์ ์งํ์.