๋จ์ํ ์คํธ : ์์ฐ์ฑ๊ณผ ํ์ง์ ์ํ ๋จ์ํ ์คํธ ์์น๊ณผ ํจํด (๋ธ๋ผ๋๋ฏธ๋ฅด ์ฝ๋ฆฌ์ฝํ ์ )
'2์ฅ_ ๋จ์ ํ ์คํธ๋ ๋ฌด์์ธ๊ฐ' ๋ถ๋ถ์ ์ฝ๊ณ ์ ๋ฆฌํ ๋ด์ฉ์ ๋๋ค.
๋ชจ๋ ์์ค์ฝ๋๋ ์ด๊ณณ์์ ํ์ธํ ์ ์์ต๋๋ค.
๋จ์ ํ ์คํธ์ ์ ์
๋จ์ํ ์คํธ๋
- ์์ ์ฝ๋ ์กฐ๊ฐ์ ๊ฒ์ฆํ๊ณ
- ๋น ๋ฅด๊ฒ ์ํํ๊ณ
- ๊ฒฉ๋ฆฌ๋ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํ๋ ์๋ํ๋ ํ ์คํธ์ด๋ค.
๊ทธ๋ ๋ค๋ฉด, ์ด์ค ์ธ ๋ฒ์งธ "๊ฒฉ๋ฆฌ๋ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํ๋" ๋ถ๋ถ์์์ ๊ฒฉ๋ฆฌ๋ ์ ํํ ๋ฌด์์ผ๊น?
๊ณ ์ ํ์ ๋ฐ๋ํ์ ์ฃผ์ฅ์ ๋ํด ์ ๋ฆฌํด๋ณด์.
๊ฒฉ๋ฆฌ ๋ฌธ์ ์ ๋ํ ๋ฐ๋ํ์ ์ ๊ทผ
๋ฐ๋ํ์์ ์ฃผ์ฅํ "๊ฒฉ๋ฆฌ"๋ ํ ์คํธ ๋์ ์์คํ ์ ํ๋ ฅ์์๊ฒ์ ๊ฒฉ๋ฆฌํ๋ ๊ฒ์ ์ผ์ปซ๋๋ค.
์ฆ, ํ๋์ ํด๋์ค๊ฐ ๋ค๋ฅธ ํด๋์ค ๋๋ ์ฌ๋ฌ ํด๋์ค์ ์์กดํ๋ฉด ์ด ๋ชจ๋ ์์กด์ฑ์ ํ ์คํธ ๋์ญ์ผ๋ก ๋์ฒดํด์ผ ํ๋ค๋ ๊ฒ์ด๋ค.

