From 6f3ccfcfcdacebfbbe5d3b1d6baf5520fb30a5ca Mon Sep 17 00:00:00 2001 From: seungyeonchoi Date: Sat, 24 Jun 2023 18:10:15 +0900 Subject: [PATCH 1/2] =?UTF-8?q?vol1=20=EB=82=B4=EC=9A=A9=EC=9D=80=20?= =?UTF-8?q?=ED=95=98=EC=9C=84=20=ED=8F=B4=EB=8D=94=EB=A1=9C=20=EC=9D=B4?= =?UTF-8?q?=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...240\225\353\263\264 \354\236\221\354\204\261.md" | 2 +- ...251\224\355\203\200\354\240\225\353\263\264.png" | Bin ...~1_3DAO\354\235\230 \355\231\225\354\236\245.md" | 0 ...232\251\355\225\234 \354\204\244\354\240\225.md" | 4 ++-- ...32\251\355\225\234 \352\265\254\354\241\260.png" | Bin ...25\230\353\212\224 \353\260\251\354\213\235.png" | Bin ...235\230\354\241\264\352\264\200\352\263\204.png" | Bin ...235\230\354\241\264\352\264\200\352\263\204.png" | Bin ...212\224 \354\212\244\355\224\204\353\247\201.md" | 0 ...13\244\355\226\211_\353\260\251\353\262\225.png" | Bin ...\212\244\355\224\204\353\247\201JdbcTemplate.md" | 0 ...230\210\354\231\270 \354\240\204\355\231\230.md" | 2 +- ...31\270_\352\263\204\354\270\265\353\217\204.png" | Bin ...12\244_\352\263\204\354\270\265\353\217\204.png" | Bin ...\212\244\354\266\224\354\203\201\355\231\224.md" | 0 ...262\230\353\246\254\352\263\274\354\240\225.png" | Bin ...236\221\354\227\205\355\235\220\353\246\204.png" | Bin ...203\201\355\231\224\352\263\204\354\270\265.png" | Bin .../6_5\354\212\244\355\224\204\353\247\201 AOP.md" | 0 ...\233\220\355\205\214\354\212\244\355\212\270.md" | 0 ...236\220\353\217\231\354\203\235\354\204\261.png" | Bin ...\270\260\354\260\270\354\241\260\353\271\210.md" | 0 ...\203\201\355\231\224\354\240\201\354\232\251.md" | 4 ++-- ...270\260\353\212\245 \355\231\225\354\236\245.md" | 2 +- ...\240\201\354\232\251\355\225\230\352\270\260.md" | 0 ...236\245\354\240\220\354\204\244\353\252\205.png" | Bin ...231\225\354\236\245\352\265\254\354\241\260.png" | Bin ...35\230 \354\236\254\354\202\254\354\232\251.png" | Bin ...36\230\354\212\244 \352\265\254\354\241\260.png" | Bin ...\225\204\355\202\244\355\205\215\354\262\230.md" | 4 ++-- ...225\204\355\202\244\355\205\215\354\262\230.png" | Bin ...40\235\355\212\270 \353\260\251\354\213\235.png" | Bin ...40\235\355\212\270 \353\260\251\354\213\235.png" | Bin ...63\204\354\270\265 \353\260\251\354\213\235.png" | Bin 34 files changed, 9 insertions(+), 9 deletions(-) rename "\354\265\234\354\212\271\354\227\260/10\354\236\245 Ioc\354\273\250\355\205\214\354\235\264\353\204\210\354\231\200 DI/1_2 IOC/DI\353\245\274 \354\234\204\355\225\234 \353\271\210 \354\204\244\354\240\225 \353\251\224\355\203\200\354\240\225\353\263\264 \354\236\221\354\204\261.md" => "\354\265\234\354\212\271\354\227\260/vol1/10\354\236\245 Ioc\354\273\250\355\205\214\354\235\264\353\204\210\354\231\200 DI/1_2 IOC/DI\353\245\274 \354\234\204\355\225\234 \353\271\210 \354\204\244\354\240\225 \353\251\224\355\203\200\354\240\225\353\263\264 \354\236\221\354\204\261.md" (99%) rename "\354\265\234\354\212\271\354\227\260/10\354\236\245 Ioc\354\273\250\355\205\214\354\235\264\353\204\210\354\231\200 DI/1_2 IOC/\352\267\270\353\246\2741-8 \354\273\250\355\205\214\354\235\264\353\204\210\352\260\200 \355\231\234\354\232\251\355\225\230\353\212\224 \353\271\210 \354\204\244\354\240\225 \353\251\224\355\203\200\354\240\225\353\263\264.png" => "\354\265\234\354\212\271\354\227\260/vol1/10\354\236\245 Ioc\354\273\250\355\205\214\354\235\264\353\204\210\354\231\200 DI/1_2 IOC/\352\267\270\353\246\2741-8 \354\273\250\355\205\214\354\235\264\353\204\210\352\260\200 \355\231\234\354\232\251\355\225\230\353\212\224 \353\271\210 \354\204\244\354\240\225 \353\251\224\355\203\200\354\240\225\353\263\264.png" (100%) rename "\354\265\234\354\212\271\354\227\260/1\354\236\245 \354\230\244\353\270\214\354\240\235\355\212\270\354\231\200 \354\235\230\354\241\264\352\264\200\352\263\204/1_1\354\264\210\353\202\234\352\260\220 DAO~1_3DAO\354\235\230 \355\231\225\354\236\245.md" => "\354\265\234\354\212\271\354\227\260/vol1/1\354\236\245 \354\230\244\353\270\214\354\240\235\355\212\270\354\231\200 \354\235\230\354\241\264\352\264\200\352\263\204/1_1\354\264\210\353\202\234\352\260\220 DAO~1_3DAO\354\235\230 \355\231\225\354\236\245.md" (100%) rename "\354\265\234\354\212\271\354\227\260/1\354\236\245 \354\230\244\353\270\214\354\240\235\355\212\270\354\231\200 \354\235\230\354\241\264\352\264\200\352\263\204/1_4\354\240\234\354\226\264\354\235\230 \354\227\255\354\240\204 ~ 1.8 XML\354\235\204 \354\235\264\354\232\251\355\225\234 \354\204\244\354\240\225.md" => "\354\265\234\354\212\271\354\227\260/vol1/1\354\236\245 \354\230\244\353\270\214\354\240\235\355\212\270\354\231\200 \354\235\230\354\241\264\352\264\200\352\263\204/1_4\354\240\234\354\226\264\354\235\230 \354\227\255\354\240\204 ~ 1.8 XML\354\235\204 \354\235\264\354\232\251\355\225\234 \354\204\244\354\240\225.md" (97%) rename "\354\265\234\354\212\271\354\227\260/1\354\236\245 \354\230\244\353\270\214\354\240\235\355\212\270\354\231\200 \354\235\230\354\241\264\352\264\200\352\263\204/\352\267\270\353\246\274 1-8 \354\230\244\353\270\214\354\240\235\355\212\270 \355\214\251\355\206\240\353\246\254\353\245\274 \355\231\234\354\232\251\355\225\234 \352\265\254\354\241\260.png" => "\354\265\234\354\212\271\354\227\260/vol1/1\354\236\245 \354\230\244\353\270\214\354\240\235\355\212\270\354\231\200 \354\235\230\354\241\264\352\264\200\352\263\204/\352\267\270\353\246\274 1-8 \354\230\244\353\270\214\354\240\235\355\212\270 \355\214\251\355\206\240\353\246\254\353\245\274 \355\231\234\354\232\251\355\225\234 \352\265\254\354\241\260.png" (100%) rename "\354\265\234\354\212\271\354\227\260/1\354\236\245 \354\230\244\353\270\214\354\240\235\355\212\270\354\231\200 \354\235\230\354\241\264\352\264\200\352\263\204/\352\267\270\353\246\274 1-9 \354\225\240\355\224\214\353\246\254\354\274\200\354\235\264\354\205\230 \354\273\250\355\205\215\354\212\244\355\212\270\352\260\200 \353\217\231\354\236\221\355\225\230\353\212\224 \353\260\251\354\213\235.png" => "\354\265\234\354\212\271\354\227\260/vol1/1\354\236\245 \354\230\244\353\270\214\354\240\235\355\212\270\354\231\200 \354\235\230\354\241\264\352\264\200\352\263\204/\352\267\270\353\246\274 1-9 \354\225\240\355\224\214\353\246\254\354\274\200\354\235\264\354\205\230 \354\273\250\355\205\215\354\212\244\355\212\270\352\260\200 \353\217\231\354\236\221\355\225\230\353\212\224 \353\260\251\354\213\235.png" (100%) rename "\354\265\234\354\212\271\354\227\260/1\354\236\245 \354\230\244\353\270\214\354\240\235\355\212\270\354\231\200 \354\235\230\354\241\264\352\264\200\352\263\204/\352\267\270\353\246\2741-12 \355\201\264\353\236\230\354\212\244_\354\275\224\353\223\234 \353\240\210\353\262\250\354\235\230 \354\235\230\354\241\264\352\264\200\352\263\204.png" => "\354\265\234\354\212\271\354\227\260/vol1/1\354\236\245 \354\230\244\353\270\214\354\240\235\355\212\270\354\231\200 \354\235\230\354\241\264\352\264\200\352\263\204/\352\267\270\353\246\2741-12 \355\201\264\353\236\230\354\212\244_\354\275\224\353\223\234 \353\240\210\353\262\250\354\235\230 \354\235\230\354\241\264\352\264\200\352\263\204.png" (100%) rename "\354\265\234\354\212\271\354\227\260/1\354\236\245 \354\230\244\353\270\214\354\240\235\355\212\270\354\231\200 \354\235\230\354\241\264\352\264\200\352\263\204/\352\267\270\353\246\2741-13 \353\237\260\355\203\200\354\236\204 \354\213\234\354\235\230 \354\235\230\354\241\264\352\264\200\352\263\204 \354\243\274\354\236\205\352\263\274 \354\202\254\354\232\251 \354\235\230\354\241\264\352\264\200\352\263\204.png" => "\354\265\234\354\212\271\354\227\260/vol1/1\354\236\245 \354\230\244\353\270\214\354\240\235\355\212\270\354\231\200 \354\235\230\354\241\264\352\264\200\352\263\204/\352\267\270\353\246\2741-13 \353\237\260\355\203\200\354\236\204 \354\213\234\354\235\230 \354\235\230\354\241\264\352\264\200\352\263\204 \354\243\274\354\236\205\352\263\274 \354\202\254\354\232\251 \354\235\230\354\241\264\352\264\200\352\263\204.png" (100%) rename "\354\265\234\354\212\271\354\227\260/2\354\236\245 \355\205\214\354\212\244\355\212\270/2_1UserDaoTest \353\213\244\354\213\234\353\263\264\352\270\260~2_5\355\225\231\354\212\265 \355\205\214\354\212\244\355\212\270\353\241\234 \353\260\260\354\232\260\353\212\224 \354\212\244\355\224\204\353\247\201.md" => "\354\265\234\354\212\271\354\227\260/vol1/2\354\236\245 \355\205\214\354\212\244\355\212\270/2_1UserDaoTest \353\213\244\354\213\234\353\263\264\352\270\260~2_5\355\225\231\354\212\265 \355\205\214\354\212\244\355\212\270\353\241\234 \353\260\260\354\232\260\353\212\224 \354\212\244\355\224\204\353\247\201.md" (100%) rename "\354\265\234\354\212\271\354\227\260/2\354\236\245 \355\205\214\354\212\244\355\212\270/\352\267\270\353\246\2742-4_JUnit\354\235\230_\355\205\214\354\212\244\355\212\270_\353\251\224\354\206\214\353\223\234_\354\213\244\355\226\211_\353\260\251\353\262\225.png" => "\354\265\234\354\212\271\354\227\260/vol1/2\354\236\245 \355\205\214\354\212\244\355\212\270/\352\267\270\353\246\2742-4_JUnit\354\235\230_\355\205\214\354\212\244\355\212\270_\353\251\224\354\206\214\353\223\234_\354\213\244\355\226\211_\353\260\251\353\262\225.png" (100%) rename "\354\265\234\354\212\271\354\227\260/3\354\236\245 \355\205\234\355\224\214\353\246\277/3_1\353\213\244\354\213\234\353\263\264\353\212\224 \354\264\210\353\202\234\352\260\220 DAO_3_6\354\212\244\355\224\204\353\247\201JdbcTemplate.md" => "\354\265\234\354\212\271\354\227\260/vol1/3\354\236\245 \355\205\234\355\224\214\353\246\277/3_1\353\213\244\354\213\234\353\263\264\353\212\224 \354\264\210\353\202\234\352\260\220 DAO_3_6\354\212\244\355\224\204\353\247\201JdbcTemplate.md" (100%) rename "\354\265\234\354\212\271\354\227\260/4\354\236\245 \354\230\210\354\231\270/4_1\354\202\254\353\235\274\354\247\204 SQLException_4_2\354\230\210\354\231\270 \354\240\204\355\231\230.md" => "\354\265\234\354\212\271\354\227\260/vol1/4\354\236\245 \354\230\210\354\231\270/4_1\354\202\254\353\235\274\354\247\204 SQLException_4_2\354\230\210\354\231\270 \354\240\204\355\231\230.md" (99%) rename "\354\265\234\354\212\271\354\227\260/4\354\236\245 \354\230\210\354\231\270/dataaccessexception\354\230\210\354\231\270_\352\263\204\354\270\265\353\217\204.png" => "\354\265\234\354\212\271\354\227\260/vol1/4\354\236\245 \354\230\210\354\231\270/dataaccessexception\354\230\210\354\231\270_\352\263\204\354\270\265\353\217\204.png" (100%) rename "\354\265\234\354\212\271\354\227\260/4\354\236\245 \354\230\210\354\231\270/\354\230\210\354\231\270\355\201\264\353\236\230\354\212\244_\352\263\204\354\270\265\353\217\204.png" => "\354\265\234\354\212\271\354\227\260/vol1/4\354\236\245 \354\230\210\354\231\270/\354\230\210\354\231\270\355\201\264\353\236\230\354\212\244_\352\263\204\354\270\265\353\217\204.png" (100%) rename "\354\265\234\354\212\271\354\227\260/5\354\236\245 \354\204\234\353\271\204\354\212\244 \354\266\224\354\203\201\355\231\224/5_1\354\202\254\354\232\251\354\236\220\353\240\210\353\262\250\352\264\200\353\246\254\352\270\260\353\212\245\354\266\224\352\260\200_5_4\353\251\224\354\235\274\354\204\234\353\271\204\354\212\244\354\266\224\354\203\201\355\231\224.md" => "\354\265\234\354\212\271\354\227\260/vol1/5\354\236\245 \354\204\234\353\271\204\354\212\244 \354\266\224\354\203\201\355\231\224/5_1\354\202\254\354\232\251\354\236\220\353\240\210\353\262\250\352\264\200\353\246\254\352\270\260\353\212\245\354\266\224\352\260\200_5_4\353\251\224\354\235\274\354\204\234\353\271\204\354\212\244\354\266\224\354\203\201\355\231\224.md" (100%) rename "\354\265\234\354\212\271\354\227\260/5\354\236\245 \354\204\234\353\271\204\354\212\244 \354\266\224\354\203\201\355\231\224/\352\267\270\353\246\2745-2UserService\354\231\200UserDao\354\235\230\355\212\270\353\236\234\354\236\255\354\205\230\354\262\230\353\246\254\352\263\274\354\240\225.png" => "\354\265\234\354\212\271\354\227\260/vol1/5\354\236\245 \354\204\234\353\271\204\354\212\244 \354\266\224\354\203\201\355\231\224/\352\267\270\353\246\2745-2UserService\354\231\200UserDao\354\235\230\355\212\270\353\236\234\354\236\255\354\205\230\354\262\230\353\246\254\352\263\274\354\240\225.png" (100%) rename "\354\265\234\354\212\271\354\227\260/5\354\236\245 \354\204\234\353\271\204\354\212\244 \354\266\224\354\203\201\355\231\224/\352\267\270\353\246\2745-3\355\212\270\353\236\234\354\236\255\354\205\230\353\217\231\352\270\260\355\231\224\353\245\274\354\202\254\354\232\251\355\225\230\353\212\224\352\262\275\354\232\260\354\235\230\354\236\221\354\227\205\355\235\220\353\246\204.png" => "\354\265\234\354\212\271\354\227\260/vol1/5\354\236\245 \354\204\234\353\271\204\354\212\244 \354\266\224\354\203\201\355\231\224/\352\267\270\353\246\2745-3\355\212\270\353\236\234\354\236\255\354\205\230\353\217\231\352\270\260\355\231\224\353\245\274\354\202\254\354\232\251\355\225\230\353\212\224\352\262\275\354\232\260\354\235\230\354\236\221\354\227\205\355\235\220\353\246\204.png" (100%) rename "\354\265\234\354\212\271\354\227\260/5\354\236\245 \354\204\234\353\271\204\354\212\244 \354\266\224\354\203\201\355\231\224/\352\267\270\353\246\2745-6\354\212\244\355\224\204\353\247\201\354\235\230\355\212\270\353\236\234\354\236\255\354\205\230\354\266\224\354\203\201\355\231\224\352\263\204\354\270\265.png" => "\354\265\234\354\212\271\354\227\260/vol1/5\354\236\245 \354\204\234\353\271\204\354\212\244 \354\266\224\354\203\201\355\231\224/\352\267\270\353\246\2745-6\354\212\244\355\224\204\353\247\201\354\235\230\355\212\270\353\236\234\354\236\255\354\205\230\354\266\224\354\203\201\355\231\224\352\263\204\354\270\265.png" (100%) rename "\354\265\234\354\212\271\354\227\260/6\354\236\245 AOP/6_5\354\212\244\355\224\204\353\247\201 AOP.md" => "\354\265\234\354\212\271\354\227\260/vol1/6\354\236\245 AOP/6_5\354\212\244\355\224\204\353\247\201 AOP.md" (100%) rename "\354\265\234\354\212\271\354\227\260/6\354\236\245 AOP/6_6\355\212\270\353\236\234\354\236\255\354\205\230\354\206\215\354\204\261~6_8\355\212\270\353\236\234\354\236\255\354\205\230\354\247\200\354\233\220\355\205\214\354\212\244\355\212\270.md" => "\354\265\234\354\212\271\354\227\260/vol1/6\354\236\245 AOP/6_6\355\212\270\353\236\234\354\236\255\354\205\230\354\206\215\354\204\261~6_8\355\212\270\353\236\234\354\236\255\354\205\230\354\247\200\354\233\220\355\205\214\354\212\244\355\212\270.md" (100%) rename "\354\265\234\354\212\271\354\227\260/6\354\236\245 AOP/\352\267\270\353\246\2746-20_\353\271\210\355\233\204\354\262\230\353\246\254\352\270\260\353\245\274\354\235\264\354\232\251\355\225\234\355\224\204\353\241\235\354\213\234\354\236\220\353\217\231\354\203\235\354\204\261.png" => "\354\265\234\354\212\271\354\227\260/vol1/6\354\236\245 AOP/\352\267\270\353\246\2746-20_\353\271\210\355\233\204\354\262\230\353\246\254\352\270\260\353\245\274\354\235\264\354\232\251\355\225\234\355\224\204\353\241\235\354\213\234\354\236\220\353\217\231\354\203\235\354\204\261.png" (100%) rename "\354\265\234\354\212\271\354\227\260/7\354\236\245 \354\212\244\355\224\204\353\247\201 \355\225\265\354\213\254 \352\270\260\354\210\240\354\235\230 \354\235\221\354\232\251/7_1SQL\352\263\274DAO\354\235\230\353\266\204\353\246\254~7_2\354\235\270\355\204\260\355\216\230\354\235\264\354\212\244\354\231\200\354\236\220\352\270\260\354\260\270\354\241\260\353\271\210.md" => "\354\265\234\354\212\271\354\227\260/vol1/7\354\236\245 \354\212\244\355\224\204\353\247\201 \355\225\265\354\213\254 \352\270\260\354\210\240\354\235\230 \354\235\221\354\232\251/7_1SQL\352\263\274DAO\354\235\230\353\266\204\353\246\254~7_2\354\235\270\355\204\260\355\216\230\354\235\264\354\212\244\354\231\200\354\236\220\352\270\260\354\260\270\354\241\260\353\271\210.md" (100%) rename "\354\265\234\354\212\271\354\227\260/7\354\236\245 \354\212\244\355\224\204\353\247\201 \355\225\265\354\213\254 \352\270\260\354\210\240\354\235\230 \354\235\221\354\232\251/7_3\354\204\234\353\271\204\354\212\244\354\266\224\354\203\201\355\231\224\354\240\201\354\232\251.md" => "\354\265\234\354\212\271\354\227\260/vol1/7\354\236\245 \354\212\244\355\224\204\353\247\201 \355\225\265\354\213\254 \352\270\260\354\210\240\354\235\230 \354\235\221\354\232\251/7_3\354\204\234\353\271\204\354\212\244\354\266\224\354\203\201\355\231\224\354\240\201\354\232\251.md" (98%) rename "\354\265\234\354\212\271\354\227\260/7\354\236\245 \354\212\244\355\224\204\353\247\201 \355\225\265\354\213\254 \352\270\260\354\210\240\354\235\230 \354\235\221\354\232\251/7_4 \354\235\270\355\204\260\355\216\230\354\235\264\354\212\244 \354\203\201\354\206\215\354\235\204 \355\206\265\355\225\234 \354\225\210\354\240\204\355\225\234 \352\270\260\353\212\245 \355\231\225\354\236\245.md" => "\354\265\234\354\212\271\354\227\260/vol1/7\354\236\245 \354\212\244\355\224\204\353\247\201 \355\225\265\354\213\254 \352\270\260\354\210\240\354\235\230 \354\235\221\354\232\251/7_4 \354\235\270\355\204\260\355\216\230\354\235\264\354\212\244 \354\203\201\354\206\215\354\235\204 \355\206\265\355\225\234 \354\225\210\354\240\204\355\225\234 \352\270\260\353\212\245 \355\231\225\354\236\245.md" (98%) rename "\354\265\234\354\212\271\354\227\260/7\354\236\245 \354\212\244\355\224\204\353\247\201 \355\225\265\354\213\254 \352\270\260\354\210\240\354\235\230 \354\235\221\354\232\251/7_5DI\353\245\274 \354\235\264\354\232\251\355\225\264 \353\213\244\354\226\221\355\225\234 \352\265\254\355\230\204 \353\260\251\353\262\225 \354\240\201\354\232\251\355\225\230\352\270\260.md" => "\354\265\234\354\212\271\354\227\260/vol1/7\354\236\245 \354\212\244\355\224\204\353\247\201 \355\225\265\354\213\254 \352\270\260\354\210\240\354\235\230 \354\235\221\354\232\251/7_5DI\353\245\274 \354\235\264\354\232\251\355\225\264 \353\213\244\354\226\221\355\225\234 \352\265\254\355\230\204 \353\260\251\353\262\225 \354\240\201\354\232\251\355\225\230\352\270\260.md" (100%) rename "\354\265\234\354\212\271\354\227\260/7\354\236\245 \354\212\244\355\224\204\353\247\201 \355\225\265\354\213\254 \352\270\260\354\210\240\354\235\230 \354\235\221\354\232\251/interface\354\236\245\354\240\220\354\204\244\353\252\205.png" => "\354\265\234\354\212\271\354\227\260/vol1/7\354\236\245 \354\212\244\355\224\204\353\247\201 \355\225\265\354\213\254 \352\270\260\354\210\240\354\235\230 \354\235\221\354\232\251/interface\354\236\245\354\240\220\354\204\244\353\252\205.png" (100%) rename "\354\265\234\354\212\271\354\227\260/7\354\236\245 \354\212\244\355\224\204\353\247\201 \355\225\265\354\213\254 \352\270\260\354\210\240\354\235\230 \354\235\221\354\232\251/\352\267\270\353\246\274 7-11 \354\235\270\355\204\260\355\216\230\354\235\264\354\212\244 \354\203\201\354\206\215\354\234\250 \354\235\264\354\232\251\355\225\234 \355\231\225\354\236\245\352\265\254\354\241\260.png" => "\354\265\234\354\212\271\354\227\260/vol1/7\354\236\245 \354\212\244\355\224\204\353\247\201 \355\225\265\354\213\254 \352\270\260\354\210\240\354\235\230 \354\235\221\354\232\251/\352\267\270\353\246\274 7-11 \354\235\270\355\204\260\355\216\230\354\235\264\354\212\244 \354\203\201\354\206\215\354\234\250 \354\235\264\354\232\251\355\225\234 \355\231\225\354\236\245\352\265\254\354\241\260.png" (100%) rename "\354\265\234\354\212\271\354\227\260/7\354\236\245 \354\212\244\355\224\204\353\247\201 \355\225\265\354\213\254 \352\270\260\354\210\240\354\235\230 \354\235\221\354\232\251/\352\267\270\353\246\274 7-9 \354\234\204\354\236\204\354\235\204 \355\206\265\355\225\234 BaseSqIService\354\235\230 \354\236\254\354\202\254\354\232\251.png" => "\354\265\234\354\212\271\354\227\260/vol1/7\354\236\245 \354\212\244\355\224\204\353\247\201 \355\225\265\354\213\254 \352\270\260\354\210\240\354\235\230 \354\235\221\354\232\251/\352\267\270\353\246\274 7-9 \354\234\204\354\236\204\354\235\204 \355\206\265\355\225\234 BaseSqIService\354\235\230 \354\236\254\354\202\254\354\232\251.png" (100%) rename "\354\265\234\354\212\271\354\227\260/7\354\236\245 \354\212\244\355\224\204\353\247\201 \355\225\265\354\213\254 \352\270\260\354\210\240\354\235\230 \354\235\221\354\232\251/\352\267\270\353\246\2747-7 OxmSqlReader\353\245\274 \353\251\244\353\262\204\353\241\234 \352\260\226\353\212\224 OxmSqlService\355\201\264\353\236\230\354\212\244 \352\265\254\354\241\260.png" => "\354\265\234\354\212\271\354\227\260/vol1/7\354\236\245 \354\212\244\355\224\204\353\247\201 \355\225\265\354\213\254 \352\270\260\354\210\240\354\235\230 \354\235\221\354\232\251/\352\267\270\353\246\2747-7 OxmSqlReader\353\245\274 \353\251\244\353\262\204\353\241\234 \352\260\226\353\212\224 OxmSqlService\355\201\264\353\236\230\354\212\244 \352\265\254\354\241\260.png" (100%) rename "\354\265\234\354\212\271\354\227\260/9\354\236\245 \354\212\244\355\224\204\353\247\201 \355\224\204\353\241\234\354\240\235\355\212\270 \354\213\234\354\236\221\355\225\230\352\270\260/9_3 \354\225\240\355\224\214\353\246\254\354\274\200\354\235\264\354\205\230 \354\225\204\355\202\244\355\205\215\354\262\230.md" => "\354\265\234\354\212\271\354\227\260/vol1/9\354\236\245 \354\212\244\355\224\204\353\247\201 \355\224\204\353\241\234\354\240\235\355\212\270 \354\213\234\354\236\221\355\225\230\352\270\260/9_3 \354\225\240\355\224\214\353\246\254\354\274\200\354\235\264\354\205\230 \354\225\204\355\202\244\355\205\215\354\262\230.md" (96%) rename "\354\265\234\354\212\271\354\227\260/9\354\236\245 \354\212\244\355\224\204\353\247\201 \355\224\204\353\241\234\354\240\235\355\212\270 \354\213\234\354\236\221\355\225\230\352\270\260/\352\267\270\353\246\2749-13 3\352\263\204\354\270\265 \354\225\204\355\202\244\355\205\215\354\262\230.png" => "\354\265\234\354\212\271\354\227\260/vol1/9\354\236\245 \354\212\244\355\224\204\353\247\201 \355\224\204\353\241\234\354\240\235\355\212\270 \354\213\234\354\236\221\355\225\230\352\270\260/\352\267\270\353\246\2749-13 3\352\263\204\354\270\265 \354\225\204\355\202\244\355\205\215\354\262\230.png" (100%) rename "\354\265\234\354\212\271\354\227\260/9\354\236\245 \354\212\244\355\224\204\353\247\201 \355\224\204\353\241\234\354\240\235\355\212\270 \354\213\234\354\236\221\355\225\230\352\270\260/\352\267\270\353\246\2749-20 \353\271\210\354\225\275\355\225\234 \353\217\204\353\251\224\354\235\270 \354\230\244\353\270\214\354\240\235\355\212\270 \353\260\251\354\213\235.png" => "\354\265\234\354\212\271\354\227\260/vol1/9\354\236\245 \354\212\244\355\224\204\353\247\201 \355\224\204\353\241\234\354\240\235\355\212\270 \354\213\234\354\236\221\355\225\230\352\270\260/\352\267\270\353\246\2749-20 \353\271\210\354\225\275\355\225\234 \353\217\204\353\251\224\354\235\270 \354\230\244\353\270\214\354\240\235\355\212\270 \353\260\251\354\213\235.png" (100%) rename "\354\265\234\354\212\271\354\227\260/9\354\236\245 \354\212\244\355\224\204\353\247\201 \355\224\204\353\241\234\354\240\235\355\212\270 \354\213\234\354\236\221\355\225\230\352\270\260/\352\267\270\353\246\2749-21 \355\222\215\354\204\261\355\225\234 \353\217\204\353\251\224\354\235\270 \354\230\244\353\270\214\354\240\235\355\212\270 \353\260\251\354\213\235.png" => "\354\265\234\354\212\271\354\227\260/vol1/9\354\236\245 \354\212\244\355\224\204\353\247\201 \355\224\204\353\241\234\354\240\235\355\212\270 \354\213\234\354\236\221\355\225\230\352\270\260/\352\267\270\353\246\2749-21 \355\222\215\354\204\261\355\225\234 \353\217\204\353\251\224\354\235\270 \354\230\244\353\270\214\354\240\235\355\212\270 \353\260\251\354\213\235.png" (100%) rename "\354\265\234\354\212\271\354\227\260/9\354\236\245 \354\212\244\355\224\204\353\247\201 \355\224\204\353\241\234\354\240\235\355\212\270 \354\213\234\354\236\221\355\225\230\352\270\260/\352\267\270\353\246\2749-22 \353\217\204\353\251\224\354\235\270 \352\263\204\354\270\265 \353\260\251\354\213\235.png" => "\354\265\234\354\212\271\354\227\260/vol1/9\354\236\245 \354\212\244\355\224\204\353\247\201 \355\224\204\353\241\234\354\240\235\355\212\270 \354\213\234\354\236\221\355\225\230\352\270\260/\352\267\270\353\246\2749-22 \353\217\204\353\251\224\354\235\270 \352\263\204\354\270\265 \353\260\251\354\213\235.png" (100%) diff --git "a/\354\265\234\354\212\271\354\227\260/10\354\236\245 Ioc\354\273\250\355\205\214\354\235\264\353\204\210\354\231\200 DI/1_2 IOC/DI\353\245\274 \354\234\204\355\225\234 \353\271\210 \354\204\244\354\240\225 \353\251\224\355\203\200\354\240\225\353\263\264 \354\236\221\354\204\261.md" "b/\354\265\234\354\212\271\354\227\260/vol1/10\354\236\245 Ioc\354\273\250\355\205\214\354\235\264\353\204\210\354\231\200 DI/1_2 IOC/DI\353\245\274 \354\234\204\355\225\234 \353\271\210 \354\204\244\354\240\225 \353\251\224\355\203\200\354\240\225\353\263\264 \354\236\221\354\204\261.md" similarity index 99% rename from "\354\265\234\354\212\271\354\227\260/10\354\236\245 Ioc\354\273\250\355\205\214\354\235\264\353\204\210\354\231\200 DI/1_2 IOC/DI\353\245\274 \354\234\204\355\225\234 \353\271\210 \354\204\244\354\240\225 \353\251\224\355\203\200\354\240\225\353\263\264 \354\236\221\354\204\261.md" rename to "\354\265\234\354\212\271\354\227\260/vol1/10\354\236\245 Ioc\354\273\250\355\205\214\354\235\264\353\204\210\354\231\200 DI/1_2 IOC/DI\353\245\274 \354\234\204\355\225\234 \353\271\210 \354\204\244\354\240\225 \353\251\224\355\203\200\354\240\225\353\263\264 \354\236\221\354\204\261.md" index 231a8d5..5ad1b3a 100644 --- "a/\354\265\234\354\212\271\354\227\260/10\354\236\245 Ioc\354\273\250\355\205\214\354\235\264\353\204\210\354\231\200 DI/1_2 IOC/DI\353\245\274 \354\234\204\355\225\234 \353\271\210 \354\204\244\354\240\225 \353\251\224\355\203\200\354\240\225\353\263\264 \354\236\221\354\204\261.md" +++ "b/\354\265\234\354\212\271\354\227\260/vol1/10\354\236\245 Ioc\354\273\250\355\205\214\354\235\264\353\204\210\354\231\200 DI/1_2 IOC/DI\353\245\274 \354\234\204\355\225\234 \353\271\210 \354\204\244\354\240\225 \353\251\224\355\203\200\354\240\225\353\263\264 \354\236\221\354\204\261.md" @@ -25,7 +25,7 @@ BeanDefinition이란? ``` #### 동작 방식 -![img.png](그림1-8 컨테이너가 활용하는 빈 설정 메타정보.png) +![img.png](그림1-8%20컨테이너가%20활용하는%20빈%20설정%20메타정보.png) 1. `빈 설정 메타정보`가 담긴 xml 파일 or 애노테이션 같은 리소스를 전용 리더를 통해 읽는다 2. BeanDefinition 타입의 오브젝트로 변환한다 3. IoC 컨테이너는 이 BeanDefinition 메타정보를 이용해 빈을 생선한다 diff --git "a/\354\265\234\354\212\271\354\227\260/10\354\236\245 Ioc\354\273\250\355\205\214\354\235\264\353\204\210\354\231\200 DI/1_2 IOC/\352\267\270\353\246\2741-8 \354\273\250\355\205\214\354\235\264\353\204\210\352\260\200 \355\231\234\354\232\251\355\225\230\353\212\224 \353\271\210 \354\204\244\354\240\225 \353\251\224\355\203\200\354\240\225\353\263\264.png" "b/\354\265\234\354\212\271\354\227\260/vol1/10\354\236\245 Ioc\354\273\250\355\205\214\354\235\264\353\204\210\354\231\200 DI/1_2 IOC/\352\267\270\353\246\2741-8 \354\273\250\355\205\214\354\235\264\353\204\210\352\260\200 \355\231\234\354\232\251\355\225\230\353\212\224 \353\271\210 \354\204\244\354\240\225 \353\251\224\355\203\200\354\240\225\353\263\264.png" similarity index 100% rename from "\354\265\234\354\212\271\354\227\260/10\354\236\245 Ioc\354\273\250\355\205\214\354\235\264\353\204\210\354\231\200 DI/1_2 IOC/\352\267\270\353\246\2741-8 \354\273\250\355\205\214\354\235\264\353\204\210\352\260\200 \355\231\234\354\232\251\355\225\230\353\212\224 \353\271\210 \354\204\244\354\240\225 \353\251\224\355\203\200\354\240\225\353\263\264.png" rename to "\354\265\234\354\212\271\354\227\260/vol1/10\354\236\245 Ioc\354\273\250\355\205\214\354\235\264\353\204\210\354\231\200 DI/1_2 IOC/\352\267\270\353\246\2741-8 \354\273\250\355\205\214\354\235\264\353\204\210\352\260\200 \355\231\234\354\232\251\355\225\230\353\212\224 \353\271\210 \354\204\244\354\240\225 \353\251\224\355\203\200\354\240\225\353\263\264.png" diff --git "a/\354\265\234\354\212\271\354\227\260/1\354\236\245 \354\230\244\353\270\214\354\240\235\355\212\270\354\231\200 \354\235\230\354\241\264\352\264\200\352\263\204/1_1\354\264\210\353\202\234\352\260\220 DAO~1_3DAO\354\235\230 \355\231\225\354\236\245.md" "b/\354\265\234\354\212\271\354\227\260/vol1/1\354\236\245 \354\230\244\353\270\214\354\240\235\355\212\270\354\231\200 \354\235\230\354\241\264\352\264\200\352\263\204/1_1\354\264\210\353\202\234\352\260\220 DAO~1_3DAO\354\235\230 \355\231\225\354\236\245.md" similarity index 100% rename from "\354\265\234\354\212\271\354\227\260/1\354\236\245 \354\230\244\353\270\214\354\240\235\355\212\270\354\231\200 \354\235\230\354\241\264\352\264\200\352\263\204/1_1\354\264\210\353\202\234\352\260\220 DAO~1_3DAO\354\235\230 \355\231\225\354\236\245.md" rename to "\354\265\234\354\212\271\354\227\260/vol1/1\354\236\245 \354\230\244\353\270\214\354\240\235\355\212\270\354\231\200 \354\235\230\354\241\264\352\264\200\352\263\204/1_1\354\264\210\353\202\234\352\260\220 DAO~1_3DAO\354\235\230 \355\231\225\354\236\245.md" diff --git "a/\354\265\234\354\212\271\354\227\260/1\354\236\245 \354\230\244\353\270\214\354\240\235\355\212\270\354\231\200 \354\235\230\354\241\264\352\264\200\352\263\204/1_4\354\240\234\354\226\264\354\235\230 \354\227\255\354\240\204 ~ 1.8 XML\354\235\204 \354\235\264\354\232\251\355\225\234 \354\204\244\354\240\225.md" "b/\354\265\234\354\212\271\354\227\260/vol1/1\354\236\245 \354\230\244\353\270\214\354\240\235\355\212\270\354\231\200 \354\235\230\354\241\264\352\264\200\352\263\204/1_4\354\240\234\354\226\264\354\235\230 \354\227\255\354\240\204 ~ 1.8 XML\354\235\204 \354\235\264\354\232\251\355\225\234 \354\204\244\354\240\225.md" similarity index 97% rename from "\354\265\234\354\212\271\354\227\260/1\354\236\245 \354\230\244\353\270\214\354\240\235\355\212\270\354\231\200 \354\235\230\354\241\264\352\264\200\352\263\204/1_4\354\240\234\354\226\264\354\235\230 \354\227\255\354\240\204 ~ 1.8 XML\354\235\204 \354\235\264\354\232\251\355\225\234 \354\204\244\354\240\225.md" rename to "\354\265\234\354\212\271\354\227\260/vol1/1\354\236\245 \354\230\244\353\270\214\354\240\235\355\212\270\354\231\200 \354\235\230\354\241\264\352\264\200\352\263\204/1_4\354\240\234\354\226\264\354\235\230 \354\227\255\354\240\204 ~ 1.8 XML\354\235\204 \354\235\264\354\232\251\355\225\234 \354\204\244\354\240\225.md" index 6dd4df2..fce867c 100644 --- "a/\354\265\234\354\212\271\354\227\260/1\354\236\245 \354\230\244\353\270\214\354\240\235\355\212\270\354\231\200 \354\235\230\354\241\264\352\264\200\352\263\204/1_4\354\240\234\354\226\264\354\235\230 \354\227\255\354\240\204 ~ 1.8 XML\354\235\204 \354\235\264\354\232\251\355\225\234 \354\204\244\354\240\225.md" +++ "b/\354\265\234\354\212\271\354\227\260/vol1/1\354\236\245 \354\230\244\353\270\214\354\240\235\355\212\270\354\231\200 \354\235\230\354\241\264\352\264\200\352\263\204/1_4\354\240\234\354\226\264\354\235\230 \354\227\255\354\240\204 ~ 1.8 XML\354\235\204 \354\235\264\354\232\251\355\225\234 \354\204\244\354\240\225.md" @@ -40,7 +40,7 @@ main() 메소드와 같이 프로그램이 시작되는 지점에서 다음에 ## 오브젝트 수준의 단순한 예제 -img.png +img.png ``` java public class DaoFactory { @@ -81,7 +81,7 @@ public class UserDaoTest { - DI: 스프링이 제공하는 차별적인 IoC방식인 `의존관계 주입`을 나타내는 용어 ### 애플리케이션 컨텍스트 동작 방식 -img.png +img.png **방식 1- java 클래스 파일로 설정** ``` java diff --git "a/\354\265\234\354\212\271\354\227\260/1\354\236\245 \354\230\244\353\270\214\354\240\235\355\212\270\354\231\200 \354\235\230\354\241\264\352\264\200\352\263\204/\352\267\270\353\246\274 1-8 \354\230\244\353\270\214\354\240\235\355\212\270 \355\214\251\355\206\240\353\246\254\353\245\274 \355\231\234\354\232\251\355\225\234 \352\265\254\354\241\260.png" "b/\354\265\234\354\212\271\354\227\260/vol1/1\354\236\245 \354\230\244\353\270\214\354\240\235\355\212\270\354\231\200 \354\235\230\354\241\264\352\264\200\352\263\204/\352\267\270\353\246\274 1-8 \354\230\244\353\270\214\354\240\235\355\212\270 \355\214\251\355\206\240\353\246\254\353\245\274 \355\231\234\354\232\251\355\225\234 \352\265\254\354\241\260.png" similarity index 100% rename from "\354\265\234\354\212\271\354\227\260/1\354\236\245 \354\230\244\353\270\214\354\240\235\355\212\270\354\231\200 \354\235\230\354\241\264\352\264\200\352\263\204/\352\267\270\353\246\274 1-8 \354\230\244\353\270\214\354\240\235\355\212\270 \355\214\251\355\206\240\353\246\254\353\245\274 \355\231\234\354\232\251\355\225\234 \352\265\254\354\241\260.png" rename to "\354\265\234\354\212\271\354\227\260/vol1/1\354\236\245 \354\230\244\353\270\214\354\240\235\355\212\270\354\231\200 \354\235\230\354\241\264\352\264\200\352\263\204/\352\267\270\353\246\274 1-8 \354\230\244\353\270\214\354\240\235\355\212\270 \355\214\251\355\206\240\353\246\254\353\245\274 \355\231\234\354\232\251\355\225\234 \352\265\254\354\241\260.png" diff --git "a/\354\265\234\354\212\271\354\227\260/1\354\236\245 \354\230\244\353\270\214\354\240\235\355\212\270\354\231\200 \354\235\230\354\241\264\352\264\200\352\263\204/\352\267\270\353\246\274 1-9 \354\225\240\355\224\214\353\246\254\354\274\200\354\235\264\354\205\230 \354\273\250\355\205\215\354\212\244\355\212\270\352\260\200 \353\217\231\354\236\221\355\225\230\353\212\224 \353\260\251\354\213\235.png" "b/\354\265\234\354\212\271\354\227\260/vol1/1\354\236\245 \354\230\244\353\270\214\354\240\235\355\212\270\354\231\200 \354\235\230\354\241\264\352\264\200\352\263\204/\352\267\270\353\246\274 1-9 \354\225\240\355\224\214\353\246\254\354\274\200\354\235\264\354\205\230 \354\273\250\355\205\215\354\212\244\355\212\270\352\260\200 \353\217\231\354\236\221\355\225\230\353\212\224 \353\260\251\354\213\235.png" similarity index 100% rename from "\354\265\234\354\212\271\354\227\260/1\354\236\245 \354\230\244\353\270\214\354\240\235\355\212\270\354\231\200 \354\235\230\354\241\264\352\264\200\352\263\204/\352\267\270\353\246\274 1-9 \354\225\240\355\224\214\353\246\254\354\274\200\354\235\264\354\205\230 \354\273\250\355\205\215\354\212\244\355\212\270\352\260\200 \353\217\231\354\236\221\355\225\230\353\212\224 \353\260\251\354\213\235.png" rename to "\354\265\234\354\212\271\354\227\260/vol1/1\354\236\245 \354\230\244\353\270\214\354\240\235\355\212\270\354\231\200 \354\235\230\354\241\264\352\264\200\352\263\204/\352\267\270\353\246\274 1-9 \354\225\240\355\224\214\353\246\254\354\274\200\354\235\264\354\205\230 \354\273\250\355\205\215\354\212\244\355\212\270\352\260\200 \353\217\231\354\236\221\355\225\230\353\212\224 \353\260\251\354\213\235.png" diff --git "a/\354\265\234\354\212\271\354\227\260/1\354\236\245 \354\230\244\353\270\214\354\240\235\355\212\270\354\231\200 \354\235\230\354\241\264\352\264\200\352\263\204/\352\267\270\353\246\2741-12 \355\201\264\353\236\230\354\212\244_\354\275\224\353\223\234 \353\240\210\353\262\250\354\235\230 \354\235\230\354\241\264\352\264\200\352\263\204.png" "b/\354\265\234\354\212\271\354\227\260/vol1/1\354\236\245 \354\230\244\353\270\214\354\240\235\355\212\270\354\231\200 \354\235\230\354\241\264\352\264\200\352\263\204/\352\267\270\353\246\2741-12 \355\201\264\353\236\230\354\212\244_\354\275\224\353\223\234 \353\240\210\353\262\250\354\235\230 \354\235\230\354\241\264\352\264\200\352\263\204.png" similarity index 100% rename from "\354\265\234\354\212\271\354\227\260/1\354\236\245 \354\230\244\353\270\214\354\240\235\355\212\270\354\231\200 \354\235\230\354\241\264\352\264\200\352\263\204/\352\267\270\353\246\2741-12 \355\201\264\353\236\230\354\212\244_\354\275\224\353\223\234 \353\240\210\353\262\250\354\235\230 \354\235\230\354\241\264\352\264\200\352\263\204.png" rename to "\354\265\234\354\212\271\354\227\260/vol1/1\354\236\245 \354\230\244\353\270\214\354\240\235\355\212\270\354\231\200 \354\235\230\354\241\264\352\264\200\352\263\204/\352\267\270\353\246\2741-12 \355\201\264\353\236\230\354\212\244_\354\275\224\353\223\234 \353\240\210\353\262\250\354\235\230 \354\235\230\354\241\264\352\264\200\352\263\204.png" diff --git "a/\354\265\234\354\212\271\354\227\260/1\354\236\245 \354\230\244\353\270\214\354\240\235\355\212\270\354\231\200 \354\235\230\354\241\264\352\264\200\352\263\204/\352\267\270\353\246\2741-13 \353\237\260\355\203\200\354\236\204 \354\213\234\354\235\230 \354\235\230\354\241\264\352\264\200\352\263\204 \354\243\274\354\236\205\352\263\274 \354\202\254\354\232\251 \354\235\230\354\241\264\352\264\200\352\263\204.png" "b/\354\265\234\354\212\271\354\227\260/vol1/1\354\236\245 \354\230\244\353\270\214\354\240\235\355\212\270\354\231\200 \354\235\230\354\241\264\352\264\200\352\263\204/\352\267\270\353\246\2741-13 \353\237\260\355\203\200\354\236\204 \354\213\234\354\235\230 \354\235\230\354\241\264\352\264\200\352\263\204 \354\243\274\354\236\205\352\263\274 \354\202\254\354\232\251 \354\235\230\354\241\264\352\264\200\352\263\204.png" similarity index 100% rename from "\354\265\234\354\212\271\354\227\260/1\354\236\245 \354\230\244\353\270\214\354\240\235\355\212\270\354\231\200 \354\235\230\354\241\264\352\264\200\352\263\204/\352\267\270\353\246\2741-13 \353\237\260\355\203\200\354\236\204 \354\213\234\354\235\230 \354\235\230\354\241\264\352\264\200\352\263\204 \354\243\274\354\236\205\352\263\274 \354\202\254\354\232\251 \354\235\230\354\241\264\352\264\200\352\263\204.png" rename to "\354\265\234\354\212\271\354\227\260/vol1/1\354\236\245 \354\230\244\353\270\214\354\240\235\355\212\270\354\231\200 \354\235\230\354\241\264\352\264\200\352\263\204/\352\267\270\353\246\2741-13 \353\237\260\355\203\200\354\236\204 \354\213\234\354\235\230 \354\235\230\354\241\264\352\264\200\352\263\204 \354\243\274\354\236\205\352\263\274 \354\202\254\354\232\251 \354\235\230\354\241\264\352\264\200\352\263\204.png" diff --git "a/\354\265\234\354\212\271\354\227\260/2\354\236\245 \355\205\214\354\212\244\355\212\270/2_1UserDaoTest \353\213\244\354\213\234\353\263\264\352\270\260~2_5\355\225\231\354\212\265 \355\205\214\354\212\244\355\212\270\353\241\234 \353\260\260\354\232\260\353\212\224 \354\212\244\355\224\204\353\247\201.md" "b/\354\265\234\354\212\271\354\227\260/vol1/2\354\236\245 \355\205\214\354\212\244\355\212\270/2_1UserDaoTest \353\213\244\354\213\234\353\263\264\352\270\260~2_5\355\225\231\354\212\265 \355\205\214\354\212\244\355\212\270\353\241\234 \353\260\260\354\232\260\353\212\224 \354\212\244\355\224\204\353\247\201.md" similarity index 100% rename from "\354\265\234\354\212\271\354\227\260/2\354\236\245 \355\205\214\354\212\244\355\212\270/2_1UserDaoTest \353\213\244\354\213\234\353\263\264\352\270\260~2_5\355\225\231\354\212\265 \355\205\214\354\212\244\355\212\270\353\241\234 \353\260\260\354\232\260\353\212\224 \354\212\244\355\224\204\353\247\201.md" rename to "\354\265\234\354\212\271\354\227\260/vol1/2\354\236\245 \355\205\214\354\212\244\355\212\270/2_1UserDaoTest \353\213\244\354\213\234\353\263\264\352\270\260~2_5\355\225\231\354\212\265 \355\205\214\354\212\244\355\212\270\353\241\234 \353\260\260\354\232\260\353\212\224 \354\212\244\355\224\204\353\247\201.md" diff --git "a/\354\265\234\354\212\271\354\227\260/2\354\236\245 \355\205\214\354\212\244\355\212\270/\352\267\270\353\246\2742-4_JUnit\354\235\230_\355\205\214\354\212\244\355\212\270_\353\251\224\354\206\214\353\223\234_\354\213\244\355\226\211_\353\260\251\353\262\225.png" "b/\354\265\234\354\212\271\354\227\260/vol1/2\354\236\245 \355\205\214\354\212\244\355\212\270/\352\267\270\353\246\2742-4_JUnit\354\235\230_\355\205\214\354\212\244\355\212\270_\353\251\224\354\206\214\353\223\234_\354\213\244\355\226\211_\353\260\251\353\262\225.png" similarity index 100% rename from "\354\265\234\354\212\271\354\227\260/2\354\236\245 \355\205\214\354\212\244\355\212\270/\352\267\270\353\246\2742-4_JUnit\354\235\230_\355\205\214\354\212\244\355\212\270_\353\251\224\354\206\214\353\223\234_\354\213\244\355\226\211_\353\260\251\353\262\225.png" rename to "\354\265\234\354\212\271\354\227\260/vol1/2\354\236\245 \355\205\214\354\212\244\355\212\270/\352\267\270\353\246\2742-4_JUnit\354\235\230_\355\205\214\354\212\244\355\212\270_\353\251\224\354\206\214\353\223\234_\354\213\244\355\226\211_\353\260\251\353\262\225.png" diff --git "a/\354\265\234\354\212\271\354\227\260/3\354\236\245 \355\205\234\355\224\214\353\246\277/3_1\353\213\244\354\213\234\353\263\264\353\212\224 \354\264\210\353\202\234\352\260\220 DAO_3_6\354\212\244\355\224\204\353\247\201JdbcTemplate.md" "b/\354\265\234\354\212\271\354\227\260/vol1/3\354\236\245 \355\205\234\355\224\214\353\246\277/3_1\353\213\244\354\213\234\353\263\264\353\212\224 \354\264\210\353\202\234\352\260\220 DAO_3_6\354\212\244\355\224\204\353\247\201JdbcTemplate.md" similarity index 100% rename from "\354\265\234\354\212\271\354\227\260/3\354\236\245 \355\205\234\355\224\214\353\246\277/3_1\353\213\244\354\213\234\353\263\264\353\212\224 \354\264\210\353\202\234\352\260\220 DAO_3_6\354\212\244\355\224\204\353\247\201JdbcTemplate.md" rename to "\354\265\234\354\212\271\354\227\260/vol1/3\354\236\245 \355\205\234\355\224\214\353\246\277/3_1\353\213\244\354\213\234\353\263\264\353\212\224 \354\264\210\353\202\234\352\260\220 DAO_3_6\354\212\244\355\224\204\353\247\201JdbcTemplate.md" diff --git "a/\354\265\234\354\212\271\354\227\260/4\354\236\245 \354\230\210\354\231\270/4_1\354\202\254\353\235\274\354\247\204 SQLException_4_2\354\230\210\354\231\270 \354\240\204\355\231\230.md" "b/\354\265\234\354\212\271\354\227\260/vol1/4\354\236\245 \354\230\210\354\231\270/4_1\354\202\254\353\235\274\354\247\204 SQLException_4_2\354\230\210\354\231\270 \354\240\204\355\231\230.md" similarity index 99% rename from "\354\265\234\354\212\271\354\227\260/4\354\236\245 \354\230\210\354\231\270/4_1\354\202\254\353\235\274\354\247\204 SQLException_4_2\354\230\210\354\231\270 \354\240\204\355\231\230.md" rename to "\354\265\234\354\212\271\354\227\260/vol1/4\354\236\245 \354\230\210\354\231\270/4_1\354\202\254\353\235\274\354\247\204 SQLException_4_2\354\230\210\354\231\270 \354\240\204\355\231\230.md" index fe03241..f282bd4 100644 --- "a/\354\265\234\354\212\271\354\227\260/4\354\236\245 \354\230\210\354\231\270/4_1\354\202\254\353\235\274\354\247\204 SQLException_4_2\354\230\210\354\231\270 \354\240\204\355\231\230.md" +++ "b/\354\265\234\354\212\271\354\227\260/vol1/4\354\236\245 \354\230\210\354\231\270/4_1\354\202\254\353\235\274\354\247\204 SQLException_4_2\354\230\210\354\231\270 \354\240\204\355\231\230.md" @@ -1,4 +1,4 @@ -# 범위 +g# 범위 4장 예외 4.1 사라진 SQLException diff --git "a/\354\265\234\354\212\271\354\227\260/4\354\236\245 \354\230\210\354\231\270/dataaccessexception\354\230\210\354\231\270_\352\263\204\354\270\265\353\217\204.png" "b/\354\265\234\354\212\271\354\227\260/vol1/4\354\236\245 \354\230\210\354\231\270/dataaccessexception\354\230\210\354\231\270_\352\263\204\354\270\265\353\217\204.png" similarity index 100% rename from "\354\265\234\354\212\271\354\227\260/4\354\236\245 \354\230\210\354\231\270/dataaccessexception\354\230\210\354\231\270_\352\263\204\354\270\265\353\217\204.png" rename to "\354\265\234\354\212\271\354\227\260/vol1/4\354\236\245 \354\230\210\354\231\270/dataaccessexception\354\230\210\354\231\270_\352\263\204\354\270\265\353\217\204.png" diff --git "a/\354\265\234\354\212\271\354\227\260/4\354\236\245 \354\230\210\354\231\270/\354\230\210\354\231\270\355\201\264\353\236\230\354\212\244_\352\263\204\354\270\265\353\217\204.png" "b/\354\265\234\354\212\271\354\227\260/vol1/4\354\236\245 \354\230\210\354\231\270/\354\230\210\354\231\270\355\201\264\353\236\230\354\212\244_\352\263\204\354\270\265\353\217\204.png" similarity index 100% rename from "\354\265\234\354\212\271\354\227\260/4\354\236\245 \354\230\210\354\231\270/\354\230\210\354\231\270\355\201\264\353\236\230\354\212\244_\352\263\204\354\270\265\353\217\204.png" rename to "\354\265\234\354\212\271\354\227\260/vol1/4\354\236\245 \354\230\210\354\231\270/\354\230\210\354\231\270\355\201\264\353\236\230\354\212\244_\352\263\204\354\270\265\353\217\204.png" diff --git "a/\354\265\234\354\212\271\354\227\260/5\354\236\245 \354\204\234\353\271\204\354\212\244 \354\266\224\354\203\201\355\231\224/5_1\354\202\254\354\232\251\354\236\220\353\240\210\353\262\250\352\264\200\353\246\254\352\270\260\353\212\245\354\266\224\352\260\200_5_4\353\251\224\354\235\274\354\204\234\353\271\204\354\212\244\354\266\224\354\203\201\355\231\224.md" "b/\354\265\234\354\212\271\354\227\260/vol1/5\354\236\245 \354\204\234\353\271\204\354\212\244 \354\266\224\354\203\201\355\231\224/5_1\354\202\254\354\232\251\354\236\220\353\240\210\353\262\250\352\264\200\353\246\254\352\270\260\353\212\245\354\266\224\352\260\200_5_4\353\251\224\354\235\274\354\204\234\353\271\204\354\212\244\354\266\224\354\203\201\355\231\224.md" similarity index 100% rename from "\354\265\234\354\212\271\354\227\260/5\354\236\245 \354\204\234\353\271\204\354\212\244 \354\266\224\354\203\201\355\231\224/5_1\354\202\254\354\232\251\354\236\220\353\240\210\353\262\250\352\264\200\353\246\254\352\270\260\353\212\245\354\266\224\352\260\200_5_4\353\251\224\354\235\274\354\204\234\353\271\204\354\212\244\354\266\224\354\203\201\355\231\224.md" rename to "\354\265\234\354\212\271\354\227\260/vol1/5\354\236\245 \354\204\234\353\271\204\354\212\244 \354\266\224\354\203\201\355\231\224/5_1\354\202\254\354\232\251\354\236\220\353\240\210\353\262\250\352\264\200\353\246\254\352\270\260\353\212\245\354\266\224\352\260\200_5_4\353\251\224\354\235\274\354\204\234\353\271\204\354\212\244\354\266\224\354\203\201\355\231\224.md" diff --git "a/\354\265\234\354\212\271\354\227\260/5\354\236\245 \354\204\234\353\271\204\354\212\244 \354\266\224\354\203\201\355\231\224/\352\267\270\353\246\2745-2UserService\354\231\200UserDao\354\235\230\355\212\270\353\236\234\354\236\255\354\205\230\354\262\230\353\246\254\352\263\274\354\240\225.png" "b/\354\265\234\354\212\271\354\227\260/vol1/5\354\236\245 \354\204\234\353\271\204\354\212\244 \354\266\224\354\203\201\355\231\224/\352\267\270\353\246\2745-2UserService\354\231\200UserDao\354\235\230\355\212\270\353\236\234\354\236\255\354\205\230\354\262\230\353\246\254\352\263\274\354\240\225.png" similarity index 100% rename from "\354\265\234\354\212\271\354\227\260/5\354\236\245 \354\204\234\353\271\204\354\212\244 \354\266\224\354\203\201\355\231\224/\352\267\270\353\246\2745-2UserService\354\231\200UserDao\354\235\230\355\212\270\353\236\234\354\236\255\354\205\230\354\262\230\353\246\254\352\263\274\354\240\225.png" rename to "\354\265\234\354\212\271\354\227\260/vol1/5\354\236\245 \354\204\234\353\271\204\354\212\244 \354\266\224\354\203\201\355\231\224/\352\267\270\353\246\2745-2UserService\354\231\200UserDao\354\235\230\355\212\270\353\236\234\354\236\255\354\205\230\354\262\230\353\246\254\352\263\274\354\240\225.png" diff --git "a/\354\265\234\354\212\271\354\227\260/5\354\236\245 \354\204\234\353\271\204\354\212\244 \354\266\224\354\203\201\355\231\224/\352\267\270\353\246\2745-3\355\212\270\353\236\234\354\236\255\354\205\230\353\217\231\352\270\260\355\231\224\353\245\274\354\202\254\354\232\251\355\225\230\353\212\224\352\262\275\354\232\260\354\235\230\354\236\221\354\227\205\355\235\220\353\246\204.png" "b/\354\265\234\354\212\271\354\227\260/vol1/5\354\236\245 \354\204\234\353\271\204\354\212\244 \354\266\224\354\203\201\355\231\224/\352\267\270\353\246\2745-3\355\212\270\353\236\234\354\236\255\354\205\230\353\217\231\352\270\260\355\231\224\353\245\274\354\202\254\354\232\251\355\225\230\353\212\224\352\262\275\354\232\260\354\235\230\354\236\221\354\227\205\355\235\220\353\246\204.png" similarity index 100% rename from "\354\265\234\354\212\271\354\227\260/5\354\236\245 \354\204\234\353\271\204\354\212\244 \354\266\224\354\203\201\355\231\224/\352\267\270\353\246\2745-3\355\212\270\353\236\234\354\236\255\354\205\230\353\217\231\352\270\260\355\231\224\353\245\274\354\202\254\354\232\251\355\225\230\353\212\224\352\262\275\354\232\260\354\235\230\354\236\221\354\227\205\355\235\220\353\246\204.png" rename to "\354\265\234\354\212\271\354\227\260/vol1/5\354\236\245 \354\204\234\353\271\204\354\212\244 \354\266\224\354\203\201\355\231\224/\352\267\270\353\246\2745-3\355\212\270\353\236\234\354\236\255\354\205\230\353\217\231\352\270\260\355\231\224\353\245\274\354\202\254\354\232\251\355\225\230\353\212\224\352\262\275\354\232\260\354\235\230\354\236\221\354\227\205\355\235\220\353\246\204.png" diff --git "a/\354\265\234\354\212\271\354\227\260/5\354\236\245 \354\204\234\353\271\204\354\212\244 \354\266\224\354\203\201\355\231\224/\352\267\270\353\246\2745-6\354\212\244\355\224\204\353\247\201\354\235\230\355\212\270\353\236\234\354\236\255\354\205\230\354\266\224\354\203\201\355\231\224\352\263\204\354\270\265.png" "b/\354\265\234\354\212\271\354\227\260/vol1/5\354\236\245 \354\204\234\353\271\204\354\212\244 \354\266\224\354\203\201\355\231\224/\352\267\270\353\246\2745-6\354\212\244\355\224\204\353\247\201\354\235\230\355\212\270\353\236\234\354\236\255\354\205\230\354\266\224\354\203\201\355\231\224\352\263\204\354\270\265.png" similarity index 100% rename from "\354\265\234\354\212\271\354\227\260/5\354\236\245 \354\204\234\353\271\204\354\212\244 \354\266\224\354\203\201\355\231\224/\352\267\270\353\246\2745-6\354\212\244\355\224\204\353\247\201\354\235\230\355\212\270\353\236\234\354\236\255\354\205\230\354\266\224\354\203\201\355\231\224\352\263\204\354\270\265.png" rename to "\354\265\234\354\212\271\354\227\260/vol1/5\354\236\245 \354\204\234\353\271\204\354\212\244 \354\266\224\354\203\201\355\231\224/\352\267\270\353\246\2745-6\354\212\244\355\224\204\353\247\201\354\235\230\355\212\270\353\236\234\354\236\255\354\205\230\354\266\224\354\203\201\355\231\224\352\263\204\354\270\265.png" diff --git "a/\354\265\234\354\212\271\354\227\260/6\354\236\245 AOP/6_5\354\212\244\355\224\204\353\247\201 AOP.md" "b/\354\265\234\354\212\271\354\227\260/vol1/6\354\236\245 AOP/6_5\354\212\244\355\224\204\353\247\201 AOP.md" similarity index 100% rename from "\354\265\234\354\212\271\354\227\260/6\354\236\245 AOP/6_5\354\212\244\355\224\204\353\247\201 AOP.md" rename to "\354\265\234\354\212\271\354\227\260/vol1/6\354\236\245 AOP/6_5\354\212\244\355\224\204\353\247\201 AOP.md" diff --git "a/\354\265\234\354\212\271\354\227\260/6\354\236\245 AOP/6_6\355\212\270\353\236\234\354\236\255\354\205\230\354\206\215\354\204\261~6_8\355\212\270\353\236\234\354\236\255\354\205\230\354\247\200\354\233\220\355\205\214\354\212\244\355\212\270.md" "b/\354\265\234\354\212\271\354\227\260/vol1/6\354\236\245 AOP/6_6\355\212\270\353\236\234\354\236\255\354\205\230\354\206\215\354\204\261~6_8\355\212\270\353\236\234\354\236\255\354\205\230\354\247\200\354\233\220\355\205\214\354\212\244\355\212\270.md" similarity index 100% rename from "\354\265\234\354\212\271\354\227\260/6\354\236\245 AOP/6_6\355\212\270\353\236\234\354\236\255\354\205\230\354\206\215\354\204\261~6_8\355\212\270\353\236\234\354\236\255\354\205\230\354\247\200\354\233\220\355\205\214\354\212\244\355\212\270.md" rename to "\354\265\234\354\212\271\354\227\260/vol1/6\354\236\245 AOP/6_6\355\212\270\353\236\234\354\236\255\354\205\230\354\206\215\354\204\261~6_8\355\212\270\353\236\234\354\236\255\354\205\230\354\247\200\354\233\220\355\205\214\354\212\244\355\212\270.md" diff --git "a/\354\265\234\354\212\271\354\227\260/6\354\236\245 AOP/\352\267\270\353\246\2746-20_\353\271\210\355\233\204\354\262\230\353\246\254\352\270\260\353\245\274\354\235\264\354\232\251\355\225\234\355\224\204\353\241\235\354\213\234\354\236\220\353\217\231\354\203\235\354\204\261.png" "b/\354\265\234\354\212\271\354\227\260/vol1/6\354\236\245 AOP/\352\267\270\353\246\2746-20_\353\271\210\355\233\204\354\262\230\353\246\254\352\270\260\353\245\274\354\235\264\354\232\251\355\225\234\355\224\204\353\241\235\354\213\234\354\236\220\353\217\231\354\203\235\354\204\261.png" similarity index 100% rename from "\354\265\234\354\212\271\354\227\260/6\354\236\245 AOP/\352\267\270\353\246\2746-20_\353\271\210\355\233\204\354\262\230\353\246\254\352\270\260\353\245\274\354\235\264\354\232\251\355\225\234\355\224\204\353\241\235\354\213\234\354\236\220\353\217\231\354\203\235\354\204\261.png" rename to "\354\265\234\354\212\271\354\227\260/vol1/6\354\236\245 AOP/\352\267\270\353\246\2746-20_\353\271\210\355\233\204\354\262\230\353\246\254\352\270\260\353\245\274\354\235\264\354\232\251\355\225\234\355\224\204\353\241\235\354\213\234\354\236\220\353\217\231\354\203\235\354\204\261.png" diff --git "a/\354\265\234\354\212\271\354\227\260/7\354\236\245 \354\212\244\355\224\204\353\247\201 \355\225\265\354\213\254 \352\270\260\354\210\240\354\235\230 \354\235\221\354\232\251/7_1SQL\352\263\274DAO\354\235\230\353\266\204\353\246\254~7_2\354\235\270\355\204\260\355\216\230\354\235\264\354\212\244\354\231\200\354\236\220\352\270\260\354\260\270\354\241\260\353\271\210.md" "b/\354\265\234\354\212\271\354\227\260/vol1/7\354\236\245 \354\212\244\355\224\204\353\247\201 \355\225\265\354\213\254 \352\270\260\354\210\240\354\235\230 \354\235\221\354\232\251/7_1SQL\352\263\274DAO\354\235\230\353\266\204\353\246\254~7_2\354\235\270\355\204\260\355\216\230\354\235\264\354\212\244\354\231\200\354\236\220\352\270\260\354\260\270\354\241\260\353\271\210.md" similarity index 100% rename from "\354\265\234\354\212\271\354\227\260/7\354\236\245 \354\212\244\355\224\204\353\247\201 \355\225\265\354\213\254 \352\270\260\354\210\240\354\235\230 \354\235\221\354\232\251/7_1SQL\352\263\274DAO\354\235\230\353\266\204\353\246\254~7_2\354\235\270\355\204\260\355\216\230\354\235\264\354\212\244\354\231\200\354\236\220\352\270\260\354\260\270\354\241\260\353\271\210.md" rename to "\354\265\234\354\212\271\354\227\260/vol1/7\354\236\245 \354\212\244\355\224\204\353\247\201 \355\225\265\354\213\254 \352\270\260\354\210\240\354\235\230 \354\235\221\354\232\251/7_1SQL\352\263\274DAO\354\235\230\353\266\204\353\246\254~7_2\354\235\270\355\204\260\355\216\230\354\235\264\354\212\244\354\231\200\354\236\220\352\270\260\354\260\270\354\241\260\353\271\210.md" diff --git "a/\354\265\234\354\212\271\354\227\260/7\354\236\245 \354\212\244\355\224\204\353\247\201 \355\225\265\354\213\254 \352\270\260\354\210\240\354\235\230 \354\235\221\354\232\251/7_3\354\204\234\353\271\204\354\212\244\354\266\224\354\203\201\355\231\224\354\240\201\354\232\251.md" "b/\354\265\234\354\212\271\354\227\260/vol1/7\354\236\245 \354\212\244\355\224\204\353\247\201 \355\225\265\354\213\254 \352\270\260\354\210\240\354\235\230 \354\235\221\354\232\251/7_3\354\204\234\353\271\204\354\212\244\354\266\224\354\203\201\355\231\224\354\240\201\354\232\251.md" similarity index 98% rename from "\354\265\234\354\212\271\354\227\260/7\354\236\245 \354\212\244\355\224\204\353\247\201 \355\225\265\354\213\254 \352\270\260\354\210\240\354\235\230 \354\235\221\354\232\251/7_3\354\204\234\353\271\204\354\212\244\354\266\224\354\203\201\355\231\224\354\240\201\354\232\251.md" rename to "\354\265\234\354\212\271\354\227\260/vol1/7\354\236\245 \354\212\244\355\224\204\353\247\201 \355\225\265\354\213\254 \352\270\260\354\210\240\354\235\230 \354\235\221\354\232\251/7_3\354\204\234\353\271\204\354\212\244\354\266\224\354\203\201\355\231\224\354\240\201\354\232\251.md" index 6ea87a2..3bcda62 100644 --- "a/\354\265\234\354\212\271\354\227\260/7\354\236\245 \354\212\244\355\224\204\353\247\201 \355\225\265\354\213\254 \352\270\260\354\210\240\354\235\230 \354\235\221\354\232\251/7_3\354\204\234\353\271\204\354\212\244\354\266\224\354\203\201\355\231\224\354\240\201\354\232\251.md" +++ "b/\354\265\234\354\212\271\354\227\260/vol1/7\354\236\245 \354\212\244\355\224\204\353\247\201 \355\225\265\354\213\254 \352\270\260\354\210\240\354\235\230 \354\235\221\354\232\251/7_3\354\204\234\353\271\204\354\212\244\354\266\224\354\203\201\355\231\224\354\240\201\354\232\251.md" @@ -140,7 +140,7 @@ public class OxmTest { - `SqlReader`는 스프링의 OXM 언마샬러를 이용해야함 ### 의도 -![img.png](그림7-7 OxmSqlReader를 멤버로 갖는 OxmSqlService클래스 구조.png) +![img.png](그림7-7%20OxmSqlReader를%20멤버로%20갖는%20OxmSqlService클래스%20구조.png) SqlReader 구현 오브젝트에 대한 의존관계를 `OxmSqlService` 에 고정시키기 -> SQL 을 읽는 방법을 OXM으로 제한해서 사용성 극대화 @@ -187,7 +187,7 @@ public class OxmSqlService implements SqlService { - OxmSqlService 와 BaseSqlService 는 SqlService의 핵심 메서드(`loadSql`, `getSql`) 구현이 중복된다 ### 의도 -![img.png](그림 7-9 위임을 통한 BaseSqIService의 재사용.png) +![img.png](그림%207-9%20위임을%20통한%20BaseSqIService의%20재사용.png) OxmSqlService는 일종의 설정과 기본 구성을 변경해주기 위한 어댑터와 같은 개념이므로, SqlService의 핵심 메서드는 `BaseSqlService` 로 위임하기 diff --git "a/\354\265\234\354\212\271\354\227\260/7\354\236\245 \354\212\244\355\224\204\353\247\201 \355\225\265\354\213\254 \352\270\260\354\210\240\354\235\230 \354\235\221\354\232\251/7_4 \354\235\270\355\204\260\355\216\230\354\235\264\354\212\244 \354\203\201\354\206\215\354\235\204 \355\206\265\355\225\234 \354\225\210\354\240\204\355\225\234 \352\270\260\353\212\245 \355\231\225\354\236\245.md" "b/\354\265\234\354\212\271\354\227\260/vol1/7\354\236\245 \354\212\244\355\224\204\353\247\201 \355\225\265\354\213\254 \352\270\260\354\210\240\354\235\230 \354\235\221\354\232\251/7_4 \354\235\270\355\204\260\355\216\230\354\235\264\354\212\244 \354\203\201\354\206\215\354\235\204 \355\206\265\355\225\234 \354\225\210\354\240\204\355\225\234 \352\270\260\353\212\245 \355\231\225\354\236\245.md" similarity index 98% rename from "\354\265\234\354\212\271\354\227\260/7\354\236\245 \354\212\244\355\224\204\353\247\201 \355\225\265\354\213\254 \352\270\260\354\210\240\354\235\230 \354\235\221\354\232\251/7_4 \354\235\270\355\204\260\355\216\230\354\235\264\354\212\244 \354\203\201\354\206\215\354\235\204 \355\206\265\355\225\234 \354\225\210\354\240\204\355\225\234 \352\270\260\353\212\245 \355\231\225\354\236\245.md" rename to "\354\265\234\354\212\271\354\227\260/vol1/7\354\236\245 \354\212\244\355\224\204\353\247\201 \355\225\265\354\213\254 \352\270\260\354\210\240\354\235\230 \354\235\221\354\232\251/7_4 \354\235\270\355\204\260\355\216\230\354\235\264\354\212\244 \354\203\201\354\206\215\354\235\204 \355\206\265\355\225\234 \354\225\210\354\240\204\355\225\234 \352\270\260\353\212\245 \355\231\225\354\236\245.md" index d42458e..edb9038 100644 --- "a/\354\265\234\354\212\271\354\227\260/7\354\236\245 \354\212\244\355\224\204\353\247\201 \355\225\265\354\213\254 \352\270\260\354\210\240\354\235\230 \354\235\221\354\232\251/7_4 \354\235\270\355\204\260\355\216\230\354\235\264\354\212\244 \354\203\201\354\206\215\354\235\204 \355\206\265\355\225\234 \354\225\210\354\240\204\355\225\234 \352\270\260\353\212\245 \355\231\225\354\236\245.md" +++ "b/\354\265\234\354\212\271\354\227\260/vol1/7\354\236\245 \354\212\244\355\224\204\353\247\201 \355\225\265\354\213\254 \352\270\260\354\210\240\354\235\230 \354\235\221\354\232\251/7_4 \354\235\270\355\204\260\355\216\230\354\235\264\354\212\244 \354\203\201\354\206\215\354\235\204 \355\206\265\355\225\234 \354\225\210\354\240\204\355\225\234 \352\270\260\353\212\245 \355\231\225\354\236\245.md" @@ -65,7 +65,7 @@ B2라는 인터페이스가 그려주는 창으로 B를 바라보는 다른 종 - 기능: 어플리케이션을 새로 시작하지 않고, 특정 SQL의 내용만 변경하기 ### 의도 -![img.png](그림 7-11 인터페이스 상속율 이용한 확장구조.png) +![img.png](그림%207-11%20인터페이스%20상속율%20이용한%20확장구조.png) SQL 변경을 하는 `UpdatableSqlRegistry` 인터페이스를 추가하기 -> 기존 SqlRegistry 인터페이스에 정의된 메서드도 사용할 필요가 있으니, 이 인터페이스를 상속받은 형태 diff --git "a/\354\265\234\354\212\271\354\227\260/7\354\236\245 \354\212\244\355\224\204\353\247\201 \355\225\265\354\213\254 \352\270\260\354\210\240\354\235\230 \354\235\221\354\232\251/7_5DI\353\245\274 \354\235\264\354\232\251\355\225\264 \353\213\244\354\226\221\355\225\234 \352\265\254\355\230\204 \353\260\251\353\262\225 \354\240\201\354\232\251\355\225\230\352\270\260.md" "b/\354\265\234\354\212\271\354\227\260/vol1/7\354\236\245 \354\212\244\355\224\204\353\247\201 \355\225\265\354\213\254 \352\270\260\354\210\240\354\235\230 \354\235\221\354\232\251/7_5DI\353\245\274 \354\235\264\354\232\251\355\225\264 \353\213\244\354\226\221\355\225\234 \352\265\254\355\230\204 \353\260\251\353\262\225 \354\240\201\354\232\251\355\225\230\352\270\260.md" similarity index 100% rename from "\354\265\234\354\212\271\354\227\260/7\354\236\245 \354\212\244\355\224\204\353\247\201 \355\225\265\354\213\254 \352\270\260\354\210\240\354\235\230 \354\235\221\354\232\251/7_5DI\353\245\274 \354\235\264\354\232\251\355\225\264 \353\213\244\354\226\221\355\225\234 \352\265\254\355\230\204 \353\260\251\353\262\225 \354\240\201\354\232\251\355\225\230\352\270\260.md" rename to "\354\265\234\354\212\271\354\227\260/vol1/7\354\236\245 \354\212\244\355\224\204\353\247\201 \355\225\265\354\213\254 \352\270\260\354\210\240\354\235\230 \354\235\221\354\232\251/7_5DI\353\245\274 \354\235\264\354\232\251\355\225\264 \353\213\244\354\226\221\355\225\234 \352\265\254\355\230\204 \353\260\251\353\262\225 \354\240\201\354\232\251\355\225\230\352\270\260.md" diff --git "a/\354\265\234\354\212\271\354\227\260/7\354\236\245 \354\212\244\355\224\204\353\247\201 \355\225\265\354\213\254 \352\270\260\354\210\240\354\235\230 \354\235\221\354\232\251/interface\354\236\245\354\240\220\354\204\244\353\252\205.png" "b/\354\265\234\354\212\271\354\227\260/vol1/7\354\236\245 \354\212\244\355\224\204\353\247\201 \355\225\265\354\213\254 \352\270\260\354\210\240\354\235\230 \354\235\221\354\232\251/interface\354\236\245\354\240\220\354\204\244\353\252\205.png" similarity index 100% rename from "\354\265\234\354\212\271\354\227\260/7\354\236\245 \354\212\244\355\224\204\353\247\201 \355\225\265\354\213\254 \352\270\260\354\210\240\354\235\230 \354\235\221\354\232\251/interface\354\236\245\354\240\220\354\204\244\353\252\205.png" rename to "\354\265\234\354\212\271\354\227\260/vol1/7\354\236\245 \354\212\244\355\224\204\353\247\201 \355\225\265\354\213\254 \352\270\260\354\210\240\354\235\230 \354\235\221\354\232\251/interface\354\236\245\354\240\220\354\204\244\353\252\205.png" diff --git "a/\354\265\234\354\212\271\354\227\260/7\354\236\245 \354\212\244\355\224\204\353\247\201 \355\225\265\354\213\254 \352\270\260\354\210\240\354\235\230 \354\235\221\354\232\251/\352\267\270\353\246\274 7-11 \354\235\270\355\204\260\355\216\230\354\235\264\354\212\244 \354\203\201\354\206\215\354\234\250 \354\235\264\354\232\251\355\225\234 \355\231\225\354\236\245\352\265\254\354\241\260.png" "b/\354\265\234\354\212\271\354\227\260/vol1/7\354\236\245 \354\212\244\355\224\204\353\247\201 \355\225\265\354\213\254 \352\270\260\354\210\240\354\235\230 \354\235\221\354\232\251/\352\267\270\353\246\274 7-11 \354\235\270\355\204\260\355\216\230\354\235\264\354\212\244 \354\203\201\354\206\215\354\234\250 \354\235\264\354\232\251\355\225\234 \355\231\225\354\236\245\352\265\254\354\241\260.png" similarity index 100% rename from "\354\265\234\354\212\271\354\227\260/7\354\236\245 \354\212\244\355\224\204\353\247\201 \355\225\265\354\213\254 \352\270\260\354\210\240\354\235\230 \354\235\221\354\232\251/\352\267\270\353\246\274 7-11 \354\235\270\355\204\260\355\216\230\354\235\264\354\212\244 \354\203\201\354\206\215\354\234\250 \354\235\264\354\232\251\355\225\234 \355\231\225\354\236\245\352\265\254\354\241\260.png" rename to "\354\265\234\354\212\271\354\227\260/vol1/7\354\236\245 \354\212\244\355\224\204\353\247\201 \355\225\265\354\213\254 \352\270\260\354\210\240\354\235\230 \354\235\221\354\232\251/\352\267\270\353\246\274 7-11 \354\235\270\355\204\260\355\216\230\354\235\264\354\212\244 \354\203\201\354\206\215\354\234\250 \354\235\264\354\232\251\355\225\234 \355\231\225\354\236\245\352\265\254\354\241\260.png" diff --git "a/\354\265\234\354\212\271\354\227\260/7\354\236\245 \354\212\244\355\224\204\353\247\201 \355\225\265\354\213\254 \352\270\260\354\210\240\354\235\230 \354\235\221\354\232\251/\352\267\270\353\246\274 7-9 \354\234\204\354\236\204\354\235\204 \355\206\265\355\225\234 BaseSqIService\354\235\230 \354\236\254\354\202\254\354\232\251.png" "b/\354\265\234\354\212\271\354\227\260/vol1/7\354\236\245 \354\212\244\355\224\204\353\247\201 \355\225\265\354\213\254 \352\270\260\354\210\240\354\235\230 \354\235\221\354\232\251/\352\267\270\353\246\274 7-9 \354\234\204\354\236\204\354\235\204 \355\206\265\355\225\234 BaseSqIService\354\235\230 \354\236\254\354\202\254\354\232\251.png" similarity index 100% rename from "\354\265\234\354\212\271\354\227\260/7\354\236\245 \354\212\244\355\224\204\353\247\201 \355\225\265\354\213\254 \352\270\260\354\210\240\354\235\230 \354\235\221\354\232\251/\352\267\270\353\246\274 7-9 \354\234\204\354\236\204\354\235\204 \355\206\265\355\225\234 BaseSqIService\354\235\230 \354\236\254\354\202\254\354\232\251.png" rename to "\354\265\234\354\212\271\354\227\260/vol1/7\354\236\245 \354\212\244\355\224\204\353\247\201 \355\225\265\354\213\254 \352\270\260\354\210\240\354\235\230 \354\235\221\354\232\251/\352\267\270\353\246\274 7-9 \354\234\204\354\236\204\354\235\204 \355\206\265\355\225\234 BaseSqIService\354\235\230 \354\236\254\354\202\254\354\232\251.png" diff --git "a/\354\265\234\354\212\271\354\227\260/7\354\236\245 \354\212\244\355\224\204\353\247\201 \355\225\265\354\213\254 \352\270\260\354\210\240\354\235\230 \354\235\221\354\232\251/\352\267\270\353\246\2747-7 OxmSqlReader\353\245\274 \353\251\244\353\262\204\353\241\234 \352\260\226\353\212\224 OxmSqlService\355\201\264\353\236\230\354\212\244 \352\265\254\354\241\260.png" "b/\354\265\234\354\212\271\354\227\260/vol1/7\354\236\245 \354\212\244\355\224\204\353\247\201 \355\225\265\354\213\254 \352\270\260\354\210\240\354\235\230 \354\235\221\354\232\251/\352\267\270\353\246\2747-7 OxmSqlReader\353\245\274 \353\251\244\353\262\204\353\241\234 \352\260\226\353\212\224 OxmSqlService\355\201\264\353\236\230\354\212\244 \352\265\254\354\241\260.png" similarity index 100% rename from "\354\265\234\354\212\271\354\227\260/7\354\236\245 \354\212\244\355\224\204\353\247\201 \355\225\265\354\213\254 \352\270\260\354\210\240\354\235\230 \354\235\221\354\232\251/\352\267\270\353\246\2747-7 OxmSqlReader\353\245\274 \353\251\244\353\262\204\353\241\234 \352\260\226\353\212\224 OxmSqlService\355\201\264\353\236\230\354\212\244 \352\265\254\354\241\260.png" rename to "\354\265\234\354\212\271\354\227\260/vol1/7\354\236\245 \354\212\244\355\224\204\353\247\201 \355\225\265\354\213\254 \352\270\260\354\210\240\354\235\230 \354\235\221\354\232\251/\352\267\270\353\246\2747-7 OxmSqlReader\353\245\274 \353\251\244\353\262\204\353\241\234 \352\260\226\353\212\224 OxmSqlService\355\201\264\353\236\230\354\212\244 \352\265\254\354\241\260.png" diff --git "a/\354\265\234\354\212\271\354\227\260/9\354\236\245 \354\212\244\355\224\204\353\247\201 \355\224\204\353\241\234\354\240\235\355\212\270 \354\213\234\354\236\221\355\225\230\352\270\260/9_3 \354\225\240\355\224\214\353\246\254\354\274\200\354\235\264\354\205\230 \354\225\204\355\202\244\355\205\215\354\262\230.md" "b/\354\265\234\354\212\271\354\227\260/vol1/9\354\236\245 \354\212\244\355\224\204\353\247\201 \355\224\204\353\241\234\354\240\235\355\212\270 \354\213\234\354\236\221\355\225\230\352\270\260/9_3 \354\225\240\355\224\214\353\246\254\354\274\200\354\235\264\354\205\230 \354\225\204\355\202\244\355\205\215\354\262\230.md" similarity index 96% rename from "\354\265\234\354\212\271\354\227\260/9\354\236\245 \354\212\244\355\224\204\353\247\201 \355\224\204\353\241\234\354\240\235\355\212\270 \354\213\234\354\236\221\355\225\230\352\270\260/9_3 \354\225\240\355\224\214\353\246\254\354\274\200\354\235\264\354\205\230 \354\225\204\355\202\244\355\205\215\354\262\230.md" rename to "\354\265\234\354\212\271\354\227\260/vol1/9\354\236\245 \354\212\244\355\224\204\353\247\201 \355\224\204\353\241\234\354\240\235\355\212\270 \354\213\234\354\236\221\355\225\230\352\270\260/9_3 \354\225\240\355\224\214\353\246\254\354\274\200\354\235\264\354\205\230 \354\225\204\355\202\244\355\205\215\354\262\230.md" index 000b55b..586a4b5 100644 --- "a/\354\265\234\354\212\271\354\227\260/9\354\236\245 \354\212\244\355\224\204\353\247\201 \355\224\204\353\241\234\354\240\235\355\212\270 \354\213\234\354\236\221\355\225\230\352\270\260/9_3 \354\225\240\355\224\214\353\246\254\354\274\200\354\235\264\354\205\230 \354\225\204\355\202\244\355\205\215\354\262\230.md" +++ "b/\354\265\234\354\212\271\354\227\260/vol1/9\354\236\245 \354\212\244\355\224\204\353\247\201 \355\224\204\353\241\234\354\240\235\355\212\270 \354\213\234\354\236\221\355\225\230\352\270\260/9_3 \354\225\240\355\224\214\353\246\254\354\274\200\354\235\264\354\205\230 \354\225\204\355\202\244\355\205\215\354\262\230.md" @@ -74,7 +74,7 @@ DAO 계층을 호출하고, 이를 활용해서 비즈니스 로직 작성 - 속성+행위 둘다 있음 -> 풍부한 도메인 오브젝트 방식 ### 빈약한 도메인 오브젝트 방식(흔히 쓰이는 방식) -img.png +img.png 도메인 오브젝트에는 오직 정보만 담겨 있고, 정보를 활용하는 아무런 기능도 갖고 있지 않음. - 비즈니스 로직은 서비스 계층에 존재함. @@ -82,7 +82,7 @@ DAO 계층을 호출하고, 이를 활용해서 비즈니스 로직 작성 ### 풍부한/영리한 도메인 오브젝트 방식(DDD) -img.png +img.png 도메인 오브젝트 안에 비즈니스 로직을 담아둠 -> 스프링 빈으로 등록할 수 없음. DI될 수도, 받을 수도 없음 서비스 계층에서는, 여러 종류의 도메인 오브젝트의 기능을 조합해서 복잡한 비즈니스 로직을 처리하는 로직 작성 diff --git "a/\354\265\234\354\212\271\354\227\260/9\354\236\245 \354\212\244\355\224\204\353\247\201 \355\224\204\353\241\234\354\240\235\355\212\270 \354\213\234\354\236\221\355\225\230\352\270\260/\352\267\270\353\246\2749-13 3\352\263\204\354\270\265 \354\225\204\355\202\244\355\205\215\354\262\230.png" "b/\354\265\234\354\212\271\354\227\260/vol1/9\354\236\245 \354\212\244\355\224\204\353\247\201 \355\224\204\353\241\234\354\240\235\355\212\270 \354\213\234\354\236\221\355\225\230\352\270\260/\352\267\270\353\246\2749-13 3\352\263\204\354\270\265 \354\225\204\355\202\244\355\205\215\354\262\230.png" similarity index 100% rename from "\354\265\234\354\212\271\354\227\260/9\354\236\245 \354\212\244\355\224\204\353\247\201 \355\224\204\353\241\234\354\240\235\355\212\270 \354\213\234\354\236\221\355\225\230\352\270\260/\352\267\270\353\246\2749-13 3\352\263\204\354\270\265 \354\225\204\355\202\244\355\205\215\354\262\230.png" rename to "\354\265\234\354\212\271\354\227\260/vol1/9\354\236\245 \354\212\244\355\224\204\353\247\201 \355\224\204\353\241\234\354\240\235\355\212\270 \354\213\234\354\236\221\355\225\230\352\270\260/\352\267\270\353\246\2749-13 3\352\263\204\354\270\265 \354\225\204\355\202\244\355\205\215\354\262\230.png" diff --git "a/\354\265\234\354\212\271\354\227\260/9\354\236\245 \354\212\244\355\224\204\353\247\201 \355\224\204\353\241\234\354\240\235\355\212\270 \354\213\234\354\236\221\355\225\230\352\270\260/\352\267\270\353\246\2749-20 \353\271\210\354\225\275\355\225\234 \353\217\204\353\251\224\354\235\270 \354\230\244\353\270\214\354\240\235\355\212\270 \353\260\251\354\213\235.png" "b/\354\265\234\354\212\271\354\227\260/vol1/9\354\236\245 \354\212\244\355\224\204\353\247\201 \355\224\204\353\241\234\354\240\235\355\212\270 \354\213\234\354\236\221\355\225\230\352\270\260/\352\267\270\353\246\2749-20 \353\271\210\354\225\275\355\225\234 \353\217\204\353\251\224\354\235\270 \354\230\244\353\270\214\354\240\235\355\212\270 \353\260\251\354\213\235.png" similarity index 100% rename from "\354\265\234\354\212\271\354\227\260/9\354\236\245 \354\212\244\355\224\204\353\247\201 \355\224\204\353\241\234\354\240\235\355\212\270 \354\213\234\354\236\221\355\225\230\352\270\260/\352\267\270\353\246\2749-20 \353\271\210\354\225\275\355\225\234 \353\217\204\353\251\224\354\235\270 \354\230\244\353\270\214\354\240\235\355\212\270 \353\260\251\354\213\235.png" rename to "\354\265\234\354\212\271\354\227\260/vol1/9\354\236\245 \354\212\244\355\224\204\353\247\201 \355\224\204\353\241\234\354\240\235\355\212\270 \354\213\234\354\236\221\355\225\230\352\270\260/\352\267\270\353\246\2749-20 \353\271\210\354\225\275\355\225\234 \353\217\204\353\251\224\354\235\270 \354\230\244\353\270\214\354\240\235\355\212\270 \353\260\251\354\213\235.png" diff --git "a/\354\265\234\354\212\271\354\227\260/9\354\236\245 \354\212\244\355\224\204\353\247\201 \355\224\204\353\241\234\354\240\235\355\212\270 \354\213\234\354\236\221\355\225\230\352\270\260/\352\267\270\353\246\2749-21 \355\222\215\354\204\261\355\225\234 \353\217\204\353\251\224\354\235\270 \354\230\244\353\270\214\354\240\235\355\212\270 \353\260\251\354\213\235.png" "b/\354\265\234\354\212\271\354\227\260/vol1/9\354\236\245 \354\212\244\355\224\204\353\247\201 \355\224\204\353\241\234\354\240\235\355\212\270 \354\213\234\354\236\221\355\225\230\352\270\260/\352\267\270\353\246\2749-21 \355\222\215\354\204\261\355\225\234 \353\217\204\353\251\224\354\235\270 \354\230\244\353\270\214\354\240\235\355\212\270 \353\260\251\354\213\235.png" similarity index 100% rename from "\354\265\234\354\212\271\354\227\260/9\354\236\245 \354\212\244\355\224\204\353\247\201 \355\224\204\353\241\234\354\240\235\355\212\270 \354\213\234\354\236\221\355\225\230\352\270\260/\352\267\270\353\246\2749-21 \355\222\215\354\204\261\355\225\234 \353\217\204\353\251\224\354\235\270 \354\230\244\353\270\214\354\240\235\355\212\270 \353\260\251\354\213\235.png" rename to "\354\265\234\354\212\271\354\227\260/vol1/9\354\236\245 \354\212\244\355\224\204\353\247\201 \355\224\204\353\241\234\354\240\235\355\212\270 \354\213\234\354\236\221\355\225\230\352\270\260/\352\267\270\353\246\2749-21 \355\222\215\354\204\261\355\225\234 \353\217\204\353\251\224\354\235\270 \354\230\244\353\270\214\354\240\235\355\212\270 \353\260\251\354\213\235.png" diff --git "a/\354\265\234\354\212\271\354\227\260/9\354\236\245 \354\212\244\355\224\204\353\247\201 \355\224\204\353\241\234\354\240\235\355\212\270 \354\213\234\354\236\221\355\225\230\352\270\260/\352\267\270\353\246\2749-22 \353\217\204\353\251\224\354\235\270 \352\263\204\354\270\265 \353\260\251\354\213\235.png" "b/\354\265\234\354\212\271\354\227\260/vol1/9\354\236\245 \354\212\244\355\224\204\353\247\201 \355\224\204\353\241\234\354\240\235\355\212\270 \354\213\234\354\236\221\355\225\230\352\270\260/\352\267\270\353\246\2749-22 \353\217\204\353\251\224\354\235\270 \352\263\204\354\270\265 \353\260\251\354\213\235.png" similarity index 100% rename from "\354\265\234\354\212\271\354\227\260/9\354\236\245 \354\212\244\355\224\204\353\247\201 \355\224\204\353\241\234\354\240\235\355\212\270 \354\213\234\354\236\221\355\225\230\352\270\260/\352\267\270\353\246\2749-22 \353\217\204\353\251\224\354\235\270 \352\263\204\354\270\265 \353\260\251\354\213\235.png" rename to "\354\265\234\354\212\271\354\227\260/vol1/9\354\236\245 \354\212\244\355\224\204\353\247\201 \355\224\204\353\241\234\354\240\235\355\212\270 \354\213\234\354\236\221\355\225\230\352\270\260/\352\267\270\353\246\2749-22 \353\217\204\353\251\224\354\235\270 \352\263\204\354\270\265 \353\260\251\354\213\235.png" From a65190969ad8489e20ab7987afbb3ad3a907b3d4 Mon Sep 17 00:00:00 2001 From: seungyeonchoi Date: Sun, 25 Jun 2023 21:34:12 +0900 Subject: [PATCH 2/2] =?UTF-8?q?2.6~2.7=20=ED=8A=B8=EB=9E=9C=EC=9E=AD?= =?UTF-8?q?=EC=85=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...70\353\236\234\354\236\255\354\205\230.md" | 227 ++++++++++++++++++ .../img.png" | Bin 0 -> 59175 bytes 2 files changed, 227 insertions(+) create mode 100644 "\354\265\234\354\212\271\354\227\260/vol2/2\354\236\245 \353\215\260\354\235\264\355\204\260 \354\225\241\354\204\270\354\212\244 \352\270\260\354\210\240/2_6 \355\212\270\353\236\234\354\236\255\354\205\230.md" create mode 100644 "\354\265\234\354\212\271\354\227\260/vol2/2\354\236\245 \353\215\260\354\235\264\355\204\260 \354\225\241\354\204\270\354\212\244 \352\270\260\354\210\240/img.png" diff --git "a/\354\265\234\354\212\271\354\227\260/vol2/2\354\236\245 \353\215\260\354\235\264\355\204\260 \354\225\241\354\204\270\354\212\244 \352\270\260\354\210\240/2_6 \355\212\270\353\236\234\354\236\255\354\205\230.md" "b/\354\265\234\354\212\271\354\227\260/vol2/2\354\236\245 \353\215\260\354\235\264\355\204\260 \354\225\241\354\204\270\354\212\244 \352\270\260\354\210\240/2_6 \355\212\270\353\236\234\354\236\255\354\205\230.md" new file mode 100644 index 0000000..2f50bad --- /dev/null +++ "b/\354\265\234\354\212\271\354\227\260/vol2/2\354\236\245 \353\215\260\354\235\264\355\204\260 \354\225\241\354\204\270\354\212\244 \352\270\260\354\210\240/2_6 \355\212\270\353\236\234\354\236\255\354\205\230.md" @@ -0,0 +1,227 @@ +# 범위 +2.6 트랜잭션 +2.6.1 트랜잭션 추상화와 동기화 +2.6.2 트랜잭션 경계설정 전략 +2.6.3 트랜잭션 속성 +2.6.4 데이터 액세스 기술 트랜잭션의 통합 +2.6.5 JTA를 이용한 글로벌/분산 트랜잭션 + +# 2.6 트랜잭션 +스프링이 제공하는 트랜잭션 서비스는? +2가지 측면이 있다. +1. 트랜잭션 추상화 +2. 트랜잭션 동기화 + +[이 velog](https://velog.io/@jakeseo_me/%ED%86%A0%EB%B9%84%EC%9D%98-%EC%8A%A4%ED%94%84%EB%A7%81-%EC%A0%95%EB%A6%AC-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-5.2-%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98-%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%B6%94%EC%83%81%ED%99%94) 에서 잘 설명중이니 참고할 것.. + +# 2.6.1 트랜잭션 추상화와 동기화 +## 트랜잭션 동기화 +트랜잭션을 시작하기 위해 생성한 Connection 객체를 별도의 특별한 공간에 보관하고, 이 커넥션이 필요할 때 (ex. DAO) 꺼내쓰는 방식이다. + +``` java + public void upgradeLevels() throws SQLException{ + // 트랜잭션 동기화 관리자를 이용해 동기화 작업을 초기화 + TransactionSynchronizationManager.initSynchronization(); + // DB 커넥션을 생성하고 트랜잭션을 시작한다. + // 이후의 DAO 작업은 모두 여기서 시작한 트랜잭션 안에서 진행된다. + // 아래 두 줄이 DB 커넥션 생성과 동기화를 함께 해준다. + Connection c = DataSourceUtils.getConnection(dataSource); + c.setAutoCommit(false); + + try { + List users = userDao.getAll(); + for (User user : users) { + if (canUpgradeLevel(user)) { + upgradeLevel(user); + } + } + + c.commit(); + }catch(Exception e) { + c.rollback(); + throw e; + } finally { + // 스프링 DataSourceUtils 유틸리티 메소드를 통해 커넥션을 안전하게 닫는다. + DataSourceUtils.releaseConnection(c, dataSource); + // 동기화 작업 종료 및 정리 + TransactionSynchronizationManager.unbindResource(this.dataSource); + TransactionSynchronizationManager.clearSynchronization(); + } + } +``` + +## 트랜잭션 추상화 +![img.png](img.png) +`PlatformTransactionManager` 인터페이스를 통해, JDBC / JTA / Hibernate 같은 기술에 종속되지 않은채로 트랜잭션 경계설정을 가능하게 한다. + +```java + public void upgradeLevels() { + // 트랜잭션 시작 + TransactionStatus status = + transactionManager.getTransaction(new DefaultTransactionDefinition()); + + //setAutoCommit(false) 같은거 할 필요 없음 + try { + List users = userDao.getAll(); + for (User user : users) { + if (canUpgradeLevel(user)) { + upgradeLevel(user); + } + } + + transactionManager.commit(status); + }catch(Exception e) { + transactionManager.rollback(status); + throw e; + } + } +``` + +# 2.6.2 트랜잭션 경계 설정 전략 +## 코드에 의한 트랜잭션 경계설정 +거의 안쓰이는 방법이라 예제 코드만 첨부합니다.. +```java +public class EmbeddedDbSqlRegistry implements UpdatableSqlRegistry { + SimpleJdbcTemplate jdbc; + TransactionTemplate transactionTemplate; + + public void setDataSource(DataSource dataSource) { + jdbc = new SimpleJdbcTemplate(dataSource); + + //DataSource로 TranscationManager를 만들고 이를 이용해 TranscationTemplate을 생성한다. + transactionTemplate = new TranscationTemplate( + new DataSourceTranscationManager(dataSource)); + } + + @Override + public void updateSql(final Map sqlmap) throws SqlUpdateFailureException { + transactionTemplate.execute(new TransactionCallbackWithoutResult() { + // 트랜잭션 템플릿이 만드는 트랜잭션 경계 안에서 동작할 코드를 콜백 형태로 만들고 + // execute() 메소드에 전달한다. + @Override + protected void doInTransactionWithoutResult(TransactionStatus status) { + for (Map.Entry entry : sqlmap.entrySet()) { + updateSql(entry.getKey(), entry.getValue()); + } + } + }); + } +} +``` + +## 선언적 트랜잭션 경계설정 +선언적 트랜잭션을 이용하면 코드에는 전혀 영향을 주지 않으면서, +- 특정 메소드 실행 전 후에 트랜잭션이 시작되고 종료되거나 +- 기존 트랜잭션에 참여하도록 만들 수 있다. + +어떻게 코드에 전혀 영향을 주지 않을 수 있을까? +✨AOP의 형태로 동작하기 때문이다.✨ + +AOP로 동작하려면 `포인트컷(적용대상) + 어드바이스(부가기능)` 이 필요하다. + +구현 방식에는 2가지가 있다. + +### tx 네임스페이스 +`txAdvice`를 통해 스프링의 트랜잭션 관리 기능을 제공한다. +```xml + + + + + + + + + + + +``` + +### @Transactional +위 방식처럼 설정파일에 명시적으로 포인트컷과 어드바이스를 정의하지 않는다. + +간단하게 @Transactional을 사용한다는 설정만 추가하면 된다. +```java +@Configuration +@EnableTransactionManagement +public class AppConfig { + // ... +} +``` +이러게 config 파일에 추가하거나 + +```xml + +``` +설정파일에 이 한줄을 추가해준다. + +이 어노테이션은 선언된 위치에 따라 우선순위가 결정된다. +``` +(높) 클래스의 메소드 > 클래스 > 인터페이스의 메소드 > 인터페이스 (낮) +``` +구체적일수록 우선순위가 높다고 생각하면 된다. + +### 프록시 모드: 인터페이스와 클래스 +스프링의 프록시 팩토리는 상황에 맞게 동적 프록시 기술을 선택한다. +- 대상에 인터페이스가 있을 경우: `JDK 동적 프록시`(인터페이스 기반) +- 대상에 인터페이스가 없을 경우: `CGLIB`(구체 클래스 기반) + +트랜잭션의 경우, 디폴트로 `JDK 동적 프록시` 로 동작한다. +클래스만 있을 경우엔 어떻게 해야할까? + +``` java +proxyTargetClass=true + +또는 + +@Configuration +@EnableTransactionManagement(proxyTargetClass = true) +public class AppConfig { + // ... +} +``` +이 옵션을 추가해서 무조건 `CGLIB` 기반으로 동작하게 한다. +(책에는 별말 없지만, 매번 인터페이스를 만들지 않으므로 거의 이 옵션을 주고 사용한다) + +### 프록시 방식의 AOP 한계 +프록시를 사용하면 메서드 내부 호출에는 프록시를 적용할 수 없다. +내부 호출을 할 때는, 프록시 객체의 메서드가 아닌 실제 타겟 객체의 메서드가 호출되기 때문이다. + +# 2.6.3 트랜잭션 속성 +## propagation (전파 동작) +메소드가 이미 실행 중인 트랜잭션 내에서 실행될 때 어떻게 동작할지를 정의한다. +- `REQUIRED`: 미리 시작된 트랜잭션이 있음 참여하고, 없으면 새로 시작 +- `SUPPORTS`: 이미 시작한 트랜잭션이 있음 참여하고, 없으면 트랜잭션 없이 진행 +- `MANDATORY`: 미리 시작된 트랜잭션이 있음 참여하고, 없으면 예외 발생 +- `REQUIRES_NEW`: 항상 새로운 트랜잭션 시작한다. 이미 시작한 트랜잭션이 있다면 보류시킴 +- `NOT_SUPPORTED`: 트랜잭션을 사용하지 않게 한다. 이미 시작한 트랜잭션이 있다면 보류시킴 +- `NEVER`: 트랜잭션을 사용하지 않도록 강제함. 이미 시작한 트랜잭션이 있으면 예외 발생 +- `NESTED`: 이미 진행중인 트랜잭션이 있으면 중첩 트랜잭션을 시작함. 부모 트랜잭션은 자식의 영향을 받지 않고, 자식 트랜잭션은 부모의 영향을 받음. + + +## isolation (격리 수준) +트랜잭션의 격리 수준을 지정한다. +ex. DEFAULT (데이터베이스 기본값), READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE + +## timeout +트랜잭션의 최대 실행 시간을 초 단위로 지정한다. 초과할 경우 트랜잭션은 롤백된다. + +## readOnly +트랜잭션에서 데이터베이스를 읽기 전용으로 처리할지 여부를 지정한다. 읽기 전용으로 설정할 경우 성능이 향상될 수 있다. + +## rollbackFor +명시적으로 롤백되어야 하는 예외의 타입을 지정한다. 지정한 예외 또는 해당 예외의 서브클래스가 발생할 경우 트랜잭션이 롤백된다. + +참고) RuntimeException 은 디폴트로 롤백된다. Exception은 디폴트로 커밋된다. + +## noRollbackFor +롤백되지 않아야 하는 예외의 타입을 지정한다. 지정한 예외 또는 해당 예외의 서브클래스가 발생해도 트랜잭션이 롤백되지 않는다. + +# 2.6.4 데이터 액세스 기술 트랜잭션의 통합 +스프링은 두 개 이상의 데이터 액세스 기술로 만든 DAO를 하나의 트랜잭션으로 묶어서 사용하는 방법을 제공한다. +- ORM과 비ORM 기술을 함께 사용할 땐 주의해야 한다. + - ORM은 트랜잭션이 커밋되기 전까지 실제 DB에 cud를 하지 않으므로... 적절히 flush 해야한다 + +# 2.6.5 JTA를 이용한 글로벌/분산 트랜잭션 +한 개 이상의 DB나 JMS의 작업을 하나의 트랜잭션 안에서 동작하게 하려면 서버가 제공히는 트랜잭션 매니저를 JTA를 통해 사용해야 한다. +스프링에서는 서버에 설정해둔 XA DataSource와 트랜잭션 매니저 그리고 UserTransaction 등을 JNDI를 통해 가져와 모든 데이터 액세스 기술에서 사용할 수 있다. \ No newline at end of file diff --git "a/\354\265\234\354\212\271\354\227\260/vol2/2\354\236\245 \353\215\260\354\235\264\355\204\260 \354\225\241\354\204\270\354\212\244 \352\270\260\354\210\240/img.png" "b/\354\265\234\354\212\271\354\227\260/vol2/2\354\236\245 \353\215\260\354\235\264\355\204\260 \354\225\241\354\204\270\354\212\244 \352\270\260\354\210\240/img.png" new file mode 100644 index 0000000000000000000000000000000000000000..92233fcf871c82be40ab097ec476bfadd0ec055c GIT binary patch literal 59175 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 S^Bb>!_LSSNHNRZ@