๐ค Chapter 6. ๋จ์ ํ ์คํธ ์คํ์ผ
๐ฅ ๋จ์ ํ ์คํธ์ ์ธ ๊ฐ์ง ์คํ์ผโ
๋จ์ ํ ์คํธ๋ ์ธ ๊ฐ์ง ์คํ์ผ์ด ์๋ค.
- ์ถ๋ ฅ ๊ธฐ๋ฐ ํ ์คํธ
- ์ํ ๊ธฐ๋ฐ ํ ์คํธ
- ํต์ ๊ธฐ๋ฐ ํ ์คํธ
ํ๋์ ํ ์คํธ์์ ํ๋ ๋๋ ๋, ์ฌ์ง์ด ์ธ ๊ฐ์ง ์คํ์ผ ๋ชจ๋๋ฅผ ํจ๊ป ์ฌ์ฉํ ์ ์๋ค.
๐ ์ถ๋ ฅ ๊ธฐ๋ฐ ํ ์คํธ ์ ์โ
ํ ์คํธ ๋์ ์์คํ (SUT)์ ์ ๋ ฅ์ ๋ฃ๊ณ ์์ฑ๋๋ ์ถ๋ ฅ์ ์ ๊ฒํ๋ ๋ฐฉ์์ด๋ค. ์ด๋ฌํ ๋จ์ ํ ์คํธ ์คํ์ผ์ ์ ์ญ ์ํ๋ ๋ด๋ถ ์ํ๋ฅผ ๋ณ๊ฒฝํ์ง ์๋ ์ฝ๋์๋ง ์ ์ฉ๋๋ฏ๋ก ๋ฐํ ๊ฐ๋ง ๊ฒ์ฆํ๋ฉด ๋๋ค.
public class PriceEngine {
public decimal CalculateDiscount(params Product[] products) {
decimal discount = products.Length * 0.01m;
return Math.Min(discount, 0.2m);
}
}
[Fact]
public void Discount_of_two_products() {
var product1 = new Product("Hand wash");
var product2 = new Product("Shampoo");
var sut = new PriceEngine();
decimal discount = sut.CalculateDiscount(product1, product2);
Assert.Equal(0.02m, discount);
}
CalculateDiscount()
๋ฉ์๋์ ๊ฒฐ๊ณผ๋ ๋ฐํ๋ ํ ์ธ, ์ฆ ์ถ๋ ฅ ๊ฐ๋ฟ์ด๋ค.
์ถ๋ ฅ ๊ธฐ๋ฐ ๋จ์ ํ ์คํธ ์คํ์ผ์ ํจ์ํ์ด๋ผ๊ณ ๋ ํ๋ค. ์ด ์ด๋ฆ์ ๋ถ์์ฉ ์๋ ์ฝ๋ ์ ํธ๋ฅผ ๊ฐ์กฐํ๋ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ธ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ๋ฟ๋ฆฌ๋ฅผ ๋๊ณ ์๋ค.
๐ ์ํ ๊ธฐ๋ฐ ์คํ์ผ ์ ์โ
์ํ ๊ธฐ๋ฐ ์คํ์ผ์ ์์ ์ด ์๋ฃ๋ ํ ์์คํ ์ํ๋ฅผ ํ์ธํ๋ ๊ฒ์ด๋ค. ์ด ํ ์คํธ ์คํ์ผ์์ ์ํ๋ผ๋ ์ฉ์ด๋ SUT๋ ํ๋ ฅ์ ์ค ํ๋, ๋๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ํ์ผ ์์คํ ๋ฑ๊ณผ ๊ฐ์ ํ๋ก์ธ์ค ์ธ๋ถ ์์กด์ฑ์ ์ํ ๋ฑ์ ์๋ฏธํ ์ ์๋ค.
public class Order {
private readonly List<Product> _products = new List<product>();
public IReadOnlyList<Product> Products => _products.ToList();
public void AddProduct(Product product) {
_products.Add(product);
}
}
[Fact]
public void Adding_a_product_to_an_order() {
var product = new Product("Hand wash");
var sut = new Order();
sut.AddProduct(product);
Assert.Equal(1, sut.Products.Count);
Assert.Equal(product, sut.Products[0]);
}
ํ
์คํธ๋ ์ํ์ ์ถ๊ฐํ ํ Products
์ปฌ๋ ์
์ ๊ฒ์ฆํ๋ค. ์ถ๋ ฅ ๊ธฐ๋ฐ ํ
์คํธ์ ์์ ์ ๋ฌ๋ฆฌ, AddProduct()
์ ๊ฒฐ๊ณผ๋ ์ฃผ๋ฌธ ์ํ์ ๋ณ๊ฒฝ์ด๋ค.
๐ ํต์ ๊ธฐ๋ฐ ์คํ์ผ ์ ์โ
ํต์ ๊ธฐ๋ฐ ์คํ์ผ์ ๋ชฉ์ ์ฌ์ฉํด ํ ์คํธ ๋์ ์์คํ ๊ณผ ํ๋ ฅ์ ๊ฐ์ ํต์ ์ ๊ฒ์ฆํ๋ค.
[Fact]
public void Sending_a_greetings_email() {
var emailGatewayMock = new Mock<IEmailGateway>();
var sut = new Controller(emailGatewayMock.Object);
sut.GreetUser("user@email.com");
emailGatewayMock.Verify(
x => x.SendGreetingsEmail("user@email.com"),
Times.Once
);
}
๐ฅ ๋จ์ ํ ์คํธ ์คํ์ผ ๋น๊ตโ
๐ ํ๊ท ๋ฐฉ์ง์ ํผ๋๋ฐฑ ์๋ ์งํ๋ก ์คํ์ผ ๋น๊ตํ๊ธฐโ
ํ๊ท ๋ฐฉ์ง ์งํ๋ ํน์ ์คํ์ผ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง์ง ์๋๋ค. ํ๊ท ๋ฐฉ์ง ์งํ๋ ๋ค์ ์ธ ๊ฐ์ง ํน์ฑ์ผ๋ก ๊ฒฐ์ ๋๋ค.
- ํ ์คํธ ์ค์ ์คํ๋๋ ์ฝ๋์ ์
- ์ฝ๋ ๋ณต์ก๋
- ๋๋ฉ์ธ ์ ์์ฑ
๋ณดํต ์คํํ๋ ์ฝ๋๊ฐ ๋ง๋ ์ ๋ ์ํ๋ ๋๋ก ํ ์คํธ๋ฅผ ์์ฑํ ์ ์๋ค. ์ด๋ค ์คํ์ผ๋ ์ด ๋ถ๋ถ์์ ๋์์ด ๋์ง ์๋๋ค. ์ฝ๋ ๋ณต์ก๋์ ๋๋ฉ์ธ ์ ์์ฑ ์ญ์ ๋ง์ฐฌ๊ฐ์ง๋ค. ํต์ ๊ธฐ๋ฐ ์คํ์ผ์๋ ์์ธ๊ฐ ํ๋ ์๋ค. ๋จ์ฉํ๋ฉด ์์ ์ฝ๋ ์กฐ๊ฐ์ ๊ฒ์ฆํ๊ณ ๋ค๋ฅธ ๊ฒ์ ๋ชจ๋ ๋ชฉ์ ์ฌ์ฉํ๋ ๋ฑ ํผ์์ ์ธ ํ ์คํธ๊ฐ ๋ ์ ์๋ค. ํ์ง๋ง ์ด๋ ํต์ ๊ธฐ๋ฐ ํ ์คํธ์ ๊ฒฐ์ ์ ์ธ ํน์ง์ด ์๋๋ผ ๊ธฐ์ ์ ๋จ์ํ๋ ๊ทน๋จ์ ์ธ ์ฌ๋ก๋ค.
ํ ์คํธ ์คํ์ผ๊ณผ ํ ์คํธ ํผ๋๋ฐฑ ์๋ ์ฌ์ด์๋ ์๊ด๊ด๊ณ๊ฐ ๊ฑฐ์ ์๋ค. ํ ์คํธ๊ฐ ํ๋ก์ธ์ค ์ธ๋ถ ์์กด์ฑ๊ณผ ๋จ์ด์ ธ ๋จ์ ํ ์คํธ ์์ญ์ ์๋ ํ, ๋ชจ๋ ์คํ์ผ์ ํ ์คํธ ์คํ ์๋๊ฐ ๊ฑฐ์ ๋์ผํ๋ค. ๋ชฉ์ ๋ฐํ์์ ์ง์ฐ ์๊ฐ์ด ์๊ธฐ๋ ํธ์ด๋ฏ๋ก ํต์ ๊ธฐ๋ฐ ํ ์คํธ๊ฐ ์ฝ๊ฐ ๋์ ์ ์๋ค. ๊ทธ๋ฌ๋ ์ด๋ฌํ ํ ์คํธ๊ฐ ์๋ง ๊ฐ ์์ค์ด ์๋๋ผ๋ฉด ๋ณ๋ก ์ฐจ์ด๋ ์๋ค.
๐ ๋ฆฌํฉํฐ๋ง ๋ด์ฑ ์งํ๋ก ์คํ์ผ ๋น๊ตํ๊ธฐโ
๋ฆฌํฉํฐ๋ง ๋ด์ฑ์ ๋ฆฌํฉํฐ๋ง ์ค์ ๋ฐ์ํ๋ ๊ฑฐ์ง ์์ฑ ์์ ๋ํ ์ฒ๋๋ค. ๊ฒฐ๊ตญ ๊ฑฐ์ง ์์ฑ์ ์๋ณํ ์ ์๋ ๋์์ด ์๋๋ผ ์ฝ๋์ ๊ตฌํ ์ธ๋ถ ์ฌํญ์ ๊ฒฐํฉ๋ ํ ์คํธ์ ๊ฒฐ๊ณผ๋ค.
์ถ๋ ฅ ๊ธฐ๋ฐ ํ ์คํธ๋ ํ ์คํธ๊ฐ ํ ์คํธ ๋์ ๋ฉ์๋์ ๋ง ๊ฒฐํฉ๋๋ฏ๋ก ๊ฑฐ์ง ์์ฑ ๋ฐฉ์ง๊ฐ ๊ฐ์ฅ ์ฐ์ํ๋ค. ์ด;๋ฌํ ํ ์คํธ๊ฐ ๊ตฌํ ์ธ๋ถ ์ฌํญ์ ๊ฒฐํฉ๋๋ ๊ฒฝ์ฐ๋ ํ ์คํธ ๋์ ๋ฉ์๋๊ฐ ๊ตฌํ ์ธ๋ถ ์ฌํญ์ผ ๋๋ฟ์ด๋ค.
์ํ ๊ธฐ๋ฐ ํ ์คํธ๋ ์ผ๋ฐ์ ์ผ๋ก ๊ฑฐ์ง ์์ฑ์ด ๋๊ธฐ ์ฝ๋ค. ์ด๋ฌํ ํ ์คํธ๋ ํ ์คํธ ๋์ ๋ฉ์๋ ์ธ์๋ ํด๋์ค ์ํ์ ํจ๊ป ์๋ํ๋ค. ์ํ ๊ธฐ๋ฐ ํ ์คํธ๋ ํฐ API ๋ ธ์ถ ์์ญ์ ์์กดํ๋ฏ๋ก, ๊ตฌํ ์ธ๋ถ ์ฌํญ๊ณผ ๊ฒฐํฉํ ๊ฐ๋ฅ์ฑ๋ ๋ ๋๋ค.
ํต์ ๊ธฐ๋ฐ ํ ์คํธ๊ฐ ํ์ ์ ๋ณด์ ๊ฐ์ฅ ์ทจ์ฝํ๋ค. ํ ์คํธ ๋์ญ์ผ๋ก ์ํธ ์์ฉ์ ํ์ธํ๋ ํ ์คํธ๋ ๋๋ถ๋ถ ๊นจ์ง๊ธฐ ์ฝ๋ค. ์ ํ๋ฆฌ์ผ์ด์ ๊ฒฝ๊ณ๋ฅผ ๋๋ ์ํธ ์์ฉ์ ํ์ธํ๊ณ ํด๋น ์ํธ ์์ฉ์ ๋ถ์์ฉ์ด ์ธ๋ถ ํ๊ฒฝ์ ๋ณด์ด๋ ๊ฒฝ์ฐ์๋ง ๋ชฉ์ด ๊ด์ฐฎ๋ค.
๐ ์ ์ง ๋ณด์์ฑ ์งํ๋ก ์คํ์ผ ๋น๊ตํ๊ธฐโ
์ ์ง ๋ณด์์ฑ์ ๋จ์ ํ ์คํธ์ ์ ์ง๋น๋ฅผ ์ธก์ ํ๋ฉฐ, ๋ค์ ๋ ๊ฐ์ง ํน์ฑ์ผ๋ก ์ ์ํ๋ค.
- ํ ์คํธ๋ฅผ ์ดํดํ๊ธฐ ์ผ๋ง๋ ์ด๋ ค์ด๊ฐ?
- ํ ์คํธ๋ฅผ ์คํํ๊ธฐ ์ผ๋ง๋ ์ด๋ ค์ด๊ฐ?
ํ ์คํธ๊ฐ ํฌ๋ฉด, ํ์ํ ๋ ํ์ ํ๊ธฐ๋ ๋ณ๊ฒฝํ๊ธฐ๋ ์ด๋ ค์ฐ๋ฏ๋ก ์ ์ง ๋ณด์๊ฐ ์ฝ์ง ์๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก ํ๋ ์ด์์ ํ๋ก์ธ์ค ์ธ๋ถ ์์กด์ฑ๊ณผ ์ง์ ์๋ํ๋ ํ ์คํธ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์๋ฒ ์ฌ๋ถํ , ๋คํธ์ํฌ ์ฐ๊ฒฐ ๋ฌธ์ ํด๊ฒฐ ๋ฑ๊ณผ ๊ฐ์ด ์ด์ํ๋ ๋ฐ ์๊ฐ์ด ํ์ํ๋ฏ๋ก ์ ์ง ๋ณด์๊ฐ ์ด๋ ต๋ค.
๋ค๋ฅธ ๋ ๊ฐ์ง ์คํ์ผ๊ณผ ๋น๊ตํ๋ฉด, ์ถ๋ ฅ ๊ธฐ๋ฐ ํ ์คํธ๊ฐ ๊ฐ์ฅ ์ ์ง ๋ณด์ํ๊ธฐ ์ฉ์ดํ๋ค. ์ถ๋ ฅ ๊ธฐ๋ฐ ํ ์คํธ๋ ๊ฑฐ ์ ํญ์ ์งง๊ณ ๊ฐ๊ฒฐํ๋ฏ๋ก ์ ์ง ๋ณด์๊ฐ ์ฝ๋ค. ์ถ๋ ฅ ๊ธฐ๋ฐ ํ ์คํธ์ ๊ธฐ๋ฐ ์ฝ๋๋ ์ ์ญ ์ํ๋ ๋ด๋ถ ์ํ๋ฅผ ๋ณ๊ฒฝํ ๋ฆฌ ์์ผ๋ฏ๋ก, ํ๋ก์ธ์ค ์ธ๋ถ ์์กด์ฑ์ ๋ค๋ฃจ์ง ์๋๋ค. ๋ฐ๋ผ์ ๋ ๊ฐ์ง ์ ์ง ๋ณด์์ฑ ๋ชจ๋์ ์ธก๋ฉด์์ ์ถ๋ ฅ ๊ธฐ๋ฐ ํ ์คํธ๊ฐ ๊ฐ์ฅ ์ข๋ค.
์ํ ๊ธฐ๋ฐ ํ ์คํธ๋ ์ผ๋ฐ์ ์ผ๋ก ์ถ๋ ฅ ๊ธฐ๋ฐ ํ ์คํธ๋ณด๋ค ์ ์ฆค ๋ณด์๊ฐ ์ฝ์ง ์๋ค. ์ํ ๊ฒ์ฆ์ ์ข ์ข ์ถ๋ ฅ ๊ฒ์ฆ๋ณด๋ค ๋ ๋ง์ ๊ณต๊ฐ์ ์ฐจ์งํ๊ธฐ ๋๋ฌธ์ด๋ค.
[Fact]
public void Adding_a_comment_to_an_article() {
var sut = new Article();
var text = "Comment text";
var author = "John Doe";
var now = new DateTime(2019, 4, 1);
sut.AddComment(text, author, now);
Assert.Equal(1, sut.Comments.Count);
Assert.Equal(text, sut.Comments[0].Text);
Assert.Equal(author, sut.Comments[0].Author);
Assert.Equal(now, sut.Comments[0].DateCreated);
}
์ด ํ ์คํธ๋ ๋จ์ํ๊ณ ๋๊ธ์ด ํ๋๋ง ์์ง๋ง, ๊ฒ์ฆ๋ถ๋ ๋ค ์ค์ ๊ฑธ์ณ ์๋ค. ์ํ ๊ธฐ๋ฐ ํ ์คํธ๋ ์ข ์ข ํจ์ ๋ง์ ๋ฐ์ดํฐ๋ฅผ ํ์ธํด์ผ ํ๋ฏ๋ก ํฌ๊ธฐ๊ฐ ๋ํญ ์ปค์ง ์ ์๋ค.
ํต์ ๊ธฐ๋ฐ ํ ์คํธ๋ ์ ์ง ๋ณด์์ฑ ์งํ์์ ์ถ๋ ฅ ๊ธฐ๋ฐ ํ ์คํธ์ ์ํ ๊ธฐ๋ฐ ํ ์ค ํธ๋ณด๋ค ์ ์๊ฐ ๋ฎ๋ค. ํต์ ๊ธฐ๋ฐ ํ ์คํธ์๋ ํ ์คํธ ๋์ญ๊ณผ ์ํธ ์์ฉ ๊ฒ์ฆ์ ์ค์ ํด์ผ ํ๋ฉฐ, ์ด๋ ๊ณต๊ฐ์ ๋ง์ด ์ฐจ์งํ๋ค. ๋ชฉ์ด ์ฌ์ฌ ํํ๋ก ์์ ๋ ํ ์คํธ๋ ๋ ์ปค์ง๊ณ ์ ์ง ๋ณด์ํ๊ธฐ๊ฐ ์ด๋ ค์์ง๋ค.
๐ ์คํ์ผ ๋น๊ตํ๊ธฐ: ๊ฒฐ๋ก โ
์ธ ๊ฐ์ง ์คํ์ผ ๋ชจ๋ ํ๊ท ๋ฐฉ์ง๊ณผ ํผ๋๋ฐฑ ์๋ ์งํ์์๋ ์ ์๊ฐ ๊ฐ๋ค.
์ถ๋ ฅ ๊ธฐ๋ฐ ํ ์คํธ๊ฐ ๊ฐ์ฅ ๊ฒฐ๊ณผ๊ฐ ์ข๋ค. ์ด ์คํ์ผ์ ๊ตฌํ ์ธ๋ถ ์ฌํญ๊ณผ ๊ฑฐ์ ๊ฒฐํฉ๋์ง ์์ผ๋ฏ๋ก ๋ฆฌํฉํฐ๋ง ๋ด์ฑ์ ์ ์ ํ ์ ์งํ๊ณ ์ ์ฃผ์๋ฅผ ๋ง์ด ๊ธฐ์ธ์ผ ํ์๊ฐ ์๋ค. ์ด๋ฌํ ํ ์คํธ๋ ๊ฐ๊ฒฐํ๊ณ ํ๋ก์ธ์ค ์ธ๋ถ ์์กด์ฑ์ด ์๊ธฐ ๋๋ฌธ์ ์ ์ง ๋ณด์๋ ์ฝ๋ค.
์ถ๋ ฅ ๊ธฐ๋ฐ | ์ํ ๊ธฐ๋ฐ | ํต์ ๊ธฐ๋ฐ | |
---|---|---|---|
๋ฆฌํฉํฐ๋ง ๋ด์ฑ์ ์งํค๊ธฐ ์ํด ํ์ํ ๋ ธ๋ ฅ | ๋ฎ์ | ์ค๊ฐ | ์ค๊ฐ |
์ ์ง๋น | ๋ฎ์ | ์ค๊ฐ | ๋์ |
์ํ ๊ธฐ๋ฐ ํ
์คํธ์ ํต์ ๊ธฐ๋ฐ ํ
์คํธ๋ ๋ ์งํ ๋ชจ๋ ์ข์ง ์๋ค. ์ ์ถ๋ ๊ตฌํ ์ธ๋ถ ์ฌํญ์ ๊ฒฐํฉํ ๊ฐ๋ฅ์ฑ์ด ๋๊ณ , ํฌ๊ธฐ๋ ์ปค์ ์ ์ง๋น๊ฐ ๋ง์ด ๋ ๋ค.
๊ทธ๋ฌ๋ฏ๋ก ํญ์ ๋ค๋ฅธ ๊ฒ๋ณด๋ค ์ถ๋ ฅ ๊ธฐ๋ฐ ํ
์คํธ๋ฅผ ์ ํธํ๋ผ. ํ์ง๋ง ์ํ๊น๊ฒ๋ ๋งํ๊ธฐ๋ ์ฌ์๋ ํํ๊ธฐ๋ ์ด๋ ต๋ค. ์ถ๋ ฅ ๊ธฐ๋ฐ ์คํ์ผ์ ํจ์ํ์ผ๋ก ์์ฑ๋ ์ฝ๋์๋ง ์ ์ฉํ ์ ์๊ณ , ๋๋ถ๋ถ์ ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์๋ ํด๋นํ์ง ์๋๋ค.
๐ฅ ํจ์ํ ์ํคํ ์ฒ ์ดํดโ
๐ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ด๋?โ
์ถ๋ ฅ ๊ธฐ๋ฐ ๋จ์ ํ ์คํธ ์คํ์ผ์ ํจ์ํ์ด๋ผ๊ณ ๋ ํ๋ค. ๊ธฐ๋ฐ ์ ํ ์ฝ๋๋ฅผ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ์ด์ฉํด ์์ ํจ์ ๋ฐฉ์์ผ๋ก ์์ฑํด์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ์ํ์ ํจ์(์์ ํจ์๋ผ๊ณ ๋ ํจ)๋ฅผ ์ฌ์ฉํ ํ๋ก๊ทธ๋๋ฐ์ด๋ค. ์ํ์ ํจ์๋ ์จ์ ์ ์ถ๋ ฅ์ด ์๋ ํจ์(๋๋ ๋ฉ์๋)๋ค. ์ํ์ ํจ์์ ๋ชจ๋ ์ ์ถ๋ ฅ์ ๋ฉ์๋ ์ด๋ฆ, ์ธ์, ๋ฐํ ํ์ ์ผ๋ก ๊ตฌ์ฑ๋ ๋ฉ์๋ ์๊ทธ๋์ฒ์ ๋ช ์ํด์ผ ํ๋ค. ์ํ์ ํจ์๋ ํธ์ถ ํ์์ ์๊ด์์ด ์ฃผ์ด์ง ์ ๋ ฅ์ ๋ํด ๋์ผํ ์ถ๋ ฅ์ ์์ฑํ๋ค.
public decimal CalculateDiscount(Product[] products) {
decimal discount = products.Length + 0.01m;
return Math.Min(discount, 0.2m);
}
์ด ๋ฉ์๋๋ ํ๋์ ์
๋ ฅ๊ณผ ํ๋์ ์ถ๋ ฅ์ด ์์ผ๋ฉฐ, ๋ ๋ค ๋ฉ์๋ ์๊ทธ๋์ฒ์ ๋ช
์๋ผ ์๋ค. ์ด๋ก์จ CalculateDiscount()
๋ ์ํ์ ํจ์๊ฐ ๋๋ค.
// ์ถ๋ ฅ ์ด๋ฆ ์
๋ ฅ
public decimal CalculateDiscount(Product[] products)
์จ์ ์
์ถ๋ ฅ์ด ์๋ ๋ฉ์๋๋ ์ํ์์ ๋งํ๋ ํจ์์ ์ ์๋ฅผ ์ค์ํ๊ธฐ ๋๋ฌธ์ ์ํ์ ํจ์๋ผ๊ณ ํ๋ค.
์
์ถ๋ ฅ์ ๋ช
์ํ ์ํ์ ํจ์๋ ์ด์ ๋ฐ๋ฅด๋ ํ
์คํธ๊ฐ ์งง๊ณ ๊ฐ๊ฒฐํ๋ฉฐ ์ดํดํ๊ณ ์ ์ง ๋ณด์ํ๊ธฐ ์ฌ์ฐ๋ฏ๋ก ํ
์คํธํ๊ธฐ๊ฐ ๋งค์ฐ ์ฝ๋ค. ์ถ๋ ฅ ๊ธฐ๋ฐ ํ
์คํธ๋ฅผ ์ ์ฉํ ์ ์๋ ๋ฉ์๋ ์ ํ์ ์ํ์ ํจ์๋ฟ์ด๋ค. ์ด๋ ์ ์ง ๋ณด์์ฑ์ด ๋ฐ์ด๋๊ณ ๊ฑฐ์ง ์์ฑ ๋น๋๊ฐ ๋ฎ๋ค.
๋ฐ๋ฉด์ ์จ์ ์ ์ถ๋ ฅ์ ์ฝ๋๋ฅผ ํ ์คํธํ๊ธฐ ํ๋ค๊ฒ ํ๋ค. ์จ์ ์ ์ถ๋ ฅ์ ์ ํ์ ๋ค์๊ณผ ๊ฐ๋ค.
- ๋ถ์์ฉ: ๋ถ์์ฉ์ ๋ฉ์๋ ์๊ทธ๋์ฒ์ ํฌ์๋์ง ์๋ ์ถ๋ ฅ์ด๋ฉฐ, ๋ฐ๋ผ์ ์จ์ด์๋ค.
- ์์ธ: ๋ฉ์๋๊ฐ ์์ธ๋ฅผ ๋์ง๋ฉด, ํ๋ก๊ทธ๋จ ํ๋ฆ์ ๋ฉ์๋ ์๊ทธ๋์ฒ์ ์ค์ ๋ ๊ณ์ฝ์ ์ฐํํ๋ ๊ฒฝ๋ก๋ฅผ ๋ง๋ ๋ค.
- ๋ด์ธ๋ถ ์ํ์ ๋ํ ์ฐธ์กฐ:
DateTime.Now
์ ๊ฐ์ด ์ ์ ์์ฑ์ ์ฌ์ฉํด ํ์ฌ ๋ ์ง์ ์๊ฐ์ ๊ฐ์ ธ์ค๋ ๋ฉ์๋๊ฐ ์์ ์ ์๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ฐ์ดํฐ๋ฅผ ์ง์ํ ์ ์๊ณ , ๋น๊ณต๊ฐ ๋ณ๊ฒฝ ๊ฐ๋ฅ ํ๋๋ฅผ ์ฐธ์กฐํ ์๋ ์๋ค. ์ด ๋ชจ๋ ๋ฉ์๋ ์๊ทธ๋์ฒ์ ์๋ ์คํ ํ๋ฆ์ ๋ํ ์ ๋ ฅ์ด๋ฉฐ, ๋ฐ๋ผ์ ์จ์ด์๋ค.
๋ฉ์๋๊ฐ ์ํ์ ํจ์์ธ์ง ํ๋ณํ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ํ๋ก๊ทธ๋จ์ ๋์์ ๋ณ๊ฒฝํ์ง ์๊ณ ํด๋น ๋ฉ์๋์ ๋ํ ํธ์ถ์ ๋ฐํ ๊ฐ์ผ๋ก ๋์ฒดํ ์ ์๋์ง ํ์ธํ๋ ๊ฒ์ด๋ค. ๋ฉ์๋ ํธ์ถ์ ํด๋น ๊ฐ์ผ๋ก ๋ฐ๊พธ๋ ๊ฒ์ ์ฐธ์กฐ ํฌ๋ช ์ฑ์ด๋ผ๊ณ ํ๋ค.
public int Increment(int x) {
return x + 1;
}
์ด ๋ฉ์๋๋ ์ํ์ ํจ์๋ค. ๋ค์ ๋ ๊ตฌ๋ฌธ์ ์๋ก ๋์ผํ๋ค.
int y = Increment(4);
int y = 5;
๋ฐ๋ฉด์ ๋ค์ ๋ฉ์๋๋ ์ํ์ ํจ์๊ฐ ์๋๋ค. ๋ฐํ ๊ฐ์ด ๋ฉ์๋์ ์ถ๋ ฅ์ ๋ชจ๋ ๋ํ๋ด์ง ์์ผ๋ฏ๋ก ๋ฐํ ๊ฐ์ผ๋ก ๋์ฒดํ ์ ์๋ค.
int x = 0;
public int Increment() {
x++;
return x;
}
๐ ํจ์ํ ์ํคํ ์ฒ๋?โ
ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ๋ชฉํ๋ ๋ถ์์ฉ์ ์์ ํ ์ ๊ฑฐํ๋ ๊ฒ์ด ์๋๋ผ ๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌํ๋ ์ฝ๋์ ๋ถ์์ฉ์ ์ผ์ผํค๋ ์ฝ๋๋ฅผ ๋ถ๋ฆฌํ๋ ๊ฒ์ด๋ค. ์ด ๋ ๊ฐ์ง ์ฑ ์์ ๊ฐ๊ฐ๋ง ๋ณด๋๋ผ๋ ์ถฉ๋ถํ ๋ณต์กํ๋ค. ๋ชจ๋ ๊ณ ๋ คํ๋ฉด ๋ณต์ก๋๊ฐ ๋ฐฐ๊ฐ๋๊ณ ์ฅ๊ธฐ์ ์ผ๋ก ์ฝ๋์ ์ ์ง ๋ณด์์ฑ์ ๋ฐฉํดํ๋ค. ๋ถ์์ฉ์ ๋น์ฆ๋์ค ์ฐ์ฐ ๋์ผ๋ก ๋ชฐ์์ ๋น์ฆ๋์ค ๋ก์ง์ ๋ถ์์ฉ๊ณผ ๋ถ๋ฆฌํ๋ค.
๋ค์ ๋ ๊ฐ์ง ์ฝ๋ ์ ํ์ ๊ตฌ๋ถํด์ ๋น์ฆ๋์ค ๋ก์ง๊ณผ ๋ถ์์ฉ์ ๋ถ๋ฆฌํ ์ ์๋ค.
- ๊ฒฐ์ ์ ๋ด๋ฆฌ๋ ์ฝ๋: ์ด ์ฝ๋๋ ๋ถ์์ฉ์ด ํ์ ์๊ธฐ ๋๋ฌธ์ ์ํ์ ํจ์๋ฅผ ์ฌ์ฉํด ์์ฑํ ์ ์๋ค.
- ํด๋น ๊ฒฐ์ ์ ๋ฐ๋ผ ์์ฉํ๋ ์ฝ๋: ์ด ์ฝ๋๋ ์ํ์ ํจ์์ ์ํด ์ด๋ค์ง ๋ชจ๋ ๊ฒฐ์ ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ณ๊ฒฝ์ด๋ ๋ฉ์์ง ๋ฒ์ค๋ก ์ ์ก๋ ๋ฉ์์ง์ ๊ฐ์ด ๊ฐ์์ ์ธ ๋ถ๋ถ์ผ๋ก ๋ณํํ๋ค.
๊ฒฐ์ ์ ๋ด๋ฆฌ๋ ์ฝ๋๋ ์ข ์ข ํจ์ํ ์ฝ์ด๋ผ๊ณ ๋ ํ๋ค. ํด๋น ๊ฒฐ์ ์ ๋ฐ๋ผ ์์ฉํ๋ ์ฝ๋๋ ๊ฐ๋ณ ์ ์ด๋ค.
- ๊ฐ๋ณ ์ ธ์ ๋ชจ๋ ์ ๋ ฅ์ ์์งํ๋ค.
- ํจ์ํ ์ฝ์ด๋ ๊ฒฐ์ ์ ์์ฑํ๋ค.
- ์ ธ์ ๊ฒฐ์ ์ ๋ถ์์ฉ์ผ๋ก ๋ณํํ๋ค.
์ด ๋ ๊ณ์ธต์ ๊ณ์ ์ ๋ถ๋ฆฌํ๋ ค๋ฉด, ๊ฐ๋ณ ์ ธ์ ์์ฌ ๊ฒฐ์ ์ ์ถ๊ฐํ์ง ์๊ฒ๋ ๊ฒฐ์ ์ ๋ํ๋ด๋ ํด๋์ค์ ์ ๋ณด๊ฐ ์ถฉ๋ถํ ์๋์ง ํ์ธํด์ผ ํ๋ค. ๋ค์ ๋งํด, ๊ฐ๋ณ ์ ธ์ ๊ฐ๋ฅํ ํ ์๋ฌด๋ง๋ ํ์ง ์์์ผ ํ๋ค. ๋ชฉํ๋ ์ถ๋ ฅ ๊ธฐ๋ฐ ํ ์คํธ๋ก ํจ์ํ ์ฝ์ด๋ฅผ ๋๋ฃจ ๋๋ฃจ๊ณ ๊ฐ๋ณ ์ ธ์ ํจ์ฌ ๋ ์ ์ ์์ ํตํฉ ํ ์คํธ์ ๋งก๊ธฐ๋ ๊ฒ์ด๋ค.
๐ ํจ์ํ ์ํคํ ์ฒ์ ์ก๊ฐํ ์ํคํ ์ฒ ๋น๊ตโ
ํจ์ํ ์ํคํ ์ฒ์ ์ก๊ฐํ ์ํคํ ์ฒ๋ ๋น์ทํ ์ ์ด ๋ง๋ค. ๋ ๋ค ๊ด์ฌ์ฌ ๋ถ๋ฆฌ๋ผ๋ ์์ด๋์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ค. ๊ทธ๋ฌ๋ ๋ถ๋ฆฌ๋ฅผ ๋๋ฌ์ผ ๊ตฌ์ฒด์ ์ธ ๋ด์ฉ์ ๋ค์ํ๋ค.
์ก๊ฐํ ์ํคํ ์ฒ๋ ๋๋ฉ์ธ ๊ณ์ธต๊ณผ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น์ค ๊ณ์ธต์ ๊ตฌ๋ณํ๋ค. ๋๋ฉ์ธ ๊ณ์ธต์ ๋น์ฆ๋์ค ๋ก์ง์ ์ฑ ์์ด ์๋ ๋ฐ๋ฉด, ์ ํ๋ฆฌ์ผ์ด์ ์๋น์ค ๊ณ์ธต์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ SMTP ์๋น์ค์ ๊ฐ์ด ์ธ๋ถ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ์ ํต์ ์ ์ฑ ์์ด ์๋ค. ์ด๋ ๊ฒฐ์ ๊ณผ ์คํ์ ๋ถ๋ฆฌํ๋ ํจ์ํ ์ํคํ ์ฒ์ ๋งค์ฐ ์ ์ฌํ๋ค.
๋ ๋ค๋ฅธ ์ ์ฌ์ ์ ์์กด์ฑ ๊ฐ์ ๋จ๋ฐฉํฅ ํ๋ฆ์ด๋ค. ์ก๊ฐํ ์ํคํ ์ฒ์์ ๋๋ฉ์ธ ๊ณ์ธต ๋ด ํด๋์ค๋ ์๋ก์๊ฒ๋ง ์์กดํด์ผ ํ๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์๋น์ค ๊ณ์ธต์ ํด๋์ค์ ์์กดํด์๋ ์๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก ํจ์ํ ์ํคํ ์ฒ์ ๋ถ๋ณ ์ฝ์ด๋ ๊ฐ๋ณ ์ ธ์ ์์กดํ์ง ์๋๋ค. ์๊ธํ ์ ์๊ณ ์ธ๋ถ ๊ณ์ธต๊ณผ ๊ฒฉ๋ฆฌ๋ผ ์๋ํ ์ ์๋ค. ์ด๋ก ์ธํด ํจ์ํ ์ํคํ ์ฒ๋ฅผ ํ ์คํธํ๊ธฐ ์ฝ๋ค.
์ด ๋์ ์ฐจ์ด์ ์ ๋ถ์์ฉ์ ๋ํ ์ฒ๋ฆฌ์ ์๋ค. ํจ์ํ ์ํคํ ์ฒ๋ ๋ชจ๋ ๋ถ์์ฉ์ ๋ถ๋ณ ์ฝ์ด์์ ๋น์ฆ๋์ค ์ฐ์ฐ ๊ฐ์ฅ์๋ฆฌ๋ก ๋ฐ์ด๋ธ๋ค. ์ด ๊ฐ์ฅ์๋ฆฌ๋ ๊ฐ๋ณ ์ ธ์ด ์ฒ๋ฆฌํ๋ค. ๋ฐ๋ฉด ์ก๊ฐํ ์ํคํ ์ฒ๋ ๋๋ฉ์ธ ๊ณ์ธต์ ์ ํํ๋ ํ, ๋๋ฉ์ธ ๊ณ์ธต์ผ๋ก ์ธํ ๋ถ์์ฉ๋ ๋ฌธ์ ์๋ค. ์ก๊ฐํ ์ํคํ ์ฒ์ ๋ชจ๋ ์์ ์ฌํญ์ ๋๋ฉ์ธ ๊ณ์ธต ๋ด์ ์์ด์ผ ํ๋ฉฐ, ๊ณ์ธต์ ๊ฒฝ๊ณ๋ฅผ ๋์ด์๋ ์ ๋๋ค.
๐ฅ ํจ์ํ ์ํคํ ์ฒ์ ์ถ๋ ฅ ๊ธฐ๋ฐ ํ ์คํธ๋ก์ ์ ํโ
์ํ ๊ธฐ๋ฐ ํ ์คํธ์ ํต์ ๊ธฐ๋ฐ ํ ์คํธ๋ฅผ ์ถ๋ ฅ ๊ธฐ๋ฐ ํ ์คํธ ์คํ์ผ๋ก ๋ฆฌํฉํฐ๋งํ ๊ฒ์ด๋ค.
๐ ๊ฐ์ฌ ์์คํ ์๊ฐโ
์ํ ํ๋ก์ ํธ๋ ์กฐ์ง์ ๋ชจ๋ ๋ฐฉ๋ฌธ์๋ฅผ ์ถ์ ํ๋ ๊ฐ์ฌ ์์คํ ์ด๋ค. ์ด ์์คํ ์ ๊ฐ์ฅ ์ต๊ทผ ํ์ผ์ ๋ง์ง๋ง ์ค์ ๋ฐฉ๋ฌธ์์ ์ด๋ฆ๊ณผ ๋ฐฉ๋ฌธ ์๊ฐ์ ์ถ๊ฐํ๋ค. ํ์ผ๋น ์ต๋ ํญ๋ชฉ ์์ ๋๋ฌํ๋ฉด ์ธ๋ฑ์ค๋ฅผ ์ฆ๊ฐ์์ผ ์ ํ์ผ์ ์์ฑํ๋ค.
public class AuditManager {
private readonly int _maxEntriesPerFile;
private readonly string _directoryName;
public AuditManager(int maxEntriesPerFile, string directoryName) { // ์ต๋ ํญ๋ชฉ ์์ ์์
๋๋ ํฐ๋ฆฌ๋ฅผ ์ค์ ๋งค๊ฐ๋ณ์๋ก ๋ฐ๋๋ค.
_maxEntriesPerFile = max EntriesPerFile;
_directoryName = directoryName;
}
public void AddRecord(string visitorName, DateTime timeOfVisit) {
// ์์
๋๋ ํฐ๋ฆฌ์์ ์ ์ฒด ํ์ผ ๋ชฉ๋ก์ ๊ฒ์
string[] filePaths = Directory.GetFiles(_directoryName);
// ์ธ๋ฑ์ค๋ณ๋ก ์ ๋ ฌ
(int index, string path)[] sorted = SortByIndex(filePaths);
string newRecord = visitorName + ';' + timeOfVisit;
// ์์ง ๊ฐ์ ํ์ผ์ด ์์ผ๋ฉด ๋จ์ผ ๋ ์ฝ๋๋ก ์ฒซ ๋ฒ์งธ ํ์ผ์ ์์ฑํ๋ค.
if (sorted.Length == 0) {
string newFile = Path.Combine(_directoryName, "audit+1.txt");
File.WriteAllText(newFile, newRecord);
return;
}
// ๊ฐ์ ํ์ผ์ด ์์ผ๋ฉด ์ต์ ํ์ผ์ ๊ฐ์ ธ์์ ํ์ผ์ ํญ๋ชฉ ์๊ฐ ํ๊ณ์ ๋๋ฌํ๋์ง์ ๋ฐ๋ผ ์ ๋ ์ฝ๋๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์ ํ์ผ์ ์์ฑํ๋ค.
(int currentFileIndex, string currentFilePath) = sorted.Last();
List<string> lines = File.ReadAllLines(currentFilePath).ToList();
if (lines.Count < _maxEntriesPerFile) {
lines.Add(newRecord);
string newContent = string.Join("\r\n", lines);
File.WriteAllText(currentFilePath, newContent);
} else {
int newIndex = currentFileIndex + 1;
string newName = $"audit_{newIndex}.txt";
string newFile = Path.Combine(_directoryName, newName);
File.WriteAllText(newFile, newRecord);
}
}
}
AuditManager
ํด๋์ค๋ ํ์ผ ์์คํ
๊ณผ ๋ฐ์ ํ๊ฒ ์ฐ๊ฒฐ๋ผ ์์ด ๊ทธ๋๋ก ํ
์คํธํ๊ธฐ๊ฐ ์ด๋ ต๋ค. ํ
์คํธ ์ ์ ํ์ผ์ ์ฌ๋ฐ๋ฅธ ์์น์ ๋ฐฐ์นํ๊ณ , ํ
์คํธ๊ฐ ๋๋๋ฉด ํด๋น ํ์ผ์ ์ฝ๊ณ ๋ด์ฉ์ ํ์ธํ ํ ์ญ์ ํด์ผ ํ๋ค.
๋ณ๋ชฉ ์ง์ ์ ํ์ผ ์์คํ
์ด๋ค. ์ด๋ ํ
์คํธ๊ฐ ์คํ ํ๋ฆ์ ๋ฐฉํดํ ์ ์๋ ๊ณต์ ์์กด์ฑ์ด๋ค.
๋ ํ์ผ ์์คํ
์ ํ
์คํธ๋ฅผ ๋๋ฆฌ๊ฒ ํ๋ค. ๋ก์ปฌ ์์คํ
๊ณผ ๋น๋ ์๋ฒ ๋ชจ๋ ์์
๋๋ ํฐ๋ฆฌ๊ฐ ์๊ณ ํ
์คํธํ ์ ์์ด์ผ ํ๋ฏ๋ก ์ ์ง ๋ณด์์ฑ๋ ์ ํ๋๋ค.
ํํธ ํ์ผ ์์คํ ์ ์ง์ ์๋ํ๋ ํ ์คํธ๋ ๋จ์ ํ ์คํธ์ ์ ์์ ๋ง์ง ์๋๋ค. ๋จ์ ํ ์คํธ์ ๋ ๋ฒ์งธ์ ์ธ ๋ฒ์งธ ํน์ฑ์ ์ค์ํ์ง ์์ผ๋ฏ๋ก, ํตํฉ ํ ์คํธ ๋ฒ์ฃผ์ ์ํ๋ค.
- ๋จ์ ํ ์คํธ๋ ๋จ์ ๋์์ ๊ฒ์ฆํ๊ณ
- ๋น ๋ฅด๊ฒ ์ํํ๊ณ
- ๋ค๋ฅธ ํ ์คํธ์ ๋ณ๋๋ก ์ฒ๋ฆฌํ๋ค.
๐ ํ ์คํธ๋ฅผ ํ์ผ ์์คํ ์์ ๋ถ๋ฆฌํ๊ธฐ ์ํ ๋ชฉ ์ฌ์ฉโ
ํ
์คํธ๊ฐ ๋ฐ์ ํ๊ฒ ๊ฒฐํจ๋ ๋ฌธ์ ๋ ์ผ๋ฐ์ ์ผ๋ก ํ์ผ ์์คํ
์ ๋ชฉ์ผ๋ก ์ฒ๋ฆฌํด ํด๊ฒฐํ๋ค. ํ์ผ์ ๋ชจ๋ ์ฐ์ฐ์ ๋ณ๋์ ํด๋์ค(IFileSystem
)๋ก ๋์ถํ๊ณ AuditManager
์ ์์ฑ์๋ก ํด๋น ํด๋์ค๋ฅผ ์ฃผ์
ํ ์ ์๋ค. ๊ทธ๋ฐ ๋ค์ ํ
์คํธ๋ ์ด ํด๋์ค๋ฅผ ๋ชฉ์ผ๋ก ์ฒ๋ฆฌํ๊ณ ๊ฐ์ฌ ์์คํ
์ด ํ์ผ์ ์ํํ๋ ์ฐ๊ธฐ๋ฅผ ์บก์ฒํ๋ค.
public class AuditManager {
private readonly int _maxEntriesPerFile;
private readonly string _directoryName;
private readonly IFileSystem _fileSystem;
public AuditManager(
int maxEntriesPerFile, string directoryName, IFileSystem fileSystem
) {
_maxEntriesPerFile = maxEntriesPerFile;
_directoryName = directoryName;
_fileSystem = fileSystem;
}
}
๋ค์์ AddRecord
๋ฉ์๋๋ค.
public void AddRecord(string visitorName, DateTime timeOfVisit) {
string[] filePaths = _fileSystem.GetFiles(_directoryName);
(int index, string path)[] sorted = SortByIndex(filePaths);
string newRecord = visitorName + ';' + timeOfVisit;
if (sorted.Length == 0) {
string newFile = Path.Combine(_directoryName, "audit+1.txt");
_fileSystem.WriteAllText(newFile, newRecord);
return;
}
(int currentFileIndex, string currentFilePath) = sorted.Last();
List<string> lines = _fileSystem.ReadAllLines(currentFilePath).ToList();
if (lines.Count < _maxEntriesPerFile) {
lines.Add(newRecord);
string newContent = string.Join("\r\n", lines);
_fileSystem.WriteAllText(currentFilePath, newContent);
} else {
int newIndex = currentFileIndex + 1;
string newName = $"audit_{newIndex}.txt";
string newFile = Path.Combine(_directoryName, newName);
_fileSystem.WriteAllText(newFile, newRecord);
}
}
์ด์ AuditManager
๊ฐ ํ์ผ ์์คํ
์์ ๋ถ๋ฆฌ๋๋ฏ๋ก, ๊ณต์ ์์กด์ฑ์ด ์ฌ๋ผ์ง๊ณ ํ
์คํธ๋ฅผ ์๋ก ๋
๋ฆฝ์ ์ผ๋ก ์คํํ ์ ์๋ค. ๋ค์์ ๊ทธ๋ฌํ ํ
์คํธ๋ค.
[Fact]
public void A_new_file_is_created_when_the_current_file_overflows() {
var fileSystemMock = new Mock<IFileSystem>();
fileSystemMock
.Setup(x => x.GetFiles("audits"))
.Returns(new string[] {
@"audits\audit_1.txt",
@"audits\audit_2.txt"
});
fileSystemMock
.Setup(x => x.ReadAllLines(@"audits\audit_2.txt"))
.Returns(new List<string> {
"Peter; 2019-04-06T16:30:00",
"Jane; 2019-04-06T16:40:00",
"Jack; 2019-04-06T17:00:00",
});
var sut = new AuditManager(3, "audits", fileSystemMock.Object);
sut.AddRecord("Alice", DateTime.Pars("2019-04-06T18:00:00"));
fileSystemMock.verify(x => x.WriteAllText(
@"audits\audit_3.txt"
"Alice; 2019-04-06T18:00:00",
));
}
์ด ๊ตฌํ์ ์ด๊ธฐ ๋ฒ์ ๋ณด๋ค ๊ฐ์ ๋๋ค. ํ
์คํธ๋ ๋ ์ด์ ํ์ผ ์์คํ
์ ์ ๊ทผํ์ง ์์ผ๋ฏ๋ก ๋ ๋นจ๋ฆฌ ์คํ๋๋ค. ํ
์คํธ๋ฅผ ๋ง์กฑ์ํค๋ ค๊ณ ํ์ผ ์์คํ
์ ๋ค๋ฃฐ ํ์๊ฐ ์์ผ๋ฏ๋ก ์ ์ง๋น๋ ์ ๊ฐ๋๋ค. ๋ฆฌํฉํฐ๋ง์ ํด๋ ํ๊ท ๋ฐฉ์ง์ ๋ฆฌํฉํฐ๋ง ๋ด์ฑ์ด ๋๋น ์ง์ง ์์๋ค.
ํ์ง๋ง ๋ ๊ฐ์ ํ ์ ์๋ค. ๋ชฉ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ต์ ์ ๋คํด ๋์์ ์ฃผ์ง๋ง, ์์ฑ๋ ํ
์คํธ๋ ์ฌ์ ํ ํ์ดํ ์
์ถ๋ ฅ์ ์์กดํ๋ ํ
์คํธ๋งํผ ์ฝ๊ธฐ๊ฐ ์ฝ์ง ์๋ค.