์ด ๋ฐฉ์์ ์ด์
- ํ ์คํธ๊ฐ ์คํจํ๋ฉด ์ฝ๋๋ฒ ์ด์ค์ ์ด๋ ๋ถ๋ถ์ด ๊ณ ์ฅ ๋ฌ๋์ง ํ์คํ ์ ์ ์์ผ๋ฉฐ,
- ๊ฐ์ฒด ๊ทธ๋ํ(๊ฐ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ํด๋์ค์ ํต์ ๋ง)๋ฅผ ๋ถํ ํ ์ ์๋ค.
ํ ์คํธ๋ฅผ ํ๋ ค๋ฉด ์ค์ ์ ํ์ ํด๋นํ๋ ์์กด์ฑ ์ธ์ ํ ์คํธ ๋ชฉ์ ์ ์์กด์ฑ๋ค๋ก ๊ตฌ์ฑํด์ ๋์ฒดํด์ผ ํ๋ค.
์ง์ ์ฐธ์กฐํ๋ ์์กด์ฑ์ ํ ์คํธ ๋ชฉ์ ์ ์์กด์ฑ์ผ๋ก ๋์ฒดํ๊ณ , ํด๋น ์์กด์ฑ๋ค์ด ๋ค์ ํ ์คํธ ๋ชฉ์ ์ ์์กด์ฑ์ ์ฐธ์กฐํ๋ ์์ผ๋ก
์์กด์ฑ โ ์์กด์ฑ ์ผ๋ก ๊ณ์ ๋์ด๊ฐ ๊ฒฐ๊ตญ ํ ์คํธ ๋ชฉ์ ์ ์์กด์ฑ์ ์ฐธ์กฐํ๋ ์์ผ๋ก ๋ชจ๋ ๋์ฒดํ๊ฒ ๋๋ฉด ๊ฒฐ๊ตญ ์ด ์์ ์ "๊ทธ๋ํ๋ฅผ ๋ค์ ๋ง๋ ๋ค"๋ผ๊ณ ํ ์ ์๋ ๊ฒ!
ํ ์คํธ ๋์ญ์ ์ฌ์ฉํ๋ฉด ๊ฐ์ฒด ๊ทธ๋ํ๋ฅผ ๋ค์ ๋ง๋ค์ง ์์๋ ๋๊ณ , ํด๋์ค์ ์ง์ ์ ์ธ ์์กด์ฑ์ ๋์ฒดํ๋ฉฐ ๋ ๋์๊ฐ ์์กด์ฑ์ ์์กด์ฑ์ ๋ค๋ฃฐ ํ์๊ฐ ์๋ค.
๊ณ ์ ์ ์คํ์ผ๋ก ์์ฑ๋ ํ ์คํธ
public class CustomerTests
{
[Fact]
public void Purchase_succeeds_when_enough_inventory()
{
// ์ค๋น
var store = new Store();
store.AddInventory(Product.Shampoo, 10);
var customer = new Customer();
// ์คํ
bool success = customer.Purchase(store, Product.Shampoo, 5);
// ๊ฒ์ฆ
Assert.True(success);
Assert.Equal(5, store.GetInventory(Product.Shampoo)); // ์ํ ์ฌ๊ณ 5๊ฐ ๊ฐ์
}
[Fact]
public void Purchase_fails_when_not_enough_inventory()
{
// ์ค๋น
var store = new Store();
store.AddInventory(Product.Shampoo, 10);
var customer = new Customer();
// ์คํ
bool success = customer.Purchase(store, Product.Shampoo, 15);
// ๊ฒ์ฆ
Assert.False(success);
Assert.Equal(10, store.GetInventory(Product.Shampoo)); // ์ํ ์ฌ๊ณ ์๋ ๋ณํ ์์
}
}
- ์ค๋น: ์์กด์ฑ๊ณผ ํ ์คํธ ๋์ ์์คํ ์ ๋ชจ๋ ์ค๋น
- ์คํ: ๊ฒ์ฆํ๊ณ ์ ํ๋ ๋์ ์ํ
- ๊ฒ์ฆ: ๊ฒ์ฆ ๋จ๊ณ, ๋์์ด ์์ ๊ฒฐ๊ณผ๋ก ์ด์ด์ง๋์ง ํ์ธ
์ค๋น๋จ๊ณ์์๋ ํ ์คํธ ๋์ ์์คํ (SUT: System Under Test)๊ณผ ํ๋ ฅ์๋ฅผ ์ค๋นํ๋ค.
var store = new Store();
store.AddInventory(Product.Shampoo, 10);
var customer = new Customer();
์ ๊ฒฝ์ฐ, Customer-๊ณ ๊ฐ์ด SUT, Store-์์ ์ด ํ๋ ฅ์์ ํด๋นํ๋ค.
ํ ์คํธ ๋์ ๋ฉ์๋ (MUT: Method Under Test)๋ ํ ์คํธ์์ ํธ์ถํ SUT์ ๋ฉ์๋์ด๋ค.
SUT์ MUT๋ ๋์์ด๋ก ์ฐ์ด๊ธฐ๋ ํ์ง๋ง, ๋ณดํต SUT๋ ํด๋์ค ์ ์ฒด, MUT๋ ๋ฉ์๋๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
์ฌ๊ธฐ์ ํ ์คํธ ๋์ ๋ฉ์๋์ธ customer.Purchase()๋ Store ์ธ์คํด์ค๋ฅผ ํ์๋ก ํ์๋ก ํ๊ณ ,
๊ฒ์ฆ ๋จ๊ณ์์ Purchase()์ ๊ฒฐ๊ณผ ์ค ํ๋๋ก ์์ ์ ํ ์๋์ด ๊ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ์๊ธฐ์ Store ํ๋ ฅ์๊ฐ ํ์ํ ๊ฒ์ด๋ค.
- ์ฌ๊ธฐ์ Product.Shampoo, ์ซ์ 5, 15๋ ์์๋ก ์ทจ๊ธํ๋ค.
์ฌ๊ธฐ์๋ ๋จ์ ํ ์คํธ์ ๊ณ ์ ์คํ์ผ์ ์๋ก, ํ ์คํธ๋ ํ๋ ฅ์(Store)๋ฅผ ๋์ฒดํ๋ ํด๋์ค๋ฅผ ๋ฐ๋ก ๋ง๋ค์ด์ ์ฌ์ฉํ์ง ์๊ณ , ์ด์ ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค.
Customer๊ณผ Store ๋ชจ๋ ํจ๊ณผ์ ์ผ๋ก ๊ฒ์ฆํ ์ ์์ผ๋, ๋ ํด๋์ค๊ฐ ์๋ก ๊ฒฉ๋ฆฌ๋ ํ ์คํธ๋ ์๋๊ธฐ์ Customer๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์๋ ํ๋๋ผ๋ Customer์ ์ํฅ์ ๋ฏธ์น๋ Store ๋ด๋ถ์ ๋ฒ๊ทธ๊ฐ ์์ผ๋ฉด ๋จ์ ํ ์คํธ์ ์คํจํ ์๋ ์๋ ๊ฒ์ด๋ค.
๋ฐ๋ ์คํ์ผ๋ก ์์ฑ๋ ํ ์คํธ
์์ ๋์ผํ ์์ ๋ฅผ ๋ฐ๋ ์คํ์ผ๋ก ์์ฑํด๋ณด๋ฉด ์ด๋จ๊น?
๋์ผํ ํ ์คํธ์์ Store ์ธ์คํด์ค๋ ํ ์คํธ ๋์ญ, "๋ชฉ"์ผ๋ก ๊ต์ฒดํด๋ณด์.
Mock์ ํ ์คํธ ๋์ ์์คํ ๊ณผ ํ๋ ฅ์ ๊ฐ์ ์ํธ ์์ฉ์ ๊ฒ์ฌํ ์ ์๋ ํน๋ณํ ํ ์คํธ ๋์ญ์ด๋ค.
- ํ ์คํธ ๋์ญ๊ณผ ๋ชฉ์ ๋์์ด๊ฐ ์๋๋ค.
- ํ ์คํธ ๋์ญ์ ๋ชจ๋ ์ข ๋ฅ์ ๊ฐ์ง ์์กด์ฑ์ ์ค๋ช ํ๋ ํฌ๊ด์ ์ธ ์ฉ์ด์ด๊ณ , ๋ชฉ์ ๊ทธ๋ฌํ ์์กด์ฑ์ ํ ์ข ๋ฅ์ธ ๊ฒ.
public class CustomerTests
{
[Fact]
public void Purchase_succeeds_when_enough_inventory()
{
// ์ค๋น
var storeMock = new Mock<IStore>();
storeMock
.Setup(x => x.HasEnoughInventory(Product.Shampoo, 5))
.Returns(true);
var customer = new Customer();
// ์คํ
bool success = customer.Purchase(storeMock.Object, Product.Shampoo, 5);
// ๊ฒ์ฆ
Assert.True(success);
storeMock.Verify(x => x.RemoveInventory(Product.Shampoo, 5), Times.Once);
}
[Fact]
public void Purchase_fails_when_not_enough_inventory()
{
// ์ค๋น
var storeMock = new Mock<IStore>();
storeMock
.Setup(x => x.HasEnoughInventory(Product.Shampoo, 5))
.Returns(false);
var customer = new Customer();
// ์คํ
bool success = customer.Purchase(storeMock.Object, Product.Shampoo, 5);
// ๊ฒ์ฆ
Assert.False(success);
storeMock.Verify(x => x.RemoveInventory(Product.Shampoo, 5), Times.Never);
}
}
์ค๋น ๋จ๊ณ์์ ๋ฐ๋ ์คํ์ผ์ ํ ์คํธ๋
var storeMock = new Mock<IStore>();
storeMock
.Setup(x => x.HasEnoughInventory(Product.Shampoo, 5))
.Returns(true);
var customer = new Customer();
- ์ค์ Store ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํ์ง ์๊ณ , Mock์ ์ฌ์ฉํด ๋์ฒดํ์๋ค.
- ์ดํธ์ ์ฌ๊ณ ๋ฅผ ์ถ๊ฐํ์ฌ Store์ ์ํ๋ฅผ ๋ณํ์ํค๋ ๋์ ,
HasEnoughInventory() ๋ฉ์๋ ํธ์ถ์ ์ด๋ป๊ฒ ์๋ตํ๋์ง ๋ชฉ์ ์ง์ ์ ์ํ์๋ค.
โ Store์ ์ํ์ ์๊ด ์์ด ํ ์คํธ๊ฐ ์๊ตฌํ๋ ๋ฐฉ์์ผ๋ก ์์ฒญ์ ์๋ตํ๊ฒ ํ๋ ๊ฒ!
< 2๋ฒ ์ถ๊ฐ ์ค๋ช >
์ด๋ Purchase() ๋ฉ์๋์์ HasEnoughInventory() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ธ๋ฐ,
๋ฏธ๋ฆฌ HasEnoughInventory์ (Product.Shampoo, 5) ๋ผ๋ ๋งค๊ฐ๋ณ์๋ฅผ ๋ฃ์ผ๋ฉด ํด๋น ๋ฉ์๋์ ๋ก์ง์ด๋, ์ค๋ฅ ์ฌ๋ถ์ ์๊ด ์์ด ๋ฌด์กฐ๊ฑด true๋ฅผ ๋ฐํํ๋๋ก ์ค์ ํด์ค ๊ฒ์ด๋ค.
public bool Purchase(IStore store, Product product, int quantity) { if (!store.HasEnoughInventory(product, quantity)) { return false; } store.RemoveInventory(product, quantity); return true; }โ
๊ฒ์ฆ ๋จ๊ณ์์ ํด๋์๊ณผ ๋ฐ๋ ์คํ์ผ์ ๋ ๋ช ํํ ์ฐจ์ด์ ์ ํ์ธํ ์ ์๋ค.
Assert.True(success);
storeMock.Verify(x => x.RemoveInventory(Product.Shampoo, 5), Times.Once);
ํด๋์์์๋ ์์ ์ํ๋ฅผ ๊ฒ์ฆํ๋ค๋ฉด, ์ง๊ธ์ Customer๊ณผ Store๊ฐ์ ์ํธ ์์ฉ์ ๊ฒ์ฌํ๋ค.
์ฆ, ๊ณ ๊ฐ์ด ์์ ์์ ํธ์ถ์ ์ฌ๋ฐ๋ฅด๊ฒ ํ๋์ง, ํธ์ถ ํ์๋ ์ ํํ๋์ง๋ ํ์ธํ ์ ์๋ค.
- ๊ณ ๊ฐ์ด ์์ ์ RemoveInventory() ๋ฉ์๋๋ฅผ
- ํ ๋ฒ ํธ์ถํ๋์ง ๊ฒ์ฆํ ์ ์๋ ๊ฒ.
๊ตฌ๋งค์ ์ฑ๊ณตํ์ ๋์ ์คํจํ์ ๋๋ฅผ ๋น๊ตํ์ฌ ์ดํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํธ์ถ ํ์๊ฐ ์ ํํ๋์ง ํ์ธํ๋ ์ฝ๋๋ฅผ ๋ณผ ์ ์๋ค.
- ์ฑ๊ณตํ์ ๋๋ RemoveInventory() ๋ฉ์๋๋ฅผ ํ ๋ฒ (Times.Once) ํธ์ถํด์ผ ํ๋ค.
- ์คํจํ์ ๋๋ RemoveInventory() ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ์๋๋ค. (Times.never)
// inventory๊ฐ ์ถฉ๋ถํ์ฌ ๊ตฌ๋งค์ ์ฑ๊ณตํ์ ๋์ ๊ฒ์ฆ ๊ณผ์
Assert.True(success);
storeMock.Verify(x => x.RemoveInventory(Product.Shampoo, 5), Times.Once);
// inventory๊ฐ ๋ถ์กฑํ์ฌ ๊ตฌ๋งค์ ์คํจํ์ ๋์ ๊ฒ์ฆ ๊ณผ์
Assert.False(success);
storeMock.Verify(x => x.RemoveInventory(Product.Shampoo, 5), Times.Never);
๊ฒฉ๋ฆฌ ๋ฌธ์ ์ ๋ํ ๊ณ ์ ํ์ ์ ๊ทผ
๋จ์ํ ์คํธ๋
- ์์ ์ฝ๋ ์กฐ๊ฐ์ ๊ฒ์ฆํ๊ณ
- ๋น ๋ฅด๊ฒ ์ํํ๊ณ
- ๊ฒฉ๋ฆฌ๋ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํ๋ ์๋ํ๋ ํ ์คํธ์ด๋ค.
๋ผ๊ณ ์ ์ํ๋ค.
๋ง์ฝ, ๋ฐ๋ ์คํ์ผ์ฒ๋ผ ํ ์คํธ ๋์ญ์ผ๋ก ๋์ ์ฝ๋ ์กฐ๊ฐ์ ๋ถ๋ฆฌํด์ ๊ฒฉ๋ฆฌํด์ผ ํ๋ค๋ฉด, ์ด๋ 1๋ฒ์ ๋ฌด์์ด "์์ ์ฝ๋ ์กฐ๊ฐ"์ธ๊ฐ์ ๋ํ ๊ฒฌํด์๋ ์ํฅ์ ๋ฏธ์น ์ ์๋ค.
์ฌ๊ธฐ์ ์์ ์ฝ๋ ์กฐ๊ฐ์ ์ผ๋ง๋ ์์์ผ ํ ๊น?
๋ฐ๋ํ์์๋ ๋น์ฐํ ๋ชจ๋ ํด๋์ค๋ฅผ ๊ฒฉ๋ฆฌํด์ผ ํ๊ธฐ์, ์กฐ๊ฐ์ ๋น์ฐํ ๋จ์ผ ํด๋์ค์ด๊ฑฐ๋ ํด๋น ํด๋์ค ๋ด์ ๋ฉ์๋์ด์ด์ผ ํ๋ค.
๊ทธ๋ ๋ค๋ฉด ๊ณ ์ ํ์์๋ ์ด๋จ๊น?
๊ณ ์ ์ ์ธ ๋ฐฉ๋ฒ์์๋ ๊ผญ ์ฝ๋๋ฅผ ๊ฒฉ๋ฆฌํ๋ ๋ฐฉ์์ผ๋ก ํ ์คํธํด์ผ ํ๋ ๊ฒ์ ์๋๋ค. ํ์ง๋ง ํ ์คํธ์ ์์์ ์๊ด์์ด ์ฌ๋ฌ ํด๋์ค๋ฅผ ํ ๋ฒ์ ํ ์คํธํด๋ ๊ด์ฐฎ์์ผ ํ๋ค.
- ํ
์คํธ๊ฐ ์๋ก ์ํตํ๊ณ , ์คํ ์ปจํ
์คํธ์ ์ํฅ์ ์ค ์ ์์.
DB, ํ์ผ ์์คํ ๋ฑ ํ๋ก์ธ์ค ์ธ๋ถ ์์กด์ฑ์ด ์ด๋ฌํ "๊ณต์ ์ํ"์ ๋ํ์ ์ธ ์์.
๊ฒฉ๋ฆฌ ๋ฌธ์ ์ ๋ํ ์ด๋ฐ ์๋ฐ๋ ๊ฒฌํด๋ ๋ชฉ๊ณผ ๊ธฐํ ํ ์คํธ ๋์ญ์ ์ฌ์ฉ์ ๊ฒฌํด๋ฅผ ์๋ฐํจ.
ํ ์คํธ ๋์ญ์ ์ฌ์ฉํ ์ ์์ง๋ง, ๋ณดํต ํ ์คํธ ๊ฐ์ ๊ณต์ ์ํ๋ฅผ ์ผ์ผํค๋ ์์กด์ฑ์ ๋ํด์๋ง ์ฌ์ฉํจ.

