๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“– Dev Book/Unit Testing

[Unit Testing] 2์žฅ ๋‹จ์œ„ํ…Œ์ŠคํŠธ๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

by Lucy Oh 2024. 8. 4.
๋‹จ์œ„ํ…Œ์ŠคํŠธ : ์ƒ์‚ฐ์„ฑ๊ณผ ํ’ˆ์งˆ์„ ์œ„ํ•œ ๋‹จ์œ„ํ…Œ์ŠคํŠธ ์›์น™๊ณผ ํŒจํ„ด (๋ธ”๋ผ๋””๋ฏธ๋ฅด ์ฝ”๋ฆฌ์ฝ”ํ”„ ์ €)
'2์žฅ_ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ž€ ๋ฌด์—‡์ธ๊ฐ€' ๋ถ€๋ถ„์„ ์ฝ๊ณ  ์ •๋ฆฌํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.

๋ชจ๋“  ์†Œ์Šค์ฝ”๋“œ๋Š” ์ด๊ณณ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋‹จ์œ„ ํ…Œ์ŠคํŠธ์˜ ์ •์˜

๋‹จ์œ„ํ…Œ์ŠคํŠธ๋Š”

  1. ์ž‘์€ ์ฝ”๋“œ ์กฐ๊ฐ์„ ๊ฒ€์ฆํ•˜๊ณ 
  2. ๋น ๋ฅด๊ฒŒ ์ˆ˜ํ–‰ํ•˜๊ณ 
  3. ๊ฒฉ๋ฆฌ๋œ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ์ž๋™ํ™”๋œ ํ…Œ์ŠคํŠธ์ด๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด, ์ด์ค‘ ์„ธ ๋ฒˆ์งธ "๊ฒฉ๋ฆฌ๋œ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š”" ๋ถ€๋ถ„์—์„œ์˜ ๊ฒฉ๋ฆฌ๋Š” ์ •ํ™•ํžˆ ๋ฌด์—‡์ผ๊นŒ?

๊ณ ์ „ํŒŒ์™€ ๋Ÿฐ๋˜ํŒŒ์˜ ์ฃผ์žฅ์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด๋ณด์ž.

๊ฒฉ๋ฆฌ ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋Ÿฐ๋˜ํŒŒ์˜ ์ ‘๊ทผ

๋Ÿฐ๋˜ํŒŒ์—์„œ ์ฃผ์žฅํ•œ "๊ฒฉ๋ฆฌ"๋Š” ํ…Œ์ŠคํŠธ ๋Œ€์ƒ ์‹œ์Šคํ…œ์„ ํ˜‘๋ ฅ์ž์—๊ฒŒ์„œ ๊ฒฉ๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ์ผ์ปซ๋Š”๋‹ค.

์ฆ‰, ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๊ฐ€ ๋‹ค๋ฅธ ํด๋ž˜์Šค ๋˜๋Š” ์—ฌ๋Ÿฌ ํด๋ž˜์Šค์— ์˜์กดํ•˜๋ฉด ์ด ๋ชจ๋“  ์˜์กด์„ฑ์„ ํ…Œ์ŠคํŠธ ๋Œ€์—ญ์œผ๋กœ ๋Œ€์ฒดํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

 

 

์ด ๋ฐฉ์‹์˜ ์ด์ 

  1. ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ•˜๋ฉด ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ์–ด๋Š ๋ถ€๋ถ„์ด ๊ณ ์žฅ ๋‚ฌ๋Š”์ง€ ํ™•์‹คํžˆ ์•Œ ์ˆ˜ ์žˆ์œผ๋ฉฐ,
  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();

 

  1. ์‹ค์ œ Store ์ธ์Šคํ„ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , Mock์„ ์‚ฌ์šฉํ•ด ๋Œ€์ฒดํ•˜์˜€๋‹ค.
  2. ์ƒดํ‘ธ์˜ ์žฌ๊ณ ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ 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๊ฐ„์˜ ์ƒํ˜ธ ์ž‘์šฉ์„ ๊ฒ€์‚ฌํ•œ๋‹ค.

