{"id":35134,"date":"2023-05-28T11:30:23","date_gmt":"2023-05-28T02:30:23","guid":{"rendered":"https:\/\/m9js.shop\/blog\/?p=35134"},"modified":"2023-05-28T11:30:23","modified_gmt":"2023-05-28T02:30:23","slug":"deep-dive-into-spring-data-r2dbc-reactive-database-access","status":"publish","type":"post","link":"https:\/\/m9js.shop\/blog\/development\/deep-dive-into-spring-data-r2dbc-reactive-database-access","title":{"rendered":"Deep Dive into Spring Data R2DBC: Reactive Database Access"},"content":{"rendered":"

Spring Data R2DBC: \ubc18\uc751\ud615 \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc561\uc138\uc2a4\uc758 \uae4a\uc740 \ud0d0\uad6c<\/h1>\n

Spring Data R2DBC\ub294 R2DBC\ub97c \uc9c0\uc6d0\ud558\ub294 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \ub300\ud574 Spring Data\uc758 \ub9ac\uc561\ud2f0\ube0c \ud504\ub85c\uadf8\ub798\ubc0d \ubc29\uc2dd\uc744 \ud65c\uc6a9\ud560 \uc218 \uc788\ub3c4\ub85d \uc9c0\uc6d0\ud558\ub294 \ud504\ub85c\uc81d\ud2b8\uc785\ub2c8\ub2e4. \uc774\ubc88 \uae00\uc5d0\uc11c\ub294 R2DBC\uc758 \uc6d0\ub9ac\uc640 \uc774\uc810, \uadf8\ub9ac\uace0 Spring Data R2DBC\ub97c \uc774\uc6a9\ud55c \ub9ac\uc561\ud2f0\ube0c \ud504\ub85c\uadf8\ub798\ubc0d \ubc29\uc2dd\uc758 \uc801\uc6a9 \ubc29\ubc95\uc5d0 \ub300\ud574 \uc54c\uc544\ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n

R2DBC\ub97c \ud65c\uc6a9\ud55c \ub9ac\uc561\ud2f0\ube0c \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc561\uc138\uc2a4\uc758 \uc6d0\ub9ac\uc640 \uc774\uc810<\/h2>\n

R2DBC\ub294 Reactive Relational Database Connectivity\uc758 \uc57d\uc790\ub85c, \ubc18\uc751\ud615 \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc561\uc138\uc2a4\ub97c \uc704\ud55c \uba85\uc138\uc785\ub2c8\ub2e4. R2DBC\ub294 JDBC\uc640 \uc720\uc0ac\ud55c API\ub97c \uc81c\uacf5\ud558\uc9c0\ub9cc, JDBC\uc640 \ub2ec\ub9ac \ube14\ub85c\ud0b9\ud558\uc9c0 \uc54a\uace0 \ube44\ub3d9\uae30\uc801\uc73c\ub85c \ub3d9\uc791\ud569\ub2c8\ub2e4. \uc774\ub97c \ud1b5\ud574 I\/O \uc2a4\ub808\ub4dc\uc758 \ube14\ub85c\ud0b9\uc744 \ucd5c\uc18c\ud654\ud558\uace0, \ub354 \ub9ce\uc740 \uc694\uccad\uc744 \ucc98\ub9ac\ud560 \uc218 \uc788\uac8c \ub429\ub2c8\ub2e4.<\/p>\n

R2DBC\uc758 \uac00\uc7a5 \ud070 \uc7a5\uc810\uc740 \ub9ac\uc561\ud2f0\ube0c \ud504\ub85c\uadf8\ub798\ubc0d\uacfc\uc758 \ud638\ud658\uc131\uc785\ub2c8\ub2e4. R2DBC\ub294 Publisher \uc778\ud130\ud398\uc774\uc2a4\ub97c \uc9c0\uc6d0\ud558\uba70, \uc774\ub97c \ud1b5\ud574 \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc561\uc138\uc2a4\ub97c \ube44\ub3d9\uae30\uc801\uc73c\ub85c \ucc98\ub9ac\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub97c \ud1b5\ud574 \ub354\uc6b1 \ub192\uc740 \uc131\ub2a5\uacfc \ud655\uc7a5\uc131\uc744 \uc81c\uacf5\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n

R2DBC\ub97c \uc774\uc6a9\ud55c Spring Data\uc758 \ub9ac\uc561\ud2f0\ube0c \ud504\ub85c\uadf8\ub798\ubc0d \ubc29\uc2dd\uc758 \uc801\uc6a9 \ubc29\ubc95<\/h2>\n

Spring Data R2DBC\ub294 Spring Data\uc758 \ub9ac\uc561\ud2f0\ube0c \ud504\ub85c\uadf8\ub798\ubc0d \ubc29\uc2dd\uc744 R2DBC \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \uc801\uc6a9\ud560 \uc218 \uc788\ub3c4\ub85d \uc9c0\uc6d0\ud569\ub2c8\ub2e4. \uc774\ub97c \ud1b5\ud574 \ub354\uc6b1 \ud6a8\uc728\uc801\uc778 \ube44\ub3d9\uae30\uc801 \ub370\uc774\ud130 \uc561\uc138\uc2a4\ub97c \uad6c\ud604\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n

Spring Data R2DBC\ub97c \uc0ac\uc6a9\ud558\ub824\uba74 \uba3c\uc800 R2DBC \ub4dc\ub77c\uc774\ubc84\ub97c \ucd94\uac00\ud574\uc57c \ud569\ub2c8\ub2e4. \uc608\ub97c \ub4e4\uc5b4, PostgreSQL R2DBC \ub4dc\ub77c\uc774\ubc84\ub97c \ucd94\uac00\ud558\ub294 \ubc29\ubc95\uc740 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.<\/p>\n

\n    io.r2dbc\n    r2dbc-postgresql\n    0.8.5.RELEASE\n<\/code><\/pre>\n

\ub2e4\uc74c\uc73c\ub85c, Spring Data R2DBC\ub97c \uc0ac\uc6a9\ud558\uae30 \uc704\ud574 R2dbcRepository\ub97c \uc0c1\uc18d\ud558\ub294 \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac \uc778\ud130\ud398\uc774\uc2a4\ub97c \uc815\uc758\ud574\uc57c \ud569\ub2c8\ub2e4. \uc774 \uc778\ud130\ud398\uc774\uc2a4\uc5d0\uc11c\ub294 \ub9ac\uc561\ud2f0\ube0c \ubc29\uc2dd\uc73c\ub85c \ub3d9\uc791\ud558\ub294 CRUD \uba54\uc11c\ub4dc\ub97c \uc815\uc758\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n

public interface UserRepository extends R2dbcRepository {\n    Flux findByLastName(String lastName);\n}<\/code><\/pre>\n

\uc774\uc81c UserRepository\ub97c \uc0ac\uc6a9\ud558\uc5ec \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \ub300\ud55c \ube44\ub3d9\uae30\uc801\uc778 CRUD \uc791\uc5c5\uc744 \uc218\ud589\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n

@Service\npublic class UserService {\n    private final UserRepository userRepository;\n\n    public UserService(UserRepository userRepository) {\n        this.userRepository = userRepository;\n    }\n\n    public Flux getUsersByLastName(String lastName) {\n        return userRepository.findByLastName(lastName);\n    }\n}<\/code><\/pre>\n

Spring Data R2DBC\ub294 \ub2e4\uc591\ud55c \ub370\uc774\ud130\ubca0\uc774\uc2a4\ub97c \uc9c0\uc6d0\ud569\ub2c8\ub2e4. \uc608\ub97c \ub4e4\uc5b4, PostgreSQL, MySQL, Microsoft SQL Server, H2 \ub4f1\uc744 \uc9c0\uc6d0\ud569\ub2c8\ub2e4.<\/p>\n

\uacb0\ub860<\/h2>\n

Spring Data R2DBC\ub294 \ub9ac\uc561\ud2f0\ube0c \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc561\uc138\uc2a4\ub97c \uc704\ud55c Spring Data\uc758 \ud655\uc7a5 \ud504\ub85c\uc81d\ud2b8\uc785\ub2c8\ub2e4. R2DBC\ub97c \uc774\uc6a9\ud558\uc5ec \ube44\ub3d9\uae30\uc801\uc778 \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc561\uc138\uc2a4\ub97c \uad6c\ud604\ud560 \uc218 \uc788\uc73c\uba70, Spring Data R2DBC\ub97c \uc774\uc6a9\ud558\uc5ec \ub354\uc6b1 \uc27d\uac8c \ub9ac\uc561\ud2f0\ube0c \ubc29\uc2dd\uc73c\ub85c \ub370\uc774\ud130\ubca0\uc774\uc2a4\ub97c \ub2e4\ub8f0 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub97c \ud1b5\ud574 \ub192\uc740 \uc131\ub2a5\uacfc \ud655\uc7a5\uc131\uc744 \uc81c\uacf5\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n","protected":false},"excerpt":{"rendered":"

\uc2a4\ud504\ub9c1 \ub370\uc774\ud130 R2DBC: \ubc18\uc751\ud615 \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc561\uc138\uc2a4\uc5d0 \ub300\ud55c \uae4a\uc740 \ud0d0\uad6c<\/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,2104,2157,2105,2100,2156,5932],"class_list":["post-35134","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development","tag-api","tag-backend","tag-data","tag-into","tag-java","tag-mysql","tag-spring","tag-spring-boot"],"acf":[],"_links":{"self":[{"href":"https:\/\/m9js.shop\/blog\/wp-json\/wp\/v2\/posts\/35134","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=35134"}],"version-history":[{"count":1,"href":"https:\/\/m9js.shop\/blog\/wp-json\/wp\/v2\/posts\/35134\/revisions"}],"predecessor-version":[{"id":35216,"href":"https:\/\/m9js.shop\/blog\/wp-json\/wp\/v2\/posts\/35134\/revisions\/35216"}],"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=35134"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/m9js.shop\/blog\/wp-json\/wp\/v2\/categories?post=35134"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/m9js.shop\/blog\/wp-json\/wp\/v2\/tags?post=35134"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}