{"id":35108,"date":"2023-05-28T11:30:56","date_gmt":"2023-05-28T02:30:56","guid":{"rendered":"https:\/\/m9js.shop\/blog\/?p=35108"},"modified":"2023-05-28T11:30:56","modified_gmt":"2023-05-28T02:30:56","slug":"implementing-microservices-communication-with-spring-cloud-feign","status":"publish","type":"post","link":"https:\/\/m9js.shop\/blog\/development\/implementing-microservices-communication-with-spring-cloud-feign","title":{"rendered":"Implementing Microservices Communication with Spring Cloud Feign"},"content":{"rendered":"

\uc2a4\ud504\ub9c1 \ud074\ub77c\uc6b0\ub4dc \ud398\uc778\uc744 \uc774\uc6a9\ud55c \ub9c8\uc774\ud06c\ub85c\uc11c\ube44\uc2a4 \ud1b5\uc2e0 \uad6c\ud604<\/h1>\n

\ub9c8\uc774\ud06c\ub85c\uc11c\ube44\uc2a4 \uc544\ud0a4\ud14d\ucc98\ub294 \uac1c\ubc1c\uc790\uac00 \uc791\uc740 \ub2e8\uc704\ub85c \ub098\ub204\uc5b4 \uad6c\uc131\ud55c \uc11c\ube44\uc2a4\ub4e4\uc744 \uc870\ud569\ud558\uc5ec \uc5b4\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \uad6c\uc131\ud558\ub294 \ubc29\ubc95\uc785\ub2c8\ub2e4. \uc774\ub7ec\ud55c \uc544\ud0a4\ud14d\ucc98\uc5d0\uc11c \uac01 \uc11c\ube44\uc2a4\ub294 \ubd84\ub9ac\ub418\uc5b4 \ub3c5\ub9bd\uc801\uc778 \ud658\uacbd\uc5d0\uc11c \uac1c\ubc1c, \ubc30\ud3ec, \ud655\uc7a5\uc774 \uac00\ub2a5\ud558\uba70, \uc11c\ube44\uc2a4 \uac04 \ud1b5\uc2e0\uc740 HTTP \ud504\ub85c\ud1a0\ucf5c\uc744 \uc774\uc6a9\ud558\uc5ec \uc774\ub8e8\uc5b4\uc9d1\ub2c8\ub2e4. \uc774\ub54c, \uc11c\ube44\uc2a4 \uac04\uc758 \ud1b5\uc2e0\uc744 \uad6c\ud604\ud558\ub294 \uac83\uc740 \ub9e4\uc6b0 \uc911\uc694\ud55c\ub370, \uc2a4\ud504\ub9c1 \ud074\ub77c\uc6b0\ub4dc \ud398\uc778\uc740 \uc774\ub97c \uc27d\uac8c \uad6c\ud604\ud560 \uc218 \uc788\ub3c4\ub85d \ub3c4\uc640\uc8fc\ub294 \ub77c\uc774\ube0c\ub7ec\ub9ac\uc785\ub2c8\ub2e4.<\/p>\n

Feign\uc744 \ud65c\uc6a9\ud55c \ub9e4\uc6b0 \ud6a8\uc728\uc801\uc778 \ub9c8\uc774\ud06c\ub85c\uc11c\ube44\uc2a4 \ud1b5\uc2e0 \ubc29\ubc95<\/h2>\n

\uc2a4\ud504\ub9c1 \ud074\ub77c\uc6b0\ub4dc \ud398\uc778\uc740 Feign\uc774\ub77c\ub294 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub97c \uae30\ubc18\uc73c\ub85c \uad6c\ud604\ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4. Feign\uc740 \ud074\ub77c\uc774\uc5b8\ud2b8-\uc11c\ubc84 \uc0ac\uc774\uc758 HTTP \uc694\uccad \ubc0f \uc751\ub2f5\uc744 \uc27d\uac8c \ucc98\ub9ac\ud560 \uc218 \uc788\ub3c4\ub85d \ub3c4\uc640\uc8fc\ub294 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub85c, \uc11c\ube44\uc2a4 \uac04\uc758 \ud1b5\uc2e0\uc744 \uad6c\ud604\ud560 \ub54c \ub9e4\uc6b0 \ud6a8\uc728\uc801\uc785\ub2c8\ub2e4. Feign\uc744 \uc0ac\uc6a9\ud558\uba74 \ub9c8\uc774\ud06c\ub85c\uc11c\ube44\uc2a4 \uac04\uc758 \ud1b5\uc2e0\uc744 \uad6c\ud604\ud558\ub294 \ucf54\ub4dc\ub97c \uac04\uacb0\ud558\uace0 \uac00\ub3c5\uc131\uc774 \uc88b\uac8c \uc791\uc131\ud560 \uc218 \uc788\uc73c\uba70, RESTful API\ub97c \uc27d\uac8c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n

Feign\uc740 \uc778\ud130\ud398\uc774\uc2a4 \uae30\ubc18\uc73c\ub85c \ud074\ub77c\uc774\uc5b8\ud2b8\ub97c \uc0dd\uc131\ud558\uba70, \uc774\ub97c \ud1b5\ud574 \uc11c\ube44\uc2a4 \uac04\uc758 \ud1b5\uc2e0\uc744 \uad6c\ud604\ud569\ub2c8\ub2e4. \uc778\ud130\ud398\uc774\uc2a4\uc5d0\ub294 \uc694\uccad\ud560 URL, HTTP \uba54\uc18c\ub4dc, \uc694\uccad \ubcf8\ubb38, \ud5e4\ub354 \ub4f1\uc744 \uc815\uc758\ud558\uba70, Feign\uc740 \uc774 \uc815\ubcf4\ub97c \ubc14\ud0d5\uc73c\ub85c \uc790\ub3d9\uc73c\ub85c HTTP \uc694\uccad\uc744 \uc0dd\uc131\ud569\ub2c8\ub2e4. \uc774\ub7ec\ud55c \ubc29\uc2dd\uc744 \ud1b5\ud574 \uac1c\ubc1c\uc790\ub294 \uac04\ub2e8\ud55c \uc778\ud130\ud398\uc774\uc2a4\ub9cc \uc815\uc758\ud558\uba74 \ub418\ubbc0\ub85c, \uc11c\ube44\uc2a4 \uac04\uc758 \ud1b5\uc2e0\uc744 \uad6c\ud604\ud558\ub294 \ucf54\ub4dc\ub97c \uac04\uacb0\ud558\uace0 \uac00\ub3c5\uc131\uc774 \uc88b\uac8c \uc791\uc131\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n

\ud074\ub77c\uc774\uc5b8\ud2b8-\uc11c\ubc84 \uc0ac\uc774\uc758 HTTP \uc694\uccad \ubc0f \uc751\ub2f5\uc744 \uc27d\uac8c \ucc98\ub9ac\ud558\ub294 Feign<\/h2>\n

Feign\uc740 \ud074\ub77c\uc774\uc5b8\ud2b8-\uc11c\ubc84 \uc0ac\uc774\uc758 HTTP \uc694\uccad \ubc0f \uc751\ub2f5\uc744 \uc27d\uac8c \ucc98\ub9ac\ud560 \uc218 \uc788\ub3c4\ub85d \ub2e4\uc591\ud55c \uae30\ub2a5\uc744 \uc81c\uacf5\ud569\ub2c8\ub2e4. \uc608\ub97c \ub4e4\uc5b4, Feign\uc740 \uc11c\ube44\uc2a4 \ub514\uc2a4\ucee4\ubc84\ub9ac \uae30\ub2a5\uc744 \uc81c\uacf5\ud558\uc5ec, Eureka\uc640 \uac19\uc740 \uc11c\ube44\uc2a4 \ub514\uc2a4\ucee4\ubc84\ub9ac \uc2dc\uc2a4\ud15c\uc744 \uc774\uc6a9\ud558\uc5ec \uc11c\ube44\uc2a4\ub97c \uac80\uc0c9\ud558\uace0 \ud638\ucd9c\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub610\ud55c, Feign\uc740 Hystrix\uc640 \uac19\uc740 \uc11c\ud0b7 \ube0c\ub808\uc774\ucee4\ub97c \uc774\uc6a9\ud558\uc5ec, \uc11c\ube44\uc2a4 \uac04\uc758 \ud1b5\uc2e0\uc774 \uc2e4\ud328\ud558\uac70\ub098 \uc9c0\uc5f0\ub420 \uacbd\uc6b0\uc5d0 \ub300\ud55c \ub300\uc751 \ubc29\uc548\uc744 \uc81c\uacf5\ud569\ub2c8\ub2e4.<\/p>\n

Feign\uc740 \uc2a4\ud504\ub9c1 \ud074\ub77c\uc6b0\ub4dc\uc640 \ud568\uaed8 \uc0ac\uc6a9\ud560 \ub54c \ub9e4\uc6b0 \ud6a8\uacfc\uc801\uc785\ub2c8\ub2e4. \uc2a4\ud504\ub9c1 \ud074\ub77c\uc6b0\ub4dc\ub294 Feign\uc744 \uc774\uc6a9\ud558\uc5ec \uc11c\ube44\uc2a4 \uac04\uc758 \ud1b5\uc2e0\uc744 \uad6c\ud604\ud560 \uc218 \uc788\ub3c4\ub85d \ub2e4\uc591\ud55c \uae30\ub2a5\uc744 \uc81c\uacf5\ud569\ub2c8\ub2e4. \uc608\ub97c \ub4e4\uc5b4, \uc2a4\ud504\ub9c1 \ud074\ub77c\uc6b0\ub4dc\ub294 Feign\uc744 \uc774\uc6a9\ud558\uc5ec \ub85c\ub4dc \ubc38\ub7f0\uc2f1 \uae30\ub2a5\uc744 \uc81c\uacf5\ud558\uba70, Ribbon\uacfc \uac19\uc740 \ub85c\ub4dc \ubc38\ub7f0\uc11c\ub97c \uc774\uc6a9\ud558\uc5ec \uc11c\ube44\uc2a4 \ud638\ucd9c\uc744 \ubd84\uc0b0\uc2dc\ud0ac \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n

\uc544\ub798\ub294 Feign\uc744 \uc774\uc6a9\ud558\uc5ec \uc11c\ube44\uc2a4 \uac04\uc758 \ud1b5\uc2e0\uc744 \uad6c\ud604\ud558\ub294 \uc608\uc2dc \ucf54\ub4dc\uc785\ub2c8\ub2e4.<\/p>\n

@FeignClient(name = \"user-service\")\npublic interface UserServiceClient {\n\n    @GetMapping(\"\/users\/{id}\")\n    User getUser(@PathVariable(\"id\") Long id);\n\n    @PostMapping(\"\/users\")\n    User createUser(@RequestBody User user);\n\n    @DeleteMapping(\"\/users\/{id}\")\n    void deleteUser(@PathVariable(\"id\") Long id);\n}<\/code><\/pre>\n

\uc704 \ucf54\ub4dc\ub294 UserServiceClient\ub77c\ub294 Feign \ud074\ub77c\uc774\uc5b8\ud2b8 \uc778\ud130\ud398\uc774\uc2a4\ub97c \uc815\uc758\ud55c \uac83\uc785\ub2c8\ub2e4. \uc774 \uc778\ud130\ud398\uc774\uc2a4\ub97c \ud1b5\ud574 user-service\ub77c\ub294 \ub9c8\uc774\ud06c\ub85c\uc11c\ube44\uc2a4\uc640 \ud1b5\uc2e0\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. getUser, createUser, deleteUser \uba54\uc18c\ub4dc\ub294 \uac01\uac01 GET, POST, DELETE HTTP \uba54\uc18c\ub4dc\ub97c \uc0ac\uc6a9\ud558\uba70, \/users\/{id}\uc640 \uac19\uc740 URL\uc744 \uc694\uccad\ud569\ub2c8\ub2e4. \uc774\ub7ec\ud55c \ubc29\uc2dd\uc73c\ub85c Feign\uc744 \uc774\uc6a9\ud558\uc5ec \uc11c\ube44\uc2a4 \uac04\uc758 \ud1b5\uc2e0\uc744 \uad6c\ud604\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n

\uacb0\ub860<\/h1>\n

\uc2a4\ud504\ub9c1 \ud074\ub77c\uc6b0\ub4dc \ud398\uc778\uc740 Feign\uc744 \uc774\uc6a9\ud558\uc5ec \uc11c\ube44\uc2a4 \uac04\uc758 \ud1b5\uc2e0\uc744 \uad6c\ud604\ud560 \uc218 \uc788\ub3c4\ub85d \ub3c4\uc640\uc8fc\ub294 \ub77c\uc774\ube0c\ub7ec\ub9ac\uc785\ub2c8\ub2e4. Feign\uc740 \uac04\uacb0\ud558\uace0 \uac00\ub3c5\uc131\uc774 \uc88b\uc740 \uc778\ud130\ud398\uc774\uc2a4\ub97c \uc81c\uacf5\ud558\uc5ec, \uac1c\ubc1c\uc790\uac00 \uc11c\ube44\uc2a4 \uac04\uc758 \ud1b5\uc2e0\uc744 \uc27d\uac8c \uad6c\ud604\ud560 \uc218 \uc788\ub3c4\ub85d \ub3c4\uc640\uc90d\ub2c8\ub2e4. \ub610\ud55c, \uc2a4\ud504\ub9c1 \ud074\ub77c\uc6b0\ub4dc\uc640 \ud568\uaed8 \uc0ac\uc6a9\ud560 \ub54c \ub9e4\uc6b0 \ud6a8\uacfc\uc801\uc785\ub2c8\ub2e4. \uc2a4\ud504\ub9c1 \ud074\ub77c\uc6b0\ub4dc\ub294 Feign\uc744 \uc774\uc6a9\ud558\uc5ec \ub85c\ub4dc \ubc38\ub7f0\uc2f1, \uc11c\ube44\uc2a4 \ub514\uc2a4\ucee4\ubc84\ub9ac, \uc11c\ud0b7 \ube0c\ub808\uc774\ucee4 \ub4f1 \ub2e4\uc591\ud55c \uae30\ub2a5\uc744 \uc81c\uacf5\ud558\ubbc0\ub85c, \uc11c\ube44\uc2a4 \uac04\uc758 \ud1b5\uc2e0\uc744 \ubcf4\ub2e4 \uac04\ud3b8\ud558\uace0 \uc548\uc815\uc801\uc73c\ub85c \uad6c\ud604\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n","protected":false},"excerpt":{"rendered":"

Spring Cloud Feign\uc73c\ub85c \ub9c8\uc774\ud06c\ub85c\uc11c\ube44\uc2a4 \ud1b5\uc2e0 \uad6c\ud604\ud558\uae30<\/p>\n","protected":false},"author":1,"featured_media":12882,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1957],"tags":[2119,5898,2082,2059,2105,2086,2156,5932],"class_list":["post-35108","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development","tag-api","tag-backend","tag-cloud","tag-implementing","tag-java","tag-microservices","tag-spring","tag-spring-boot"],"acf":[],"_links":{"self":[{"href":"https:\/\/m9js.shop\/blog\/wp-json\/wp\/v2\/posts\/35108","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=35108"}],"version-history":[{"count":1,"href":"https:\/\/m9js.shop\/blog\/wp-json\/wp\/v2\/posts\/35108\/revisions"}],"predecessor-version":[{"id":35268,"href":"https:\/\/m9js.shop\/blog\/wp-json\/wp\/v2\/posts\/35108\/revisions\/35268"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/m9js.shop\/blog\/wp-json\/wp\/v2\/media\/12882"}],"wp:attachment":[{"href":"https:\/\/m9js.shop\/blog\/wp-json\/wp\/v2\/media?parent=35108"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/m9js.shop\/blog\/wp-json\/wp\/v2\/categories?post=35108"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/m9js.shop\/blog\/wp-json\/wp\/v2\/tags?post=35108"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}