{"id":35107,"date":"2023-05-28T11:30:57","date_gmt":"2023-05-28T02:30:57","guid":{"rendered":"https:\/\/m9js.shop\/blog\/?p=35107"},"modified":"2023-05-28T11:30:57","modified_gmt":"2023-05-28T02:30:57","slug":"mastering-reactive-programming-with-spring-webflux-and-project-reactor","status":"publish","type":"post","link":"https:\/\/m9js.shop\/blog\/development\/mastering-reactive-programming-with-spring-webflux-and-project-reactor","title":{"rendered":"Mastering Reactive Programming with Spring WebFlux and Project Reactor"},"content":{"rendered":"

Mastering Reactive Programming with Spring WebFlux and Project Reactor<\/h1>\n

\"Programmer<\/p>\n

Reactive programming is becoming increasingly popular as more developers recognize its benefits in creating responsive, scalable, and fault-tolerant applications. Spring WebFlux and Project Reactor are two popular tools for mastering reactive programming in Java. In this article, we’ll explore these technologies and how they can be used to create reactive applications.<\/p>\n

Spring WebFlux\uc640 Project Reactor\ub85c \ubc18\uc751\ud615 \ud504\ub85c\uadf8\ub798\ubc0d \uc2b5\ub4dd\ud558\uae30<\/h2>\n

Spring WebFlux\ub294 \uc2a4\ud504\ub9c1\uc758 \ubc18\uc751\ud615 \uc6f9 \ud504\ub808\uc784\uc6cc\ud06c\ub85c, \ube44\ub3d9\uae30\uc801\uc778 \ub124\ud2b8\uc6cc\ud06c \ud1b5\uc2e0\uc744 \ud1b5\ud574 \ube60\ub974\uace0 \uc27d\uac8c \ubc18\uc751\ud615 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \ub9cc\ub4e4 \uc218 \uc788\uac8c \ud574\uc90d\ub2c8\ub2e4. \ubc18\uba74\uc5d0 Project Reactor\ub294 Reactor\ub77c\ub294 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub97c \uc81c\uacf5\ud558\uc5ec Java 8\uc5d0\uc11c\uc758 \ubc18\uc751\ud615 \uc2a4\ud2b8\ub9bc \ud504\ub85c\uadf8\ub798\ubc0d\uc744 \uac00\ub2a5\ud558\uac8c \ud574\uc90d\ub2c8\ub2e4.<\/p>\n

Spring WebFlux\uc640 Project Reactor\ub97c \ud568\uaed8 \uc0ac\uc6a9\ud558\uba74 \ube60\ub974\uace0 \uc548\uc815\uc801\uc778 \ubc18\uc751\ud615 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \ub9cc\ub4e4 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub97c \uc704\ud574\uc11c\ub294 \uba3c\uc800 \ube44\ub3d9\uae30 \ud504\ub85c\uadf8\ub798\ubc0d\uc758 \uac1c\ub150\uacfc \uc7a5\ub2e8\uc810, \uadf8\ub9ac\uace0 \uc2a4\ud504\ub9c1\uc5d0\uc11c\uc758 \ube44\ub3d9\uae30 \ud504\ub85c\uadf8\ub798\ubc0d \ubc29\ubc95\uc744 \uc774\ud574\ud574\uc57c \ud569\ub2c8\ub2e4.<\/p>\n

Spring WebFlux\uc640 Project Reactor\ub97c \uc774\uc6a9\ud55c \ube44\ub3d9\uae30 \ud504\ub85c\uadf8\ub798\ubc0d<\/h2>\n

\ube44\ub3d9\uae30 \ud504\ub85c\uadf8\ub798\ubc0d\uc740 \uc5ec\ub7ec \uc694\uccad\uc744 \ub3d9\uc2dc\uc5d0 \ucc98\ub9ac\ud560 \uc218 \uc788\uae30 \ub54c\ubb38\uc5d0 \ube60\ub978 \uc751\ub2f5 \ubc0f \ucc98\ub9ac \uc18d\ub3c4\ub97c \uac00\uc9c0\uba70, \ub300\uaddc\ubaa8 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c\ub3c4 \uc548\uc815\uc801\uc73c\ub85c \ub3d9\uc791\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. Spring WebFlux\uc640 Project Reactor\ub294 \ube44\ub3d9\uae30 \ud504\ub85c\uadf8\ub798\ubc0d\uc744 \uc27d\uac8c \uad6c\ud604\ud560 \uc218 \uc788\ub3c4\ub85d \ub3c4\uc640\uc90d\ub2c8\ub2e4.<\/p>\n

Spring WebFlux\ub294 \uae30\ubcf8\uc801\uc73c\ub85c Netty\ub97c \uc0ac\uc6a9\ud558\uc5ec \ube44\ub3d9\uae30\uc801\uc778 \ub124\ud2b8\uc6cc\ud06c \ud1b5\uc2e0\uc744 \ucc98\ub9ac\ud569\ub2c8\ub2e4. \uc774\ub97c \uc704\ud574 Mono\uc640 Flux \ub77c\ub294 \ub370\uc774\ud130 \ud0c0\uc785\uc744 \uc81c\uacf5\ud558\uc5ec \ube44\ub3d9\uae30 \uc2a4\ud2b8\ub9bc\uc744 \ucc98\ub9ac\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. Project Reactor\ub294 \uc774\ub7ec\ud55c \uc2a4\ud2b8\ub9bc \ud504\ub85c\uadf8\ub798\ubc0d\uc744 \uc9c0\uc6d0\ud558\ub294 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub85c, \uc5ec\ub7ec \uc5f0\uc0b0\uc790\ub97c \uc81c\uacf5\ud558\uc5ec \ub370\uc774\ud130\ub97c \ucc98\ub9ac\ud558\uace0 \ubcc0\ud658\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n

Reactor\uc758 Flux\uc640 Mono\ub97c \ud65c\uc6a9\ud55c Spring WebFlux \ud504\ub85c\uadf8\ub798\ubc0d<\/h2>\n

Flux\uc640 Mono\ub294 Reactor\uc5d0\uc11c \uc81c\uacf5\ud558\ub294 \ub370\uc774\ud130 \ud0c0\uc785\uc73c\ub85c, \ube44\ub3d9\uae30 \uc2a4\ud2b8\ub9bc\uc744 \ucc98\ub9ac\ud560 \ub54c \uc0ac\uc6a9\ub429\ub2c8\ub2e4. Flux\ub294 0\uac1c \uc774\uc0c1\uc758 \ub370\uc774\ud130\ub97c \ubc1c\uc0dd\uc2dc\ud0a4\ub294 \uc2a4\ud2b8\ub9bc\uc73c\ub85c, \uc5ec\ub7ec \uac1c\uc758 \ub370\uc774\ud130\ub97c \ucc98\ub9ac\ud560 \ub54c \uc720\uc6a9\ud569\ub2c8\ub2e4. Mono\ub294 1\uac1c\uc758 \ub370\uc774\ud130\ub97c \ubc1c\uc0dd\uc2dc\ud0a4\ub294 \uc2a4\ud2b8\ub9bc\uc73c\ub85c, \ub2e8\uc77c \ub370\uc774\ud130\ub97c \ucc98\ub9ac\ud560 \ub54c \uc0ac\uc6a9\ub429\ub2c8\ub2e4.<\/p>\n

\uc608\ub97c \ub4e4\uc5b4, \ub2e4\uc74c\uc740 Flux\ub97c \uc0ac\uc6a9\ud558\uc5ec \ube44\ub3d9\uae30\uc801\uc73c\ub85c \ub370\uc774\ud130\ub97c \uc870\ud68c\ud558\ub294 \ucf54\ub4dc\uc785\ub2c8\ub2e4.<\/p>\n

Flux users = userRepository.findAll();\nusers.subscribe(user -> System.out.println(user));<\/code><\/pre>\n

\uc704 \ucf54\ub4dc\uc5d0\uc11c userRepository.findAll() \uba54\uc11c\ub4dc\ub294 Flux \ud0c0\uc785\uc744 \ubc18\ud658\ud569\ub2c8\ub2e4. \uc774\ub97c \uad6c\ub3c5\ud558\uc5ec \uac01 User \uac1d\uccb4\ub97c \ucd9c\ub825\ud569\ub2c8\ub2e4. \ube44\ub3d9\uae30\uc801\uc73c\ub85c \ub370\uc774\ud130\ub97c \uc870\ud68c\ud558\uace0 \ucd9c\ub825\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n

Mono\ub97c \uc0ac\uc6a9\ud558\uc5ec \ub2e8\uc77c \ub370\uc774\ud130\ub97c \ucc98\ub9ac\ud558\ub294 \ucf54\ub4dc\ub3c4 \uac04\ub2e8\ud569\ub2c8\ub2e4.<\/p>\n

Mono user = userRepository.findById(1);\nuser.subscribe(user -> System.out.println(user));<\/code><\/pre>\n

\uc704 \ucf54\ub4dc\uc5d0\uc11c userRepository.findById(1) \uba54\uc11c\ub4dc\ub294 Mono \ud0c0\uc785\uc744 \ubc18\ud658\ud569\ub2c8\ub2e4. \uc774\ub97c \uad6c\ub3c5\ud558\uc5ec \ud574\ub2f9 id\uc758 User \uac1d\uccb4\ub97c \ucd9c\ub825\ud569\ub2c8\ub2e4.<\/p>\n

Spring WebFlux\uc640 Project Reactor\ub97c \ud568\uaed8 \uc0ac\uc6a9\ud558\uba74 \ube44\ub3d9\uae30 \ud504\ub85c\uadf8\ub798\ubc0d\uc744 \uc27d\uac8c \uad6c\ud604\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub97c \ud1b5\ud574 \ub354\uc6b1 \ube60\ub974\uace0 \uc548\uc815\uc801\uc778 \ubc18\uc751\ud615 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \ub9cc\ub4e4\uc5b4\ubcfc \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n

\uacb0\ub860<\/h2>\n

Spring WebFlux\uc640 Project Reactor\ub294 Java\uc5d0\uc11c \ubc18\uc751\ud615 \ud504\ub85c\uadf8\ub798\ubc0d\uc744 \uad6c\ud604\ud558\ub294 \ub370 \ub3c4\uc6c0\uc774 \ub418\ub294 \uac15\ub825\ud55c \ub3c4\uad6c\uc785\ub2c8\ub2e4. \uc774\ub4e4\uc744 \ud568\uaed8 \uc0ac\uc6a9\ud558\uc5ec \ube44\ub3d9\uae30 \uc2a4\ud2b8\ub9bc \ud504\ub85c\uadf8\ub798\ubc0d\uc744 \uad6c\ud604\ud558\uba74 \ube60\ub974\uace0 \uc548\uc815\uc801\uc778 \ubc18\uc751\ud615 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \ub9cc\ub4e4 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uac1c\ubc1c\uc790\ub4e4\uc740 \uc774\ub7ec\ud55c \uae30\uc220\uc744 \ud65c\uc6a9\ud558\uc5ec \ub354\uc6b1 \ud6a8\uc728\uc801\uc774\uace0 \ud601\uc2e0\uc801\uc778 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \uac1c\ubc1c\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n","protected":false},"excerpt":{"rendered":"

\uc2a4\ud504\ub9c1 \uc6f9\ud50c\ub7ed\uc2a4\uc640 \ud504\ub85c\uc81d\ud2b8 \ub9ac\uc561\ud130\ub97c \ud65c\uc6a9\ud55c \ubc18\uc751\ud615 \ud504\ub85c\uadf8\ub798\ubc0d \ub9c8\uc2a4\ud130\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":[2089,5898,2041,2004,2105,2011,5932,2065],"class_list":["post-35107","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development","tag-applications","tag-backend","tag-benefits","tag-how","tag-java","tag-project","tag-spring-boot","tag-technologies"],"acf":[],"_links":{"self":[{"href":"https:\/\/m9js.shop\/blog\/wp-json\/wp\/v2\/posts\/35107","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=35107"}],"version-history":[{"count":1,"href":"https:\/\/m9js.shop\/blog\/wp-json\/wp\/v2\/posts\/35107\/revisions"}],"predecessor-version":[{"id":35270,"href":"https:\/\/m9js.shop\/blog\/wp-json\/wp\/v2\/posts\/35107\/revisions\/35270"}],"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=35107"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/m9js.shop\/blog\/wp-json\/wp\/v2\/categories?post=35107"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/m9js.shop\/blog\/wp-json\/wp\/v2\/tags?post=35107"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}