๋จ์ํ ์คํธ๋ฅผ ์๋ก ๊ฒฉ๋ฆฌํ๋ ๊ฒ์ ํ ์คํธ ๋์ ํด๋์ค์์ "๊ณต์ ์์กด์ฑ"๋ง ๊ฒฉ๋ฆฌํ๋ ๊ฒ์ ์๋ฏธํ๋ค.
- ๋น๊ณต๊ฐ ์์กด์ฑ์ ๊ทธ๋๋ก ๋ ์ ์์.
์ฌ๊ธฐ์ ๊ณต์ ์์กด์ฑ์ ํ ์คํธ ๋์ ํด๋์ค ๊ฐ์ด ์๋๋ผ ๋จ์ ํ ์คํธ ๊ฐ ๊ณต์ ํ๋ค.
singleton ์์กด์ฑ : ๊ฐ ํ ์คํธ์์ ์ ์ธ์คํด์ค๋ฅผ ๋ง๋ค ์ ์๊ธฐ๋ง ํ๋ฉด ๊ณต์ ๋์ง ์์.
- โป ์ฑ๊ธํค: ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ํ๋๋ง ์์ฑํ์ฌ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ์ต์ ํํ๊ณ , ์ ์ญ์ ์ผ๋ก ์ ๊ทผํ ์ ์๋๋ก ํ๋ ๊ฒ.
- ์ ํ ์ฝ๋์์๋ ์ฑ๊ธํด ์ธ์คํด์ค๊ฐ ๋จ ํ๋๋ง ์์ ๊ฒ.
ํ์ง๋ง ํ ์คํธ์์๋ ์ด ํจํด์ ๋ฐ๋ฅด์ง๋ ์๊ณ , ์ฌ์ฌ์ฉํ์ง๋ ์์.
โ ์ด๋ฌํ ์์กด์ฑ์ "๋น๊ณต๊ฐ" ์ด๋ค!
ex)
์ค์ configuration ํด๋์ค๋ ์ผ๋ฐ์ ์ผ๋ก ํ ๊ฐ์ด๋ฉฐ, ๋ชจ๋ ์ ํ ์ฝ๋์์ ์ด ์ธ์คํด์ค๋ฅผ ์ฌ์ฌ์ฉํจ.
๊ทธ๋ฌ๋ ๋ค๋ฅธ ๋ชจ๋ ์์กด์ฑ์ด SUT(ํ ์คํธ ๋์ ์์คํ )์ ์ฃผ์ ๋๋ฉด ๊ฐ ํ ์คํธ์์ ์ ์ธ์คํด์ค๋ฅผ ๋ง๋ค ์ ์์.
- ํ ์คํธ ์ค์ํธ ์ ์ฒด์์ ๋จ์ผ ์ธ์คํด์ค๋ฅผ ์ ์งํ ํ์๋ ์์
- ๊ทธ๋ฌ๋ ์ ํ์ผ ์์คํ ์ด๋ DB๋ฅผ ๋ง๋ค ์๋ ์์ผ๋ฉฐ, ํ ์คํธ ๊ฐ์ ๊ณต์ ๋๊ฑฐ๋ ํ ์คํธ ๋์ญ์ผ๋ก ๋์ฒด๋์ด์ผ ํจ.
๊ณต์ ์์กด์ฑ์ ๋์ฒดํ๋ ๋ ๋ค๋ฅธ ์ด์ ๋ ํ ์คํธ ์คํ ์๋๋ฅผ ๋์ด๊ธฐ ์ํด์์.
ํ๋ก์ธ์ค ์ธ๋ถ์ ์๊ธฐ ๋๋ฌธ์ ๋น๊ณต๊ฐ ์์กด์ฑ๋ณด๋ค ํธ์ถ์ ๋ ์ค๋ ์๊ฐ์ด ๊ฑธ๋ฆฌ๊ธฐ ๋๋ฌธ.
์ฐธ๊ณ ) ๊ณต์ ์์กด์ฑ, ๋น๊ณต๊ฐ ์์กด์ฑ, ํ๋ก์ธ์ค ์ธ๋ถ ์์กด์ฑ
๊ณต์ ์์กด์ฑ
- ํ ์คํธ ๊ฐ์ ๊ณต์ ๋๊ณ ์๋ก์ ๊ฒฐ๊ณผ์ ์ํฅ์ ๋ฏธ์น ์ ์๋ ์๋จ์ ์ ๊ณตํ๋ ์์กด์ฑ
- ex) ์ ์ ๊ฐ๋ณ ํ๋, ๋ฐ์ดํฐ๋ฒ ์ด์ค
๋น๊ณต๊ฐ ์์กด์ฑ
- ๊ณต์ ํ์ง ์๋ ์์กด์ฑ
ํ๋ก์ธ์ค ์ธ๋ถ ์์กด์ฑ
- ์ ํ๋ฆฌ์ผ์ด์ ์คํ ํ๋ก์ธ์ค ์ธ๋ถ์์ ์คํ๋๋ ์์กด์ฑ. ์์ง ๋ฉ๋ชจ๋ฆฌ์ ์๋ ๋ฐ์ดํฐ์ ๋ํ ํ๋ก์(proxy)
- ๋๋ถ๋ถ "๊ณต์ ์์กด์ฑ"์ ํด๋นํจ. (์ ๋ถ๋ ์๋)
- ์์
- ๋ฐ์ดํฐ๋ฒ ์ด์ค = ํ๋ก์ธ์ค ์ธ๋ถ + ๊ณต์ ์์กด์ฑ
- ํ
์คํธ ์ ๋์ปค ์ปจํ
์ด๋๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํ = ํ๋ก์ธ์ค ์ธ๋ถ + ๊ณต์ ํ์ง ์๋ ์์กด์ฑ
(ํ ์คํธ๊ฐ ๋ ์ด์ ๋์ผํ ์ธ์คํด์ค๋ก ์๋ํ์ง ์๊ธฐ ๋๋ฌธ.)
๋จ์ ํ ์คํธ์ ๋ฐ๋ํ์ ๊ณ ์ ํ
๋ฐ๋ํ์ ๊ณ ์ ํ๋ก ๋๋์ด์ง ์์ธ์ "๊ฒฉ๋ฆฌ ํน์ฑ"
- ๋ฐ๋ํ: ํ ์คํธ ๋์ ์์คํ ์์ ํ๋ ฅ์๋ฅผ ๋ชจ๋ ๊ฒฉ๋ฆฌํ๋ค.
- ๊ณ ์ ํ: ๋จ์ ํ ์คํธ๋ผ๋ฆฌ ๊ฒฉ๋ฆฌํ๋ค.
๊ฒฉ๋ฆฌ ์๊ตฌ ์ฌํญ / ํ ์คํธ ๋์ ์ฝ๋ ์กฐ๊ฐ(๋จ์)์ ๊ตฌ์ฑ ์์ / ์์กด์ฑ ์ฒ๋ฆฌ์ ๋ํ ์๊ฒฌ ์ฐจ์ด๊ฐ ์กด์ฌํ๋ค.
๊ฒฉ๋ฆฌ ์ฃผ์ฒด | ๋จ์์ ํฌ๊ธฐ | ํ ์คํธ ๋์ญ ์ฌ์ฉ ๋์ | |
๋ฐ๋ํ | ๋จ์ | ๋จ์ผ ํด๋์ค | ๋ถ๋ณ ์์กด์ฑ ์ธ ๋ชจ๋ ์์กด์ฑ |
๊ณ ์ ํ | ๋จ์ ํ ์คํธ | ๋จ์ผ ํด๋์ค ๋๋ ํด๋์ค ์ธํธ | ๊ณต์ ์์กด์ฑ |
๊ณ ์ ํ์ ๋ฐ๋ํ๊ฐ ์์กด์ฑ์ ๋ค๋ฃจ๋ ๋ฐฉ๋ฒ
๋ฐ๋ํ์์๋ "๋ถ๋ณ ๊ฐ์ฒด"๋ ๊ต์ฒดํ์ง ์๊ณ ๊ทธ๋๋ก ์ฌ์ฉํ ์ ์๋ค.
๋ฐ๋ ์คํ์ผ๋ก ๋ฆฌํฉํ ๋ง๋ ํ ์คํธ ์ฝ๋๋ฅผ ์ดํด๋ณด๋ฉด,
Product.Shampoo ์ ๋ํ ์ธ์คํด์ค๋ ๋ชฉ์ผ๋ก ๊ต์ฒดํ์ง ์๊ณ , ์ค์ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค.
โ ๋ฐ๋ผ์ ๊ฐ๋ณ์ ์ธ Store๋ง ๊ต์ฒดํ ๊ฒ!
- Store๋ง ๋ณํ๋ ๋ด๋ถ ์ํ๋ฅผ ํฌํจํ๊ณ ์์.
- Product๋ (enum) ์ด๊ฑฐํ์ผ๋ก ๋ถ๋ณ์.
(Product.Shampoo, 5) ์์ "5"๋ผ๋ ์ซ์์ ํ ์คํธ ๋์ญ์ ์ฌ์ฉํ์ง ์๋ ๊ฒ๋ ๋น์ทํ ๋งฅ๋ฝ์.
[Fact]
public void Purchase_fails_when_not_enough_inventory()
{
// ์ค๋น
var storeMock = new Mock<IStore>();
storeMock
.Setup(x => x.HasEnoughInventory(Product.Shampoo, 5))
.Returns(false);
var customer = new Customer();
// ์คํ
bool success = customer.Purchase(storeMock.Object, Product.Shampoo, 5);
// ๊ฒ์ฆ
Assert.False(success);
storeMock.Verify(x => x.RemoveInventory(Product.Shampoo, 5), Times.Never);
}
์ด๋ฌํ ๋ถ๋ณ ๊ฐ์ฒด๋ฅผ ๊ฐ ๊ฐ์ฒด ๋๋ ๊ฐ์ด๋ผ๊ณ ํจ.
- ๊ฐ๊ฐ์ ์ ์ฒด์ฑ์ด ์๊ณ ๋ด์ฉ์ ์ํด์๋ง ์๋ณ๋จ.
- ๋ ๊ฐ์ฒด๊ฐ "๋์ผํ ๋ด์ฉ"์ ๊ฐ๊ณ ์๋ค๋ฉด, ์ด๋ค ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ์๊ด์ด ์์.
โ ๊ฐ์ ๋ด์ฉ์ด๋ผ๋ฉด ์๋ก ๋ฐ๊ฟ ์ฌ์ฉํ ์๋ ์๋ ๊ฒ!

