{"id":33949,"date":"2019-01-17T11:53:52","date_gmt":"2019-01-17T02:53:52","guid":{"rendered":"https:\/\/blog.jetbrains.com\/kr\/?p=332"},"modified":"2019-01-17T11:53:52","modified_gmt":"2019-01-17T02:53:52","slug":"copypaste","status":"publish","type":"post","link":"https:\/\/blog.jetbrains.com\/ko\/2019\/01\/17\/copypaste\/","title":{"rendered":"\uc778\uc218\uc778\uacc4 \ubc1b\uc740 \ucf54\ub4dc\uac00 Copy\/Paste \ub85c \uc791\uc131\ub41c \uc5c9\ub9dd\uc778 \ucf54\ub4dc\uc778\uac00\uc694?"},"content":{"rendered":"\ubb3c\ub860 \ud751\ubc31\uc758 \uadf9\ub2e8\uc801\uc778 \uc138\uc0c1\uc740 \uc544\ub2c8\uc9c0\ub9cc, \uc790\uc8fc \uc774\uc911 \ucf54\ub4dc\ub97c \ubc1c\uacac\ud558\uac70\ub098 \uc624\ub958\ub85c \uc774\uc911 \uc791\uc131\uc744 \ud558\uae30\ub3c4 \ud569\ub2c8\ub2e4. \ud070 \ud68c\uc0ac\uc5d0\uc11c\ub294 \ub354 \uc790\uc8fc \uc77c\uc5b4\ub098\ub290 \uc77c\uc774\uc8e0. \uc774\uc720\uac00 \uc911\uc694\ud55c\uac8c \uc544\ub2d9\ub2c8\ub2e4. \ub354 \uc911\uc694\ud55c \uac83\uc740 \uc0ac\uc6a9\ud558\ub294 \ud234\ub85c \uadf8\ub7f0 \ubb38\uc81c\ub97c \ud574\uacb0\ud560 \uc218 \uc788\ub294\uc9c0 \uc544\ub294\uac83\uc774\uc8e0. \ub298\uc5b4\ub098\ub294 \ucf54\ub4dc \uc18d\uc5d0 \uc911\ubcf5 \ucf54\ub4dc\ub97c \ucc3e\uc544\uc8fc\ub294 \ud234\uc5d0 \uc870\uae08\uc740 \uae30\ub300\uc5b4 \ubcf4\uc138\uc694.\r\n\uc624\ub298\uc758 \ud3ec\uc2a4\ud305\uc740\u00a0\u00a0dupFinder command-line tool\u00a0\uc5d0 \ub300\ud55c \ub0b4\uc6a9\uc785\ub2c8\ub2e4.\u00a0C# and VB.NET code\uc5d0\uc11c \uc911\ubcf5\ub41c \ucf54\ub4dc\ub97c \ucc3e\uc544\ubcf4\uc138\uc694.\u00a0ReSharper Command-Line Tools\u00a0 NuGet package\u00a0\uc5d0\uc11c \ud655\uc778 \uac00\ub2a5\ud558\uba70\u00a0TeamCity build step\u00a0\uc5d0\uc11c\ub3c4 \uac00\ub2a5\ud569\ub2c8\ub2e4. \ubb34\ub8cc\uc774\uae30 \ub54c\ubb38\uc5d0 \uc5b4\ub5a0\ud55c CI \ub610\ub294 DevOps \uad00\ub828 \ud658\uacbd\uc5d0\uc11c \uc0ac\uc6a9\ud558\uae30 \uc88b\uc2b5\ub2c8\ub2e4.\r\n\r\n\ucc38\uace0 :\u00a0DupFinder \ub294 \uc708\ub3c4\uc6b0 \uc804\uc6a9\uc785\ub2c8\ub2e4.\u00a0YouTrack issue\u00a0\uc5d0\uc11c \ub2e4\ub978 \ud50c\ub7ab\ud3fc \uc9c0\uc6d0 \uc5ec\ubd80\ub97c \ud5a5\ud6c4 \uc2e4\uc2dc\uac04\uc73c\ub85c \ud655\uc778\ud558\uc2e4 \uc218 \uc788\uaca0\uc2b5\ub2c8\ub2e4.\r\n\uc911\ubcf5 \ucf54\ub4dc\ub780 \ubb34\uc5c7\uc778\uac00?\r\n\ub2f9\uc5f0\ud558\uaca0\uc9c0\ub9cc, \ucf54\ub4dc\ub97c \ubcf5\uc0ac \/ \ubd99\uc5ec\ub123\uae30 \ud558\ub294 \ud589\uc704\uac00 \ubc14\ub85c \uc911\ubcf5 \ucf54\ub4dc\ub97c \ub9cc\ub4dc\ub294 \uc6d0\uc778\uc785\ub2c8\ub2e4. \uc2e4\ubb34\uc5d0\uc11c \uc790\uc8fc \uc788\ub294 \ud604\uc0c1\uc740 \ubc14\ub85c \uac1c\ubc1c\uc790\uac00 \uac01\uac01 \ube44\uc2b7\ud55c \uad6c\uc870\uc758 \ucf54\ub4dc\ub97c \ub9cc\ub4e4\uc9c0\ub9cc \ub2e4\ub978 \ub124\uc774\ubc0d\uc774\ub098 \ucf54\ub4dc \ud3ec\ub9f7, \uc2a4\ud0c0\uc77c\uc744 \ub2ec\ub9ac\ud558\uc5ec \uc791\uc131\ud558\uac8c \ub418\ub294 \uacbd\uc6b0\ub3c4 \uc788\uaca0\uc8e0.\r\n\r\n\r\n\r\nDupFinder \uc5d0\uc11c\ub294 \ucf54\ub4dc \uc870\uac01(code fragments)\u00a0\uc758 \uc720\uc0ac\uc131\uc774 \ube44\uc6a9(costs)\uc73c\ub85c\u00a0 \uce21\uc815\ub429\ub2c8\ub2e4. \ube44\uc6a9\uc740 \uc21c\ud658\uc801 \ubcf5\uc7a1\uc131(cyclomatic complexity\u00a0)\uacfc \uac19\uc740 \uc0c1\ub300\uc801 \ub2e8\uc704\ub85c \uc81c\uacf5\ub429\ub2c8\ub2e4. \ube44\uc6a9\uc774 \ud074 \uc218\ub85d \uc911\ubcf5 \ucf54\ub4dc\uc758 \ube44\uc728\uc774 \ucee4\uc9c4\ub2e4\ub294 \uac83\uc774\uc8e0.\r\n\uc911\ubcf5 \uba54\ud2b8\ub9ad\uc2a4 \uc218\uc9d1\r\nDupFinder \ub294\u00a0CLI \ud234\uc785\ub2c8\ub2e4. \uc774\ub294 \uc194\ub8e8\uc158 \ud30c\uc77c, \ud3f4\ub354 \ub610\ub294 \uac1c\ubc1c \ud30c\uc77c\uc5d0 \uc801\uc6a9\ub420 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc77c\ubc18\uc801\uc778 \uc694\uad6c\uc0ac\ud56d\uc740 \uc0dd\uc131\ub41c \ucf54\ub4dc\ub97c \uc81c\uc678\ud558\ub294 \uac83\uc774\uaca0\uc8e0:\r\n\r\ndupFinder FunkyApp.sln --output=report.xml --exclude=\u201c**\/*.Generated.cs\u201d\r\n\r\n\uc0dd\uc131\ub41c XML \ub9ac\ud3ec\ud2b8 \ucd5c\uc0c1\ub2e8\uc5d0\u00a0\ucd95\uc801\ub41c \ud1b5\uacc4 \ub370\uc774\ud130\ub97c \ubcf4\uc774\uac8c \ub418\uace0 \uae30\uc874 \ub85c\uadf8 \ubd84\uc11d\uc744 \uc704\ud574 \uc0ac\uc6a9\ub420 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\r\n\r\n\r\n\r\n\ub354 \ud765\ubbf8\ub86d\uac8c\ub3c4 \ubc1c\uacac \ub41c \uc911\ubcf5\ucf54\ub4dc\uc758 \uac1c\ubcc4 \ub370\uc774\ud130\uac00 \ud3ec\ud568\ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4. \uc5ec\uae30\uc5d0\ub294 \uc911\ubcf5\ucf54\ub4dc\uc758 \uc2e4\uc81c \ube44\uc6a9\uacfc \uad00\ub828 \uc870\uac01\uc5d0 \ub300\ud55c \ud30c\uc77c \uc774\ub984, \ub77c\uc778 \uc624\ud504\uc14b \ubc0f \uc5f4 \uc624\ud504\uc14b\uc774 \ud3ec\ud568\ub429\ub2c8\ub2e4.:\r\n\r\n\r\n\r\n\uc0ac\uc6a9\ucc98\uc758 \uc194\ub8e8\uc158\uc5d0 \ub530\ub77c\u00a0\uacb0\uacfc\ub97c \uac00\uc7a5 \uc801\uc808\ud558\uac8c\ud558\uae30 \uc704\ud574\u00a0\ube44\uc6a9 \uc784\uacc4 \uac12 \uc5ed\ud560\uc744 \ud558\ub294\u00a0--discard-cost\u00a0\ub9e4\uac1c \ubcc0\uc218(parameter)\ub97c\u00a0\uc0ac\uc6a9\ud574\uc57c \ud560 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4\u00a0.\u00a0\uc2e4\uc81c \ucf54\ub4dc\u00a0\ub97c \ubcf4\uace0\uc11c\uc5d0\u00a0\ud3ec\ud568\u00a0\ud558\uae30 \uc704\ud574\u00a0--show-text\u00a0\ub9e4\uac1c \ubcc0\uc218\u00a0\ub97c \ucd94\uac00 \ud560 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4\u00a0.\u00a0\ub3c4\uc6c0\ub9d0 \uc124\uba85\uc11c\uc5d0\ub294 \ub2e4\uc591\ud55c \uba85\ub839 \uc904 \uc635\uc158\uc774 \uc124\uba85\ub418\uc5b4\u00a0\uc788\uc2b5\ub2c8\ub2e4\u00a0.\r\n\uc0ac\ub78c\uc774 \uc77d\uc744 \uc218 \uc788\ub294 \ubcf4\uace0\uc11c\r\nXML\uc5d0 \uc5bd\ub9e4\uc774\ub294 \uac83\uc774 \ubcf4\uace0\uc11c\ub97c \ubd84\uc11d\ud558\ub294 \ud6a8\uc728\uc801 \ubc29\ubc95\uc740 \uc544\ub2c8\uaca0\uc8e0.\u00a0\ucee4\uc2a4\ud140\u00a0XSL \ubcc0\ud658(XSL transformation)\u00a0\uc744 \uc801\uc6a9\ud568\uc73c\ub85c\uc368\u00a0\uc6b0\ub9ac\ub294 \uc774\uac83\uc744 \ud6e8\uc52c \ub354 \uc27d\uac8c \uc77d\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\u00a0TeamCity\ub294 \uc0c8\ub85c\uc6b4\u00a0Duplicates \ubcf4\uace0\uc11c \ud0ed\uc744\u00a0\ubcf4\uc5ec\uc90d\ub2c8\ub2e4.\uc774\u00a0\ud0ed\u00a0\uc5d0\uc11c\ub294 \ubc94\uc704\ubcc4\ub85c \uacb0\uacfc\ub97c \ud0d0\uc0c9\ud558\uace0 \uc870\uac01\uc744 \ub098\ub780\ud788 \ud45c\uc2dc \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\r\n\r\n\r\n\ucf54\ub529\ud558\uba70 \uc2e4\uc2dc\uac04\uc73c\ub85c \uc911\ubcf5 \uac80\uc0ac\ud558\uc138\uc694\r\nReSharper (\ubc0f Rider)\ub294 dupFinder CLI\uc758 \uae30\ub2a5\uc744 \ub118\uc5b4\u00a0\uc2dc\uac04\uc774 \uc9c0\ub0a8\uc5d0 \ub530\ub77c \ubc18\ubcf5\ub418\ub294 \uc911\ubcf5\u00a0\uc744 \ud53c\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4\u00a0.\u00a0\ud504\ub798\uadf8\uba3c\ud2b8\ub97c \uc2dd\ubcc4\ud558\uace0 \ucf54\ub4dc\ub97c \uc790\uccb4 \uba54\uc18c\ub4dc\uc5d0 \ucea1\uc290\ud654\ud558\uc5ec \ucf54\ub4dc\ubca0\uc774\uc2a4\uc758 \uc5b4\ub290 \uc704\uce58\uc5d0\uc11c\ub4e0 \ub354 \uac04\uacb0\ud558\uac8c \ud638\ucd9c \ud560 \uc218 \uc788\ub2e4\uace0 \uac00\uc815 \ud574 \ubcf4\uaca0\uc2b5\ub2c8\ub2e4.\u00a0\uadf8\ub798\ub3c4 \ub3d9\ub8cc \uac1c\ubc1c\uc790\ub294 \uc774\uc804 \uc870\uac01\uc744 \ubc18\ubcf5\ud574\uc11c \uc0ac\uc6a9\ud569\ub2c8\ub2e4.\u00a0\uc774\uac83\uc740\u00a0\ucee4\uc2a4\ud140 SSR \ud328\ud134\u00a0\uc744\u00a0\uc0dd\uc131\u00a0\ud558\uae30\uc5d0 \uc88b\uc740 \uc2dc\uac04\u00a0\uc774\uba70, \ubcf5\uc81c\ubb3c\uc774 \uc4f0\uc5ec\uc9c0\ub294 \uc21c\uac04\uc5d0 \ucf54\ub4dc \uac80\uc0ac\ub97c \ubcf4\uc5ec\uc904 \uac83\uc785\ub2c8\ub2e4.\r\n\r\nReSharper\ub97c \ub2e4\uc6b4\ub85c\ub4dc\u00a0\ud558\uac70\ub098\u00a0Rider\uc5d0\uac8c \uc2dc\ub3c4\ud574\ubcf4\uc2ed\uc2dc\uc624\u00a0.\u00a0\uc6b0\ub9ac\ub294 \uadc0\ud558\uc758 \uc758\uacac\uc744 \ub4e3\uace0 \uc2f6\uc2b5\ub2c8\ub2e4!\r\n\r\nThe Drive to Develop\r\nJetBrains \ud300\r\n\r\n\ud574\ub2f9 \ud3ec\uc2a4\ud2b8\ub294 \ud558\uae30 URL \uc758 \uc6d0\ubb38\uc744 \ubc88\uc5ed\ud558\uc5ec \uae30\uc7ac\ub418\uc5c8\uc2b5\ub2c8\ub2e4.\r\n\r\nhttps:\/\/blog.jetbrains.com\/dotnet\/2019\/01\/15\/solid-veteran-copypaste-master-finding-duplicate-code\/","protected":false},"excerpt":{"rendered":"\ubb3c\ub860 \ud751\ubc31\uc758 \uadf9\ub2e8\uc801\uc778 \uc138\uc0c1\uc740 \uc544\ub2c8\uc9c0\ub9cc, \uc790\uc8fc \uc774\uc911 \ucf54\ub4dc\ub97c \ubc1c\uacac\ud558\uac70\ub098 \uc624\ub958\ub85c \uc774\uc911 \uc791\uc131\uc744 \ud558\uae30\ub3c4 \ud569\ub2c8\ub2e4. \ud070 \ud68c\uc0ac\uc5d0\uc11c\ub294 \ub354 \uc790\uc8fc \uc77c\uc5b4\ub098\ub290 \uc77c\uc774\uc8e0. \uc774\uc720\uac00 \uc911\uc694\ud55c\uac8c \uc544\ub2d9\ub2c8\ub2e4. \ub354 \uc911\uc694\ud55c \uac83\uc740 \uc0ac\uc6a9\ud558\ub294 \ud234\ub85c \uadf8\ub7f0 \ubb38\uc81c\ub97c \ud574\uacb0\ud560 \uc218 \uc788\ub294\uc9c0 \uc544\ub294\uac83\uc774\uc8e0. \ub298\uc5b4\ub098\ub294 \ucf54\ub4dc \uc18d\uc5d0 \uc911\ubcf5 \ucf54\ub4dc\ub97c \ucc3e\uc544\uc8fc\ub294 \ud234\uc5d0 \uc870\uae08\uc740 \uae30\ub300\uc5b4 \ubcf4\uc138\uc694.\uc624\ub298\uc758 \ud3ec\uc2a4\ud305\uc740\u00a0\u00a0dupFinder com","protected":false},"author":{"name":"JetBrains","link":"https:\/\/blog.jetbrains.com\/ko\/author\/jetbrains"},"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[3990,4140],"tags":[211,486,5598],"cross-post-tag":[],"acf":[],"featured_image":null,"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/posts\/33949"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/users\/1152"},{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/users\/1152"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/comments?post=33949"}],"version-history":[{"count":0,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/posts\/33949\/revisions"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/media?parent=33949"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/categories?post=33949"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/tags?post=33949"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/cross-post-tag?post=33949"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}