{"id":37227,"date":"2023-06-13T22:55:20","date_gmt":"2023-06-13T13:55:20","guid":{"rendered":"https:\/\/8gfg.shop\/blog\/?p=37227"},"modified":"2023-06-13T22:55:20","modified_gmt":"2023-06-13T13:55:20","slug":"java-chain-of-responsibility-design-pattern-how-to-compose-chained-handlers-to-handle-requests","status":"publish","type":"post","link":"https:\/\/8gfg.shop\/blog\/development\/java-chain-of-responsibility-design-pattern-how-to-compose-chained-handlers-to-handle-requests","title":{"rendered":"\uc790\ubc14 \uccb4\uc778 \uc624\ube0c \ub9ac\uc2a4\ud3f0\uc2dc\ube4c\ub9ac\ud2f0 \ub514\uc790\uc778 \ud328\ud134: \uc694\uccad\uc744 \ucc98\ub9ac\ud558\uae30 \uc704\ud574 \uccb4\uc778\uc73c\ub85c \uc5f0\uacb0\ub41c \ud578\ub4e4\ub7ec\ub97c \uad6c\uc131\ud558\ub294 \ubc29\ubc95"},"content":{"rendered":"
\uc790\ubc14 \uccb4\uc778 \uc624\ube0c \ub9ac\uc2a4\ud3f0\uc2dc\ube4c\ub9ac\ud2f0 \ub514\uc790\uc778 \ud328\ud134\uc740 \uc694\uccad\uc744 \ucc98\ub9ac\ud558\uae30 \uc704\ud574 \uccb4\uc778\uc73c\ub85c \uc5f0\uacb0\ub41c \ud578\ub4e4\ub7ec\ub97c \uad6c\uc131\ud558\ub294 \ubc29\ubc95\uc785\ub2c8\ub2e4. \uc774 \ub514\uc790\uc778 \ud328\ud134\uc740 \uc694\uccad \ucc98\ub9ac\ub97c \ub2e8\uacc4\ubcc4\ub85c \ucc98\ub9ac\ud558\uace0 \uac01 \ub2e8\uacc4\uc5d0\uc11c \ub2e4\ub978 \ud578\ub4e4\ub7ec\uac00 \ucc98\ub9ac\ud558\ub3c4\ub85d \uad6c\uc131\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub7ec\ud55c \ubc29\uc2dd\uc73c\ub85c \ucc98\ub9ac\ub418\ub294 \uc694\uccad\uc740 \uac01 \ud578\ub4e4\ub7ec\uac00 \ucc98\ub9ac\ud558\ub294 \uc2dc\uc810\uc5d0 \ub530\ub77c \ub2e4\ub978 \uc751\ub2f5\uc774 \ubc18\ud658\ub429\ub2c8\ub2e4.<\/p>\n
\uc774 \ub514\uc790\uc778 \ud328\ud134\uc740 \uc11c\ube14\ub9bf \ud544\ud130, \uc2a4\ud504\ub9c1 \uc778\ud130\uc149\ud130, \uc790\ubc14\uc2a4\ud06c\ub9bd\ud2b8 Promise, RxJava \ub4f1 \uc5ec\ub7ec \uacf3\uc5d0\uc11c \ud65c\uc6a9\ub429\ub2c8\ub2e4. \uc774 \ub514\uc790\uc778 \ud328\ud134\uc744 \uc774\uc6a9\ud558\uba74 \uc694\uccad \ucc98\ub9ac\uc758 \uc720\uc5f0\uc131\uc744 \ub192\uc77c \uc218 \uc788\uc73c\uba70, \uc694\uccad \ucc98\ub9ac\uc758 \ub85c\uae45, \ubcf4\uc548 \ub4f1 \ub2e4\uc591\ud55c \uae30\ub2a5\uc744 \ucd94\uac00\ud558\uae30\uc5d0 \uc6a9\uc774\ud569\ub2c8\ub2e4.<\/p>\n
\ud578\ub4e4\ub7ec \uccb4\uc778\uc744 \uc774\uc6a9\ud55c \uc694\uccad \ucc98\ub9ac \ubc29\ubc95\uc740 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.<\/p>\n
\ud578\ub4e4\ub7ec \uccb4\uc778\uc744 \uad6c\uc131\ud569\ub2c8\ub2e4. \ud578\ub4e4\ub7ec \uccb4\uc778\uc740 \uac01 \ud578\ub4e4\ub7ec\ub97c \uc5f0\uacb0\ud55c \uccb4\uc778\uc73c\ub85c \uad6c\uc131\ub429\ub2c8\ub2e4. \uac01 \ud578\ub4e4\ub7ec\ub294 \ub2e4\uc74c \ud578\ub4e4\ub7ec\ub97c \uac00\ub9ac\ud0a4\ub294 next \ud578\ub4e4\ub7ec\ub97c \uac16\uc2b5\ub2c8\ub2e4.<\/p>\n<\/li>\n
\ud074\ub77c\uc774\uc5b8\ud2b8\ub85c\ubd80\ud130 \uc694\uccad\uc774 \ub4e4\uc5b4\uc624\uba74 \uccab \ubc88\uc9f8 \ud578\ub4e4\ub7ec\ub97c \uc2e4\ud589\ud569\ub2c8\ub2e4.<\/p>\n<\/li>\n
\uccab \ubc88\uc9f8 \ud578\ub4e4\ub7ec\uc5d0\uc11c \uc694\uccad\uc744 \ucc98\ub9ac\ud560 \uc218 \uc5c6\uc73c\uba74 \ub2e4\uc74c \ud578\ub4e4\ub7ec\ub85c \uc694\uccad\uc744 \uc804\ub2ec\ud569\ub2c8\ub2e4.<\/p>\n<\/li>\n
\ud578\ub4e4\ub7ec \uccb4\uc778\uc744 \ub530\ub77c \uc694\uccad\uc744 \ucc98\ub9ac\ud558\ub2e4\uac00 \uc694\uccad\uc744 \ucc98\ub9ac\ud560 \uc218 \uc788\ub294 \ud578\ub4e4\ub7ec\ub97c \ucc3e\uc73c\uba74 \ud574\ub2f9 \ud578\ub4e4\ub7ec\uc5d0\uc11c \uc694\uccad\uc744 \ucc98\ub9ac\ud569\ub2c8\ub2e4.<\/p>\n<\/li>\n
\ud578\ub4e4\ub7ec \uccb4\uc778\uc744 \ub530\ub77c \ucc98\ub9ac\ud558\ub2e4\uac00 \uc5b4\ub290 \ud578\ub4e4\ub7ec\uc5d0\uc11c\ub3c4 \uc694\uccad\uc744 \ucc98\ub9ac\ud560 \uc218 \uc5c6\uc73c\uba74 \uc608\uc678\ub97c \ubc1c\uc0dd\uc2dc\ud0b5\ub2c8\ub2e4.<\/p>\n<\/li>\n<\/ol>\n
\ub2e4\uc74c\uc740 \uc790\ubc14 \uccb4\uc778 \uc624\ube0c \ub9ac\uc2a4\ud3f0\uc2dc\ube4c\ub9ac\ud2f0 \ub514\uc790\uc778 \ud328\ud134 \uc608\uc81c \uad6c\ud604\uc785\ub2c8\ub2e4.<\/p>\n
public interface Handler {\n void setNextHandler(Handler nextHandler);\n void handleRequest(Request request);\n}\n\npublic class Request {\n private String requestType;\n private String requestDescription;\n\n public Request(String requestType, String requestDescription) {\n this.requestType = requestType;\n this.requestDescription = requestDescription;\n }\n\n public String getRequestType() {\n return requestType;\n }\n\n public String getRequestDescription() {\n return requestDescription;\n }\n}\n\npublic class AuthenticationHandler implements Handler {\n private Handler nextHandler;\n\n @Override\n public void setNextHandler(Handler nextHandler) {\n this.nextHandler = nextHandler;\n }\n\n @Override\n public void handleRequest(Request request) {\n if (request.getRequestType().equals(\"Authentication\")) {\n System.out.println(\"Handle Authentication Request: \" + request.getRequestDescription());\n } else {\n nextHandler.handleRequest(request);\n }\n }\n}\n\npublic class AuthorizationHandler implements Handler {\n private Handler nextHandler;\n\n @Override\n public void setNextHandler(Handler nextHandler) {\n this.nextHandler = nextHandler;\n }\n\n @Override\n public void handleRequest(Request request) {\n if (request.getRequestType().equals(\"Authorization\")) {\n System.out.println(\"Handle Authorization Request: \" + request.getRequestDescription());\n } else {\n nextHandler.handleRequest(request);\n }\n }\n}\n\npublic class LoggingHandler implements Handler {\n private Handler nextHandler;\n\n @Override\n public void setNextHandler(Handler nextHandler) {\n this.nextHandler = nextHandler;\n }\n\n @Override\n public void handleRequest(Request request) {\n if (request.getRequestType().equals(\"Logging\")) {\n System.out.println(\"Handle Logging Request: \" + request.getRequestDescription());\n } else {\n nextHandler.handleRequest(request);\n }\n }\n}\n\npublic class Client {\n public static void main(String[] args) {\n Handler authenticationHandler = new AuthenticationHandler();\n Handler authorizationHandler = new AuthorizationHandler();\n Handler loggingHandler = new LoggingHandler();\n\n authenticationHandler.setNextHandler(authorizationHandler);\n authorizationHandler.setNextHandler(loggingHandler);\n\n Request authenticationRequest = new Request(\"Authentication\", \"Authenticate user\");\n Request authorizationRequest = new Request(\"Authorization\", \"Authorize user\");\n Request loggingRequest = new Request(\"Logging\", \"Log user activity\");\n Request invalidRequest = new Request(\"Invalid\", \"Invalid request\");\n\n authenticationHandler.handleRequest(authenticationRequest);\n authorizationHandler.handleRequest(authorizationRequest);\n loggingHandler.handleRequest(loggingRequest);\n authenticationHandler.handleRequest(invalidRequest);\n }\n}<\/code><\/pre>\n\uc704 \uc608\uc81c\ub294 AuthenticationHandler, AuthorizationHandler, LoggingHandler\ub97c \ud578\ub4e4\ub7ec\ub85c \uac16\ub294 \ud578\ub4e4\ub7ec \uccb4\uc778\uc744 \uad6c\uc131\ud558\uace0, \uac01 \ud578\ub4e4\ub7ec\uc5d0\uc11c \uc694\uccad\uc744 \ucc98\ub9ac\ud558\ub294 \ubc29\ubc95\uc744 \ubcf4\uc5ec\uc90d\ub2c8\ub2e4. \uc774 \uc608\uc81c\uc5d0\uc11c\ub294 Request \uac1d\uccb4\ub97c \ub9cc\ub4e4\uc5b4 \uac01 \ud578\ub4e4\ub7ec\uc5d0 \uc804\ub2ec\ud558\uace0, \uc694\uccad\uc758 \ud0c0\uc785\uc5d0 \ub530\ub77c \uac01 \ud578\ub4e4\ub7ec\uc5d0\uc11c \uc694\uccad\uc744 \ucc98\ub9ac\ud569\ub2c8\ub2e4.<\/p>\n
\uccb4\uc778 \uc624\ube0c \ub9ac\uc2a4\ud3f0\uc2dc\ube4c\ub9ac\ud2f0 \ub514\uc790\uc778 \ud328\ud134\uc758 \uc7a5\ub2e8\uc810 \ubc0f \ud65c\uc6a9 \ubc29\uc548<\/h1>\n
\uccb4\uc778 \uc624\ube0c \ub9ac\uc2a4\ud3f0\uc2dc\ube4c\ub9ac\ud2f0 \ub514\uc790\uc778 \ud328\ud134\uc758 \uc7a5\uc810\uc740 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.<\/p>\n
\n- \uc694\uccad \ucc98\ub9ac\uc758 \uc720\uc5f0\uc131\uc744 \ub192\uc785\ub2c8\ub2e4. \ud578\ub4e4\ub7ec\ub97c \ucd94\uac00\ud558\uac70\ub098 \uc0ad\uc81c\ud558\uba74\uc11c \uc694\uccad \ucc98\ub9ac\uc758 \uacfc\uc815\uc744 \ubcc0\uacbd\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/li>\n
- \uc694\uccad \ucc98\ub9ac\uc758 \ub85c\uae45, \ubcf4\uc548 \ub4f1 \ub2e4\uc591\ud55c \uae30\ub2a5\uc744 \ucd94\uac00\ud558\uae30\uc5d0 \uc6a9\uc774\ud569\ub2c8\ub2e4.<\/li>\n
- \uac01 \ud578\ub4e4\ub7ec\uac00 \ub3c5\ub9bd\uc801\uc73c\ub85c \ub3d9\uc791\ud558\uae30 \ub54c\ubb38\uc5d0, \ud578\ub4e4\ub7ec \uac04\uc758 \uacb0\ud569\ub3c4\uac00 \ub0ae\uc2b5\ub2c8\ub2e4.<\/li>\n
- \ud578\ub4e4\ub7ec \uccb4\uc778\uc744 \uc774\uc6a9\ud558\uba74 \uc694\uccad \ucc98\ub9ac\uc758 \uc131\ub2a5\uc744 \ud5a5\uc0c1\uc2dc\ud0ac \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud578\ub4e4\ub7ec \uccb4\uc778\uc5d0\uc11c \uc694\uccad \ucc98\ub9ac\uc5d0 \uc2e4\ud328\ud560 \uac00\ub2a5\uc131\uc774 \ub0ae\uc544\uc9c0\uae30 \ub54c\ubb38\uc785\ub2c8\ub2e4.<\/li>\n<\/ul>\n
\uccb4\uc778 \uc624\ube0c \ub9ac\uc2a4\ud3f0\uc2dc\ube4c\ub9ac\ud2f0 \ub514\uc790\uc778 \ud328\ud134\uc758 \ub2e8\uc810\uc740 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.<\/p>\n
\n- \ud578\ub4e4\ub7ec \uccb4\uc778\uc744 \uad6c\uc131\ud558\ub294 \uacfc\uc815\uc774 \ubcf5\uc7a1\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uac01 \ud578\ub4e4\ub7ec\ub97c \uad6c\ud604\ud55c \ud6c4, \ud578\ub4e4\ub7ec \uccb4\uc778\uc744 \uad6c\uc131\ud574\uc57c \ud558\uae30 \ub54c\ubb38\uc785\ub2c8\ub2e4.<\/li>\n
- \ud578\ub4e4\ub7ec \uccb4\uc778\uc5d0\uc11c \uc694\uccad \ucc98\ub9ac\uc5d0 \uc2e4\ud328\ud560 \uac00\ub2a5\uc131\uc774 \uc788\uae30 \ub54c\ubb38\uc5d0, \uc608\uc678 \ucc98\ub9ac\uac00 \ud544\uc694\ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n
\uccb4\uc778 \uc624\ube0c \ub9ac\uc2a4\ud3f0\uc2dc\ube4c\ub9ac\ud2f0 \ub514\uc790\uc778 \ud328\ud134\uc740 \ub2e4\uc74c\uacfc \uac19\uc740 \ud65c\uc6a9 \ubc29\uc548\uc774 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n
\n- \uc11c\ube14\ub9bf \ud544\ud130, \uc2a4\ud504\ub9c1 \uc778\ud130\uc149\ud130 \ub4f1\uc5d0\uc11c \uc694\uccad \ucc98\ub9ac\ub97c \uad6c\ud604\ud560 \ub54c \ud65c\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/li>\n
- \uc790\ubc14\uc2a4\ud06c\ub9bd\ud2b8 Promise, RxJava \ub4f1\uc5d0\uc11c \ube44\ub3d9\uae30 \ucc98\ub9ac\ub97c \uad6c\ud604\ud560 \ub54c \ud65c\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/li>\n
- \uc694\uccad \ucc98\ub9ac\uc758 \uacfc\uc815 \uc911 \ubc1c\uc0dd\ud558\ub294 \ub85c\uae45, \ubcf4\uc548 \ub4f1 \ub2e4\uc591\ud55c \uae30\ub2a5\uc744 \ucd94\uac00\ud560 \ub54c \ud65c\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/li>\n<\/ul>\n
\uacb0\ub860<\/h1>\n
\uc790\ubc14 \uccb4\uc778 \uc624\ube0c \ub9ac\uc2a4\ud3f0\uc2dc\ube4c\ub9ac\ud2f0 \ub514\uc790\uc778 \ud328\ud134\uc740 \uc694\uccad\uc744 \ucc98\ub9ac\ud558\uae30 \uc704\ud574 \uccb4\uc778\uc73c\ub85c \uc5f0\uacb0\ub41c \ud578\ub4e4\ub7ec\ub97c \uad6c\uc131\ud558\ub294 \ubc29\ubc95\uc785\ub2c8\ub2e4. \uc774 \ub514\uc790\uc778 \ud328\ud134\uc744 \uc774\uc6a9\ud558\uba74 \uc694\uccad \ucc98\ub9ac\uc758 \uc720\uc5f0\uc131\uc744 \ub192\uc77c \uc218 \uc788\uc73c\uba70, \uc694\uccad \ucc98\ub9ac\uc758 \ub85c\uae45, \ubcf4\uc548 \ub4f1 \ub2e4\uc591\ud55c \uae30\ub2a5\uc744 \ucd94\uac00\ud558\uae30\uc5d0 \uc6a9\uc774\ud569\ub2c8\ub2e4. \uc774 \ub514\uc790\uc778 \ud328\ud134\uc740 \uc11c\ube14\ub9bf \ud544\ud130, \uc2a4\ud504\ub9c1 \uc778\ud130\uc149\ud130, \uc790\ubc14\uc2a4\ud06c\ub9bd\ud2b8 Promise, RxJava \ub4f1 \uc5ec\ub7ec \uacf3\uc5d0\uc11c \ud65c\uc6a9\ub429\ub2c8\ub2e4.<\/p>\n","protected":false},"excerpt":{"rendered":"
\uc790\ubc14 \uccb4\uc778 \uc624\ube0c \ub9ac\uc2a4\ud3f0\uc2dc\ube4c\ub9ac\ud2f0 \ub514\uc790\uc778 \ud328\ud134\uc740 \uc694\uccad\uc744 \ucc98\ub9ac\ud558\uae30 \uc704\ud574 \uccb4\uc778\uc73c\ub85c \uc5f0\uacb0\ub41c \ud578\ub4e4\ub7ec\ub97c \uad6c\uc131\ud558\ub294 \ubc29\ubc95\uc785\ub2c8\ub2e4.<\/p>\n","protected":false},"author":1,"featured_media":33704,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1957],"tags":[2550,2068,2188,2584,2580,3291,5925,3414],"class_list":["post-37227","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development","tag-authentication","tag-handle","tag-public","tag-system","tag-user","tag-3291","tag-5925","tag-3414"],"acf":[],"_links":{"self":[{"href":"https:\/\/8gfg.shop\/blog\/wp-json\/wp\/v2\/posts\/37227","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/8gfg.shop\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/8gfg.shop\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/8gfg.shop\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/8gfg.shop\/blog\/wp-json\/wp\/v2\/comments?post=37227"}],"version-history":[{"count":1,"href":"https:\/\/8gfg.shop\/blog\/wp-json\/wp\/v2\/posts\/37227\/revisions"}],"predecessor-version":[{"id":37228,"href":"https:\/\/8gfg.shop\/blog\/wp-json\/wp\/v2\/posts\/37227\/revisions\/37228"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/8gfg.shop\/blog\/wp-json\/wp\/v2\/media\/33704"}],"wp:attachment":[{"href":"https:\/\/8gfg.shop\/blog\/wp-json\/wp\/v2\/media?parent=37227"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/8gfg.shop\/blog\/wp-json\/wp\/v2\/categories?post=37227"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/8gfg.shop\/blog\/wp-json\/wp\/v2\/tags?post=37227"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}