๋ฐ๋ํ | ๊ณ ์ ํ | ||
์์กด์ฑ | ๊ณต์ ์์กด์ฑ (ํ๋ ฅ์) | ๊ต์ฒด ๋์ | ๊ต์ฒด ๋์ |
๋น๊ณต๊ฐ ์์กด์ฑ | |||
๋น๊ณต๊ฐ ์์กด์ฑ | ๋ณ๊ฒฝ ๊ฐ๋ฅํ ์์กด์ฑ (ํ๋ ฅ์) | ๊ต์ฒด ๋์ | |
๊ฐ ๊ฐ์ฒด |
ํ๋ ฅ์์ ์์กด์ฑ
ํ๋ ฅ์: ๊ณต์ ํ๊ฑฐ๋ ๋ณ๊ฒฝ ๊ฐ๋ฅํ ์์กด์ฑ
- ๊ณต์ ์์กด์ฑ ex) ๋ฐ์ดํฐ๋ฒ ์ด์ค
- ๋ณ๊ฒฝ ๊ฐ๋ฅํ ์์กด์ฑ ex) Store - ์๊ฐ์ ๋ฐ๋ผ ์ํ๊ฐ ๋ณ๊ฒฝ๋จ.
- ์ฌ๊ธฐ์ Product๋ ์ซ์ 5๋ ์์กด์ฑ์ด์ง๋ง ํ๋ ฅ์๊ฐ ์๋. ๊ทธ๋ฅ ๊ฐ ๊ฐ์ฒด์ธ๊ฒ.
customer.Purchase(store, Product.shampoo, 5)
๊ณต์ ์์กด์ฑ๊ณผ ์ธ๋ถ ์์กด์ฑ
๋ชจ๋ ํ๋ก์ธ์ค ์ธ๋ถ ์์กด์ฑ์ด "๊ณต์ ์์กด์ฑ"์ ๋ฒ์ฃผ์ ์ํ๋ ๊ฒ์ ์๋๋ค.
ํ๋ก์ธ์ค ์ธ๋ถ ์์กด์ฑ์ ๊ณต์ ํ๋ ค๋ฉด ๋จ์ ํ ์คํธ๊ฐ ์๋ก ํต์ ํ ์ ์๋ ์๋จ์ด ์์ด์ผ ํจ.
์์กด์ฑ ๋ด๋ถ ์ํ๋ฅผ ์์ ํ๋ฉด ํต์ ์ด ์ด๋ค์ง๋๋ฐ,
ํ๋ก์ธ์ค ์ธ๋ถ์ ๋ถ๋ณ ์์กด์ฑ์ ๊ทธ๋ฐ ์๋จ์ ์ ๊ณตํ์ง ์์.
- ํ ์คํธ๋ ๋ด๋ถ์ ์ด๋ค ๊ฒ๋ ์์ ํ ์ ์๊ธฐ์, ์๋ก ์คํ ์ปจํ ์คํธ์ ์ํฅ์ ์ฃผ์ง ์๋ ๊ฒ.

