\ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1\uc740 \uc18c\ud504\ud2b8\uc6e8\uc5b4 \uc2dc\uc2a4\ud15c\uc758 \ud575\uc2ec \uae30\ub2a5\uc744 \uc815\uc758\ud558\uba70, \uc774 \ub85c\uc9c1\uc774 \uc62c\ubc14\ub974\uac8c \uc791\ub3d9\ud558\ub294\uc9c0 \ud655\uc778\ud558\ub294 \uac83\uc740 \ub9e4\uc6b0 \uc911\uc694\ud569\ub2c8\ub2e4. \ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1\uc758 \ud14c\uc2a4\ud2b8\uc640 \uac80\uc99d\uc744 \uc704\ud55c \uc2a4\ud399 \ud328\ud134\uc740 \uc774\ub7ec\ud55c \uacfc\uc815\uc744 \uccb4\uacc4\uc801\uc73c\ub85c \uc9c0\uc6d0\ud558\ub294 \ubc29\ubc95\ub860\uc785\ub2c8\ub2e4. \ubcf8 \uae00\uc5d0\uc11c\ub294 \uc2a4\ud399 \ud328\ud134\uc758 \uac1c\ub150, \uc7a5\uc810, \uc801\uc6a9 \uc0ac\ub840 \ub4f1\uc744 \ud1b5\ud574 \ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1\uc758 \ud14c\uc2a4\ud2b8\uc640 \uac80\uc99d\uc5d0 \ub300\ud55c \uae4a\uc774 \uc788\ub294 \ud1b5\ucc30\uc744 \uc81c\uacf5\ud558\uace0\uc790 \ud569\ub2c8\ub2e4.<\/p>\n
\uc2a4\ud399 \ud328\ud134(Specification Pattern)\uc740 \uac1d\uccb4 \uc9c0\ud5a5 \ud504\ub85c\uadf8\ub798\ubc0d\uc5d0\uc11c \ud2b9\uc815 \uc870\uac74\uc744 \uc815\uc758\ud558\uace0 \uc774\ub97c \uae30\ubc18\uc73c\ub85c \uac1d\uccb4\uc758 \uc0c1\ud0dc\ub97c \uac80\uc99d\ud558\ub294 \ubc29\ubc95\ub860\uc785\ub2c8\ub2e4. \uc774 \ud328\ud134\uc740 \uc8fc\ub85c \ub3c4\uba54\uc778 \ubaa8\ub378\uc5d0\uc11c \ube44\uc988\ub2c8\uc2a4 \uaddc\uce59\uc744 \ud45c\ud604\ud558\ub294 \ub370 \uc0ac\uc6a9\ub429\ub2c8\ub2e4. \uc2a4\ud399 \ud328\ud134\uc740 \ub2e4\uc74c\uacfc \uac19\uc740 \uc8fc\uc694 \uc694\uc18c\ub85c \uad6c\uc131\ub429\ub2c8\ub2e4:<\/p>\n
\uc2a4\ud399 \ud328\ud134\uc740 \ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1\uc744 \uba85\ud655\ud558\uac8c \ud45c\ud604\ud558\uace0, \ud14c\uc2a4\ud2b8 \uac00\ub2a5\uc131\uc744 \ub192\uc774\uba70, \ucf54\ub4dc\uc758 \uc7ac\uc0ac\uc6a9\uc131\uc744 \uc99d\uac00\uc2dc\ud0a4\ub294 \ub370 \uae30\uc5ec\ud569\ub2c8\ub2e4. \uc774\ub7ec\ud55c \ud2b9\uc131 \ub355\ubd84\uc5d0 \uc2a4\ud399 \ud328\ud134\uc740 \uc18c\ud504\ud2b8\uc6e8\uc5b4 \uac1c\ubc1c\uc5d0\uc11c \uc810\uc810 \ub354 \ub9ce\uc774 \uc0ac\uc6a9\ub418\uace0 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n
\uc2a4\ud399 \ud328\ud134\uc744 \ud65c\uc6a9\ud558\ub294 \ub370\uc5d0\ub294 \uc5ec\ub7ec \uac00\uc9c0 \uc7a5\uc810\uc774 \uc788\uc2b5\ub2c8\ub2e4. \uc774 \uc139\uc158\uc5d0\uc11c\ub294 \uadf8 \uc911 \uba87 \uac00\uc9c0\ub97c \uc0b4\ud3b4\ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n
2.1. \uac00\ub3c5\uc131 \ud5a5\uc0c1<\/strong><\/p>\n
\uc2a4\ud399 \ud328\ud134\uc740 \ube44\uc988\ub2c8\uc2a4 \uaddc\uce59\uc744 \uba85\ud655\ud558\uac8c \ud45c\ud604\ud560 \uc218 \uc788\ub3c4\ub85d \ub3c4\uc640\uc90d\ub2c8\ub2e4. \uc774\ub97c \ud1b5\ud574 \uac1c\ubc1c\uc790\uc640 \ube44\uc988\ub2c8\uc2a4 \uc774\ud574\uad00\uacc4\uc790 \uac04\uc758 \uc758\uc0ac\uc18c\ud1b5\uc774 \uc6d0\ud65c\ud574\uc9d1\ub2c8\ub2e4. \uc608\ub97c \ub4e4\uc5b4, \ub2e4\uc74c\uacfc \uac19\uc740 \uc2a4\ud399\uc744 \uc815\uc758\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4:<\/p>\n
public class AgeSpecification implements Specification {\n private int minimumAge;\n\n public AgeSpecification(int minimumAge) {\n this.minimumAge = minimumAge;\n }\n\n @Override\n public boolean isSatisfiedBy(Person person) {\n return person.getAge() >= minimumAge;\n }\n}<\/code><\/pre>\n\uc704\uc758 \ucf54\ub4dc\ub294 \ud2b9\uc815 \uc5f0\ub839 \uc774\uc0c1\uc758 \uc0ac\ub78c\uc744 \uac80\uc99d\ud558\ub294 \uc2a4\ud399\uc744 \uc815\uc758\ud55c \uac83\uc785\ub2c8\ub2e4. \uc774\ucc98\ub7fc \uba85\ud655\ud55c \uaddc\uce59 \uc815\uc758\ub294 \uac00\ub3c5\uc131\uc744 \ub192\uc785\ub2c8\ub2e4.<\/p>\n
2.2. \ud14c\uc2a4\ud2b8 \uc6a9\uc774\uc131<\/strong><\/p>\n
\uc2a4\ud399 \ud328\ud134\uc740 \ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1\uc744 \ub3c5\ub9bd\uc801\uc73c\ub85c \ud14c\uc2a4\ud2b8\ud560 \uc218 \uc788\ub294 \uad6c\uc870\ub97c \uc81c\uacf5\ud569\ub2c8\ub2e4. \uac01 \uc2a4\ud399\uc740 \ub3c5\ub9bd\uc801\uc73c\ub85c \ud14c\uc2a4\ud2b8\ud560 \uc218 \uc788\uc73c\uba70, \uc774\ub294 \ud14c\uc2a4\ud2b8 \ucee4\ubc84\ub9ac\uc9c0\ub97c \ub192\uc774\ub294 \ub370 \uae30\uc5ec\ud569\ub2c8\ub2e4. \uc608\ub97c \ub4e4\uc5b4, \uc704\uc5d0\uc11c \uc815\uc758\ud55c AgeSpecification<\/code> \ud074\ub798\uc2a4\ub294 \ub2e8\uc704 \ud14c\uc2a4\ud2b8\ub97c \ud1b5\ud574 \uc27d\uac8c \uac80\uc99d\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n
public class AgeSpecificationTest {\n @Test\n public void testIsSatisfiedBy() {\n AgeSpecification spec = new AgeSpecification(18);\n Person person = new Person(\"John\", 20);\n assertTrue(spec.isSatisfiedBy(person));\n }\n}<\/code><\/pre>\n\uc774\uc640 \uac19\uc774 \uac01 \uc2a4\ud399\uc5d0 \ub300\ud55c \ud14c\uc2a4\ud2b8\ub97c \uc791\uc131\ud568\uc73c\ub85c\uc368 \ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1\uc758 \uc2e0\ub8b0\uc131\uc744 \ub192\uc77c \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n
2.3. \uc7ac\uc0ac\uc6a9\uc131 \uc99d\uac00<\/strong><\/p>\n
\uc2a4\ud399 \ud328\ud134\uc740 \uc870\uac74\uc744 \uc7ac\uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 \uad6c\uc870\ub97c \uc81c\uacf5\ud569\ub2c8\ub2e4. \uc5ec\ub7ec \ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1\uc5d0\uc11c \ub3d9\uc77c\ud55c \uc870\uac74\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\uc73c\ubbc0\ub85c \ucf54\ub4dc \uc911\ubcf5\uc744 \uc904\uc77c \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc608\ub97c \ub4e4\uc5b4, AgeSpecification<\/code>\uc744 \uc5ec\ub7ec \uacf3\uc5d0\uc11c \uc7ac\uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n
3. \uc2a4\ud399 \ud328\ud134\uc758 \uc801\uc6a9 \uc0ac\ub840<\/h2>\n\uc2a4\ud399 \ud328\ud134\uc740 \ub2e4\uc591\ud55c \ubd84\uc57c\uc5d0\uc11c \ud65c\uc6a9\ub420 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774 \uc139\uc158\uc5d0\uc11c\ub294 \uba87 \uac00\uc9c0 \uc2e4\uc81c \uc0ac\ub840\ub97c \ud1b5\ud574 \uc2a4\ud399 \ud328\ud134\uc758 \uc801\uc6a9 \uac00\ub2a5\uc131\uc744 \uc0b4\ud3b4\ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n
3.1. \uc804\uc790\uc0c1\uac70\ub798 \uc2dc\uc2a4\ud15c<\/strong><\/p>\n
\uc804\uc790\uc0c1\uac70\ub798 \uc2dc\uc2a4\ud15c\uc5d0\uc11c\ub294 \ub2e4\uc591\ud55c \ube44\uc988\ub2c8\uc2a4 \uaddc\uce59\uc774 \uc874\uc7ac\ud569\ub2c8\ub2e4. \uc608\ub97c \ub4e4\uc5b4, \ud2b9\uc815 \uc0c1\ud488\uc774 \ud560\uc778 \ub300\uc0c1\uc778\uc9c0 \uc5ec\ubd80\ub97c \ud310\ub2e8\ud558\ub294 \uc2a4\ud399\uc744 \uc815\uc758\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub2e4\uc74c\uc740 \ud560\uc778 \uc870\uac74\uc744 \uac80\uc99d\ud558\ub294 \uc2a4\ud399\uc758 \uc608\uc785\ub2c8\ub2e4:<\/p>\n
public class DiscountSpecification implements Specification {\n @Override\n public boolean isSatisfiedBy(Product product) {\n return product.isDiscountable() && product.getStock() > 0;\n }\n}<\/code><\/pre>\n\uc774 \uc2a4\ud399\uc740 \uc0c1\ud488\uc774 \ud560\uc778 \uac00\ub2a5\ud55c\uc9c0 \uc5ec\ubd80\ub97c \ud310\ub2e8\ud558\ub294 \ub370 \uc0ac\uc6a9\ub420 \uc218 \uc788\uc73c\uba70, \uc804\uc790\uc0c1\uac70\ub798 \uc2dc\uc2a4\ud15c\uc758 \ub2e4\uc591\ud55c \ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1\uc5d0\uc11c \uc7ac\uc0ac\uc6a9\ub420 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n
3.2. \uae08\uc735 \uc11c\ube44\uc2a4<\/strong><\/p>\n
\uae08\uc735 \uc11c\ube44\uc2a4\uc5d0\uc11c\ub294 \uace0\uac1d\uc758 \uc2e0\uc6a9\ub3c4\ub97c \ud3c9\uac00\ud558\ub294 \ub370 \uc2a4\ud399 \ud328\ud134\uc744 \ud65c\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc608\ub97c \ub4e4\uc5b4, \uace0\uac1d\uc758 \uc2e0\uc6a9 \uc810\uc218\uc640 \uc18c\ub4dd\uc744 \uae30\ubc18\uc73c\ub85c \ub300\ucd9c \uac00\ub2a5\uc131\uc744 \ud310\ub2e8\ud558\ub294 \uc2a4\ud399\uc744 \uc815\uc758\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4:<\/p>\n
public class LoanEligibilitySpecification implements Specification {\n @Override\n public boolean isSatisfiedBy(Customer customer) {\n return customer.getCreditScore() >= 700 && customer.getIncome() > 3000;\n }\n}<\/code><\/pre>\n\uc774 \uc2a4\ud399\uc740 \ub300\ucd9c \uc2e0\uccad \uc2dc \uace0\uac1d\uc758 \uc790\uaca9\uc744 \ud3c9\uac00\ud558\ub294 \ub370 \uc0ac\uc6a9\ub420 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n
4. \uc2a4\ud399 \ud328\ud134 \uad6c\ud604 \ubc29\ubc95<\/h2>\n
\uc2a4\ud399 \ud328\ud134\uc744 \uad6c\ud604\ud558\uae30 \uc704\ud574\uc11c\ub294 \uba87 \uac00\uc9c0 \ub2e8\uacc4\ub97c \uac70\uccd0\uc57c \ud569\ub2c8\ub2e4. \uc774 \uc139\uc158\uc5d0\uc11c\ub294 \uc2a4\ud399 \ud328\ud134\uc744 \uad6c\ud604\ud558\ub294 \ubc29\ubc95\uc5d0 \ub300\ud574 \uc124\uba85\ud558\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n
4.1. \uc778\ud130\ud398\uc774\uc2a4 \uc815\uc758<\/strong><\/p>\n
\uc2a4\ud399 \ud328\ud134\uc758 \uccab \ubc88\uc9f8 \ub2e8\uacc4\ub294 \uc2a4\ud399 \uc778\ud130\ud398\uc774\uc2a4\ub97c \uc815\uc758\ud558\ub294 \uac83\uc785\ub2c8\ub2e4. \uc774 \uc778\ud130\ud398\uc774\uc2a4\ub294 \ud2b9\uc815 \uc870\uac74\uc744 \uac80\uc99d\ud558\ub294 \uba54\uc11c\ub4dc\ub97c \ud3ec\ud568\ud574\uc57c \ud569\ub2c8\ub2e4.<\/p>\n
public interface Specification {\n boolean isSatisfiedBy(T t);\n}<\/code><\/pre>\n4.2. \uc870\uac74 \ud074\ub798\uc2a4 \uad6c\ud604<\/strong><\/p>\n
\ub2e4\uc74c \ub2e8\uacc4\ub294 \ube44\uc988\ub2c8\uc2a4 \uaddc\uce59\uc5d0 \ub530\ub77c \uc870\uac74 \ud074\ub798\uc2a4\ub97c \uad6c\ud604\ud558\ub294 \uac83\uc785\ub2c8\ub2e4. \uac01 \uc870\uac74 \ud074\ub798\uc2a4\ub294 Specification<\/code> \uc778\ud130\ud398\uc774\uc2a4\ub97c \uad6c\ud604\ud574\uc57c \ud569\ub2c8\ub2e4.<\/p>\n
public class ProductAvailabilitySpecification implements Specification {\n @Override\n public boolean isSatisfiedBy(Product product) {\n return product.getStock() > 0;\n }\n}<\/code><\/pre>\n4.3. \uc870\ud569 \uac00\ub2a5\uc131 \uad6c\ud604<\/strong><\/p>\n
\uc2a4\ud399 \ud328\ud134\uc758 \uac15\ub825\ud55c \uae30\ub2a5 \uc911 \ud558\ub098\ub294 \uc5ec\ub7ec \uc870\uac74\uc744 \uc870\ud569\ud560 \uc218 \uc788\ub2e4\ub294 \uc810\uc785\ub2c8\ub2e4. \uc774\ub97c \uc704\ud574 AndSpecification<\/code>, OrSpecification<\/code> \ub4f1\uc758 \ud074\ub798\uc2a4\ub97c \uad6c\ud604\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n
public class AndSpecification implements Specification {\n private Specification[] specifications;\n\n public AndSpecification(Specification... specifications) {\n this.specifications = specifications;\n }\n\n @Override\n public boolean isSatisfiedBy(T t) {\n for (Specification spec : specifications) {\n if (!spec.isSatisfiedBy(t)) {\n return false;\n }\n }\n return true;\n }\n}<\/code><\/pre>\n5. \uc2a4\ud399 \ud328\ud134\uacfc \ud14c\uc2a4\ud2b8 \uc8fc\ub3c4 \uac1c\ubc1c(TDD)<\/h2>\n
\ud14c\uc2a4\ud2b8 \uc8fc\ub3c4 \uac1c\ubc1c(TDD)\uc740 \uc18c\ud504\ud2b8\uc6e8\uc5b4 \uac1c\ubc1c \ubc29\ubc95\ub860 \uc911 \ud558\ub098\ub85c, \ud14c\uc2a4\ud2b8 \ucf00\uc774\uc2a4\ub97c \uba3c\uc800 \uc791\uc131\ud55c \ud6c4 \uc774\ub97c \ud1b5\uacfc\ud558\ub294 \ucf54\ub4dc\ub97c \uc791\uc131\ud558\ub294 \ubc29\uc2dd\uc785\ub2c8\ub2e4. \uc2a4\ud399 \ud328\ud134\uc740 TDD\uc640 \uc798 \uc5b4\uc6b8\ub9ac\ub294 \uad6c\uc870\ub97c \uc81c\uacf5\ud569\ub2c8\ub2e4.<\/p>\n
5.1. TDD\uc758 \uc6d0\uce59<\/strong><\/p>\n
TDD\uc758 \uae30\ubcf8 \uc6d0\uce59\uc740 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4:<\/p>\n
\n- \ud14c\uc2a4\ud2b8 \uc791\uc131:<\/strong> \uba3c\uc800 \uc2e4\ud328\ud558\ub294 \ud14c\uc2a4\ud2b8\ub97c \uc791\uc131\ud569\ub2c8\ub2e4.<\/li>\n
- \ucf54\ub4dc \uc791\uc131:<\/strong> \ud14c\uc2a4\ud2b8\ub97c \ud1b5\uacfc\ud558\uae30 \uc704\ud55c \ucd5c\uc18c\ud55c\uc758 \ucf54\ub4dc\ub97c \uc791\uc131\ud569\ub2c8\ub2e4.<\/li>\n
- \ub9ac\ud329\ud1a0\ub9c1:<\/strong> \ucf54\ub4dc\ub97c \uac1c\uc120\ud558\uace0 \ub9ac\ud329\ud1a0\ub9c1\ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n
5.2. \uc2a4\ud399 \ud328\ud134\uacfc TDD\uc758 \ud1b5\ud569<\/strong><\/p>\n
\uc2a4\ud399 \ud328\ud134\uc744 \uc0ac\uc6a9\ud558\uba74 TDD \uacfc\uc815\uc5d0\uc11c \ube44\uc988\ub2c8\uc2a4 \uaddc\uce59\uc744 \uba85\ud655\ud558\uac8c \uc815\uc758\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc608\ub97c \ub4e4\uc5b4, \ub300\ucd9c \uc2e0\uccad\uc5d0 \ub300\ud55c \ud14c\uc2a4\ud2b8\ub97c \uc791\uc131\ud560 \ub54c \ub2e4\uc74c\uacfc \uac19\uc740 \uc2a4\ud399\uc744 \uc815\uc758\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4:<\/p>\n
@Test\npublic void testLoanEligibility() {\n LoanEligibilitySpecification spec = new LoanEligibilitySpecification();\n Customer customer = new Customer(750, 4000);\n assertTrue(spec.isSatisfiedBy(customer));\n}<\/code><\/pre>\n\uc774\uc640 \uac19\uc774 \uc2a4\ud399 \ud328\ud134\uc744 \ud65c\uc6a9\ud558\uba74 TDD \uacfc\uc815\uc5d0\uc11c \ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1\uc744 \uba85\ud655\ud558\uac8c \uac80\uc99d\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n
6. \uc2a4\ud399 \ud328\ud134\uc758 \ud55c\uacc4\uc640 \uace0\ub824\uc0ac\ud56d<\/h2>\n
\uc2a4\ud399 \ud328\ud134\uc740 \ub9ce\uc740 \uc7a5\uc810\uc744 \uac00\uc9c0\uace0 \uc788\uc9c0\ub9cc, \uba87 \uac00\uc9c0 \ud55c\uacc4\uc640 \uace0\ub824\uc0ac\ud56d\ub3c4 \uc874\uc7ac\ud569\ub2c8\ub2e4. \uc774 \uc139\uc158\uc5d0\uc11c\ub294 \uc774\ub7ec\ud55c \uc810\ub4e4\uc744 \uc0b4\ud3b4\ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n
6.1. \ubcf5\uc7a1\uc131 \uc99d\uac00<\/strong><\/p>\n
\uc2a4\ud399 \ud328\ud134\uc744 \uc0ac\uc6a9\ud558\uba74 \ube44\uc988\ub2c8\uc2a4 \uaddc\uce59\uc774 \ubcf5\uc7a1\ud574\uc9c8 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc5ec\ub7ec \uc870\uac74\uc744 \uc870\ud569\ud558\uc5ec \ubcf5\uc7a1\ud55c \uaddc\uce59\uc744 \ub9cc\ub4e4 \uacbd\uc6b0, \ucf54\ub4dc\uac00 \ub09c\ud574\ud574\uc9c8 \uc218 \uc788\uc73c\ubbc0\ub85c \uc8fc\uc758\uac00 \ud544\uc694\ud569\ub2c8\ub2e4.<\/p>\n
6.2. \uc131\ub2a5 \ubb38\uc81c<\/strong><\/p>\n
\uc870\uac74\uc774 \ub9ce\uc544\uc9c8\uc218\ub85d \uc131\ub2a5 \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud2b9\ud788 \ub300\ub7c9\uc758 \ub370\uc774\ud130\ub97c \ucc98\ub9ac\ud560 \ub54c\ub294 \uc131\ub2a5 \uc800\ud558\uac00 \uc6b0\ub824\ub418\ubbc0\ub85c, \ucd5c\uc801\ud654\uac00 \ud544\uc694\ud569\ub2c8\ub2e4.<\/p>\n
7. \uacb0\ub860 \ubc0f \ud5a5\ud6c4 \uc804\ub9dd<\/h2>\n\uc2a4\ud399 \ud328\ud134\uc740 \ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1\uc758 \ud14c\uc2a4\ud2b8\uc640 \uac80\uc99d\uc5d0 \uc788\uc5b4 \ub9e4\uc6b0 \uc720\uc6a9\ud55c \ub3c4\uad6c\uc785\ub2c8\ub2e4. \uc774 \ud328\ud134\uc744 \ud1b5\ud574 \ube44\uc988\ub2c8\uc2a4 \uaddc\uce59\uc744 \uba85\ud655\ud558\uac8c \uc815\uc758\ud558\uace0, \ud14c\uc2a4\ud2b8 \uac00\ub2a5\uc131\uc744 \ub192\uc774\uba70, \ucf54\ub4dc\uc758 \uc7ac\uc0ac\uc6a9\uc131\uc744 \uc99d\uac00\uc2dc\ud0ac \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uadf8\ub7ec\ub098 \ubcf5\uc7a1\uc131\uacfc \uc131\ub2a5 \ubb38\uc81c \ub4f1 \ud55c\uacc4\ub3c4 \uc874\uc7ac\ud558\ubbc0\ub85c, \uc774\ub97c \uace0\ub824\ud558\uc5ec \uc801\uc808\ud788 \ud65c\uc6a9\ud574\uc57c \ud569\ub2c8\ub2e4.<\/p>\n
\ud5a5\ud6c4 \uc18c\ud504\ud2b8\uc6e8\uc5b4 \uac1c\ubc1c \ud658\uacbd\uc774 \ub354\uc6b1 \ubcf5\uc7a1\ud574\uc9d0\uc5d0 \ub530\ub77c \uc2a4\ud399 \ud328\ud134\uc758 \uc911\uc694\uc131\uc740 \ub354\uc6b1 \ucee4\uc9c8 \uac83\uc73c\ub85c \uc608\uc0c1\ub429\ub2c8\ub2e4. \ud2b9\ud788 \ub9c8\uc774\ud06c\ub85c\uc11c\ube44\uc2a4 \uc544\ud0a4\ud14d\ucc98\uc640 \uac19\uc740 \ud604\ub300\uc801\uc778 \uac1c\ubc1c \ubc29\uc2dd\uc5d0\uc11c\ub294 \ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1\uc758 \uba85\ud655\ud55c \uc815\uc758\uc640 \uac80\uc99d\uc774 \ud544\uc218\uc801\uc785\ub2c8\ub2e4.<\/p>\n
8. \uac15\ub825\ud55c \uc694\uc57d<\/h2>\n
\ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1\uc758 \ud14c\uc2a4\ud2b8\uc640 \uac80\uc99d\uc744 \uc704\ud55c \uc2a4\ud399 \ud328\ud134\uc740 \uc18c\ud504\ud2b8\uc6e8\uc5b4 \uac1c\ubc1c\uc5d0\uc11c \uc911\uc694\ud55c \uc5ed\ud560\uc744 \ud569\ub2c8\ub2e4. \uc774 \uae00\uc5d0\uc11c\ub294 \uc2a4\ud399 \ud328\ud134\uc758 \uac1c\uc694, \uc7a5\uc810, \uc801\uc6a9 \uc0ac\ub840, \uad6c\ud604 \ubc29\ubc95, TDD\uc640\uc758 \ud1b5\ud569, \ud55c\uacc4 \ubc0f \uace0\ub824\uc0ac\ud56d \ub4f1\uc744 \ub2e4\ub8e8\uc5c8\uc2b5\ub2c8\ub2e4. \uc2a4\ud399 \ud328\ud134\uc744 \ud1b5\ud574 \ube44\uc988\ub2c8\uc2a4 \uaddc\uce59\uc744 \uba85\ud655\ud558\uac8c \uc815\uc758\ud558\uace0, \ud14c\uc2a4\ud2b8 \uac00\ub2a5\uc131\uc744 \ub192\uc774\uba70, \ucf54\ub4dc\uc758 \uc7ac\uc0ac\uc6a9\uc131\uc744 \uc99d\uac00\uc2dc\ud0ac \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uadf8\ub7ec\ub098 \ubcf5\uc7a1\uc131\uacfc \uc131\ub2a5 \ubb38\uc81c \ub4f1 \ud55c\uacc4\ub3c4 \uc874\uc7ac\ud558\ubbc0\ub85c, \uc774\ub97c \uace0\ub824\ud558\uc5ec \uc801\uc808\ud788 \ud65c\uc6a9\ud574\uc57c \ud569\ub2c8\ub2e4.<\/p>\n
\uacb0\ub860\uc801\uc73c\ub85c, \uc2a4\ud399 \ud328\ud134\uc740 \ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1\uc758 \uc2e0\ub8b0\uc131\uc744 \ub192\uc774\ub294 \ub370 \uae30\uc5ec\ud558\uba70, \uc55e\uc73c\ub85c\ub3c4 \uc18c\ud504\ud2b8\uc6e8\uc5b4 \uac1c\ubc1c\uc5d0\uc11c \uc911\uc694\ud55c \ub3c4\uad6c\ub85c \uc790\ub9ac \uc7a1\uc744 \uac83\uc785\ub2c8\ub2e4.<\/p>\n","protected":false},"excerpt":{"rendered":"
\ubaa9\ucc28 \ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1\uc758 \ud14c\uc2a4\ud2b8\uc640 \uac80\uc99d\uc744 \uc704\ud55c \uc2a4\ud399 \ud328\ud134\uc758 \ud65c\uc6a9 1. \uc2a4\ud399 \ud328\ud134\uc758 \uac1c\uc694 2. \uc2a4\ud399 […]<\/p>\n","protected":false},"author":1,"featured_media":33704,"comment_status":"","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1957],"tags":[2523],"class_list":["post-50772","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development","tag-pattern"],"acf":[],"_links":{"self":[{"href":"https:\/\/m9js.shop\/blog\/wp-json\/wp\/v2\/posts\/50772","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/m9js.shop\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/m9js.shop\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/m9js.shop\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/m9js.shop\/blog\/wp-json\/wp\/v2\/comments?post=50772"}],"version-history":[{"count":0,"href":"https:\/\/m9js.shop\/blog\/wp-json\/wp\/v2\/posts\/50772\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/m9js.shop\/blog\/wp-json\/wp\/v2\/media\/33704"}],"wp:attachment":[{"href":"https:\/\/m9js.shop\/blog\/wp-json\/wp\/v2\/media?parent=50772"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/m9js.shop\/blog\/wp-json\/wp\/v2\/categories?post=50772"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/m9js.shop\/blog\/wp-json\/wp\/v2\/tags?post=50772"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}