{"id":35112,"date":"2023-05-28T11:30:51","date_gmt":"2023-05-28T02:30:51","guid":{"rendered":"https:\/\/m9js.shop\/blog\/?p=35112"},"modified":"2023-05-28T11:30:51","modified_gmt":"2023-05-28T02:30:51","slug":"implementing-caching-in-spring-boot-applications","status":"publish","type":"post","link":"https:\/\/m9js.shop\/blog\/development\/implementing-caching-in-spring-boot-applications","title":{"rendered":"Implementing Caching in Spring Boot Applications"},"content":{"rendered":"

Implementing Caching in Spring Boot Applications<\/h1>\n

\uc2a4\ud504\ub9c1 \ubd80\ud2b8 \uc5b4\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c \uce90\uc2f1 \uad6c\ud604\ud558\uae30\ub294 \uc131\ub2a5 \ucd5c\uc801\ud654\uc5d0 \ud070 \ub3c4\uc6c0\uc744 \uc90d\ub2c8\ub2e4. \uce90\uc2f1\uc740 \uc790\uc8fc \uc0ac\uc6a9\ub418\ub294 \ub370\uc774\ud130\ub97c \ubbf8\ub9ac \uc800\uc7a5\ud574\ub193\uace0, \uc694\uccad \uc2dc \uc800\uc7a5\ub41c \ub370\uc774\ud130\ub97c \ubc18\ud658\ud568\uc73c\ub85c\uc368 \uc751\ub2f5 \uc2dc\uac04\uc744 \uc904\uc774\ub294 \uae30\uc220\uc785\ub2c8\ub2e4. \uc2a4\ud504\ub9c1 \ubd80\ud2b8\uc5d0\uc11c\ub294 \uce90\uc2f1\uc744 \uc27d\uac8c \uad6c\ud604\ud560 \uc218 \uc788\ub294 \ubc29\ubc95\uc744 \uc81c\uacf5\ud569\ub2c8\ub2e4.<\/p>\n

\uce90\uc2dc \ub77c\uc774\ube0c\ub7ec\ub9ac \uc120\ud0dd\uacfc \uad6c\uc131<\/h2>\n

\uc2a4\ud504\ub9c1 \ubd80\ud2b8\uc5d0\uc11c \uce90\uc2f1\uc744 \uad6c\ud604\ud558\uae30 \uc704\ud574\uc11c\ub294 \uba3c\uc800 \uce90\uc2dc \ub77c\uc774\ube0c\ub7ec\ub9ac\ub97c \uc120\ud0dd\ud574\uc57c \ud569\ub2c8\ub2e4. \uc2a4\ud504\ub9c1 \ubd80\ud2b8\uc5d0\uc11c\ub294 Ehcache, Guava, Caffeine, Redis \ub4f1 \ub2e4\uc591\ud55c \uce90\uc2dc \ub77c\uc774\ube0c\ub7ec\ub9ac\ub97c \uc9c0\uc6d0\ud569\ub2c8\ub2e4. \uc774 \uc911\uc5d0\uc11c \uac00\uc7a5 \ub9ce\uc774 \uc0ac\uc6a9\ub418\ub294 \uac83\uc740 Ehcache\uc640 Redis\uc785\ub2c8\ub2e4.<\/p>\n

Ehcache\ub294 \uc2a4\ud504\ub9c1 \ubd80\ud2b8\uc5d0\uc11c \uae30\ubcf8\uc73c\ub85c \uc81c\uacf5\ud558\ub294 \uce90\uc2dc \ub77c\uc774\ube0c\ub7ec\ub9ac\uc785\ub2c8\ub2e4. Ehcache\ub97c \uc124\uc815\ud558\uae30 \uc704\ud574\uc11c\ub294 spring-boot-starter-cache<\/code> \uc758\uc874\uc131\uc744 \ucd94\uac00\ud558\uba74 \ub429\ub2c8\ub2e4. \uc124\uc815 \ud30c\uc77c\uc5d0 \uc544\ub798\uc640 \uac19\uc774 Ehcache\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4.<\/p>\n

spring:\n  cache:\n    type: ehcache<\/code><\/pre>\n

Redis\ub97c \uc0ac\uc6a9\ud558\uae30 \uc704\ud574\uc11c\ub294 spring-boot-starter-data-redis<\/code> \uc758\uc874\uc131\uc744 \ucd94\uac00\ud574\uc57c \ud569\ub2c8\ub2e4. Redis\uc5d0 \ub300\ud55c \uc124\uc815\uc740 \uc544\ub798\uc640 \uac19\uc774 \ucd94\uac00\ud569\ub2c8\ub2e4.<\/p>\n

spring:\n  redis:\n    host: localhost\n    port: 6379<\/code><\/pre>\n

\uce90\uc2f1 \uc774\uc810\uacfc \uad00\ub828 \uc774\uc288 \ud574\uacb0 \ubc29\ubc95<\/h2>\n

\uce90\uc2f1\uc744 \uc0ac\uc6a9\ud558\uba74 \ub370\uc774\ud130\ub97c \ubbf8\ub9ac \uc800\uc7a5\ud574\ub193\uace0, \uc694\uccad \uc2dc \uc800\uc7a5\ub41c \ub370\uc774\ud130\ub97c \ubc18\ud658\ud558\uae30 \ub54c\ubb38\uc5d0 \uc751\ub2f5 \uc2dc\uac04\uc744 \uc904\uc77c \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub610\ud55c \ub3d9\uc77c\ud55c \uc694\uccad\uc5d0 \ub300\ud55c \uc751\ub2f5 \uacb0\uacfc\ub97c \uce90\uc2f1\ud558\uc5ec \uc11c\ubc84\uc758 \ubd80\ud558\ub97c \uc904\uc77c \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n

\uadf8\ub7ec\ub098 \uce90\uc2f1\uc744 \uc0ac\uc6a9\ud568\uc73c\ub85c\uc368 \ubc1c\uc0dd\ud560 \uc218 \uc788\ub294 \uc774\uc288\ub3c4 \uc788\uc2b5\ub2c8\ub2e4. \uce90\uc2dc\ub41c \ub370\uc774\ud130\uac00 \uc5c5\ub370\uc774\ud2b8 \ub418\uc5c8\uc744 \ub54c, \uce90\uc2dc\ub97c \uac31\uc2e0\ud574\uc8fc\uc9c0 \uc54a\uc73c\uba74 \uc624\ub798\ub41c \ub370\uc774\ud130\ub97c \ubc18\ud658\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub7ec\ud55c \uc774\uc288\ub97c \ud574\uacb0\ud558\uae30 \uc704\ud574\uc11c\ub294 \uce90\uc2dc \uac31\uc2e0 \ubc29\ubc95\uc744 \uacb0\uc815\ud574\uc57c \ud569\ub2c8\ub2e4.<\/p>\n

\uc2a4\ud504\ub9c1 \ubd80\ud2b8\uc5d0\uc11c\ub294 @CacheEvict<\/code> \uc5b4\ub178\ud14c\uc774\uc158\uc744 \uc0ac\uc6a9\ud558\uc5ec \uce90\uc2dc\ub97c \uac31\uc2e0\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc608\ub97c \ub4e4\uc5b4, \uc544\ub798\uc640 \uac19\uc740 \ucf54\ub4dc\uc5d0\uc11c getUser<\/code> \uba54\uc18c\ub4dc\ub294 userId<\/code>\uc5d0 \ud574\ub2f9\ud558\ub294 \uc0ac\uc6a9\uc790 \uc815\ubcf4\ub97c \ubc18\ud658\ud569\ub2c8\ub2e4. \uce90\uc2dc\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc751\ub2f5 \uc2dc\uac04\uc744 \uc904\uc77c \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n

@Service\npublic class UserService {\n    @Cacheable(value = \"user\", key = \"#userId\")\n    public User getUser(int userId) {\n        \/\/ ...\n    }\n}<\/code><\/pre>\n

\ud558\uc9c0\ub9cc \uce90\uc2dc\ub41c \ub370\uc774\ud130\uac00 \uc5c5\ub370\uc774\ud2b8 \ub418\uc5c8\uc744 \ub54c \uac31\uc2e0\ub418\uc9c0 \uc54a\ub294 \ubb38\uc81c\uac00 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub97c \ud574\uacb0\ud558\uae30 \uc704\ud574\uc11c\ub294 @CacheEvict<\/code> \uc5b4\ub178\ud14c\uc774\uc158\uc744 \uc0ac\uc6a9\ud569\ub2c8\ub2e4.<\/p>\n

@Service\npublic class UserService {\n    @CacheEvict(value = \"user\", key = \"#userId\")\n    public void updateUser(int userId, User user) {\n        \/\/ ...\n    }\n}<\/code><\/pre>\n

\uc704 \ucf54\ub4dc\uc5d0\uc11c updateUser<\/code> \uba54\uc18c\ub4dc\uac00 \uc2e4\ud589\ub418\uba74 user<\/code> \uce90\uc2dc\ub97c \uac31\uc2e0\ud569\ub2c8\ub2e4.<\/p>\n

\uce90\uc2dc \uc0ac\uc6a9 \uc608\uc2dc<\/h2>\n

\uc2a4\ud504\ub9c1 \ubd80\ud2b8\uc5d0\uc11c \uce90\uc2dc\ub97c \uc0ac\uc6a9\ud558\ub294 \uc608\uc2dc\ub97c \uc0b4\ud3b4\ubcf4\uaca0\uc2b5\ub2c8\ub2e4. \uc544\ub798\uc758 \ucf54\ub4dc\ub294 getBooks<\/code> \uba54\uc18c\ub4dc\ub97c \ud638\ucd9c\ud560 \ub54c\ub9c8\ub2e4 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0\uc11c \ucc45 \ubaa9\ub85d\uc744 \uac00\uc838\uc624\ub294 \ucf54\ub4dc\uc785\ub2c8\ub2e4.<\/p>\n

@Service\npublic class BookService {\n    public List getBooks() {\n        \/\/ \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0\uc11c \ucc45 \ubaa9\ub85d\uc744 \uac00\uc838\uc634\n        return bookRepository.findAll();\n    }\n}<\/code><\/pre>\n

\uc704 \ucf54\ub4dc\ub294 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0\uc11c \ucc45 \ubaa9\ub85d\uc744 \ub9e4\ubc88 \uac00\uc838\uc624\uae30 \ub54c\ubb38\uc5d0 \uc751\ub2f5 \uc2dc\uac04\uc774 \ub290\ub9b4 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub97c \uce90\uc2f1\uc744 \uc0ac\uc6a9\ud558\uc5ec \uac1c\uc120\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n

@Service\npublic class BookService {\n    @Cacheable(value = \"books\")\n    public List getBooks() {\n        \/\/ \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0\uc11c \ucc45 \ubaa9\ub85d\uc744 \uac00\uc838\uc634\n        return bookRepository.findAll();\n    }\n}<\/code><\/pre>\n

\uc704 \ucf54\ub4dc\uc5d0\uc11c @Cacheable<\/code> \uc5b4\ub178\ud14c\uc774\uc158\uc744 \uc0ac\uc6a9\ud558\uc5ec books<\/code> \uce90\uc2dc\ub97c \uc0ac\uc6a9\ud569\ub2c8\ub2e4. getBooks<\/code> \uba54\uc18c\ub4dc\uac00 \ud638\ucd9c\ub420 \ub54c, \uce90\uc2dc\uc5d0 \ub370\uc774\ud130\uac00 \uc800\uc7a5\ub418\uc5b4 \uc788\uc73c\uba74 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0\uc11c \ub370\uc774\ud130\ub97c \uac00\uc838\uc624\uc9c0 \uc54a\uace0 \uce90\uc2dc\ub41c \ub370\uc774\ud130\ub97c \ubc18\ud658\ud569\ub2c8\ub2e4.<\/p>\n

\uacb0\ub860<\/h2>\n

\uc2a4\ud504\ub9c1 \ubd80\ud2b8\uc5d0\uc11c \uce90\uc2f1\uc744 \uad6c\ud604\ud558\ub294 \ubc29\ubc95\uc744 \uc0b4\ud3b4\ubcf4\uc558\uc2b5\ub2c8\ub2e4. \uce90\uc2f1\uc744 \uc0ac\uc6a9\ud558\uba74 \ub370\uc774\ud130\ub97c \ubbf8\ub9ac \uc800\uc7a5\ud574\ub193\uace0, \uc694\uccad \uc2dc \uc800\uc7a5\ub41c \ub370\uc774\ud130\ub97c \ubc18\ud658\ud558\uc5ec \uc751\ub2f5 \uc2dc\uac04\uc744 \uc904\uc77c \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uce90\uc2f1\uc744 \uad6c\ud604\ud560 \ub54c\ub294 \uce90\uc2dc \ub77c\uc774\ube0c\ub7ec\ub9ac\ub97c \uc120\ud0dd\ud558\uace0, \uce90\uc2dc\ub97c \uac31\uc2e0\ud560 \uc218 \uc788\ub294 \ubc29\ubc95\uc744 \uacb0\uc815\ud574\uc57c \ud569\ub2c8\ub2e4. \uce90\uc2f1\uc744 \uc0ac\uc6a9\ud558\uc5ec \uc131\ub2a5\uc744 \uac1c\uc120\ud558\ub294 \ubc29\ubc95\uc744 \uc775\ud600\ub450\uba74 \uc2a4\ud504\ub9c1 \ubd80\ud2b8 \uc5b4\ud50c\ub9ac\ucf00\uc774\uc158\uc758 \uc131\ub2a5\uc744 \ud5a5\uc0c1\uc2dc\ud0ac \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n

\"Caching\"<\/p>\n","protected":false},"excerpt":{"rendered":"

\uc2a4\ud504\ub9c1 \ubd80\ud2b8 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c \uce90\uc2f1 \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":[2089,5898,2104,2059,2105,5932,134,2026],"class_list":["post-35112","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development","tag-applications","tag-backend","tag-data","tag-implementing","tag-java","tag-spring-boot","tag-us","tag-use"],"acf":[],"_links":{"self":[{"href":"https:\/\/m9js.shop\/blog\/wp-json\/wp\/v2\/posts\/35112","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=35112"}],"version-history":[{"count":1,"href":"https:\/\/m9js.shop\/blog\/wp-json\/wp\/v2\/posts\/35112\/revisions"}],"predecessor-version":[{"id":35260,"href":"https:\/\/m9js.shop\/blog\/wp-json\/wp\/v2\/posts\/35112\/revisions\/35260"}],"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=35112"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/m9js.shop\/blog\/wp-json\/wp\/v2\/categories?post=35112"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/m9js.shop\/blog\/wp-json\/wp\/v2\/tags?post=35112"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}