๊ณต์ , ํ๋ก์ธ์ค ์ธ๋ถ X | ์ฑ๊ธํด (๋ชจ๋ ํ ์คํธ์์ ์ฌ์ฌ์ฉํ๋ ์ธ์คํด์ค), ํด๋์ค์ ์ ์ ํ๋
๊ณต์ , ํ๋ก์ธ์ค ์ธ๋ถ | ๋ฐ์ดํฐ๋ฒ ์ด์ค
๊ณต์ X, ํ๋ก์ธ์ค ์๋ถ | ์ฝ๊ธฐ ์ ์ฉ API
- ์์ ํ ์ ์์ผ๋ฉฐ, ์ด๋ก ์ธํด ์๋ก์ ์คํ ํ๋ฆ์ ์ํฅ์ ์ค ์ ์๊ธฐ ๋๋ฌธ
- ํ ์คํธ๊ฐ ๋ฐํํ๋ ๋ฐ์ดํฐ์ ์ํฅ์ ๋ฏธ์น ์ ์์.
- ๋ณดํต ํ๋ก์ธ์ค ์ธ๋ถ์ด๋ฉฐ ๊ณต์ ๋์ง ์๋ ์์กด์ฑ์ ์ถฉ๋ถํ ๋น ๋ฅด๊ณ ์ฐ๊ฒฐ์ด ์์ ์ ์ด์ง ์๋ ํ, ๋ณดํต ๊ต์ฒด๋๋ค.
๋ฌผ๋ก ์ค์ ํ๋ก์ ํธ์์๋ ํ๋ก์ธ์ค ์ธ๋ถ๊ฐ ์๋ ๊ณต์ ์์กด์ฑ์ ๊ฑฐ์ ์๋ค.
(โ ์ ๋ฆฌํ ๋๋ ๊ณต์ ์์กด์ฑ๊ณผ ํ๋ก์ธ์ค ์ธ๋ถ ์์กด์ฑ์ด๋ผ๋ ์ฉ์ด๋ ์๋ก ๋ฐ๊ฟ ์ ์๊ฒ ์ฌ์ฉํ ์์ )
๊ณ ์ ํ์ ๋ฐ๋ํ์ ๋น๊ต
ํ์๋ ๊ณ ์ ํ๋ฅผ ๋ ์ ํธํจ. ๋ชฉ์ ์ฌ์ฉํ๋ ํ ์คํธ๋ ๋ถ์์ ํ ๊ฒฝํฅ์ด ์๊ธฐ ๋๋ฌธ.
๋ฐ๋ํ์ ์ ๊ทผ ๋ฐฉ์์ ์ด์
- ์ ์์ฑ granularity์ด ์ข์. ํ ์คํธ๊ฐ ์ธ๋ฐํด์ ํ ๋ฒ์ ํ ํด๋์ค๋ง ํ์ธํจ.
- ์๋ก ์ฐ๊ฒฐ๋ ํด๋์ค์ ๊ทธ๋ํ๊ฐ ์ปค์ ธ๋ ํ ์คํธํ๊ธฐ์ ์ฌ์. ๋ชจ๋ ํ๋ ฅ์๊ฐ ํ ์คํธ ๋์ญ์ผ๋ก ๋์ฒด๋๊ธฐ ๋๋ฌธ.
- ํ ์คํธ๊ฐ ์คํจํ๋ฉด ์ด๋ค ๊ธฐ๋ฅ์ด ์คํจํ๋์ง ํ์คํ ์ ์ ์์. ์ ์ด์ ๋ชจ๋ ์์กด์ฑ์ ๋ชจ๋ ์ ๊ฑฐํ๊ธฐ ๋๋ฌธ.
ํ ๋ฒ์ ํ ํด๋์ค๋ง ํ ์คํธํ๊ธฐ
๋ฐ๋ํ๋ ํด๋์ค๋ฅผ ๋จ์๋ก ๊ฐ์ฃผํ๋ค.
TIP
ํ ์คํธ๋ ์ฝ๋์ "๋จ์"๋ฅผ ๊ฒ์ฆํด์๋ ์ ๋๋ค.
์คํ๋ ค ๋์์ ๋จ์, ์ฆ "๋ฌธ์ ์์ญ"์ ์๋ฏธ๊ฐ ์๋ ๊ฒ. ์ด์์ ์ผ๋ก๋ ๋น์ฆ๋์ค ๋ด๋น์๊ฐ ์ ์ฉํ๋ค๊ณ ์ธ์ํ ์ ์๋ ๊ฒ์ ๊ฒ์ฆํด์ผ ํ๋ค.
๋ฐ๋ผ์ ๋์ ๋จ์๋ฅผ ๊ตฌํํ๋ ๋ฐ ํด๋์ค๊ฐ ์ผ๋ง๋ ํ์ํ์ง๋ ์๊ด์ด ์๋ค.
๋จ์๋ ์ฌ๋ฌ ํด๋์ค์ ๊ฑธ์ณ ์๊ฑฐ๋, ํ ํด๋์ค์๋ง ์์ ์๋ ์๊ณ , ์์ฃผ ์์ ๋ฉ์๋๊ฐ ๋ ์๋ ์๋ค.
๋ฐ๋ผ์ "์ข์ ์ฝ๋ ์ ์์ฑ"์ ๋ชฉํ๋ก ํ๋ ๊ฒ์ ๋์์ด ๋์ง ์๋๋ค.
"๋จ์ผ ๋์ ๋จ์"๋ฅผ ๊ฒ์ฆํ๋ ๊ฒ์ด ์ข์ ํ ์คํธ์ง, ์ด๋ณด๋ค ์ ์ ๊ฒ์ ๋ชฉํ๋ก ์ผ๋๋ค๋ฉด ๋จ์ ํ ์คํธ๋ฅผ ํผ์ํ๋ ๊ฒ์ด๋ค.
์ด ํ ์คํธ๊ฐ "๋ฌด์์ ๊ฒ์ฆํ๋์ง" ์ ํํ ์ดํดํ ์ ์์ด์ผ ํ๋ค
- ํด๊ฒฐํ๋ ๋ฐ ๋์์ด ๋๋ ๋ฌธ์ ์ ๋ํ ์ด์ผ๊ธฐ๋ฅผ ๋ค๋ ค์ฃผ์ด์ผ ํ๋ฉฐ,
- ํ๋ก๊ทธ๋๋จธ๊ฐ ์๋ ์ผ๋ฐ ์ฌ๋๋ค์๊ฒ ์์ง๋๊ฐ ๋๊ณ ์๋ฏธ๊ฐ ์์ด์ผ ํ๋ค.
์ํธ ์ฐ๊ฒฐ๋ ํด๋์ค์ ํฐ ๊ทธ๋ํ๋ฅผ ๋จ์ ํ ์คํธํ๊ธฐ
๋ชฉ์ ์ฌ์ฉํ๋ฉด ์์กด์ฑ ๊ทธ๋ํ๊ฐ ๋ณต์กํ๊ฒ ์์ ๋ ์ฌ์ด ํ ์คํธ๊ฐ ๊ฐ๋ฅํจ.
ํด๋์ค์ ์ง์ ์ ์ธ ์์กด์ฑ์ ๋์ฒดํด ๊ทธ๋ํ๋ฅผ ๋๋ ์ ์์ผ๋ฉฐ, ๋จ์ ํ ์คํธ์์ ์ค๋นํด์ผ ํ ์์ ๋์ ํฌ๊ฒ ์ค์ด๊ธฐ ๋๋ฌธ!
ํ์ง๋ง ์ด๋ ์๋ชป๋ ๋ฌธ์ ์ ์ด์ ์ ๋ง์ถ๊ณ ์์.
์ํธ ์ฐ๊ฒฐ๋ ํด๋์ค์ ํฌ๊ณ ๋ณต์กํ ๊ทธ๋ํ๋ฅผ ํ ์คํธํ ๋ฐฉ๋ฒ์ ์ฐพ๋ ๋์ , ์ด๋ฌํ ํด๋์ค ๊ทธ๋ํ๋ฅผ ๊ฐ์ง ์๋ ๋ฐ์ ๋จผ์ ์ง์คํด์ผ ํจ.
ํด๋์ค ๊ทธ๋ํ๊ฐ ์ปค์ง ๊ฒ์ ์ฝ๋ ์ค๊ณ ๋ฌธ์ ์ ๊ฒฐ๊ณผ์
๋ฒ๊ทธ ์์น ์ ํํ ์ฐพ์๋ด๊ธฐ
๊ณ ์ ์คํ์ผ ํ ์คํธ์์๋ ์ค์๋ํ๋ ํด๋์ค์ ์ฐธ์กฐํ๋ ํด๋ผ์ด์ธํธ๋ฅผ ๋์์ผ๋กํ๋ ํ ์คํธ๋ ์คํจํ ์ ์์.
์ฆ, ํ๋์ ๋ฒ๊ทธ๊ฐ ์ ์ฒด ์์คํ ์ ๊ฑธ์ณ ํ ์คํธ ์คํจ๋ฅผ ์ผ๊ธฐํ ์ ์๋ ๊ฒ.
๊ฒฐ๊ตญ ์ด๋ ๋ฌธ์ ์ ์์ธ์ ์ฐพ๊ธฐ๊ฐ ๋ ์ด๋ ค์์ง๊ณ , ๋๋ฒ๊น ์ ๋ ๋ง์ ์๊ฐ์ ์๊ตฌํ ์ ์๋ค.
์ฐ๋ คํ ๋งํ์ง๋ง, ํฐ ๋ฌธ์ ๋ ์๋๋ค. ํ ์คํธ๋ฅผ ์ ๊ธฐ์ ์ผ๋ก ์คํ์์ผ ๋ฒ๊ทธ์ ์์ธ์ ์ฐพ๋๋ค๋ฉด,
๋ง์ง๋ง์ผ๋ก ํ ์์ ์ด ๋ฌด์์ธ์ง ์๊ธฐ ๋๋ฌธ์ ๋ฒ๊ทธ์ ์์ธ์ ์ฐพ๋ ๊ฒ์ ํฌ๊ฒ ์ด๋ ต์ง ์๋ค.
๋ํ, ํ ์คํธ ์ค์ํธ ์ ์ฒด์ ๊ฑธ์ณ ๊ณ๋จ์์ผ๋ก ์คํจํ๋ ๋ฐ ๊ฐ์น๊ฐ ์๋ค.
๋ฒ๊ทธ๊ฐ ํ ์คํธ ํ๋๋ฟ๋ง ์๋๋ผ, ๋ง์ ํ ์คํธ์์ ๊ฒฐํจ์ผ๋ก ์ด์ด์ง๋ค๋ฉด? ๋ฐฉ๊ธ ๊ณ ์ฅ ๋ธ ์ฝ๋ ์กฐ๊ฐ์ด ํฐ ๊ฐ์น๊ฐ ์๋ค๋ ๊ฒ์ ๋ณด์ฌ์ฃผ๋ ๊ฒ์ด๋ค.
= ์ฆ, ์ ์ฒด ์์คํ ์ด ๊ทธ๊ฒ์ ์์กดํ๋ค๋ ๊ฒ์ด๋ค.
์ด๋ ์ฝ๋ ์์ ์ ๋ช ์ฌํด์ผ ํ ์ ์ฉํ ์ ๋ณด์ด๋ค.
๊ณ ์ ํ์ ๋ฐ๋ํ ์ฌ์ด์ ๋ค๋ฅธ ์ฐจ์ด์
์์ง ๊ณ ์ ํ์ ๋ฐ๋ํ ์ฌ์ด์ ๋จ์์๋ ๋ ๊ฐ์ง ์ฐจ์ด์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
- ํ ์คํธ ์ฃผ๋ ๊ฐ๋ฐ (TDD: Test Driven Development) ์ ํตํ ์์คํ ์ค๊ณ ๋ฐฉ์
- ๊ณผ๋ํ ๋ช ์ธ ๋ฌธ์
๋ฐ๋ ์คํ์ผ์ ๋จ์ ํ ์คํธ
- ํํฅ์ TDD : ์ ์ฒด ์์คํ ์ ๋ํ ๊ธฐ๋์น๋ฅผ ์ค์ ํ๋ ์์ ๋ ๋ฒจ ํ ์คํธ๋ถํฐ ์์ํจ.
- ๋ชฉ์ ์ฌ์ฉํด ์์ ๊ฒฐ๊ณผ๋ฅผ ๋ฌ์ฑํ๊ณ ์ ์์คํ ์ด ํต์ ํด์ผ ํ๋ ํ๋ ฅ์๋ฅผ ์ง์ ํจ
- ๋ชจ๋ ํด๋์ค๋ฅผ ๊ตฌํํ ๋๊น์ง ํด๋์ค ๊ทธ๋ํ๋ฅผ ๋ค์ ธ๋๊ฐ.
- ํ ์คํธํ ๋ SUT์ ๋ชจ๋ ํ๋ ฅ์๋ฅผ ์ฐจ๋จํ์ฌ ํด๋น ํ๋ ฅ์์ ๊ตฌํ์ ๋์ค์ผ๋ก ๋ฏธ๋ฃฐ ์ ์์.
๊ณ ์ ์คํ์ผ์ ๋จ์ ํ ์คํธ
- ์ํฅ์ TDD : ๋๋ฉ์ธ ๋ชจ๋ธ์ ์์์ผ๋ก ์ต์ข ์ฌ์ฉ์๊ฐ ์ํํธ์จ์ด๋ฅผ ์ฌ์ฉํ ์ ์์ ๋๊น์ง ๊ณ์ธต์ ๊ทธ ์์ ๋ ๋ .
์ด ์ค์์๋ ๊ฐ์ฅ ์ฃผ์ํ ์ฐจ์ด์ ์ "๊ณผ๋ํ ๋ช ์ธ ๋ฌธ์ "
๋ฐ๋ ์คํ์ผ์ ๊ณ ์ ์คํ์ผ๋ณด๋ค ํ ์คํธ๊ฐ SUT์ ๊ตฌํ ์ธ๋ถ ์ฌํญ์ ๋ ์์ฃผ ๊ฒฐํฉ๋๋ ํธ์ด๋ค.
๋ ๋ถํ์ ํตํฉ ํ ์คํธ
๋ฐ๋ํ : ์ค์ ํ๋ ฅ์ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ๋ชจ๋ ํ ์คํธ๋ฅผ ํตํฉ ํ ์คํธ๋ผ๊ณ ๊ฐ์ฃผ
- ๋ฐ๋ผ์ ๊ณ ์ ์คํ์ผ๋ก ์์ฑ๋ ๋๋ถ๋ถ์ ํ ์คํธ๋ ๋ฐ๋ํ์์๋ ํตํฉ ํ ์คํธ๋ก ๊ฐ์ฃผ๋จ.
๊ณ ์ ํ์ ๊ด์ ์์ ๋จ์ํ ์คํธ๋
- ๋จ์ผ ๋์ ๋จ์๋ฅผ ๊ฒ์ฆํ๊ณ
- ๋น ๋ฅด๊ฒ ์ํํ๊ณ
- ๋ค๋ฅธ ํ ์คํธ์ ๋ณ๋๋ก ์ฒ๋ฆฌํ๋ค.
ํตํฉํ ์คํธ๋ ์ด๋ฌํ ๊ธฐ์ค ์ค ํ๋๋ฅผ ์ถฉ์กฑํ์ง ์๋ ํ ์คํธ์.
์๋ฅผ ๋ค์ด ๊ณต์ ์์กด์ฑ์ ์ ๊ทผํ๋ ํ ์คํธ๋ ๋ค๋ฅธ ํ ์คํธ์ ๋ถ๋ฆฌํ์ฌ ์คํํ ์ ์์.
- ์ด๋ค ํ ์คํธ์์ DB ์ํ ๋ณ๊ฒฝ์ด ์๊ธฐ๋ฉด ๋ค๋ฅธ ํ ์คํธ์ ๋ณ๋ ฌ๋ก ์คํ์ ๋ค๋ฅธ ๋ชจ๋ ํ ์คํธ์ ๊ฒฐ๊ณผ๊ฐ ๋ณ๊ฒฝ๋ ๊ฒ์.
ํ๋ก์ธ์ค ์ธ๋ถ ์์กด์ฑ์ ์ ๊ทผํ๋ฉด ํ ์คํธ๊ฐ ๋๋ ค์ง.
์ด๋ก ์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ๋ด ๊ฐ์ฒด๋ก๋ง ์๋ํ๋ ํ ์คํธ๋ฅผ ์์ฑํ ์๋ ์์ง๋ง, ์ฝ์ง๋ ์์.
- ๋์ผํ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์๋ ๊ฐ์ฒด ๊ฐ ํต์ ์ ๋ณ๋ ํ๋ก์ธ์ค ๊ฐ ํต์ ๋ณด๋ค ํจ์ฌ ์ ๋ ดํจ.
- ํ ์คํธ๊ฐ ๋ฉ๋ชจ๋ฆฌ ๋ด ๊ฐ์ฒด ์๋ฐฑ ๊ฐ์ ํจ๊ป ์๋ํ๋๋ผ๋, ๋ฐ์ดํฐ๋ฒ ์ด์ค ํธ์ถ๋ณด๋ค ๋น ๋ฅด๊ฒ ์คํ๋ ๊ฒ์.
๋ ์ด์์ ๋์ ๋จ์๋ฅผ ๊ฒ์ฆํ ๋์ ํ ์คํธ๋ ํตํฉ ํ ์คํธ์.
- ๋น์ทํ ๋จ๊ณ๋ฅผ ๋ฐ๋ฅด์ง๋ง ๋ค๋ฅธ ๋์ ๋จ์๋ฅผ ๊ฒ์ฆํ๋ "๋๋ฆฐ" ํ ์คํธ๊ฐ ๋ ๊ฐ ์์ ๋, ํ๋๋ก ํฉ์น๋ ๊ฒ์ด ํ๋นํ ์ ์์.
- ๋ค๋ฅธ ํ์ด ๊ฐ๋ฐํ ๋ชจ๋์ด ๋ ์ด์ ์์ ๋ ํตํฉ ํ ์คํธ๋ก ์ด๋ป๊ฒ ์๋ํ๋์ง ๊ฒ์ฆํ ์ ์์.
์๋ ํฌ ์๋ ํ ์คํธ
ํตํฉํ ์คํธ: ๊ณต์ ์์กด์ฑ, ํ๋ก์ธ์ค ์ธ๋ถ ์์กด์ฑ ๋ฟ ์๋๋ผ ์กฐ์ง ๋ด ๋ค๋ฅธ ํ์ด ๊ฐ๋ฐํ ์ฝ๋ ๋ฑ๊ณผ ํตํฉํด ์๋ํ๋์ง๋ ๊ฒ์ฆํ๋ ํ ์คํธ
์๋ ํฌ ์๋ ํ ์คํธ๋ ์ด ํตํฉ ํ ์คํธ์ ์ผ๋ถ์.
- ์ฝ๋๊ฐ ํ๋ก์ธ์ค ์ธ๋ถ ์กฐ์์ฑ๊ณผ ํจ๊ป ์ด๋ป๊ฒ ์๋ํ๋์ง ๊ฒ์ฆ
- ํตํฉํ ์คํธ๋ณด๋ค ์ผ๋ฐ์ ์ผ๋ก ์์กด์ฑ์ ๋ ๋ง์ด ํฌํจํจ.
ํตํฉ ํ ์คํธ๋ ํ๋ก์ธ์ค ์ธ๋ถ ์์กด์ฑ์ ํ๋ ๊ฐ๋ง ๊ฐ๊ณ ์๋ํ๋ ๋ฐ๋ฉด,
์๋ ํฌ ์๋ ํ ์คํธ๋ ํ๋ก์ธ์ค ์ธ๋ถ ์์กด์ฑ์ ์ ๋ถ ๋๋ ๋๋ค์๋ฅผ ๊ฐ๊ณ ์๋ํจ.
- UI / GUI / ๊ธฐ๋ฅ ํ ์คํธ ๋ผ๊ณ ๋ ๋ถ๋ฆผ
์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค / ํ์ผ ์์คํ / ๊ฒฐ์ ๊ฒ์ดํธ์จ์ด ๋ผ๋ ์ธ ๊ฐ์ง ํ๋ก์ธ์ค ์ธ๋ถ ์์กด์ฑ์ผ๋ก ์๋ํ๋ค๊ณ ๊ฐ์ ํด๋ณด์.
- ์ผ๋ฐ์ ์ธ ํตํฉ ํ ์คํธ๋ DB + ํ์ผ ์์คํ ๋ง ํฌํจํ๊ณ ๊ฒฐ์ ๊ฒ์ดํธ์จ์ด๋ ํ ์คํธ ๋์ญ์ผ๋ก ๋์ฒดํจ.
- ๊ฒฐ์ ๊ฒ์ดํธ์จ์ด์ ์ ์ด ๊ถํ์ DB / ํ์ผ ์์คํ ์ ๋นํด ์์ ํ ์ ์ดํ ์ ์๊ธฐ ๋๋ฌธ.
์ฆ ๋ณดํต์ ํตํฉ ํ ์คํธ๋ ์๋์ผ๋ก ์ค์ ํ๊ธฐ ์ฌ์ด ์์กด์ฑ๋ง ํ์ธํ์ง๋ง,
์๋ ํฌ ์๋ ํ ์คํธ๋ ํ๋ก์ ํธ ์ธ๋ถ ์์กด์ฑ์ ๊ฑฐ์ ๋ชจ๋ ํ์ธํจ.

์๋ ํฌ ์๋ ํ ์คํธ๋ฅผ ํ๋๋ผ๋ ๋ชจ๋ ํ๋ก์ธ์ค ์ธ๋ถ ์์กด์ฑ์ ์ฒ๋ฆฌํ์ง ๋ชปํ ์๋ ์์.
๋ฐ๋ผ์ ์ฌ์ ํ ํ ์คํธ ๋์ญ์ ์ฌ์ฉํ ํ์๊ฐ ์๊ณ , ํตํฉ ํ ์คํธ์ ์๋ ํฌ ์๋ ํ ์คํธ ์ฌ์ด์ ๋๋ ทํ ๊ฒฝ๊ณ๊ฐ ์๋ค๋ ์ฌ์ค๋ ๋ช ์ฌํด์ผ ํจ.
๋๊ธ