์ฆ‰, ๊ณ ๊ฐ์ด ์ƒ์ ์—์„œ ํ˜ธ์ถœ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํ–ˆ๋Š”์ง€, ํ˜ธ์ถœ ํšŸ์ˆ˜๋Š” ์ •ํ™•ํ–ˆ๋Š”์ง€๋„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

  1. ๊ณ ๊ฐ์ด ์ƒ์ ์˜ RemoveInventory() ๋ฉ”์†Œ๋“œ๋ฅผ
  2. ํ•œ ๋ฒˆ ํ˜ธ์ถœํ–ˆ๋Š”์ง€ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ.

 

๊ตฌ๋งค์— ์„ฑ๊ณตํ–ˆ์„ ๋•Œ์™€ ์‹คํŒจํ–ˆ์„ ๋•Œ๋ฅผ ๋น„๊ตํ•˜์—ฌ ์‚ดํŽด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ˜ธ์ถœ ํšŸ์ˆ˜๊ฐ€ ์ •ํ™•ํ–ˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

  1. ์„ฑ๊ณตํ–ˆ์„ ๋•Œ๋Š” RemoveInventory() ๋ฉ”์†Œ๋“œ๋ฅผ ํ•œ ๋ฒˆ (Times.Once) ํ˜ธ์ถœํ•ด์•ผ ํ•œ๋‹ค.
  2. ์‹คํŒจํ–ˆ์„ ๋•Œ๋Š” 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. ์ž‘์€ ์ฝ”๋“œ ์กฐ๊ฐ์„ ๊ฒ€์ฆํ•˜๊ณ 
  2. ๋น ๋ฅด๊ฒŒ ์ˆ˜ํ–‰ํ•˜๊ณ 
  3. ๊ฒฉ๋ฆฌ๋œ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ์ž๋™ํ™”๋œ ํ…Œ์ŠคํŠธ์ด๋‹ค.

๋ผ๊ณ  ์ •์˜ํ–ˆ๋‹ค. 

 

๋งŒ์•ฝ, ๋Ÿฐ๋˜ ์Šคํƒ€์ผ์ฒ˜๋Ÿผ ํ…Œ์ŠคํŠธ ๋Œ€์—ญ์œผ๋กœ ๋Œ€์ƒ ์ฝ”๋“œ ์กฐ๊ฐ์„ ๋ถ„๋ฆฌํ•ด์„œ ๊ฒฉ๋ฆฌํ•ด์•ผ ํ•œ๋‹ค๋ฉด, ์ด๋Š” 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 / ํŒŒ์ผ ์‹œ์Šคํ…œ์— ๋น„ํ•ด ์™„์ „ํžˆ ์ œ์–ดํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ.

 

์ฆ‰ ๋ณดํ†ต์˜ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ๋Š” ์ž๋™์œผ๋กœ ์„ค์ •ํ•˜๊ธฐ ์‰ฌ์šด ์˜์กด์„ฑ๋งŒ ํ™•์ธํ•˜์ง€๋งŒ,

์—”๋“œ ํˆฌ ์—”๋“œ ํ…Œ์ŠคํŠธ๋Š” ํ”„๋กœ์ ํŠธ ์™ธ๋ถ€ ์˜์กด์„ฑ์„ ๊ฑฐ์˜ ๋ชจ๋‘ ํ™•์ธํ•จ.

 

์—”๋“œ ํˆฌ ์—”๋“œ ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๋”๋ผ๋„ ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค ์™ธ๋ถ€ ์˜์กด์„ฑ์„ ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•  ์ˆ˜๋„ ์žˆ์Œ.

๋”ฐ๋ผ์„œ ์—ฌ์ „ํžˆ ํ…Œ์ŠคํŠธ ๋Œ€์—ญ์„ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์žˆ๊ณ , ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ์™€ ์—”๋“œ ํˆฌ ์—”๋“œ ํ…Œ์ŠคํŠธ ์‚ฌ์ด์— ๋šœ๋ ทํ•œ ๊ฒฝ๊ณ„๊ฐ€ ์—†๋‹ค๋Š” ์‚ฌ์‹ค๋„ ๋ช…์‹ฌํ•ด์•ผ ํ•จ.

 

๋Œ“๊ธ€