{"id":322,"date":"2020-04-03T22:26:23","date_gmt":"2020-04-03T13:26:23","guid":{"rendered":"http:\/\/batmask.dothome.co.kr\/?p=322"},"modified":"2025-09-11T18:31:31","modified_gmt":"2025-09-11T09:31:31","slug":"design-pattern-chain-of-responsibility","status":"publish","type":"post","link":"http:\/\/batmask.net\/index.php\/2020\/04\/03\/322\/","title":{"rendered":"Design Pattern: Chain of Responsibility"},"content":{"rendered":"\n<p>Chain of Responsibility\ub294 \ud578\ub4e4\ub7ec\ub97c \uac00\uc9c4 \uac1d\uccb4\uac00 \uc694\uccad\uc744 \ubc1b\uc73c\uba74 \uc790\uc2e0\uc774 \ucc98\ub9ac\ud560 \uc694\uccad\uc778\uc9c0 \ud655\uc778 \ud6c4, \ub9de\ub2e4\uba74 \ucc98\ub9ac\ud558\uace0 \uc544\ub2c8\ub77c\uba74 \ub2e4\uc74c \uac1d\uccb4\uc5d0\uac8c \uc804\ub2ec\ud55c\ub2e4. \uc804\ub2ec\ubc1b\uc740 \uac1d\uccb4\ub3c4 \ub3d9\uc77c\ud55c \ud578\ub4e4\ub7ec \uc778\ud130\ud398\uc774\uc2a4\ub97c \uac16\uace0 \uc788\uc73c\uba70, \uc804\ub2ec\ubc1b\uc740 \uc694\uccad\uc744 \ud655\uc778 \ud6c4 \ub9c8\ucc2c\uac00\uc9c0\ub85c \ucc98\ub9ac\ud55c\ub2e4. \uc774\ub807\uac8c \ud578\ub4e4\ub7ec\ub4e4\uc774 \uccb4\uc778\ucc98\ub7fc \uc5ee\uc5ec\uc11c \ub9c8\uce58 \ud544\ud130\ub97c \uac70\uce58\ub4ef \ud544\uc694\ud55c \uac1d\uccb4\uae4c\uc9c0 \uc804\ub2ec\ub418\uc5b4 \ucc98\ub9ac\ub418\ub294 \ubc29\uc2dd\uc774 Chain of Responsibility Pattern\uc774\ub2e4. <\/p>\n\n\n\n<p>\uc774 \ud328\ud134\uc744 \uc0ac\uc6a9\ud558\ub294 \uacf3\uc740 \uc544\uc8fc \ud754\ud558\uac8c \ubcf4\uc774\ub294\ub370, \uadf8 \uc911 \ud558\ub098\uac00 \uc608\uc678\ucc98\ub9ac\uc5d0 \uc0ac\uc6a9\ub418\ub294try-catch \ubb38\uc774\ub2e4. Exception\uc774 \ubc1c\uc0dd\ud558\uba74 try-catch\uc5d0\uc11c \uc7a1\uc544\ub0b4\uac70\ub098, \uc7a1\uc544\ub0b4\uc9c0 \ubabb\ud558\uba74 \ucf5c\uc2a4\ud0dd \uc704\ub85c \ub358\uc838\uc900\ub2e4. \uc774 \uacfc\uc815\uc740 exception\uc774 \uc7a1\ud790 \ub54c\uae4c\uc9c0 \uccb4\uc778\ucc98\ub7fc \ub3d9\uc791\ud55c\ub2e4.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"968\" height=\"582\" src=\"http:\/\/batmask.dothome.co.kr\/wordpress\/wp-content\/uploads\/2020\/04\/call-stack.png\" alt=\"\" class=\"wp-image-324\" srcset=\"http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2020\/04\/call-stack.png 968w, http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2020\/04\/call-stack-300x180.png 300w, http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2020\/04\/call-stack-768x462.png 768w\" sizes=\"auto, (max-width: 968px) 100vw, 968px\" \/><figcaption class=\"wp-element-caption\">\uc774\ubbf8\uc9c0 \ucc38\uc870 : <a href=\"https:\/\/www.geeksforgeeks.org\/exceptions-in-java\/\">https:\/\/www.geeksforgeeks.org\/exceptions-in-java\/<\/a><\/figcaption><\/figure>\n\n\n\n<p>\ub610 \ub2e4\ub978 \uc608\ub294 \uc708\ub3c4\uc6b0 \uc2dc\uc2a4\ud15c\uc758 \uc774\ubca4\ud2b8 \ud578\ub4e4\ub9c1\uc774\ub2e4.  \ubc84\ud2bc\uc774\ub098 \ub808\uc774\ube14 \uc704\uc82f\uc5d0 \ub9c8\uc6b0\uc2a4 \ud074\ub9ad \uc774\ubca4\ud2b8\uac00 \ubc1c\uc0dd\ud558\uba74, \ubc84\ud2bc\uc740 \ud574\ub2f9 \uac1d\uccb4\uc5d0\uc11c \ud578\ub4e4\ub7ec\uac00 \uc218\ud589\ub418\uaca0\uc9c0\ub9cc \ud578\ub4e4\ub7ec\uac00 \uc5c6\ub294\uacbd\uc6b0 \ubd80\ubaa8 \uc708\ub3c4\uc6b0\ub85c \uc774\ubca4\ud2b8\ub97c \ub118\uaca8\uc8fc\uac8c\ub41c\ub2e4. <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"520\" height=\"300\" src=\"http:\/\/batmask.dothome.co.kr\/wordpress\/wp-content\/uploads\/2020\/04\/solution2-en.png\" alt=\"\" class=\"wp-image-325\" srcset=\"http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2020\/04\/solution2-en.png 520w, http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2020\/04\/solution2-en-300x173.png 300w\" sizes=\"auto, (max-width: 520px) 100vw, 520px\" \/><figcaption class=\"wp-element-caption\">\uc774\ubbf8\uc9c0 \ucc38\uc870 : <a href=\"https:\/\/refactoring.guru\/design-patterns\/chain-of-responsibility\">https:\/\/refactoring.guru\/design-patterns\/chain-of-responsibility<\/a><\/figcaption><\/figure>\n\n\n\n<p>\uc608\uc5d0\uc11c \ubcf4\ub4ef\uc774 \uc2a4\ud0dd\ud615\ud0dc\uc758 \ub808\uc774\uc5b4\ub4e4\ub85c \uc774\ub8e8\uc5b4\uc9c4 \uc2dc\uc2a4\ud15c\uc5d0\uc11c \ub9e4\uc6b0 \ud754\ud55c \uc77c\uc774\ub2e4. \uc608\uc804 \uc548\ub4dc\ub85c\uc774\ub4dc \uac1c\ubc1c\ud560 \ub54c \ube14\ub8e8\ud22c\uc2a4\uc758 \ud0a4 \uc774\ubca4\ud2b8\uc778 \ud50c\ub808\uc774, \uc77c\uc2dc\uc815\uc9c0, \uc815\uc9c0, \ub2e4\uc74c\uace1\ub4f1\uc744 \uc624\ub514\uc624 \uc2a4\ud0dd\uc5d0\uc11c \uc774\ub7f0\uc2dd\uc73c\ub85c \ucc98\ub9ac\ud588\ub358 \uae30\uc5b5\uc774 \uc788\ub2e4. \uc624\ub514\uc624 \ucc98\ub9ac\ud558\ub294 \ubd80\ubd84\uc774 \uc2a4\ud0dd\ucc98\ub7fc \ub418\uc5b4 \uc788\uace0 \ucd5c\uadfc \uc2e4\ud589\ub41c \uc5b4\ud50c\ub9ac\ucf00\uc774\uc158\uc774 \ucd5c\uc0c1\ub2e8\uc5d0 \uc874\uc7ac\ud574\uc11c \uc774\ubca4\ud2b8\ub97c \ubc1b\uc544 \ucc98\ub9ac\ud55c\ub2e4. \ub9cc\uc57d, \uc0ac\uc6a9\ud558\uc9c0 \uc54a\ub294 \uc774\ubca4\ud2b8\uac00 \ub4e4\uc5b4\uc628\ub2e4\uba74 \uc2a4\ud0dd\uc744 \ub530\ub77c \uc544\ub798\ub85c \uc774\ubca4\ud2b8\ub97c \ub0b4\ub824\uc8fc\uac8c\ub41c\ub2e4.<\/p>\n\n\n\n<p>\uad6c\ud604\uc608\ub85c\ub294 \uc548\ub4dc\ub85c\uc774\ub4dc\uc5d0\uc11c \uc4f0\ub294 \uac83\uacfc \uc720\uc0ac\ud55c \ub85c\uadf8 \uc2dc\uc2a4\ud15c\uc744 \ub9cc\ub4e4\uc5b4\ubcf4\uc790. \uc548\ub4dc\ub85c\uc774\ub4dc\uc5d0\uc120 Verbose(v), Debug(d), Info(i), Warn(w), Error(e) \ub2e4\uc12f\uac00\uc9c0 \ub808\ubca8\uc744 \uc0ac\uc6a9\ud55c\ub2e4. \uc21c\uc11c\ub300\ub85c \ub4a4\uc758 \ub2e8\uacc4\ub4e4\uc744 \ub2e4 \ud3ec\ud568\ud55c\ub2e4. \uc608\ub97c\ub4e4\uc5b4 Debug(d)\ub294 \ub514\ubc84\uae45\uc6a9 \uba54\uc138\uc9c0\ub85c, v level\uc744 \uc81c\uc678\ud558\uace0 i, w, e\uc5d0 \ud574\ub2f9\ud558\ub294 \uba54\uc138\uc9c0\ub97c \ubaa8\ub450 \ucd9c\ub825\ud55c\ub2e4. \uc6b0\uc120, \ucd94\uc0c1 \ud074\ub798\uc2a4\ub97c \ub9cc\ub4e4\uc5b4\ubcf4\uc790.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>public enum LOGLEVEL{E(\"&#91;ERROR&#93;\"), D(\"&#91;DEBUG&#93;\"), V(\"&#91;VERBOSE&#93;\");\n    protected final String type;\n\n    LOGLEVEL(String s) {\n        this.type = s;\n    }\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F47067\">public<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">enum<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">LOGLEVEL<\/span><span style=\"color: #ADBAC7\">{<\/span><span style=\"color: #6CB6FF\">E<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;&#91;ERROR&#93;&quot;<\/span><span style=\"color: #ADBAC7\">), <\/span><span style=\"color: #6CB6FF\">D<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;&#91;DEBUG&#93;&quot;<\/span><span style=\"color: #ADBAC7\">), <\/span><span style=\"color: #6CB6FF\">V<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;&#91;VERBOSE&#93;&quot;<\/span><span style=\"color: #ADBAC7\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">protected<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">final<\/span><span style=\"color: #ADBAC7\"> String<\/span><span style=\"color: #F69D50\"> <\/span><span style=\"color: #ADBAC7\">type;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #DCBDFB\">LOGLEVEL<\/span><span style=\"color: #ADBAC7\">(String <\/span><span style=\"color: #F69D50\">s<\/span><span style=\"color: #ADBAC7\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #6CB6FF\">this<\/span><span style=\"color: #ADBAC7\">.type <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> s;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>public abstract class MyLogger {\n    protected MyLogger nextLogger = null;\n    protected LOGLEVEL level = null;\n\n    private static LOGLEVEL outputLevel = LOGLEVEL.V;\n\n    public abstract void handleMessage(LOGLEVEL level, String msg);\n    public void setNextLogger(MyLogger logger){\n        nextLogger = logger;\n    }\n\n    public void sendToNext(LOGLEVEL level, String msg){\n        if(this.level.ordinal() &lt; outputLevel.ordinal() &amp;&amp; nextLogger != null){\n            nextLogger.handleMessage(level, msg);\n        }\n    }\n\n    public static void setLevel(LOGLEVEL level){\n        outputLevel = level;\n    }\n\n    public static LOGLEVEL getLevel(){\n        return outputLevel;\n    }\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F47067\">public<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">abstract<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">class<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">MyLogger<\/span><span style=\"color: #ADBAC7\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">protected<\/span><span style=\"color: #ADBAC7\"> MyLogger<\/span><span style=\"color: #F69D50\"> <\/span><span style=\"color: #ADBAC7\">nextLogger<\/span><span style=\"color: #F69D50\"> <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">null<\/span><span style=\"color: #ADBAC7\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">protected<\/span><span style=\"color: #ADBAC7\"> LOGLEVEL<\/span><span style=\"color: #F69D50\"> <\/span><span style=\"color: #ADBAC7\">level<\/span><span style=\"color: #F69D50\"> <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">null<\/span><span style=\"color: #ADBAC7\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">private<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">static<\/span><span style=\"color: #ADBAC7\"> LOGLEVEL<\/span><span style=\"color: #F69D50\"> <\/span><span style=\"color: #ADBAC7\">outputLevel<\/span><span style=\"color: #F69D50\"> <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> LOGLEVEL.V;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">public<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">abstract<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">void<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">handleMessage<\/span><span style=\"color: #ADBAC7\">(LOGLEVEL <\/span><span style=\"color: #F69D50\">level<\/span><span style=\"color: #ADBAC7\">, String <\/span><span style=\"color: #F69D50\">msg<\/span><span style=\"color: #ADBAC7\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">public<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">void<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">setNextLogger<\/span><span style=\"color: #ADBAC7\">(MyLogger <\/span><span style=\"color: #F69D50\">logger<\/span><span style=\"color: #ADBAC7\">){<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        nextLogger <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> logger;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">public<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">void<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">sendToNext<\/span><span style=\"color: #ADBAC7\">(LOGLEVEL <\/span><span style=\"color: #F69D50\">level<\/span><span style=\"color: #ADBAC7\">, String <\/span><span style=\"color: #F69D50\">msg<\/span><span style=\"color: #ADBAC7\">){<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">if<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #6CB6FF\">this<\/span><span style=\"color: #ADBAC7\">.level.<\/span><span style=\"color: #DCBDFB\">ordinal<\/span><span style=\"color: #ADBAC7\">() <\/span><span style=\"color: #F47067\">&lt;<\/span><span style=\"color: #ADBAC7\"> outputLevel.<\/span><span style=\"color: #DCBDFB\">ordinal<\/span><span style=\"color: #ADBAC7\">() <\/span><span style=\"color: #F47067\">&amp;&amp;<\/span><span style=\"color: #ADBAC7\"> nextLogger <\/span><span style=\"color: #F47067\">!=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">null<\/span><span style=\"color: #ADBAC7\">){<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            nextLogger.<\/span><span style=\"color: #DCBDFB\">handleMessage<\/span><span style=\"color: #ADBAC7\">(level, msg);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">public<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">static<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">void<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">setLevel<\/span><span style=\"color: #ADBAC7\">(LOGLEVEL <\/span><span style=\"color: #F69D50\">level<\/span><span style=\"color: #ADBAC7\">){<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        outputLevel <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> level;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">public<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">static<\/span><span style=\"color: #ADBAC7\"> LOGLEVEL <\/span><span style=\"color: #DCBDFB\">getLevel<\/span><span style=\"color: #ADBAC7\">(){<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">return<\/span><span style=\"color: #ADBAC7\"> outputLevel;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\uba3c\uc800 \ub85c\uadf8\ub808\ubca8\uc5d0 \ub300\ud55c enum \ud074\ub798\uc2a4\ub97c \ub9cc\ub4e4\uc5c8\ub2e4. \uc608\uc81c\uc774\ubbc0\ub85c 3\ub2e8\uacc4\ub9cc \ub9cc\ub4e4\uae30\ub85c \ud55c\ub2e4. \uc694\uccad\uc744 \ucc98\ub9ac\ud558\ub294 handleMessage() \ub294 \uc11c\ube0c\ud074\ub798\uc2a4\ub4e4\uc5d0\uc11c \uad6c\ud604\ub420 \uba54\uc3d8\ub4dc\uc774\uace0, \ub9c8\uce58 \ub9c1\ud06c\ub4dc \ub9ac\uc2a4\ud2b8\ucc98\ub7fc \uccb4\uc778\uc73c\ub85c \uc5f0\uacb0\ud558\uae30\uc704\ud574 nextLogger\ub97c \uc0ac\uc6a9\ud588\ub2e4. sendToNext()\ub294 \uacf5\ud1b5\uc73c\ub85c \uc0ac\uc6a9\uac00\ub2a5\ud574\uc11c \uc5ec\uae30\uc11c \uad6c\ud604\ud588\ub2e4. \uc0c1\uc18d\uc744 \ubc1b\uc544 \uac01 \ub85c\uac70\ub4e4\uc744 \ub9cc\ub4e4\uc5b4\ubcf4\uc790.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>public class VerboseLogger extends MyLogger {\n    VerboseLogger(){\n        level = LOGLEVEL.V;\n    }\n\n    @Override\n    public void handleMessage(LOGLEVEL level, String msg) {\n        if(this.level == level){\n            System.out.println(\"VerboseLogger: \" + level.type + msg);\n        }\n\n        sendToNext(level, msg);\n    }\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F47067\">public<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">class<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">VerboseLogger<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">extends<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">MyLogger<\/span><span style=\"color: #ADBAC7\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #DCBDFB\">VerboseLogger<\/span><span style=\"color: #ADBAC7\">(){<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        level <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> LOGLEVEL.V;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    @<\/span><span style=\"color: #F47067\">Override<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">public<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">void<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">handleMessage<\/span><span style=\"color: #ADBAC7\">(LOGLEVEL <\/span><span style=\"color: #F69D50\">level<\/span><span style=\"color: #ADBAC7\">, String <\/span><span style=\"color: #F69D50\">msg<\/span><span style=\"color: #ADBAC7\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">if<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #6CB6FF\">this<\/span><span style=\"color: #ADBAC7\">.level <\/span><span style=\"color: #F47067\">==<\/span><span style=\"color: #ADBAC7\"> level){<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            System.out.<\/span><span style=\"color: #DCBDFB\">println<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;VerboseLogger: &quot;<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">+<\/span><span style=\"color: #ADBAC7\"> level.type <\/span><span style=\"color: #F47067\">+<\/span><span style=\"color: #ADBAC7\"> msg);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #DCBDFB\">sendToNext<\/span><span style=\"color: #ADBAC7\">(level, msg);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>public class DebugLogger extends MyLogger {\n    DebugLogger(){\n        level = LOGLEVEL.D;\n    }\n\n    @Override\n    public void handleMessage(LOGLEVEL level, String msg) {\n        if(this.level == level){\n            System.out.println(\"DebugLogger: \" + level.type + msg);\n        }\n\n        sendToNext(level, msg);\n    }\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F47067\">public<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">class<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">DebugLogger<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">extends<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">MyLogger<\/span><span style=\"color: #ADBAC7\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #DCBDFB\">DebugLogger<\/span><span style=\"color: #ADBAC7\">(){<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        level <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> LOGLEVEL.D;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    @<\/span><span style=\"color: #F47067\">Override<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">public<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">void<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">handleMessage<\/span><span style=\"color: #ADBAC7\">(LOGLEVEL <\/span><span style=\"color: #F69D50\">level<\/span><span style=\"color: #ADBAC7\">, String <\/span><span style=\"color: #F69D50\">msg<\/span><span style=\"color: #ADBAC7\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">if<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #6CB6FF\">this<\/span><span style=\"color: #ADBAC7\">.level <\/span><span style=\"color: #F47067\">==<\/span><span style=\"color: #ADBAC7\"> level){<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            System.out.<\/span><span style=\"color: #DCBDFB\">println<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;DebugLogger: &quot;<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">+<\/span><span style=\"color: #ADBAC7\"> level.type <\/span><span style=\"color: #F47067\">+<\/span><span style=\"color: #ADBAC7\"> msg);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #DCBDFB\">sendToNext<\/span><span style=\"color: #ADBAC7\">(level, msg);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>public class ErrorLogger extends MyLogger {\n    ErrorLogger(){\n        level = LOGLEVEL.E;\n    }\n\n    @Override\n    public void handleMessage(LOGLEVEL level, String msg) {\n        if(this.level == level){\n            System.out.println(\"ErrorLogger: \" + level.type + msg);\n        }\n\n        sendToNext(level, msg);\n    }<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F47067\">public<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">class<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">ErrorLogger<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">extends<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">MyLogger<\/span><span style=\"color: #ADBAC7\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #DCBDFB\">ErrorLogger<\/span><span style=\"color: #ADBAC7\">(){<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        level <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> LOGLEVEL.E;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    @<\/span><span style=\"color: #F47067\">Override<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">public<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">void<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">handleMessage<\/span><span style=\"color: #ADBAC7\">(LOGLEVEL <\/span><span style=\"color: #F69D50\">level<\/span><span style=\"color: #ADBAC7\">, String <\/span><span style=\"color: #F69D50\">msg<\/span><span style=\"color: #ADBAC7\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">if<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #6CB6FF\">this<\/span><span style=\"color: #ADBAC7\">.level <\/span><span style=\"color: #F47067\">==<\/span><span style=\"color: #ADBAC7\"> level){<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            System.out.<\/span><span style=\"color: #DCBDFB\">println<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;ErrorLogger: &quot;<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">+<\/span><span style=\"color: #ADBAC7\"> level.type <\/span><span style=\"color: #F47067\">+<\/span><span style=\"color: #ADBAC7\"> msg);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #DCBDFB\">sendToNext<\/span><span style=\"color: #ADBAC7\">(level, msg);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\uac01 \uad6c\ud604 \ud074\ub798\uc2a4\uc5d0\uc11c \ucd9c\ub825\ud3ec\ub9f7\uc744 \ub9c8\uc74c\ub300\ub85c \ub9cc\uc9c8 \uc218 \uc788\uace0, \uc5ec\uae30\uc11c\ub294 \uac04\ub2e8\ud558\uac8c \uc5b4\ub290 \ud074\ub798\uc2a4\uc5d0\uc11c \ucd9c\ub825\ud558\ub294\uc9c0\ub9cc \ud45c\uc2dc\ud574\uc92c\ub2e4. sendToNext()\ub294 \ucd94\uc0c1 \ud074\ub798\uc2a4 MyLogger\uc5d0\uc11c \uad6c\ud604\ud588\ub294\ub370, output level\uc5d0 \ub530\ub77c \ub9ac\ud018\uc2a4\ud2b8 \uba54\uc138\uc9c0\ub97c \uc804\ub2ec\ud560\uc9c0 \uacb0\uc815\ud558\ub3c4\ub85d \ucd94\uac00\ud574\ubd24\ub2e4. <\/p>\n\n\n\n<p>\ud074\ub77c\uc774\uc5b8\ud2b8 \ucf54\ub4dc\ub294 \ub2e4\uc74c\uacfc \uac19\uc774 \ub9cc\ub4e4\uc5c8\ub2e4. <\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>public class MyLog {\n    private static MyLogger vLogger = new VerboseLogger();\n    private static MyLogger dLogger = new DebugLogger();\n    private static MyLogger eLogger = new ErrorLogger();\n\n    static {\n        eLogger.setNextLogger(dLogger);\n        dLogger.setNextLogger(vLogger);\n    }\n\n    public static void log(LOGLEVEL level, String msg){\n        eLogger.handleMessage(level, msg);\n    }\n\n    public static void setLevel(LOGLEVEL level){\n        MyLogger.setLevel(level);\n    }\n\n    public static LOGLEVEL getLevel(){\n        return MyLogger.getLevel();\n    }\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F47067\">public<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">class<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">MyLog<\/span><span style=\"color: #ADBAC7\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">private<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">static<\/span><span style=\"color: #ADBAC7\"> MyLogger<\/span><span style=\"color: #F69D50\"> <\/span><span style=\"color: #ADBAC7\">vLogger<\/span><span style=\"color: #F69D50\"> <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">new<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">VerboseLogger<\/span><span style=\"color: #ADBAC7\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">private<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">static<\/span><span style=\"color: #ADBAC7\"> MyLogger<\/span><span style=\"color: #F69D50\"> <\/span><span style=\"color: #ADBAC7\">dLogger<\/span><span style=\"color: #F69D50\"> <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">new<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">DebugLogger<\/span><span style=\"color: #ADBAC7\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">private<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">static<\/span><span style=\"color: #ADBAC7\"> MyLogger<\/span><span style=\"color: #F69D50\"> <\/span><span style=\"color: #ADBAC7\">eLogger<\/span><span style=\"color: #F69D50\"> <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">new<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">ErrorLogger<\/span><span style=\"color: #ADBAC7\">();<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">static<\/span><span style=\"color: #ADBAC7\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        eLogger.<\/span><span style=\"color: #DCBDFB\">setNextLogger<\/span><span style=\"color: #ADBAC7\">(dLogger);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        dLogger.<\/span><span style=\"color: #DCBDFB\">setNextLogger<\/span><span style=\"color: #ADBAC7\">(vLogger);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">public<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">static<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">void<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">log<\/span><span style=\"color: #ADBAC7\">(LOGLEVEL <\/span><span style=\"color: #F69D50\">level<\/span><span style=\"color: #ADBAC7\">, String <\/span><span style=\"color: #F69D50\">msg<\/span><span style=\"color: #ADBAC7\">){<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        eLogger.<\/span><span style=\"color: #DCBDFB\">handleMessage<\/span><span style=\"color: #ADBAC7\">(level, msg);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">public<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">static<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">void<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">setLevel<\/span><span style=\"color: #ADBAC7\">(LOGLEVEL <\/span><span style=\"color: #F69D50\">level<\/span><span style=\"color: #ADBAC7\">){<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        MyLogger.<\/span><span style=\"color: #DCBDFB\">setLevel<\/span><span style=\"color: #ADBAC7\">(level);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">public<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">static<\/span><span style=\"color: #ADBAC7\"> LOGLEVEL <\/span><span style=\"color: #DCBDFB\">getLevel<\/span><span style=\"color: #ADBAC7\">(){<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">return<\/span><span style=\"color: #ADBAC7\"> MyLogger.<\/span><span style=\"color: #DCBDFB\">getLevel<\/span><span style=\"color: #ADBAC7\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\uac01\uac01\uc758 concrete class instances\ub97c \uc0dd\uc131\ud574\uc8fc\uace0 \uccb4\uc778\ucc98\ub7fc \uc5f0\uacb0\ud574\uc92c\ub2e4. eLogger\uc5d0\ub9cc \uc804\ub2ec\ud558\uba74 \uc8fc\uc5b4\uc9c4 \ub808\ubca8\uc744 \ucc28\ub840\ub300\ub85c \ud655\uc778\ud558\uba74\uc11c \uc54c\uc544\uc11c \ucd9c\ub825\ud560 \uac83\uc774\ub2e4. \ubf40\ub108\uc2a4\ub85c setLevel(), getLevel()\uc744 \uad6c\ud604\ud588\ub294\ub370, output \ub808\ubca8\uc744 \uc124\uc815\ud558\ub294 \uba54\uc3d8\ub4dc\uc774\ub2e4. \uc124\uc815\ub41c output level\uc744 \ub118\uc5b4\uac00\uba74 \uba54\uc138\uc9c0 \uccb4\uc778\uc744 \uba48\ucd94\ub3c4\ub85d MyLogger.sendToNext()\uc5d0 \uad6c\ud604\ub418\uc5b4 \uc788\ub2e4. <\/p>\n\n\n\n<p>\ud14c\uc2a4\ud2b8 \uc2e4\ud589\ucf54\ub4dc\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>public class Main {\n    public static void main(String[] args){\n        MyLog.log(LOGLEVEL.D, \"It's debug message\");\n        MyLog.log(LOGLEVEL.V, \"It's verbose message\");\n        MyLog.log(LOGLEVEL.E, \"It's error message\");\n\n        System.out.println(\"--- Set output level DEBUG ---\");\n        MyLog.setLevel(LOGLEVEL.D);\n        MyLog.log(LOGLEVEL.D, \"It's debug message\");\n        MyLog.log(LOGLEVEL.V, \"It's verbose message\");\n        MyLog.log(LOGLEVEL.E, \"It's error message\");\n    }\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F47067\">public<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">class<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">Main<\/span><span style=\"color: #ADBAC7\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">public<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">static<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">void<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">main<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #F47067\">String<\/span><span style=\"color: #ADBAC7\">[] <\/span><span style=\"color: #F69D50\">args<\/span><span style=\"color: #ADBAC7\">){<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        MyLog.<\/span><span style=\"color: #DCBDFB\">log<\/span><span style=\"color: #ADBAC7\">(LOGLEVEL.D, <\/span><span style=\"color: #96D0FF\">&quot;It&#39;s debug message&quot;<\/span><span style=\"color: #ADBAC7\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        MyLog.<\/span><span style=\"color: #DCBDFB\">log<\/span><span style=\"color: #ADBAC7\">(LOGLEVEL.V, <\/span><span style=\"color: #96D0FF\">&quot;It&#39;s verbose message&quot;<\/span><span style=\"color: #ADBAC7\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        MyLog.<\/span><span style=\"color: #DCBDFB\">log<\/span><span style=\"color: #ADBAC7\">(LOGLEVEL.E, <\/span><span style=\"color: #96D0FF\">&quot;It&#39;s error message&quot;<\/span><span style=\"color: #ADBAC7\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        System.out.<\/span><span style=\"color: #DCBDFB\">println<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;--- Set output level DEBUG ---&quot;<\/span><span style=\"color: #ADBAC7\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        MyLog.<\/span><span style=\"color: #DCBDFB\">setLevel<\/span><span style=\"color: #ADBAC7\">(LOGLEVEL.D);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        MyLog.<\/span><span style=\"color: #DCBDFB\">log<\/span><span style=\"color: #ADBAC7\">(LOGLEVEL.D, <\/span><span style=\"color: #96D0FF\">&quot;It&#39;s debug message&quot;<\/span><span style=\"color: #ADBAC7\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        MyLog.<\/span><span style=\"color: #DCBDFB\">log<\/span><span style=\"color: #ADBAC7\">(LOGLEVEL.V, <\/span><span style=\"color: #96D0FF\">&quot;It&#39;s verbose message&quot;<\/span><span style=\"color: #ADBAC7\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        MyLog.<\/span><span style=\"color: #DCBDFB\">log<\/span><span style=\"color: #ADBAC7\">(LOGLEVEL.E, <\/span><span style=\"color: #96D0FF\">&quot;It&#39;s error message&quot;<\/span><span style=\"color: #ADBAC7\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>DebugLogger: &#91;DEBUG&#93;It's debug message\nVerboseLogger: &#91;VERBOSE&#93;It's verbose message\nErrorLogger: &#91;ERROR&#93;It's error message\n--- Set output level DEBUG ---\nDebugLogger: &#91;DEBUG&#93;It's debug message\nErrorLogger: &#91;ERROR&#93;It's error message<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #ADBAC7\">DebugLogger: &#91;<\/span><span style=\"color: #F47067\">DEBUG<\/span><span style=\"color: #ADBAC7\">&#93;It<\/span><span style=\"color: #96D0FF\">&#39;s debug message<\/span><\/span>\n<span class=\"line\"><span style=\"color: #96D0FF\">VerboseLogger: &#91;VERBOSE&#93;It&#39;<\/span><span style=\"color: #ADBAC7\">s verbose message<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">ErrorLogger: &#91;<\/span><span style=\"color: #F47067\">ERROR<\/span><span style=\"color: #ADBAC7\">&#93;It<\/span><span style=\"color: #96D0FF\">&#39;s error message<\/span><\/span>\n<span class=\"line\"><span style=\"color: #96D0FF\">--- Set output level DEBUG ---<\/span><\/span>\n<span class=\"line\"><span style=\"color: #96D0FF\">DebugLogger: &#91;DEBUG&#93;It&#39;<\/span><span style=\"color: #ADBAC7\">s debug message<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">ErrorLogger: &#91;<\/span><span style=\"color: #F47067\">ERROR<\/span><span style=\"color: #ADBAC7\">&#93;It<\/span><span style=\"color: #96D0FF\">&#39;s error message<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\uad6c\ud604\ud558\uba74\uc11c \uc870\uae08 \uc560\ub9e4\ud55c \ubd80\ubd84\uc740 LOGLEVEL enum \ud074\ub798\uc2a4\uc600\ub2e4. \uc678\ubd80\uc5d0\uc11c\ub3c4 \uc0ac\uc6a9\ud560 \uc218 \uc788\uac8c \uac1c\ubcc4 \ud074\ub798\uc2a4\ub85c \ub9cc\ub4e4\uae34 \ud588\ub294\ub370, \uadf8\ub0e5 \ucd94\uc0c1 \ud074\ub798\uc2a4\uc5d0 \uc0c1\uc218\ub85c \uc815\uc758\ud574\ub3c4 \ub420\uac70\uac19\ub2e4. <br> \ub610 \ud55c\uac00\uc9c0\ub294 \ud074\ub77c\uc774\uc5b8\ud2b8\uc778 MyLog \ud074\ub798\uc2a4\uc5d0\uc11c \ud328\ud134\uc758 \ud575\uc2ec\uc778 \uccb4\uc778\uc744 \ub9cc\ub4e4\uc5b4\uc8fc\uace0 \uc788\ub2e4. \ud2b8\ub9ac\ud615\ud0dc\ub85c \uad6c\uc131\ub418\ub294 \uc708\ub3c4\uc6b0 \uc2dc\uc2a4\ud15c\uc758 \uacbd\uc6b0, \uc0dd\uc131\uc2dc \uccb4\uc778\uc774 \ub418\ub294 parent\ub97c \uc9c0\uc815\ud574\uc900\ub2e4. \uc5ec\uae30\uc11c\ub3c4 \uc0dd\uc131\uc790\uc5d0\uc11c \ucc98\ub9ac\ud574\uc8fc\ub294\uac8c \ub354 \ub098\uc558\uc744\uc218\ub3c4 \uc788\uaca0\ub2e8 \uc0dd\uac01\uc774 \ub4e4\uc5c8\ub2e4.<\/p>\n\n\n\n<p>\ub9c8\uc9c0\ub9c9\uc73c\ub85c Chain of Responsibility UML \ub2e4\uc774\uc5b4\uadf8\ub7a8 \ud45c\ud604\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"601\" height=\"311\" src=\"http:\/\/batmask.dothome.co.kr\/wordpress\/wp-content\/uploads\/2020\/04\/chainofresponsibility.png\" alt=\"\" class=\"wp-image-327\" srcset=\"http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2020\/04\/chainofresponsibility.png 601w, http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2020\/04\/chainofresponsibility-300x155.png 300w\" sizes=\"auto, (max-width: 601px) 100vw, 601px\" \/><figcaption class=\"wp-element-caption\">\uc774\ubbf8\uc9c0 \ucc38\uc870 : <a href=\"https:\/\/www.dotnettricks.com\/learn\/designpatterns\/chain-of-responsibility-design-pattern-dotnet\">https:\/\/www.dotnettricks.com\/learn\/designpatterns\/chain-of-responsibility-design-pattern-dotnet<\/a><\/figcaption><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>Chain of Responsibility\ub294 \ud578\ub4e4\ub7ec\ub97c \uac00\uc9c4 \uac1d\uccb4\uac00 \uc694\uccad\uc744 \ubc1b\uc73c\uba74 \uc790\uc2e0\uc774 \ucc98\ub9ac\ud560 \uc694\uccad\uc778\uc9c0 \ud655\uc778 \ud6c4, \ub9de\ub2e4\uba74 \ucc98\ub9ac\ud558\uace0 \uc544\ub2c8\ub77c\uba74 \ub2e4\uc74c \uac1d\uccb4\uc5d0\uac8c \uc804\ub2ec\ud55c\ub2e4. \uc804\ub2ec\ubc1b\uc740 \uac1d\uccb4\ub3c4 \ub3d9\uc77c\ud55c \ud578\ub4e4\ub7ec \uc778\ud130\ud398\uc774\uc2a4\ub97c \uac16\uace0 \uc788\uc73c\uba70, \uc804\ub2ec\ubc1b\uc740 \uc694\uccad\uc744 \ud655\uc778 \ud6c4 \ub9c8\ucc2c\uac00\uc9c0\ub85c \ucc98\ub9ac\ud55c\ub2e4. \uc774\ub807\uac8c \ud578\ub4e4\ub7ec\ub4e4\uc774 \uccb4\uc778\ucc98\ub7fc \uc5ee\uc5ec\uc11c \ub9c8\uce58 \ud544\ud130\ub97c \uac70\uce58\ub4ef \ud544\uc694\ud55c \uac1d\uccb4\uae4c\uc9c0 \uc804\ub2ec\ub418\uc5b4 \ucc98\ub9ac\ub418\ub294 \ubc29\uc2dd\uc774 Chain of Responsibility Pattern\uc774\ub2e4. \uc774 \ud328\ud134\uc744 \uc0ac\uc6a9\ud558\ub294 \uacf3\uc740 \uc544\uc8fc \ud754\ud558\uac8c \ubcf4\uc774\ub294\ub370, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3,24],"tags":[107,104,106,128,135],"class_list":["post-322","post","type-post","status-publish","format-standard","hentry","category-etc","category-note4reference","tag-chain-of-responsibility","tag-design-pattern","tag-java","tag-design-pattern-kr","tag-java-kr"],"jetpack_featured_media_url":"","_links":{"self":[{"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/posts\/322","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/comments?post=322"}],"version-history":[{"count":8,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/posts\/322\/revisions"}],"predecessor-version":[{"id":3440,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/posts\/322\/revisions\/3440"}],"wp:attachment":[{"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/media?parent=322"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/categories?post=322"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/tags?post=322"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}