{"id":720,"date":"2015-04-15T08:00:56","date_gmt":"2015-04-15T17:00:56","guid":{"rendered":"http:\/\/blog.box.kr\/?p=720"},"modified":"2015-04-15T08:00:56","modified_gmt":"2015-04-15T17:00:56","slug":"%ed%8e%8cjava-%ec%97%90%ec%84%9c-database-replication-masterslave-writeread-%eb%b6%84%ea%b8%b0-%ec%b2%98%eb%a6%ac%ed%95%98%ea%b8%b0","status":"publish","type":"post","link":"https:\/\/blog.box.kr\/?p=720","title":{"rendered":"[\ud38c]Java \uc5d0\uc11c DataBase Replication Master\/Slave (write\/read) \ubd84\uae30 \ucc98\ub9ac\ud558\uae30"},"content":{"rendered":"<p><a href=\"http:\/\/kwon37xi.egloos.com\/\">http:\/\/kwon37xi.egloos.com\/<\/a><\/p>\n<p>\ub300\uaddc\ubaa8 \uc11c\ube44\uc2a4 \uac1c\ubc1c\uc2dc\uc5d0 \uac00\uc7a5 \uae30\ubcf8\uc801\uc73c\ub85c \ud558\ub294 \ud29c\ub2dd\uc740 \ubc14\ub85c \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0\uc11c Write\uc640 Read DB\ub97c Replication(\ub9ac\ud50c\ub9ac\ucf00\uc774\uc158)\ud558\uace0 \uc4f0\uae30 \uc791\uc5c5\uc740 Master(Write)\ub85c \ubcf4\ub0b4\uace0 \uc77d\uae30 \uc791\uc5c5\uc740 Slave(Read)\ub85c \ubcf4\ub0b4\uc5b4 \ubd80\ud558\ub97c \ubd84\uc0b0 \uc2dc\ud0a4\ub294 \uac83\uc774\ub2e4.<\/p>\n<p>\ud2b9\ud788 \ub300\ubd80\ubd84\uc758 \uc11c\ube44\uc2a4\ub294 \uc77d\uae30\uac00 \uc555\ub3c4\uc801\uc73c\ub85c \ub9ce\uae30 \ub54c\ubb38\uc5d0\u00a0 Slave\ub294 \uc5ec\ub7ec \ub300\ub97c \ub450\uc5b4 \uc77d\uae30 \ubd80\ud558\ub97c \ubd84\uc0b0 \uc2dc\ud0a8\ub2e4.<br \/>\n\uadf8\ub7f0\ub370 \ub610 \ud558\ub098 \uae30\uc5b5\ud574\uc57c \ud560 \uac83\uc774 Replication\uc740 \ube44\ub85d \uc9e7\ub354\ub77c\ub3c4 \uc2dc\ucc28\ub97c \ub450\uace0 \uc774\ub8e8\uc5b4 \uc9c0\ub294 \uac83\uc774\ub2e4.<br \/>\n\ub530\ub77c\uc11c <b>\uc815\ud569\uc131\uc774 \uad49\uc7a5\ud788 \uc911\uc694\ud55c \ub370\uc774\ud130\ub294 \ube44\ub85d \uc77d\uae30 \uc791\uc5c5\uc774\ub77c \ud558\ub354\ub77c\ub3c4 Slave\uc5d0\uc11c \uc77d\uc9c0 \uc54a\uace0 Master\uc5d0\uc11c \uc77d\uc5b4\uc57c\ub9cc \ud558\ub294 \uacbd\uc6b0\ub3c4 \uc788\ub2e4.<\/b><\/p>\n<p>\uadf8\ub807\ub2e4\uba74 Java \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc740 \uc5b4\ub5bb\uac8c Master\/Slave\ub85c \uac00\ub294 \ucffc\ub9ac\ub97c \ubd84\uae30 \ucc98\ub9ac\ud574\uc57c \ud558\ub294 \uac83\uc77c\uae4c?<\/p>\n<p>\uac00\uc7a5 \uc27d\uac8c \uc0dd\uac01\ub098\ub294 \ubc29\ubc95\uc740 \ucee4\ub125\uc158 \ud480(Connection Pool, DataSource)\uc744 master\uc640 slave\uc6a9\uc73c\ub85c \ub530\ub85c \ub9cc\ub4e4\uace0 \ucffc\ub9ac\ub97c \ub9cc\ub4e4 \ub54c \ube44\ub85d \uac19\uc740 \ucffc\ub9ac\ub77c\ub3c4 \uc11c\ub85c \ub2e4\ub978 DS\ub97c \ubc14\ub77c\ubcf4\ub294 \ub450 \ubc8c\uc758 \ucffc\ub9ac\ub97c \ub9cc\ub4e4\uc5b4\uc8fc\ub294 \ubc29\uc2dd\uc774\ub2e4.<br \/>\n\uc989, \ud504\ub85c\uadf8\ub798\uba38\uac00 \uacc4\uc18d\ud574\uc11c \ub450 \uac1c\uc758 \ub370\uc774\ud130 \uc18c\uc2a4\ub97c \uc778\uc9c0\ud574\uac00\uba70 \ucf54\ub4dc\ub97c \uc791\uc131\ud558\ub294 \ubc29\uc2dd\uc774\ub2e4.<\/p>\n<p>\ubb3c\ub860 \uc774 \ubc29\ubc95\uc744 \ucd94\ucc9c\ud558\uace0 \uc2f6\uc5b4\uc11c \uae00\uc744 \uc4f0\ub294 \uac83\uc740 \uc544\ub2c8\ub2e4. \uc774 \ubc29\ubc95\uc740 \ubc84\ub9ac\uc790.<\/p>\n<p>\ub0b4\uac00 \uc544\ub294 \ubc14 \uc800\ub807\uac8c \ud558\uc9c0 \uc54a\uace0 \uc790\uc5f0\uc2a4\ub7fd\uac8c Master\/Slave \ubd84\uae30\ucc98\ub9ac\ub97c \ud558\ub294 4 \uac00\uc9c0 \uc815\ub3c4\uc758 \ubc29\ubc95\uc774 \uc788\ub294\ub370, \uadf8 \uc911\uc5d0 \uc2e4\uc81c\ub85c \uc18c\uac1c\ud558\uace0 \uc2f6\uc740 \uac83\uc740 3, 4 \ubc88\uc9f8\uc774\ub2e4. \uc2dc\uac04 \uc5c6\uc73c\uba74 3, 4\ubc88\uc744 \uc77d\uae30\ub97c \ubc14\ub780\ub2e4.<\/p>\n<p><strong>1. DB Proxy \uc11c\ubc84\ub97c \uc774\uc6a9\ud55c\ub2e4.<\/strong><\/p>\n<p><a href=\"http:\/\/dev.mysql.com\/doc\/mysql-proxy\/en\/\" target=\"_blank\">MySQL Proxy<\/a>\uc774\ub098 <a href=\"https:\/\/mariadb.com\/products\/mariadb-maxscale\" target=\"_blank\">MaxScale<\/a> \uac19\uc740 \ud504\ub85d\uc2dc \uc11c\ubc84\ub97c \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uc774 \uc788\ub2e4(MySql \uc678\uc5d0\ub3c4 \ub2e4\ub978 \ub370\uc774\ud130\ubca0\uc774\uc2a4\ub3c4 Proxy \uc11c\ubc84\uac00 \uc788\ub2e4). \uc774\ub7f0 \ud504\ub85d\uc2dc \uc11c\ubc84\ub4e4\uc740 \ucffc\ub9ac\ub97c \ubd84\uc11d\ud558\uc5ec select\ub294 slave\ub85c \uadf8 \uc678\uc758 \uc5c5\ub370\uc774\ud2b8\ub294 master\ub85c \uc790\ub3d9\uc73c\ub85c \ubcf4\ub0b4\uc900\ub2e4. \ubb38\uc81c\ub294 select \ub354\ub77c\ub3c4 master\ub85c \ubcf4\ub0bc \ub54c \uc778\ub370, \ud504\ub85d\uc2dc \uc11c\ubc84 \uc790\uccb4\uc5d0 \uc2a4\ud06c\ub9bd\ud2b8 \uc5b8\uc5b4\ub85c \ubd84\uae30 \ucc98\ub9ac\ub97c \ud574\uc8fc\ub294 \uac83\uc774 \uc788\ub2e4.<br \/>\n\ubcf4\ud1b5\uc740 PHP \uac19\uc740 \ub3d9\uc801 \uc5b8\uc5b4 \uacc4\ud1b5\uc5d0\uc11c \ub9ce\uc774 \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95 \uac19\ub2e4.<br \/>\n\uc77c\ub2e8 \ub098\ub294 \ud504\ub85d\uc2dc\ub97c \uc774\ub7f0 \ubd84\uae30 \ucc98\ub9ac \uc6a9\ub3c4\ub85c \uc0ac\uc6a9\ud574 \ubcf8 \uc801\uc774 \uc5c6\uc5b4\uc11c \ubb50\ub77c \ub9d0\ud558\uae30 \ud798\ub4e4\uace0, \ubd84\uae30 \ucc98\ub9ac\ub97c \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ub2e8\uc5d0\uc11c \uc870\uc815\ud558\uc9c0 \uc54a\uace0 \uad00\ub828 \ub85c\uc9c1\uc774 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uacfc Proxy \uc11c\ubc84\ub85c \ubd84\uc0b0 \ub418\ub294 \ubb38\uc81c\uac00 \uc788\uc744 \uac83\uc73c\ub85c \ubcf4\uc5ec\uc11c \ubc30\uc7ac\ud55c\ub2e4.<\/p>\n<p>3, 4 \ubc88\uc740 \uc21c\uc218 Java \ucf54\ub4dc\ub85c \ubd84\uae30 \ucc98\ub9ac\ud558\ub294 \ubc29\ubc95\uc744 \uc18c\uac1c\ud558\ub294 \uac83\uc774\ub2e4.<\/p>\n<p><strong>\u25c6 2, 3, 4\ub97c \uac00\uae30 \uc804\uc5d0 \uc54c\uc544\ubcf4\ub294 Java\uc758 \ud2b9\uc9d5<\/strong><\/p>\n<p>Java\uc758 JDBC \ucee4\ub125\uc158 \uac1d\uccb4\uc5d0\ub294 <a href=\"http:\/\/docs.oracle.com\/javase\/7\/docs\/api\/java\/sql\/Connection.html#setReadOnly%28boolean%29\" target=\"_blank\">Connection.setReadOnly(true|false)<\/a> \ub77c\ub294 \uba54\uc18c\ub4dc\uac00 \uc874\uc7ac\ud55c\ub2e4.<br \/>\n\uc989, Java \uc758 JDBC \uc5d0\ub294 Read\/Write\ub97c \ubd84\uae30\ud560 \uc218 \uc788\ub294 \ub2e8\ucd08\uac00 \uc774\ubbf8 \ub4e4\uc5b4\uc788\ub294 \uac83\uc774\ub2e4.<\/p>\n<p>\ud604\uc7ac Java\uc758 \uc8fc\ub958 \ud504\ub808\uc784\uc6cc\ud06c\uc778 <a href=\"http:\/\/docs.spring.io\/spring\/docs\/current\/spring-framework-reference\/html\/transaction.html\" target=\"_blank\">Spring Framework\uc744 \uc0ac\uc6a9\ud558\uc5ec \ud2b8\ub79c\uc7ad\uc158\uc744 \uad00\ub9ac<\/a>\ud558\uba74<b><code>@Transactional(readOnly=true|false)<\/code><\/b>\ub97c \ud1b5\ud574 \ud604\uc7ac \ud2b8\ub79c\uc7ad\uc158\uc758 readOnly \uc0c1\ud0dc\ub97c \uc124\uc815\ud560 \uc218 \uc788\uc73c\uba70, \uc774 <b>Spring\uc758 \ud2b8\ub79c\uc7ad\uc158 \uc124\uc815\uc740 \uc5f0\uc1c4\uc801\uc73c\ub85c \ucee4\ub125\uc158 \uac1d\uccb4\uc758 <code>setReadOnly<\/code>\uba54\uc18c\ub4dc\ub97c \ud638\ucd9c<\/b>\ud558\uae30\ub3c4 \ud55c\ub2e4.<br \/>\n\ubc14\ub85c \uc774 \uc810\uc774 Java \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c \uc678\ubd80 Proxy \uc11c\ubc84\uc5d0 \uc758\uc874\ud558\uc9c0 \uc54a\uace0 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ucf54\ub4dc\ub97c \ud1b5\ud574 Master\/Slave \ubd84\uae30 \ucc98\ub9ac\ub97c \ud560 \uc218 \uc788\ub294 \ub2e8\ucd08\uac00 \ub41c\ub2e4.<\/p>\n<p>\uc55e\uc73c\ub85c\ubcf4\uac8c \ub420 2, 3, 4\ubc88 \ud574\uacb0\ucc45\uc740 Spring \uc0ac\uc6a9\uc2dc \ub2e4\uc74c\uacfc \uac19\uc740 \ubc29\uc2dd\ub9cc\uc73c\ub85c Master\/Slave \ubd84\uae30\ub97c \ud560 \uc218 \uc788\uac8c \ud574\uc900\ub2e4.<\/p>\n<blockquote class=\"src\"><p>@Transactional(<strong>readOnly\u00a0=\u00a0true<\/strong>)<br \/>\npublic\u00a0User\u00a0findByIdRead(Integer\u00a0id)\u00a0{<br \/>\nreturn\u00a0userRepository.findById(id);<br \/>\n}<\/p>\n<p>@Transactional(<strong>readOnly\u00a0=\u00a0false<\/strong>)<br \/>\npublic\u00a0User\u00a0findByIdWrite(Integer\u00a0id)\u00a0{<br \/>\nreturn\u00a0userRepository.findById(id);<br \/>\n}<\/blockquote>\n<p>\uc704\uc5d0\uc11c \ubcfc \ub54c \ub450 \uba54\uc18c\ub4dc\ub294 \ub3d9\uc77c\ud55c repository\uc758 \uba54\uc18c\ub4dc\ub97c \ud638\ucd9c\ud558\uc9c0\ub9cc \uc11c\ub85c \ub2e4\ub978 DB\ub97c \uc790\uc5f0\uc2a4\ub7fd\uac8c \ubcf4\uac8c \ub418\ub294 \uac83\uc774\ub2e4.<br \/>\n\uc704 \ucf54\ub4dc\ub294 \ub2e4\uc18c \uc778\uc704\uc801\uc778 \uac83\uc774\ub2e4. \uc11c\ube44\uc2a4\ub294 \ubcf4\ud1b5 \uc5ec\ub7ec \uac1c\uc758 \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac \uba54\uc18c\ub4dc\ub97c \ud55c \ud2b8\ub79c\uc7ad\uc158\uc73c\ub85c \ubb36\uae30 \ub54c\ubb38\uc774\ub2e4.<\/p>\n<p>\uc544\ub798\uc5d0\uc11c \uc18c\uac1c\ud560 2, 3, 4 \ubc88\uc740 \ud504\ub85c\uadf8\ub798\uba38 \uc785\uc7a5\uc5d0\uc11c \ubd24\uc744 \ub54c \ub370\uc774\ud130\uc18c\uc2a4\ub294 \uc2e0\uacbd\uc4f0\uc9c0 \uc54a\uace0 <b>\uc624\ub85c\uc9c0 Transaction\uc758 \uc18d\uc131 \ub9cc\uc744 \uc2e0\uacbd \uc368\uac00\uba70 \uc791\uc131<\/b>\ud558\ub294 \ubc29\ubc95\uc774\ub2e4. \uc989, \ud504\ub85c\uadf8\ub798\uba38\ub294 \uc2e4\uc81c \uc124\uc815\uc740 \ub450 \uac1c\ub85c \ub418\uc5b4 \uc788\ub354\ub77c\ub3c4 <b>\ub370\uc774\ud130\uc18c\uc2a4\uac00 \ud55c \uac1c\ubfd0\uc774\ub77c\uace0 \uc0dd\uac01\ud558\uace0 \ucf54\ub4dc\ub97c \uc9dc\uba74 <\/b>\ub41c\ub2e4. \ub610\ud55c\u00a0 Hibernate\ub098 MyBatis \ub4f1\uc758 <b>\uc601\uc18d \uacc4\uce35 \ud504\ub808\uc784\uc6cc\ud06c\ub3c4 \ub370\uc774\ud130\uc18c\uc2a4\uac00 2\uac1c\ub77c\ub294 \uc0ac\uc2e4\uc740 \uc804\ud600 \uc778\uc9c0\ud558\uc9c0 \uc54a\uace0 \ud558\ub098\uc758 \ub370\uc774\ud130\uc18c\uc2a4\ub85c \uac04\uc8fc\ud558\uace0 \uc124\uc815<\/b>\uc744 \ud558\uac8c \ub41c\ub2e4.<\/p>\n<p>Connection\uc758 readOnly\ub294 <strong>\uae30\ubcf8 \uc124\uc815\uac12\uc774 false<\/strong>\uc774\ub2e4.<\/p>\n<p><strong>2. MySQL Replication JDBC Driver \uc0ac\uc6a9\ud558\uae30<\/strong><\/p>\n<p><a href=\"http:\/\/kwonnam.pe.kr\/wiki\/database\/mysql\/jdbc#replication_jdbc_driver\" target=\"_blank\">MySQL\uc5d0\ub294 Replication JDBC \ub4dc\ub77c\uc774\ubc84<\/a>\uac00 \uc874\uc7ac\ud55c\ub2e4. \uc774\ub97c \uc774\uc6a9\ud558\uba74 <code>Connection.setReadOnly(true|false)<\/code> \ud638\ucd9c\ub9cc\uc73c\ub85c Master\/Slave \ubd84\uae30 \ucc98\ub9ac\uac00 \ub41c\ub2e4.<\/p>\n<p>\uc2e4\uc804 \ud658\uacbd\uc5d0\uc11c \uc0ac\uc6a9\ud574\ubcf4\uc558\ub294\ub370, \uba87 \uac00\uc9c0 \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud588\ub2e4. \ud558\uc9c0\ub9cc \ubaa8\ub450 \ud574\uacb0 \uac00\ub2a5\ud588\uc73c\uba70, \ud06c\uac8c \uce58\uba85\uc801\uc778 \ubb38\uc81c\ub294 \uc544\ub2c8\uc5c8\ub2e4.<\/p>\n<p>\uadf8\ub798\ub3c4 \uac00\ub2a5\ud558\uba74 3, 4\ubc88 \ud574\uacb0\ucc45\uc744 \uc0ac\uc6a9\ud558\ub294 \uac83\uc774 \uc88b\uaca0\ub2e4.<\/p>\n<p>\uc65c\ub0d0\uba74, \uc774 \ubc29\uc2dd\uc740 MySQL \uc678\uc5d0\ub294 \uc801\uc6a9\ub418\uc9c0 \uc54a\ub294\ub2e4. Replication JDBC \ub4dc\ub77c\uc774\ubc84\ub97c \uc81c\uacf5\ud574\uc8fc\ub294 DB\ub294 \uadf8\ub9ac \ub9ce\uc9c0 \uc54a\ub2e4(\uc0ac\uc2e4 \ub098\ub294 MySQL \ubc16\uc5d0 \ubabb\ubd24\ub2e4).<br \/>\n\uadf8\ub9ac\uace0 \uad73\uc774 \ub354 \ub098\uc740 \ubc29\uc2dd\uc774 \uc788\ub294\ub370 \uc548 \uc88b\uc740 \ubc29\uc2dd\uc744 \uc0ac\uc6a9\ud560 \ud544\uc694\ub294 \uc5c6\uae30 \ub54c\ubb38\uc774\ub2e4.<\/p>\n<p><strong>3. Spring LazyConnectionDataSourceProxy + AbstractRoutingDataSource<\/strong><\/p>\n<p>Spring\uc5d0 \uc788\ub294 <a href=\"http:\/\/kwonnam.pe.kr\/wiki\/springframework\/abstractroutingdatasource\" target=\"_blank\">AbstractRoutingDataSource<\/a> \ub294 \uc5ec\ub7ec\uac1c\uc758 \ub370\uc774\ud130\uc18c\uc2a4\ub97c \ud558\ub098\ub85c \ubb36\uace0 \uc790\ub3d9\uc73c\ub85c \ubd84\uae30\ucc98\ub9ac\ub97c \ud574\uc8fc\ub294 Spring \uae30\ubcf8 \ud074\ub798\uc2a4\uc774\ub2e4. \ub9ce\uc740 \uc0ac\ub78c\ub4e4\uc774 Master\/Slave \ubd84\uae30 \ucc98\ub9ac\ub97c \ud560 \ub54c \uc774\uac83\uc744 \uc0ac\uc6a9\ud574 \uc2a4\ud504\ub9c1\uc758 \ud604\uc7ac \ud2b8\ub79c\uc7ad\uc158 \uc18d\uc131\uc744 \uc77d\uc5b4\uc624\ub294 <a href=\"http:\/\/docs.spring.io\/spring-framework\/docs\/current\/javadoc-api\/org\/springframework\/transaction\/support\/TransactionSynchronizationManager.html\" target=\"_blank\">TransactionSynchronizationManager<\/a>\uc640 \uc870\ud569\ud558\uc5ec \ubd84\uae30\ucc98\ub9ac \ud558\ub824\uace0 \uc2dc\ub3c4\ud558\ub294\ub370 \uc774\uac74 \uc2e4\ud328\ub2e4(<a href=\"http:\/\/stackoverflow.com\/\" target=\"_blank\">http:\/\/stackoverflow.com\/<\/a>\uc5d0 \ubcf4\uba74 \uc774\uac70 \uc65c \uc548\ub418\ub0d0\ub294 \uc9c8\ubb38\uc774 \uc880 \uc788\ub2e4).<\/p>\n<p><a href=\"https:\/\/github.com\/kwon37xi\/replication-datasource\/blob\/master\/src\/test\/java\/kr\/pe\/kwonnam\/replicationdatasource\/routingdatasource\/ReplicationRoutingDataSource.java\" target=\"_blank\">ReplicationRoutingDataSource.java<\/a>\uc5d0 \uadf8 \uad6c\ud604\uc774 \uc788\ub294\ub370, \ub108\ubb34\ub3c4 \uac04\ub2e8\ud558\ub2e4.<\/p>\n<blockquote class=\"src\"><p>public\u00a0class\u00a0ReplicationRoutingDataSource\u00a0extends\u00a0AbstractRoutingDataSource\u00a0{<\/p>\n<p>@Override<br \/>\nprotected\u00a0Object\u00a0determineCurrentLookupKey()\u00a0{<br \/>\nString\u00a0dataSourceType\u00a0=<br \/>\n<strong>TransactionSynchronizationManager.isCurrentTransactionReadOnly()<\/strong>\u00a0?\u00a0&#8220;read&#8221;\u00a0:\u00a0&#8220;write&#8221;;<br \/>\nreturn\u00a0dataSourceType;<br \/>\n}<br \/>\n}<\/blockquote>\n<p>\uc65c \uc548\ub418\ub0d0\uba74, <a href=\"http:\/\/docs.spring.io\/spring-framework\/docs\/current\/javadoc-api\/org\/springframework\/transaction\/support\/TransactionSynchronizationManager.html\" target=\"_blank\">TransactionSynchronizationManager<\/a> \uac00 \ube44\ub85d <code>@Transactional<\/code>\ub85c \uc120\uc5b8\ub41c \ud604\uc7ac \uc4f0\ub808\ub4dc\uc758 \ud2b8\ub79c\uc7ad\uc158 \uc0c1\ud0dc\ub97c \uc77d\uc5b4\uc624\ub294\uac8c \uac00\ub2a5\ud558\ub354\ub77c\ub3c4 \ub3d9\uae30\ud654(synchronation)\uc2dc\uc810\uacfc Connection \uac1d\uccb4\ub97c \uac00\uc838\uc624\ub294 \uc2dc\uc810\uc5d0 \ubb38\uc81c\uac00 \uc788\uae30 \ub54c\ubb38\uc774\ub2e4.<\/p>\n<p>Spring\uc740 <code>@Transactional<\/code>\uc744 \ub9cc\ub098\uba74 \ub2e4\uc74c \uc21c\uc11c\ub85c \uc77c\uc744 \ucc98\ub9ac\ud55c\ub2e4.<\/p>\n<p><strong>TransactionManager \uc120\ubcc4 -&gt; DataSource\uc5d0\uc11c Connection \ud68d\ub4dd -&gt; Transaction \ub3d9\uae30\ud654(Synchronization)<\/strong><\/p>\n<p>\uc5ec\uae30\uc11c \ubcf4\uba74 \ud2b8\ub79c\uc7ad\uc158 \ub3d9\uae30\ud654\ub97c \ub9c8\uce5c \ub4a4\uc5d0 <a href=\"https:\/\/github.com\/kwon37xi\/replication-datasource\/blob\/master\/src\/test\/java\/kr\/pe\/kwonnam\/replicationdatasource\/routingdatasource\/ReplicationRoutingDataSource.java\" target=\"_blank\">ReplicationRoutingDataSource.java<\/a>\uc5d0\uc11c \ucee4\ub125\uc158\uc744 \ud68d\ub4dd\ud574\uc57c\ub9cc \uc774\uac8c \uc62c\ubc14\ub85c \ub3d9\uc791\ud558\ub294\ub370 \uadf8 \uc21c\uc11c\uac00 \ub4a4\ubc14\ub00c\uc5b4 \uc788\uae30 \ub54c\ubb38\uc774\ub2e4.<br \/>\n\ub098\ub294 \uc5ec\uae30\uae4c\uc9c0 \ubcf4\uace0 \ud3ec\uae30\ud558\uace0 \ubc14\ub85c 4\ubc88 \ubc29\uc2dd\uc744 \uad6c\ud604\ud558\uc600\ub294\ub370, \uc6b0\ub9ac\ud300\uc758 \uc774\uc740\ud638\ub2d8\uc774 \uc544\uc8fc \uc2ec\ud50c\ud55c \uc544\uc774\ub514\uc5b4\ub85c \uc774 \ubb38\uc81c\ub97c \ud574\uacb0 \ud588\ub2e4. \ucf54\ub4dc \ud55c \uc904 \uc5c6\uc774!<\/p>\n<p>\ubb50\ub0d0\uba74 \uc800 <b><a href=\"https:\/\/github.com\/kwon37xi\/replication-datasource\/blob\/master\/src\/test\/java\/kr\/pe\/kwonnam\/replicationdatasource\/routingdatasource\/ReplicationRoutingDataSource.java\" target=\"_blank\">ReplicationRoutingDataSource.java<\/a>\ub97c <a href=\"http:\/\/docs.spring.io\/spring-framework\/docs\/current\/javadoc-api\/org\/springframework\/jdbc\/datasource\/LazyConnectionDataSourceProxy.html\" target=\"_blank\">LazyConnectionDataSoruceProxy<\/a>\ub85c \uac10\uc2f8\uc8fc\uae30\ub9cc \ud558\uba74<\/b> \ub418\ub294 \uac83\uc774\ub2e4.<\/p>\n<p>\uc6d0\ub798 <a href=\"http:\/\/docs.spring.io\/spring-framework\/docs\/current\/javadoc-api\/org\/springframework\/jdbc\/datasource\/LazyConnectionDataSourceProxy.html\" target=\"_blank\">LazyConnectionDataSoruceProxy<\/a>\ub294 \uc2e4\uc9c8\uc801\uc778 \ucffc\ub9ac \uc2e4\ud589 \uc5ec\ubd80\uc640 \uc0c1\uad00\uc5c6\uc774 \ud2b8\ub79c\uc7ad\uc158\uc774 \uac78\ub9ac\uba74 \ubb34\uc870\uac74 Connection \uac1d\uccb4\ub97c \ud655\ubcf4\ud558\ub294 Spring\uc758 \ub2e8\uc810\uc744 \ubcf4\uc644\ud558\uc5ec \ud2b8\ub79c\uc7ad\uc158 \uc2dc\uc791\uc2dc\uc5d0 Connection Proxy \uac1d\uccb4\ub97c \ub9ac\ud134\ud558\uace0 \uc2e4\uc81c\ub85c \ucffc\ub9ac\uac00 \ubc1c\uc0dd\ud560 \ub54c \ub370\uc774\ud130\uc18c\uc2a4\uc5d0\uc11c <code>getConnection()<\/code>\uc744 \ud638\ucd9c\ud558\ub294 \uc5ed\ud560\uc744 \ud558\ub294 \uac83\uc774\ub2e4.<\/p>\n<p>\uc774\uac78 \uc801\uc6a9\ud558\uba74 \uc791\ub3d9 \uc21c\uc11c\uac00 \uc774\ub807\uac8c \ub41c\ub2e4.<\/p>\n<p><strong>TransactionManager \uc120\ubcc4 -&gt; LazyConnectionDataSourceProxy\uc5d0\uc11c Connection Proxy \uac1d\uccb4 \ud68d\ub4dd -&gt; Transaction \ub3d9\uae30\ud654(Synchronization) -&gt; \uc2e4\uc81c \ucffc\ub9ac \ud638\ucd9c\uc2dc\uc5d0<code>ReplicationRoutingDataSource.getConnection()\/determineCurrentLookupKey()<\/code> \ud638\ucd9c<\/strong><\/p>\n<p>\uc774\ub807\uac8c \ud558\uc5ec \uae54\ub054\ud558\uac8c Spring\uc758 \ud2b8\ub79c\uc7ad\uc158\uacfc \uc5b4\uc6b8\ub9ac\ub294 Replication Routing DataSource\uac00 \ub9cc\ub4e4\uc5b4\uc9c0\uac8c \ub41c\ub2e4.<br \/>\n\uc2e4\uc81c \uc124\uc815\uc740 \ub2e4\uc74c\uacfc \uac19\uc774 \ub41c\ub2e4. \uc880 \ub354 \uc790\uc138\ud55c \uac83\uc740 <a href=\"https:\/\/github.com\/kwon37xi\/replication-datasource\/blob\/master\/src\/test\/java\/kr\/pe\/kwonnam\/replicationdatasource\/config\/WithRoutingDataSourceConfig.java\" target=\"_blank\">WithRoutingDataSourceConfig.java<\/a>\ub97c \ubcf4\uc790.<\/p>\n<blockquote class=\"src\"><p>@Bean\u00a0public\u00a0DataSource\u00a0writeDataSource()\u00a0{\u00a0return\u00a0\uc4f0\uae30\u00a0DataSource;\u00a0}<\/p>\n<p>@Bean\u00a0public\u00a0DataSource\u00a0readDataSource()\u00a0{\u00a0return\u00a0\uc77d\uae30\u00a0DataSource;\u00a0}<\/p>\n<p>@Bean<br \/>\npublic\u00a0DataSource\u00a0routingDataSource(DataSource\u00a0writeDataSource,\u00a0DataSource\u00a0readDataSource)\u00a0{<br \/>\nReplicationRoutingDataSource\u00a0routingDataSource\u00a0=\u00a0new\u00a0ReplicationRoutingDataSource();<\/p>\n<p>Map&lt;Object,\u00a0Object&gt;\u00a0dataSourceMap\u00a0=\u00a0new\u00a0HashMap&lt;Object,\u00a0Object&gt;();<br \/>\ndataSourceMap.put(&#8220;write&#8221;,\u00a0writeDataSource);<br \/>\ndataSourceMap.put(&#8220;read&#8221;,\u00a0readDataSource);<br \/>\nroutingDataSource.setTargetDataSources(dataSourceMap);<br \/>\nroutingDataSource.setDefaultTargetDataSource(writeDataSource);<\/p>\n<p>return\u00a0routingDataSource;<br \/>\n}<\/p>\n<p>@Bean<br \/>\npublic\u00a0DataSource\u00a0<strong>dataSource<\/strong>(DataSource\u00a0routingDataSource)\u00a0{<br \/>\nreturn\u00a0new\u00a0LazyConnectionDataSourceProxy(routingDataSource);<br \/>\n}<\/blockquote>\n<p><code>TransactionManager<\/code>\ub098 \uc601\uc18d \uacc4\uce35 \ud504\ub808\uc784\uc6cc\ud06c\ub294 <strong><code>dataSource<\/code><\/strong> \uc774\uac83\ub9cc \ubc14\ub77c\ubcf4\uac8c \ud574\uc57c\ud55c\ub2e4. <code>writeDataSource, readDatasource, routingDataSource<\/code>\ub294 \uc124\uc815 \uc18d\uc5d0\ub9cc \uc874\uc7ac\ud560 \ubfd0 \uc601\uc18d \uacc4\uce35 \ud504\ub808\uc784\uc6cc\ud06c\ub4e4\uc5d0\uac8c\ub294 \uadf8 \uc874\uc7ac\ub97c \ubaa8\ub974\uac8c \ud574\uc57c\ud55c\ub2e4.<\/p>\n<p><strong>4. LazyReplicationConnectionDataSourceProxy &#8211; Spring\uc774 \uc544\ub2c8\uc5b4\ub3c4!<\/strong><\/p>\n<p>3\ubc88 \ubc29\uc2dd\uc740 \ub2e8\uc810\uc774 \ud558\ub098 \uc788\ub294\ub370, Spring\uc744 \uc0ac\uc6a9\ud558\uc9c0 \uc54a\uace0 \ud504\ub85c\uadf8\ub7a8\uc744 \uc9e4 \ub54c\ub294 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\ub2e4\ub294 \uac83\uc774\ub2e4.<br \/>\n\ud604\uc7ac Java \uacc4\uc758 \uc0b0\uc5c5 \ud45c\uc900\uc778 Spring\uc774\uae34 \ud558\uc9c0\ub9cc \uc5b4\ucc0c \ubaa8\ub450\ub2e4 Spring\ub9cc \uc0ac\uc6a9\ud558\ub9ac\uc624.<br \/>\n\uadf8\ub7f0\ub370, \ub0b4\uac00 \uc774\uac78 \ub9cc\ub4e0 \uac83\uc740 Spring\uc744 \uc548 \uc0ac\uc6a9\ud560 \ub54c \ub300\ube44\ud55c \uac83\uc740 \uc544\ub2c8\uace0, 3\ubc88\uc5d0 \ub300\ud55c \uc544\uc774\ub514\uc5b4\uac00 \uc5c6\uc5c8\uae30 \ub54c\ubb38\uc774\ub2e4&#8230; ^^;<\/p>\n<p>Spring\uc758 <a href=\"http:\/\/docs.spring.io\/spring-framework\/docs\/current\/javadoc-api\/org\/springframework\/jdbc\/datasource\/LazyConnectionDataSourceProxy.html\" target=\"_blank\">LazyConnectionDataSoruceProxy<\/a>\uc758 \ucf54\ub4dc\ub97c \ubcf4\uba74\uc11c \uc774 \ud074\ub798\uc2a4\ub294 \ud558\ub098\uc758 DataSource\ub85c\ub9cc \ud504\ub85d\uc2dc\ub97c \ud558\uc9c0\ub9cc \uc774\ub97c write\/read \ub450\uac1c\uc758 \ub370\uc774\ud130\uc18c\uc2a4\ub97c \ubc1b\uc544\uc11c \ud504\ub85d\uc2f1 \ud558\ub3c4\ub85d \uc218\uc815\ud558\uc600\ub2e4.<br \/>\n\uc804\uccb4 \ucf54\ub4dc\ub294 <strong><a href=\"https:\/\/github.com\/kwon37xi\/replication-datasource\/blob\/master\/src\/main\/java\/kr\/pe\/kwonnam\/replicationdatasource\/LazyReplicationConnectionDataSourceProxy.java\" target=\"_blank\">LazyReplicationConnectionDataSourceProxy.java<\/a><\/strong>\uc5d0 \uc788\ub2e4.<br \/>\n<strong>\ud074\ub798\uc2a4 \ub2e8 \ud55c \uac1c\ub77c\uc11c, \ud544\uc694\ud558\uba74 \uadf8\ub0e5 \uc18c\uc2a4\ub97c \ubcf5\uc0ac\ud574\uc11c \uc790\uae30 \ud504\ub85c\uc81d\ud2b8\uc5d0 \ub123\uace0 \uc0ac\uc6a9<\/strong>\ud558\uba74 \ub41c\ub2e4.<\/p>\n<p>\uc2e4\uc81c \ucf54\ub4dc\ub97c Spring\uc758 \uac83\uacfc \ube44\uad50\ud574 \ubcf4\uba74 \uac70\uc758 \ucc28\uc774\uac00 \uc548 \ub09c\ub2e4.<\/p>\n<p>\uc774 \ud074\ub798\uc2a4\ub294 \uae30\ubcf8\uc801\uc73c\ub85c Spring\uc758 <a href=\"http:\/\/docs.spring.io\/spring-framework\/docs\/current\/javadoc-api\/org\/springframework\/jdbc\/datasource\/LazyConnectionDataSourceProxy.html\" target=\"_blank\">LazyConnectionDataSoruceProxy<\/a> \uc644\uc804\ud788 \ub3d9\uc77c\ud558\uac8c \uc791\ub3d9\ud558\uc9c0\ub9cc<code>setReadOnly(true|false)<\/code>\ub85c \uc9c0\uc815\ub41c \uac12\uc5d0 \ub530\ub77c \ub450 \ub370\uc774\ud130\uc18c\uc2a4 \uc911\uc5d0 \uc801\ud569\ud55c \uacf3\uc73c\ub85c \ubd84\uae30\ud558\uc5ec \uc2e4\uc81c \ucee4\ub125\uc158\uc744 \ud68d\ub4dd\ud558\uc5ec \ub9ac\ud134\ud55c\ub2e4.<br \/>\nSpring \ud504\ub85c\uc81d\ud2b8\uc5d0\uc11c\uc758 \uc124\uc815\uc740 \ub2e4\uc74c\uacfc \uac19\uc740 \ud615\ud0dc\uac00 \ub41c\ub2e4.<\/p>\n<blockquote class=\"src\"><p>@Bean\u00a0public\u00a0DataSource\u00a0writeDataSource()\u00a0{\u00a0return\u00a0\uc4f0\uae30\u00a0DataSource;\u00a0}<\/p>\n<p>@Bean\u00a0public\u00a0DataSource\u00a0readDataSource()\u00a0{\u00a0return\u00a0\uc77d\uae30\u00a0DataSource;\u00a0}<\/p>\n<p>@Bean<br \/>\npublic\u00a0DataSource\u00a0<strong>dataSource<\/strong>(DataSource\u00a0writeDataSource,\u00a0DataSource\u00a0readDataSource)\u00a0{<br \/>\nreturn\u00a0new\u00a0LazyReplicationConnectionDataSourceProxy(writeDataSource,\u00a0readDataSource);<br \/>\n}<\/blockquote>\n<p>\uc124\uc815\uc774 \ubb34\ucc99 \uac04\ub2e8\ud574\uc84c\ub2e4.<\/p>\n<p><code>TransactionManager<\/code>\ub098 \uc601\uc18d \uacc4\uce35 \ud504\ub808\uc784\uc6cc\ud06c\ub294 <strong><code>dataSource<\/code><\/strong> \uc774\uac83\ub9cc \ubc14\ub77c\ubcf4\uac8c \ud574\uc57c\ud55c\ub2e4. <code>writeDataSource, readDatasource<\/code>\ub294 \uc124\uc815 \uc18d\uc5d0\ub9cc \uc874\uc7ac\ud560 \ubfd0 \uc601\uc18d \uacc4\uce35 \ud504\ub808\uc784\uc6cc\ud06c\ub4e4\uc5d0\uac8c\ub294 \uadf8 \uc874\uc7ac\ub97c \ubaa8\ub974\uac8c \ud574\uc57c\ud55c\ub2e4.<\/p>\n<p>\uc55e\uc11c \ub9d0\ud588\ub4ef\uc774 \uc774 \ucf54\ub4dc\ub294 \uc804\ud600 Spring\uc5d0 \uc758\uc874\uc801\uc774\uc9c0 \uc54a\uc73c\uba74\uc11c Java\uc758 \ud45c\uc900 API\ub97c \ub530\ub974\uace0 \uc788\ub2e4.<br \/>\n\ub530\ub77c\uc11c Spring\uc758 <code>@Transactional<\/code>\uacfc \ud568\uaed8 \uc0ac\uc6a9\ud574\ub3c4 \ub418\uace0, \uc544\ub2c8\uba74 \uadf8\ub0e5 \uc77c\ubc18 Java \ucf54\ub4dc\uc5d0\uc11c \uc544\ub798\ucc98\ub7fc<code>Connection.setReadOnly(true|false)<\/code>\ub97c \ud638\ucd9c\ud558\uc5ec \uc0ac\uc6a9\ud558\uba74 \ub41c\ub2e4.<\/p>\n<blockquote class=\"src\"><p>Connection\u00a0connection\u00a0=\u00a0dataSource.getConnection();<br \/>\nconnection.setReadOnly(false);<br \/>\n\/\/\u00a0\uc4f0\uae30\u00a0DB\uad00\ub828\u00a0\uc791\uc5c5<br \/>\nconnection.close();<\/p>\n<p>\/\/<strong>\u00a0\uc808\ub300\u00a0\uc55e\uc11c\u00a0\ud68d\ub4dd\ud55c\u00a0\ucee4\ub125\uc158\uc744\u00a0\uc7ac\uc0ac\uc6a9\ud558\uc9c0\u00a0\ub9d0\u00a0\uac83<\/strong><\/p>\n<p>Connection\u00a0connection\u00a0=\u00a0dataSource.getConnection();<br \/>\nconnection.setReadOnly(true);<br \/>\n\/\/\u00a0\uc77d\uae30\u00a0DB\uad00\ub828\u00a0\uc791\uc5c5<br \/>\nconnection.close();<\/blockquote>\n<p><strong>\u25c6 \uacb0\ub860 \ubc0f \uc8fc\uc758\ud560 \uc810<\/strong><\/p>\n<p>1. Spring\uc744 \uc0ac\uc6a9\ud55c\ub2e4\uba74 3\ubc88 LazyConnectionDataSourceProxy + AbstractRoutingDataSource \ubc29\uc2dd\uc744 \uad8c\uc7a5\ud55c\ub2e4.<br \/>\n2. Spring\uc744 \uc0ac\uc6a9\ud558\uc9c0 \uc54a\ub294\ub2e4\uba74 4\ubc88 <a href=\"https:\/\/github.com\/kwon37xi\/replication-datasource\/blob\/master\/src\/main\/java\/kr\/pe\/kwonnam\/replicationdatasource\/LazyReplicationConnectionDataSourceProxy.java\" target=\"_blank\">LazyReplicationConnectionDataSourceProxy.java<\/a> \uc18c\uc2a4\ub97c \ubcf5\uc0ac\ud558\uc5ec \uc0ac\uc6a9\ud55c\ub2e4. \uc774\ub294 \ud55c\uac00\uc9c0 \uc608\uc678\ub97c \uc81c\uc678\ud558\uace0\ub294 Spring \uacfc\ub3c4 \uc798 \uc791\ub3d9\ud55c\ub2e4.<br \/>\n3. 4\ubc88 <a href=\"https:\/\/github.com\/kwon37xi\/replication-datasource\/blob\/master\/src\/main\/java\/kr\/pe\/kwonnam\/replicationdatasource\/LazyReplicationConnectionDataSourceProxy.java\" target=\"_blank\">LazyReplicationConnectionDataSourceProxy.java<\/a>\ub294 <strong>Spring 4.0.x \uc774\ud558 + JPA \uc870\ud569\uc73c\ub85c \uc0ac\uc6a9\ud560 \uacbd\uc6b0 \uc791\ub3d9\ud558\uc9c0 \uc54a\ub294\ub2e4<\/strong>. \uc774\uc720\ub294 \uc77c\uc885\uc758 Spring JPA TransactionManager\uc758 \uc758\ub3c4\uc801 <code>setReadOnly<\/code> \ud68c\ud53c \ub54c\ubb38\uc778\ub370 4.1 \ubd80\ud130\ub294 JPA\uc5d0\uc11c\ub3c4 <code>setReadOnly<\/code>\ub97c \uc62c\ubc14\ub974\uac8c \ud638\ucd9c\ud574\uc918\uc11c \uad1c\ucc2e\ub2e4.<br \/>\n4. <strong>\uc808\ub300\ub85c \ud55c\ubc88 \uc77d\uc5b4\ub4e4\uc778 \ucee4\ub125\uc158\uc744 readOnly \uc124\uc815\uc744 \ubc14\uafd4\uc11c \uc7ac\ud65c\uc6a9\ud558\uba74 \uc548\ub41c\ub2e4. \uc77c\ub2e8 \uc2e4\uc81c \ucee4\ub125\uc158\uc744 \ud68d\ub4dd\ud558\uba74 \uc911\uac04\uc5d0 \uc18d\uc131\uc744 \ubc14\uafd4\ub3c4 \ub2e4\ub978 \ucee4\ub125\uc158\uc744 \uc0c8\ub85c \ub9fa\uc9c0 \uc54a\ub294\ub2e4.<\/strong> Spring\uc740 propagation\uc774 <code><b>REQUIRES_NEW<\/b><\/code>\uc77c \uacbd\uc6b0 \ube44\ub85d \ub3d9\uc77c DataSource\uc5d0\uc11c \ucee4\ub125\uc158\uc744 \uac00\uc838\uc624\ub354\ub77c\ub3c4 \uc0c8\ub85c\uc6b4 \ucee4\ub125\uc158\uc744 \ub9fa\uae30 \ub54c\ubb38\uc5d0 \uc544\ubb34 \ubb38\uc81c \uc5c6\uc774 \uc791\ub3d9\ud55c\ub2e4. \ud558\uc9c0\ub9cc propagation\uc774 <code>REQUIRED<\/code>\uc77c \uacbd\uc6b0\uc5d0\ub294 \uc0c8\ub85c\uc6b4 \ud2b8\ub79c\uc7ad\uc158\uc744 \uc0dd\uc131\ud558\uc9c0\ub3c4 \uc54a\uace0 \uc0c8\ub85c\uc6b4 \uc124\uc815\uc744 \uc801\uc6a9\ud558\uc9c0\ub3c4 \uc54a\uc73c\ubbc0\ub85c \uc8fc\uc758\ud574\uc57c \ud55c\ub2e4.<br \/>\n5. \uc774\uc5d0 \uad00\ud55c \ubaa8\ub4e0 \uc18c\uc2a4\uc640 Spring\uc758 Transaction\uc5d0\uc11c\uc758 \uc608\uc81c\ub97c \ubaa8\ub450 \ub9cc\ub4e4\uc5b4\uc11c \uc62c\ub824 \ub450\uc5c8\ub2e4. <a href=\"https:\/\/github.com\/kwon37xi\/replication-datasource\" target=\"_blank\">replication-datasource<\/a> \ud504\ub85c\uc81d\ud2b8\ub97c \ubcf4\uba74\ub418\uba70 \uadf8 \uc911\uc5d0\uc11c\ub3c4 <a href=\"https:\/\/github.com\/kwon37xi\/replication-datasource\/blob\/master\/src\/test\/java\/kr\/pe\/kwonnam\/replicationdatasource\/AbstractReplicationDataSourceIntegrationTest.java\" target=\"_blank\">AbstractReplicationDataSourceIntegrationTest.java<\/a>\uac00 3, 4\ubc88 \ubaa8\ub450\uc5d0 \ub300\ud55c Spring Transaction \ud14c\uc2a4\ud2b8\uc774\ub2e4.<\/p>\n<p>PS&gt;<br \/>\n\uc77c\ubc18\uc801\uc73c\ub85c Slave\ub294 \uc5ec\ub7ec\ub300\ub85c \uad6c\uc131\ud55c\ub2e4. \uadf8\ub807\ub2e4\uba74 Slave DB \uc815\ubcf4\ub97c \uc5ec\ub7ec\uac1c \ubc1b\uc544\uc11c \ubd80\ud558 \ubd84\uc0b0 \ucc98\ub9ac\ud558\uac8c \uc218\uc815\ud558\uace0 \uc2f6\uc740 \uc695\uad6c\ub97c \ub290\ub084 \ub4ef \ud55c\ub370, \uadf8\ub7ec\uc9c0 \ub9d0\uae38 \uad8c\ud55c\ub2e4.<br \/>\n<strong>\uc2e4\uc81c \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc758 \ubb3c\ub9ac\uc801 \uc815\ubcf4\ub97c \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0 \ub123\uac8c \ub418\uba74 \uc5ec\ub7ec \uc11c\ubc84\ub4e4 \uc911 \ud55c \ub300\uac00 \uace0\uc7a5\ub0ac\uc744 \uacbd\uc6b0 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc774 \uadf8\ub300\ub85c \uc8fd\uc5b4\ubc84\ub9b0\ub2e4.<\/strong> \ub3d9\uc885\uc758 \ubb3c\ub9ac\uc801 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \ub300\ud55c Load Balancing \uc740 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c \ud558\uc9c0 \ub9d0\uace0 \uc911\uac04\uc5d0 L4, L7, LVS, Proxy Server \ub4f1\uc758 \uacc4\uce35\uc744 \ub450\uc5b4\uc11c \uc911\uc559 \uc9d1\uc911 \uc870\uc815\ud558\uac8c \ud574\uc57c\ud55c\ub2e4. \uc5ec\uae30\uc11c\ub294 \ub2e8\uc9c0 \ubd80\ud558 \ubd84\uc0b0\ub9cc \ud560 \ubfd0 \uc870\uac74\uc5d0 \ub530\ub978 \ubd84\uae30 \ucc98\ub9ac\ub294 \ud558\uc9c0 \uc54a\ub294\ub2e4.<br \/>\n\uc0ac\uc815\uc0c1 \uc774\ub7f0 \ubd84\uae30 \ucc98\ub9ac\uac00 \ud798\ub4e4\uba74 <a href=\"http:\/\/dev.mysql.com\/doc\/connector-j\/en\/connector-j-usagenotes-j2ee-concepts-managing-load-balanced-connections.html\" target=\"_blank\">MySQL\uc758 \uacbd\uc6b0\uc5d0\ub294 JDBC\uc5d0\uc11c Load Blanace<\/a>\ub97c \uc9c0\uc6d0\ud558\ub2c8 \uc54c\uc544\ubcf4\ub3c4\ub85d \ud55c\ub2e4.<br \/>\n\uadf8\ub798\ub3c4 replication-datasource\uc5d0 \ub2e4\uc911 Slave\uc758 \ubd80\ud558 \ubd84\uc0b0 \uae30\ub2a5\uc744 \ub123\uace0 \uc2f6\ub2e4\uba74 \uc77c\ubd80 \uc11c\ubc84\uac00 \uc8fd\uc5c8\uc744 \ub54c\uc758 \ucc98\ub9ac\uc5d0 \ub300\ud574 \ub9e4\uc6b0 \uae4a\uc774 \uace0\ubbfc\ud574\uc57c \ud55c\ub2e4.<\/p>\n<p>\ub9c8\uc9c0\ub9c9\uc73c\ub85c, 4\ubc88 \ubc29\ubc95\uc740 \uc2e4\uc804\uc5d0\uc11c \uc0ac\uc6a9\ud574\ubcf8 \uc801 \uc5c6\ub2e4!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>http:\/\/kwon37xi.egloos.com\/ \ub300\uaddc\ubaa8 \uc11c\ube44\uc2a4 \uac1c\ubc1c\uc2dc\uc5d0 \uac00\uc7a5 \uae30\ubcf8\uc801\uc73c\ub85c \ud558\ub294 \ud29c\ub2dd\uc740 \ubc14\ub85c \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0\uc11c Write\uc640 Read DB\ub97c Replication(\ub9ac\ud50c\ub9ac\ucf00\uc774\uc158)\ud558\uace0 \uc4f0\uae30 \uc791\uc5c5\uc740 Master(Write)\ub85c \ubcf4\ub0b4\uace0 \uc77d\uae30 \uc791\uc5c5\uc740 Slave(Read)\ub85c \ubcf4\ub0b4\uc5b4 \ubd80\ud558\ub97c \ubd84\uc0b0 \uc2dc\ud0a4\ub294 \uac83\uc774\ub2e4. \ud2b9\ud788 \ub300\ubd80\ubd84\uc758 \uc11c\ube44\uc2a4\ub294 \uc77d\uae30\uac00 \uc555\ub3c4\uc801\uc73c\ub85c \ub9ce\uae30 \ub54c\ubb38\uc5d0\u00a0 Slave\ub294 \uc5ec\ub7ec \ub300\ub97c \ub450\uc5b4 \uc77d\uae30 \ubd80\ud558\ub97c \ubd84\uc0b0 \uc2dc\ud0a8\ub2e4. \uadf8\ub7f0\ub370 \ub610 \ud558\ub098 \uae30\uc5b5\ud574\uc57c \ud560 \uac83\uc774 Replication\uc740 \ube44\ub85d \uc9e7\ub354\ub77c\ub3c4 \uc2dc\ucc28\ub97c \ub450\uace0 \uc774\ub8e8\uc5b4 \uc9c0\ub294 \uac83\uc774\ub2e4. \ub530\ub77c\uc11c \uc815\ud569\uc131\uc774 \uad49\uc7a5\ud788 \uc911\uc694\ud55c \ub370\uc774\ud130\ub294 \ube44\ub85d \uc77d\uae30 \uc791\uc5c5\uc774\ub77c \ud558\ub354\ub77c\ub3c4 Slave\uc5d0\uc11c \uc77d\uc9c0 \uc54a\uace0 Master\uc5d0\uc11c \uc77d\uc5b4\uc57c\ub9cc \ud558\ub294 \uacbd\uc6b0\ub3c4 \uc788\ub2e4. \uadf8\ub807\ub2e4\uba74 Java \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc740 \uc5b4\ub5bb\uac8c Master\/Slave\ub85c \uac00\ub294 \ucffc\ub9ac\ub97c \ubd84\uae30 \ucc98\ub9ac\ud574\uc57c \ud558\ub294 \uac83\uc77c\uae4c? \uac00\uc7a5 \uc27d\uac8c \uc0dd\uac01\ub098\ub294 \ubc29\ubc95\uc740 \ucee4\ub125\uc158 \ud480(Connection Pool, DataSource)\uc744 master\uc640 slave\uc6a9\uc73c\ub85c \ub530\ub85c \ub9cc\ub4e4\uace0 \ucffc\ub9ac\ub97c \ub9cc\ub4e4 \ub54c \ube44\ub85d \uac19\uc740 \ucffc\ub9ac\ub77c\ub3c4 \uc11c\ub85c \ub2e4\ub978 DS\ub97c \ubc14\ub77c\ubcf4\ub294 \ub450 \ubc8c\uc758 \ucffc\ub9ac\ub97c \ub9cc\ub4e4\uc5b4\uc8fc\ub294 \ubc29\uc2dd\uc774\ub2e4. \uc989, \ud504\ub85c\uadf8\ub798\uba38\uac00 \uacc4\uc18d\ud574\uc11c \ub450 \uac1c\uc758 \ub370\uc774\ud130 \uc18c\uc2a4\ub97c \uc778\uc9c0\ud574\uac00\uba70 \ucf54\ub4dc\ub97c \uc791\uc131\ud558\ub294 \ubc29\uc2dd\uc774\ub2e4. \ubb3c\ub860 \uc774 \ubc29\ubc95\uc744 \ucd94\ucc9c\ud558\uace0 \uc2f6\uc5b4\uc11c \uae00\uc744 \uc4f0\ub294 \uac83\uc740 \uc544\ub2c8\ub2e4. \uc774 \ubc29\ubc95\uc740 \ubc84\ub9ac\uc790. \ub0b4\uac00 \uc544\ub294 \ubc14 \uc800\ub807\uac8c \ud558\uc9c0 \uc54a\uace0 \uc790\uc5f0\uc2a4\ub7fd\uac8c Master\/Slave \ubd84\uae30\ucc98\ub9ac\ub97c \ud558\ub294 4 \uac00\uc9c0 \uc815\ub3c4\uc758 \ubc29\ubc95\uc774 \uc788\ub294\ub370, \uadf8 \uc911\uc5d0 \uc2e4\uc81c\ub85c \uc18c\uac1c\ud558\uace0 \uc2f6\uc740 \uac83\uc740 3, 4 \ubc88\uc9f8\uc774\ub2e4. \uc2dc\uac04 \uc5c6\uc73c\uba74 3, 4\ubc88\uc744 \uc77d\uae30\ub97c \ubc14\ub780\ub2e4. 1. DB Proxy \uc11c\ubc84\ub97c \uc774\uc6a9\ud55c\ub2e4. MySQL Proxy\uc774\ub098 MaxScale \uac19\uc740 \ud504\ub85d\uc2dc \uc11c\ubc84\ub97c \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uc774 \uc788\ub2e4(MySql \uc678\uc5d0\ub3c4 \ub2e4\ub978 \ub370\uc774\ud130\ubca0\uc774\uc2a4\ub3c4 Proxy \uc11c\ubc84\uac00 \uc788\ub2e4). \uc774\ub7f0 \ud504\ub85d\uc2dc \uc11c\ubc84\ub4e4\uc740 \ucffc\ub9ac\ub97c \ubd84\uc11d\ud558\uc5ec select\ub294 slave\ub85c \uadf8 \uc678\uc758 \uc5c5\ub370\uc774\ud2b8\ub294 master\ub85c \uc790\ub3d9\uc73c\ub85c \ubcf4\ub0b4\uc900\ub2e4. \ubb38\uc81c\ub294 select \ub354\ub77c\ub3c4 master\ub85c [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_mi_skip_tracking":false,"ngg_post_thumbnail":0,"spay_email":"","jetpack_publicize_message":"","jetpack_is_tweetstorm":false,"jetpack_publicize_feature_enabled":true},"categories":[15,7],"tags":[],"aioseo_notices":[],"jetpack_featured_media_url":"","jetpack_publicize_connections":[],"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p5q9Zn-bC","jetpack-related-posts":[{"id":590,"url":"https:\/\/blog.box.kr\/?p=590","url_meta":{"origin":720,"position":0},"title":"[\ud38c]Java \uc5d0\uc11c DataBase Replication Master\/Slave (write\/read) \ubd84\uae30 \ucc98\ub9ac\ud558\uae30 \ud504\ub85c\uadf8\ub798\ubc0d","date":"2015-01-30","format":false,"excerpt":"Cloud\ud658\uacbd\uc5d0\uc11c DB\ub97c \uc0ac\uc6a9\ud558\ub2e4\ubcf4\ub2c8 Disk I\/O\ub098 \ub108\ubb34 \ub290\ub824\uc11c \ub9ce\uc740 \uace0\ubbfc\uc744 \ud558\uac8c \ub410\ub2e4. \uc77c\ub2e8 \uc0dd\uac01\ub098\ub294\uac83\uc774 \ub9ce\uc774 \ub4e4 \ud558\ub294 Replication\uc744 \uc774\uc6a9\ud55c \ubd80\ud558\ubd84\uc0b0 ( Master\ub294 Insert\/Update\ub9cc, Slave\ub294 SELECT\ub9cc ) \uadf8\ub7f0\ub370 \ub9c9\uc0c1 \ud560\ub824\uba74 \uc774\uac83 \uc800\uac83 \uc190\uc774 \ub9ce\uc774 \uac04\ub2e4.. \uadf8\ub798\uc11c.. \uc0dd\uac01\ub9cc \ud558\uace0 \uc801\uc6a9\uc744 \uc548\ud588\uc5c8\ub294\ub370.. \u00a0 \uc6f9\uc11c\ud551\uc744 \ud558\ub2e4\uac00 \uc774\ub7f0 \uae00\uc744 \ubc1c\uacac.. \uc544!! \uc774\ub807\uac8c \uc88b\uc744 \uc218\uac00.. \u00a0 \uc5ed\uc2dc\u2026","rel":"","context":"In &quot;JAVA&quot;","img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":801,"url":"https:\/\/blog.box.kr\/?p=801","url_meta":{"origin":720,"position":1},"title":"[scrap] MySQL Replication \uc124\uc815\uacfc \uba87 \uac00\uc9c0 \ud14c\uc2a4\ud2b8","date":"2015-05-18","format":false,"excerpt":"http:\/\/blog.hibrainapps.net\/130 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 MySQL\uc744 DB\ub85c \uc0ac\uc6a9\ud558\uba74\uc11c \uc11c\ubc84\uc758 \ubd80\ud558 \ubd84\uc0b0\uc744 \uc704\ud55c \ubc29\ubc95 \uc911 \ud558\ub098\ub85c Replication \uc744 \uc0ac\uc6a9\ud55c\ub2e4. Replication \uc740 Master \ud558\ub098\uc5d0 n\uac1c\uc758 Slave\ub85c \uc9c0\uc815\uc774 \uac00\ub2a5\ud558\ub2e4. Slave\ub294 \ub2e4\uc2dc Master \uc5ed\ud560\uc744 \ud560\uc218 \uc788\uc73c\uba70 \uc5ed\uc2dc \ub610 \ub2e4\ub978 n\uac1c\uc758 Slave\ub97c \uc9c0\uc815\ud560 \uc218 \uc788\ub2e4. \ubd80\ud558 \ubd84\uc0b0\uc758 \ud6a8\uacfc\ub294 inser,update \ub4f1 \ubcc0\uacbd\uacfc \uad00\ub828\ub41c \ubaa8\ub4e0 \uc791\uc5c5\uc740\u2026","rel":"","context":"In &quot;DB\uad00\ub828&quot;","img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":807,"url":"https:\/\/blog.box.kr\/?p=807","url_meta":{"origin":720,"position":2},"title":"[scrap] mysql &#8211; dual master replication","date":"2015-05-18","format":false,"excerpt":"http:\/\/simonshin.egloos.com\/2247518 \/etc\/my.cnf \ud30c\uc77c \ub0b4\uc6a9 Below is what needs to be added to the configuration for Server A: server-id = 1 replicate-same-server-id = 0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\uc2ac\ub808\uc774\ube0c \uc11c\ubc84\uc5d0\uc11c \uc0ac\uc6a9\ub428. \uc77c\ubc18\uc801\uc73c\ub85c\ub294 \ub514\ud3f4\ud2b8 \uc124\uc815 \uac12\uc778 0\uc744 \uc0ac\uc6a9\ud558\ub294\ub370, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\uc774 \uac12\uc740 \uc21c\ud658 \ub9ac\ud50c\ub9ac\ucf00\uc774\uc158(circular replication)\uc5d0 \uc758\ud55c \ubb34\ud55c \ub8e8\ud504\ub97c \ubc29\uc9c0\ud569\ub2c8\ub2e4. \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\uc774 \uac12\uc744 1\ub85c \uc124\uc815\ud55c\ub2e4\uba74, \uc2ac\ub808\uc774\ube0c\ub294 \uc790\uc2e0\uc758 \uc11c\ubc84\u2026","rel":"","context":"In &quot;DB\uad00\ub828&quot;","img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":379,"url":"https:\/\/blog.box.kr\/?p=379","url_meta":{"origin":720,"position":3},"title":"[\ud38c]\ube60\ub974\uac8c \ud6dd\uc5b4 \ubcf4\ub294 node.js","date":"2014-09-15","format":false,"excerpt":"http:\/\/bcho.tistory.com\/889 \ube60\ub974\uac8c \ud6dd\uc5b4 \ubcf4\ub294 node.js - #6 MongoDB \uc5f0\ub3d9 (mongo-native) \ud074\ub77c\uc6b0\ub4dc \ucef4\ud4e8\ud305 & NoSQL\/Vert.x & Node.js\u00a0|\u00a02014\/04\/03 23:49\u00a0|\u00a0Posted by\u00a0\uc870\ub300\ud611 \ube60\ub974\uac8c \ud6dd\uc5b4\ubcf4\ub294\u00a0node.js #6- mongo-native \ubaa8\ub4c8\uc744 \uc774\uc6a9\ud55c MongoDB \uc5f0\ub3d9 \uc870\ub300\ud611\u00a0(http:\/\/bcho.tistory.com Persistence\u00a0\uc5f0\ub3d9 node.js\ub294\u00a0DB\ub098\u00a0NoSQL\ub4f1\uc758 \uc5f0\ub3d9\uc744 \uc9c0\uc6d0\ud558\ub294\ub370,\u00a0\uc774 \uc5ed\uc2dc \ucca0\uc800\ud558\uac8c\u00a0non-blocking io\u00a0\ubc29\uc2dd\uc73c\ub85c \ub3d9\uc791\ud55c\ub2e4.\u00a0\uc989\u00a0db\u00a0\uc5f0\uacb0\u00a0socket\uc744 \uc5f4\uc5b4\uc11c\u00a0query\ub97c \ub358\uc838\ub193\uace0, query\u00a0\uacb0\uacfc\uac00 \uc624\uba74 \uc774\ubca4\ud2b8\ub97c \ubc1b\uc544\uc11c\u00a0callback\u00a0\ud568\uc218\ub85c \ucc98\ub9ac\ud558\ub294 \uc21c\uc11c\uc774\ub2e4. \uadf8\ub7ec\uba74 \uc5ec\uae30\uc11c\ub294 \uba87\uac00\uc9c0\u00a0persistence\u00a0\uc5f0\ub3d9 \ubc29\uc2dd\uc5d0 \ub300\ud574\uc11c \uc54c\uc544\ubcf4\ub3c4\ub85d \ud55c\ub2e4.\u2026","rel":"","context":"In &quot;\ucc38\uace0\ub97c \uc704\ud55c \uc800\uc7a5\ubb3c&quot;","img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":122,"url":"https:\/\/blog.box.kr\/?p=122","url_meta":{"origin":720,"position":4},"title":"Maven\uc744 \ub118\uc5b4 Gradle\ub85c \uac00\uc790","date":"2014-06-23","format":false,"excerpt":"Maven\uc744 \ub118\uc5b4 Gradle\ub85c \uac00\uc790.\u00a0\ud504\ub85c\uadf8\ub798\ubc0d by\u00a0\uad8c\ub0a8 2012\/10\/14 21:33 kwon37xi.egloos.com\/4747016 \ub367\uae00\uc218 :\u00a029 Maven\uc744 \uc368 \ubcf8 \uc0ac\ub78c\ub4e4\uc740 \ub300\ubd80\ubd84 \ub290\ub07c\ub9ac\ub77c \uc0dd\uac01\ud558\uc9c0\ub9cc \ub9e4\uc6b0 \uacbd\uc9c1\ub3fc \uc788\uace0 \uadf8\ub85c\uc778\ud574 \ubb34\uc5b8\uac00 Maven\uc774 \uae30\ubcf8 \uc9c0\uc6d0\ud558\uc9c0 \uc54a\ub294 \ube4c\ub4dc \uacfc\uc815\uc744 \ucd94\uac00\ud574\uc57c \ud560 \uacbd\uc6b0 \uace0\uc0dd\uc774 \uc774\ub9cc \uc800\ub9cc\uc774 \uc544\ub2c8\ub2e4. \uc774\uc5d0, \uc694\uc998 Maven \ub300\ud55c \ub300\uc548\uc774 \ub9ce\uc774 \ub098\uc624\uace0 \uc788\uc73c\uba70 \uadf8 \uc911 \uac00\uc7a5 \ub3cb\ubcf4\uc774\ub294 \uac83\uc774\u00a0Gradle(Groovy\u00a0\uae30\ubc18)\uc774 \uc544\ub2cc\uac00 \uc2f6\ub2e4.\u2026","rel":"","context":"In &quot;JAVA&quot;","img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":722,"url":"https:\/\/blog.box.kr\/?p=722","url_meta":{"origin":720,"position":5},"title":"[\ud38c]Maven\uc744 \ub118\uc5b4 Gradle\ub85c \uac00\uc790.","date":"2015-04-15","format":false,"excerpt":"http:\/\/kwon37xi.egloos.com\/4747016 \u00a0 Maven\uc744 \uc368 \ubcf8 \uc0ac\ub78c\ub4e4\uc740 \ub300\ubd80\ubd84 \ub290\ub07c\ub9ac\ub77c \uc0dd\uac01\ud558\uc9c0\ub9cc \ub9e4\uc6b0 \uacbd\uc9c1\ub3fc \uc788\uace0 \uadf8\ub85c\uc778\ud574 \ubb34\uc5b8\uac00 Maven\uc774 \uae30\ubcf8 \uc9c0\uc6d0\ud558\uc9c0 \uc54a\ub294 \ube4c\ub4dc \uacfc\uc815\uc744 \ucd94\uac00\ud574\uc57c \ud560 \uacbd\uc6b0 \uace0\uc0dd\uc774 \uc774\ub9cc \uc800\ub9cc\uc774 \uc544\ub2c8\ub2e4. \uc774\uc5d0, \uc694\uc998 Maven \ub300\ud55c \ub300\uc548\uc774 \ub9ce\uc774 \ub098\uc624\uace0 \uc788\uc73c\uba70 \uadf8 \uc911 \uac00\uc7a5 \ub3cb\ubcf4\uc774\ub294 \uac83\uc774 Gradle(Groovy \uae30\ubc18)\uc774 \uc544\ub2cc\uac00 \uc2f6\ub2e4. \uadf8\ub798\uc11c \ucc28\uae30 \ud504\ub85c\uc81d\ud2b8\uc758 \ube4c\ub4dc \ud234\ub85c Gradle\uc744\u2026","rel":"","context":"In &quot;JAVA&quot;","img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"_links":{"self":[{"href":"https:\/\/blog.box.kr\/index.php?rest_route=\/wp\/v2\/posts\/720"}],"collection":[{"href":"https:\/\/blog.box.kr\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.box.kr\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.box.kr\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.box.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=720"}],"version-history":[{"count":0,"href":"https:\/\/blog.box.kr\/index.php?rest_route=\/wp\/v2\/posts\/720\/revisions"}],"wp:attachment":[{"href":"https:\/\/blog.box.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=720"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.box.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=720"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.box.kr\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=720"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}