Chapter 6 - KOO-YS/toby-spring GitHub Wiki
- IoC/DI, μλΉμ€ μΆμνμ λλΆμ΄ μ€νλ§μ 3λ κΈ°λ° κΈ°μ μ νλμΈ AOPμ νμ°μ μΈ λ±μ₯ λ°°κ²½κ³Ό μ€νλ§μ΄ κ·Έκ²μ λμ ν μ΄μ , μ μ©μ ν΅ν΄ μ»μ μ μλ μ₯μ μ΄ λ¬΄μμΈμ§ μΆ©λΆν μ΄ν΄κ° νμνλ€.
π± Branch chapter06/refactor6.1μ μ€μ΅ μ μ©
λΉμ¦λμ€ λ‘μ§μ λ΄λΉνλ μ½λκ° νΈλμμ μ μμκ³Ό μ’ λ£ μμ μ¬μ΄μμ μνλμ΄μΌ νλ€λ μ¬νμ μ§ν€λ, μ±κ²©μ΄ λ€λ₯Έ μ½λλ₯Ό λ κ°μ λ©μλλ‘ λΆλ¦¬
UserService implements : UserServiceImpl & UserServiceTx
@Autowired
UserService userServiceTx; // νλ μ΄λ¦μΌλ‘ κ²μνΈλμμ κ²½κ³μ€μ μ½λμ λΆλ¦¬μ DIλ₯Ό ν΅ν μ°κ²°μ ν΅ν΄ μ»μ μ μλ μ₯μ
- λΉμ¦λμ€ λ‘μ§μ λ΄λΉνκ³ μλ
UserServiceImplμ μ½λλ₯Ό μμ±ν λλ νΈλμμ κ³Ό κ°μ κΈ°μ μ μΈ λ΄μ©μλ μ ν μ κ²½μ°μ§ μμλ λλ€ - λΉμ¦λμ€ λ‘μ§μ λν ν μ€νΈλ₯Ό μμ½κ² λ§λ€μ΄λΌ μ μλ€
π± Branch chapter06/refactor6.2μ μ€μ΅ μ μ©
κ°μ₯ νΈνκ³ μ’μ ν μ€νΈ λ°©λ²μ κ°λ₯ν ν μμ λ¨μλ‘ μͺΌκ°μ ν μ€νΈνλ κ²
μμ λ¨μ ν μ€νΈκ° μ’μ μ΄μ
- ν μ€νΈκ° μ€ν¨νμ λ κ·Έ μμΈμ μ°ΎκΈ° μ½λ€
- ν μ€νΈμ μλλ λ΄μ©μ΄ λΆλͺ ν΄μ§λ€
- ν μ€νΈλ₯Ό μμ±νκΈ° μ½λ€
νμ§λ§, ν μ€νΈ λμμ΄ λ€λ₯Έ μ€λΈμ νΈμ νκ²½μ μμ‘΄νκ³ μλ€λ©΄ μμ λ¨μμ ν μ€νΈκ° μ£Όλ μ₯μ μ μ»κΈ° νλ€λ€
ν μ€νΈμ λμμ΄ νκ²½μ΄λ, μΈλΆ μλ², λ€λ₯Έ ν΄λμ€μ μ½λμ μ’ μλκ³ μν₯μ λ°μ§ μλλ‘ κ³ λ¦½μν¬ νμκ° μλ€.
ν μ€νΈλ₯Ό μμ‘΄ λμμΌλ‘λΆν° λΆλ¦¬ν΄μ κ³ λ¦½μν€λ λ°©λ²μ ν μ€νΈλ₯Ό μν λμμ μ¬μ©νλ κ²
κ·Έλ°λ° μμ‘΄ μ€λΈμ νΈλ μΈλΆ μλΉμ€μ μμ‘΄νμ§ μλ κ³ λ¦½λ ν μ€νΈ λ°©μμ λ§λ€μμ λ, κΈ°λ₯μ΄ μνμ΄ λλ κ·Έ κ²°κ³Ό κΈ°λ‘μ΄ λ¨μ§μμ μ§μ κ²°κ³Όλ₯Ό κ²μ¦νκΈ° νλ€λ€
-> ν μ€νΈ λμκ³Ό νλ ₯ μ€λΈμ νΈ μ¬μ΄μ μ£Όκ³ λ°μ μ 보λ₯Ό μ μ₯ν΄λλ€κ°, ν μ€νΈ κ²μ¦μ μ¬μ©ν μ μκ²νλ λͺ© μ€λΈμ νΈλ₯Ό λ§λ€μ΄μΌνλ€.
-
λΉμ¦λμ€ λ‘μ§μ κ²μ¦νλ λ° μ§μ μ μΌλ‘ νμνμ§ μμ μμ‘΄ μ€λΈμ νΈμ μλΉμ€λ₯Ό λͺ¨λ μ κ±°νκ³ , νμν λΆλΆμ λͺ© μ€λΈμ νΈλ₯Ό μμ±ν΄ μ΅μννλ€
- ν μ€νΈ μνμκ°μ΄ ν¨μ¬ ν° μ°¨μ΄λ‘ μ§§μμ‘λ€.
- ν μ€νΈ μν μ±λ₯μ΄ ν¬κ² ν₯μλμλ€
- ν μ€νΈκ° λ€λ₯Έ μμ‘΄ λμμ μν₯μ λ°μ κ²½μ° λλΉν΄ 볡μ‘νκ² μ€λΉν νμκ° μλ€
ν μ€νΈ λμ ν΄λμ€λ₯Ό λͺ© μ€λΈμ νΈ λ±μ ν μ€νΈ λμμ μ΄μ©ν΄ μμ‘΄ μ€λΈμ νΈλ μΈλΆμ 리μμ€λ₯Ό μ¬μ©νμ§ μλλ‘ κ³ λ¦½μμΌμ ν μ€νΈνλ κ²
λ κ° μ΄μμ, μ±κ²©μ΄λ κ³μΈ΅μ΄ λ€λ₯Έ μ€λΈμ νΈκ° μ°λνλλ‘ λ§λ€μ΄ ν μ€νΈνκ±°λ, μΈλΆ DBλ νμΌ, μλΉμ€ λ±μ 리μμ€κ° μ°Έμ¬νμ¬ νλ ν μ€νΈ
- λ¨μ ν μ€νΈλ₯Ό μ°μ μ
- μΈλΆμμ μμ‘΄κ΄κ³λ₯Ό μ΅μννκ³ νμμ λ°λΌ μ€ν μ΄λ λͺ© μ€λΈμ νΈ λ±μ ν μ€νΈ λμμ μ΄μ©
- μΈλΆ 리μμ€λ₯Ό μ¬μ©ν΄μΌλ§ κ°λ₯ν ν μ€νΈλ ν΅ν© ν μ€νΈλ‘ λ§λ¦
- λ¨μ ν μ€νΈλ‘ λ§λ€κΈ° λ무 볡μ‘νλ€κ³ νλ¨μ΄ λλ€λ©΄, μ²μλΆν° ν΅ν© ν μ€νΈλ₯Ό κ³ λ €. ν΅ν© ν μ€νΈ μ°Έμ¬ μ½λ μ€ μ΅λν λ§μ λΆλΆμ 미리 λ¨μ ν μ€νΈλ‘ κ²μ¦ν΄λκΈ°
- μ€νλ§ ν μ€νΈ 컨ν μ€νΈ νλ μμν¬λ₯Ό μ΄μ©νλ ν μ€νΈλ ν΅ν© ν μ€νΈλ€
-
λ¨μ ν μ€νΈλ₯Ό λ§λ€κΈ° μν΄μλ μ€ν μ΄λ λͺ© μ€λΈμ νΈμ μ¬μ©μ΄ νμμ μ΄λ€
-
λνμ νλ μμν¬ : Mockito
- Mockitoλ‘ λ§λ€μ΄μ§ λͺ© μ€λΈμ νΈλ λ©μλμ νΈμΆκ³Ό κ΄λ ¨λ λͺ¨λ λ΄μ©μ μλμΌλ‘ μ μ₯ν΄λκ³ , μ΄λ₯Ό κ°λ¨ν λ©μλλ‘ κ²μ¦ν μ μκ² ν΄μ€λ€
- μΈν°νμ΄μ€λ₯Ό μ΄μ©ν΄ λͺ© μ€λΈμ νΈλ₯Ό λ§λ λ€
- λͺ© μ€λΈμ νΈκ° 리ν΄ν κ°μ΄ μμΌλ©΄ μ΄λ₯Ό μ§μ ν΄μ€λ€. λ©μλκ° νΈμΆλλ©΄ μμΈλ₯Ό κ°μ λ‘ λμ§κ² λ§λ€ μ μλ€
- ν μ€νΈ λμ μ€λΈμ νΈμ DI ν΄μ λͺ© μ€λΈμ νΈκ° ν μ€νΈ μ€μ μ¬μ©λλλ‘ λ§λ λ€
- ν μ€νΈ λμ μ€λΈμ νΈλ₯Ό μ¬μ©ν νμ λͺ© μ€λΈμ νΈμ νΉμ λ©μλκ° νΈμΆλλμ§, μ΄λ€ κ°μ κ°μ§κ³ λͺ λ² νΈμΆλλμ§ κ²μ¦
-
any(): νλΌλ―Έν° λ΄μ©μ 무μνκ³ νΈμΆ νμλ§ νμΈ κ°λ₯ -
times(): λ©μλ νΈμΆ νμλ₯Ό κ²μ¦ν΄μ€λ€ -
ArgumentCaptor: νλΌλ―Έν°λ₯Ό μ§μ λΉκ΅ν기보λ€λ νλΌλ―Έν°μ λ΄λΆ μ 보λ₯Ό νμΈν΄μΌ νλ κ²½μ°μ μ μ©
-
λͺ© νλ μμν¬μ νΉμ§
- λͺ© ν΄λμ€λ₯Ό μΌμΌμ΄ μ€λΉν΄λ νμκ° μλ€
- κ°λ¨ν λ©μλ νΈμΆλ§μΌλ‘ λ€μ΄λ΄λ―Ήνκ² νΉμ μΈν°νμ΄μ€λ₯Ό ꡬνν ν μ€νΈμ© λͺ© μ€λΈμ νΈλ₯Ό λ§λ€ μ μλ€
π± Branch chapter06/refactor6.3μ μ€μ΅ μ μ©
-
μμ μ΄ ν΄λΌμ΄μΈνΈκ° μ¬μ©νλ €κ³ νλ μ€μ λμμΈ κ² μ²λΌ μμ₯ν΄μ ν΄λΌμ΄μΈνΈμ μμ²μ λ°μμ£Όλ κ²
-
λ리μ, λ리μΈκ³Ό κ°μ μν μ νλ€
-
νκΉ(target)orμ€μ²΄(real subject): νλ‘μλ₯Ό ν΅ν΄ μ΅μ’ μ μΌλ‘ μμ²μ μμλ°μ μ²λ¦¬νλ μ€μ μ€λΈμ νΈ -
- νκΉκ³Ό κ°μ μΈν°νμ΄μ€λ₯Ό ꡬν
- νλ‘μκ° νκΉμ μ μ΄ν μ μλ μμΉμ μλ€λ κ²
-
- ν΄λΌμ΄μΈνΈκ° νκΉμ μ κ·Όνλ λ°©λ²μ μ μ΄νκΈ° μν λͺ©μ
- νκΉμ λΆκ°μ μΈ κΈ°λ₯μ λΆμ¬ν΄μ£ΌκΈ° μν λͺ©μ
- λ κ°μ§ λͺ¨λ λ리 μ€λΈμ νΈλΌλ κ°λ μ νλ‘μλ₯Ό λκ³ μ¬μ©νλ€λ μ μ λμΌνμ§λ§, λͺ©μ μ λ°λΌμ λμμΈ ν¨ν΄μμλ λ€λ₯Έ ν¨ν΄μΌλ‘ ꡬλΆ
- νκΉμ λΆκ°μ μΈ κΈ°λ₯μ λ°νμ μ λ€μ΄λλ―Ήνκ² λΆμ¬ν΄μ£ΌκΈ° μν΄ νλ‘μλ₯Ό μ¬μ©νλ ν¨ν΄
- λ°νμ μ λ€μ΄λλ―Ή -> μ»΄νμΌ μμ , μ½λ μμμλ νλ‘μμ νκΉμ μ°κ²°νμ¬ μ¬μ©νμ§ μλλ€λ λ»
- νλ‘μκ° λ± νλλ‘ μ νλμ΄ μμ§ μκ³ , νλ‘μκ° μ§μ νκΉμ μ¬μ©νλλ‘ κ³ μ μν¬ νμλ μλ€
- κ°μ μΈν°νμ΄μ€λ₯Ό ꡬνν νκ²κ³Ό μ¬λ¬ κ°μ νλ‘μλ₯Ό μ¬μ©ν μ μλ€
- ν΄λΌμ΄μΈνΈμ μ¬μ© λμ μ¬μ΄μ λ리 μν μ λ§‘μ μ€λΈμ νΈλ₯Ό λλ λ°©λ²
- νλ‘μλ₯Ό μ¬μ©νλ λ°©λ² μ€μμ νκΉμ λν μ κ·Ό λ°©λ²μ μ μ΄νλ €λ λͺ©μ μ κ°μ§ κ²½μ° π
νλ‘μ ν¨ν΄μ νκΉμ κΈ°λ₯ μ체μλ κ΄μ¬νμ§ μμΌλ©΄μ μ κ·Όνλ λ°©λ²μ μ μ΄ν΄μ£Όλ νλ‘μλ₯Ό μ΄μ©νλ κ²
- λ€λ§ νλ‘μλ μ½λμμ μμ μ΄ λ§λ€κ±°λ μ κ·Όν νκΉ ν΄λμ€ μ 보λ₯Ό ꡬ체μ μΌλ‘ μκ³ μλ κ²½μ°κ° λ§λ€
- ex) μμ± μ§μ° νλ‘μμ κ²½μ°, νκΉ ν΄λμ€μ ꡬ체μ μΈ μμ± λ°©λ²μ μμμΌν¨
- νκΉκ³Ό λμΌν μΈν°νμ΄μ€λ₯Ό ꡬν
- ν΄λΌμ΄μΈνΈμ νκΉ μ¬μ΄μ μ‘΄μ¬
- λΆκ° κΈ°λ₯ λλ μ κ·Ό μ μ΄ κΈ°λ₯μ λ΄λΉνλ μ€λΈμ νΈ
-
νλ‘μ : κΈ°μ‘΄ μ½λμ μν₯μ μ£Όμ§ μμΌλ©΄μ νκΉμ κΈ°λ₯μ νμ₯νκ±°λ μ κ·Ό λ°©λ²μ μ μ΄ν μ μλ μ μ©ν λ°©λ²
- μλ°μ
java.lang.reflectν¨ν€μ§ μμ νλ‘μλ₯Ό μμ½κ² λ§λ€ μ μλλ‘ μ§μν΄μ£Όλ ν΄λμ€λ€μ΄ μλ€
- μλ°μ
-
- μνλ λΆκ° κΈ°λ₯μ μν΄ νμμλ λ©μλλ λͺ¨λ ꡬνν΄μΌνλ€
- λΆκ° κΈ°λ₯ μ½λκ° μ€λ³΅λ κ°λ₯μ±μ΄ λ§λ€
-
-
λ€μ΄λλ―Ή νλ‘μλ 리νλμ κΈ°λ₯μ μ΄μ©ν΄μ νλ‘μλ₯Ό λ§λ€μ΄ μ€λ€
@Test public void invokeMethod() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { String name = "Spring"; // length() assertThat(name.length(), is(6)); /** * Method ? 리νλ μ API μ€μμ λ©μλμ λν μ μλ₯Ό λ΄μ μΈν°νμ΄μ€ * 1. λ©μλμ λν μμΈν μ 보λ₯Ό λ΄κ³ μμ * 2. νΉμ μ€λΈμ νΈμ λ©μλλ₯Ό μ€νμν¬ μ μλ€ * -> invoke() λ©μλ μ¬μ© */ Method lengthMethod = String.class.getMethod("length"); assertThat((Integer)lengthMethod.invoke(name), // invoke(λ©μλλ₯Ό μ€νμν¬ νκΉ μ€λΈμ νΈ) is(6)); // charAt() assertThat(name.charAt(0), is('S')); Method charAtMethod = String.class.getMethod("charAt", int.class); assertThat((Character)charAtMethod.invoke(name, 0), // invoke(λ©μλλ₯Ό μ€νμν¬ νκΉ μ€λΈμ νΈ, λ€μ΄κ° νλΌλ―Έν°) is('S')); }
-
-
-
νλ‘μ ν©ν 리μ μν΄ λ°νμ μ λ€μ΄λλ―Ήνκ² λ§λ€μ΄μ§λ μ€λΈμ νΈ
-
λ€μ΄λλ―Ή νλ‘μ μ€λΈμ νΈλ νκΉμ μΈν°νμ΄μ€μ κ°μ νμ μΌλ‘ λ§λ€μ΄μ§λ€ -
ν΄λΌμ΄μΈνΈλ λ€μ΄λλ―Ή νλ‘μ μ€λΈμ νΈλ₯Ό νκΉ μΈν°νμ΄μ€λ₯Ό ν΅ν΄ μ¬μ©ν μ μλ€
- νλ‘μ ν©ν 리μκ² μΈν°νμ΄μ€ μ λ³΄λ§ μ 곡ν΄μ£Όλ©΄ ν΄λΉ μΈν°νμ΄μ€λ₯Ό ꡬνν ν΄λμ€μ μ€λΈμ νΈλ₯Ό μλμΌλ‘ μμ±
-
λΆκ°κΈ°λ₯μ νλ‘μ μ€λΈμ νΈμ λ 립μ μΌλ‘
InvocationHandlerλ₯Ό ꡬνν μ€λΈμ νΈμ λ΄λλ€ : λͺ¨λ μμ²μinvoke()λ©μλλ‘ μ²λ¦¬ -
νκΉ μ€λΈμ νΈ λ©μλ νΈμΆ+λΆκ° κΈ°λ₯=κ²°κ³Ό 리ν΄->ν΄λΌμ΄μΈνΈμκ² μ λ¬Object newProxyInstance( ClassLoader loader, // 1. λ€μ΄λλ―Ή νλ‘μκ° μ μλλ ν΄λμ€ λ‘λλ₯Ό μ 곡 Class<?>[] interfaces, // 2. νλ‘μκ° κ΅¬νν΄μΌ ν μΈν°νμ΄μ€. ν λ²μ νλ μ΄μμ μΈν°νμ΄μ€λ₯Ό ꡬνν μ μμΌλ―λ‘ λ°°μ΄ μ¬μ© InvocationHandler h // 3. λΆκ°κΈ°λ₯ & μμ μ½λλ₯Ό λ΄κ³ μλ InvocationHandler ꡬν μ€λΈμ νΈλ₯Ό μ 곡 );
-
- λ¦¬ν΄ νμ μ Methodλ₯Ό μ΄μ©ν νκΉ μ€λΈμ νΈμ λ©μλ νΈμΆ ν 리ν΄νμ μ νμΈν΄ νΉμ κ²½μ°μλ§ λ°ν
- νκΉμ μ’
λ₯μ μκ΄μμ΄
InvocationHandlerλ°©μμ μ μ©ν μ μλ€ - λ¨, 리νλ μ
λ©μλμΈ
Method.invoke()λ₯Ό μ΄μ©ν΄ νκΉ μ€λΈμ νΈμ λ©μλλ₯Ό νΈμΆν λλ νκΉ μ€λΈμ νΈμμ λ°μνλ μμΈκ°InvocationTargetExceptionμΌλ‘ νλ² ν¬μ₯λμ΄μ μ λ¬λλ€-
getTargetException()λ©μλλ‘ μ€μ²©λμ΄ μλ μμΈλ₯Ό κ°μ ΈμμΌ νλ€
-
-
μ€νλ§ λΉμ κΈ°λ³Έμ μΌλ‘ ν΄λμ€ μ΄λ¦κ³Ό νλ‘νΌν°λ‘ μ μλλ©°, μ§μ λ ν΄λμ€ μ΄λ¦μ κ°μ§κ³ 리νλ μ μ μ΄μ©ν΄μ ν΄λΉ ν΄λμ€μ μ€λΈμ νΈλ₯Ό λ§λ λ€
-
ClassμnewInstance()λ©μλ : ν΄λΉ ν΄λμ€μ λν΄νΈ μμ±μλ₯Ό νΈμΆν΄ μ€λΈμ νΈ μμ± ν λ°νDate now = (Date) Class.forName("java.util.Date").newInstance();
-
-
λ€λ§! λ€μ΄λλ―Ή νλ‘μ μ€λΈμ νΈλ
Proxyν΄λμ€μnewProxyInstance()μ€νν± ν©ν 리 λ©μλλ₯Ό ν΅ν΄μλ§ λ§λ€ μ μλ€.
-
ν΄λμ€ μ 보λ₯Ό κ°μ§κ³ λν΄νΈ μμ±μλ₯Ό ν΅ν΄ μ€λΈμ νΈλ₯Ό λ§λλ λ°©λ² μ΄μΈμ λΉ μμ± λ°©λ²
-
μ€νλ§μ λμ ν΄μ μ€λΈμ νΈμ μμ±λ‘μ§μ λ΄λΉ
-
-
FactoryBeanμΈν°νμ΄μ€λ₯Ό ꡬνν ν΄λμ€λ₯Ό μ€νλ§μ λΉμΌλ‘ λ±λ‘
-
μ€νλ§μ private μμ±μλ₯Ό κ°μ§ ν΄λμ€λ λΉμΌλ‘ λ±λ‘ν΄μ£Όλ©΄ 리νλ μ μ μ΄μ©ν΄ μ€λΈμ νΈλ₯Ό λ§λ€ μ μλ€
But, μμ±μλ₯Ό privateμΌλ‘ λ§λ€μλ€λ κ²μ μ€νν± λ©μλλ₯Ό ν΅ν΄ μ€λΈμ νΈλ₯Ό λ§λ€μ΄μΌ νλ μ΄μ κ° μκΈ° λλ¬Έμ΄λ―λ‘ κΆμ₯λμ§ μλλ€.
- μ€νλ§μ
FactoryBeanμΈν°νμ΄μ€λ₯Ό ꡬνν ν΄λμ€κ° λΉμ ν΄λμ€λ‘ μ§μ λλ©΄ - ν©ν 리 λΉ ν΄λμ€μ μ€λΈμ νΈμ
getObject()λ©μλλ₯Ό μ΄μ©ν΄ μ€λΈμ νΈλ₯Ό κ°μ Έμ€κ³ - μ΄λ₯Ό λΉ μ€λΈμ νΈλ‘ μ¬μ©νλ€
-
- νλ‘μ ν©ν 리 λΉμ μ¬μ¬μ©. μ½λμ μμ μμ΄ λ€μν ν΄λμ€μ μ μ©ν μ μλ€
-
- ν λ²μ μ¬λ¬ κ°μ ν΄λμ€μ 곡ν΅μ μΈ λΆκ° κΈ°λ₯μ μ 곡νλ κ²μ΄ λΆκ°λ₯νλ€
- νλμ νκΉμ μ¬λ¬ κ°μ λΆκ°κΈ°λ₯μ μ μ©νλ €λ©΄ λΆκ° κΈ°λ₯μ κ°μλ§νΌ νλ‘μ ν©ν 리 λΉ μ€μ μ΄ λΆμ΄μΌνλ€
- νκΉ μ€λΈμ νΈκ° λ¬λΌμ§ λλ§λ€ λκ°μ λΆκ°κΈ°λ₯μ μ 곡νλ μ€λΈμ νΈλ₯Ό μ€λ³΅μ μΌλ‘ λ§λ€μ΄μΌνλ€
π± Branch chapter06/refactor6.4μ μ€μ΅ μ μ©
μ€νλ§μ μΌκ΄λ λ°©λ²μΌλ‘ νλ‘μλ₯Ό λ§λ€ μ μκ² λμμ£Όλ μΆμ λ μ΄μ΄λ₯Ό μ 곡
μμ±λ νλ‘μλ μ€νλ§μ λΉμΌλ‘ λ±λ‘λμ΄μΌ νκ³ , μ€νλ§μ νλ‘μ μ€λΈμ νΈλ₯Ό μμ±ν΄μ£Όλ κΈ°μ μ μΆμνν ν©ν 리 λΉμ μ 곡
νλ‘μλ₯Ό μμ±ν΄μ λΉ μ€λΈμ νΈλ‘ λ±λ‘νκ² ν΄μ£Όλ ν©ν 리 λΉ
μμνκ² νλ‘μλ₯Ό μμ±νλ μμ λ§ λ΄λΉ, νλ‘μλ₯Ό ν΅ν΄ μ 곡ν΄μ€ λΆκ° κΈ°λ₯μ λ³λμ λΉμ λΆλ¦¬
,TransactionHandlerμ InvocationHandlerκ° μλ
ProxyFactoryBeanμ΄ μμ±νλ νλ‘μμμ μ¬μ©νλ λΆκ° κΈ°λ₯μ MethodInterceptor μΈν°νμ΄μ€λ₯Ό ꡬννμ¬ λ§λ λ€
InvocationHandler : invoke() λ©μλλ νκΉ μ€λΈμ νΈμ λν μ 보λ₯Ό μ 곡νμ§ μλλ€ -> νκΉ μ€λΈμ νΈμ λν μ 보λ₯Ό μ§μ μκ³ μμ΄μΌ νλ€
MethodInterceptor : invoke() λ©μλλ
ProxyFactoryBeanμΌλ‘λΆν° νκΉ μ€λΈμ νΈ μ 보λ₯Ό ν¨κ» μ 곡λ°λλ€βΆ κ·Έ λλΆμ
MethodInterceptorλ νκΉ μ€λΈμ νΈμ μκ΄μμ΄ λ 립μ μΌλ‘ λ§λ€μ΄μ§ μ μλ€βΆ
MethodInterceptorμ€λΈμ νΈλ νκΉμ΄ μ¬λ¬ νλ‘μμμ ν¨κ» μ¬μ©ν μ μκ³ , μ±κΈν€ λΉμΌλ‘ λ±λ‘ κ°λ₯νλ€
Advice : νκΉ μ€λΈμ νΈμ μ μ©νλ λΆκ°κΈ°λ₯μ λ΄μ μ€λΈμ νΌ
-
MethodInvocationμ μΌμ’ μ μ½λ°± μ€λΈμ νΈλ‘ proceed() λ©μλλ₯Ό μ€ννλ©΄ νκΉ μ€λΈμ νΈμ λ©μλλ₯Ό λ΄λΆμ μΌλ‘ μ€νν΄μ£Όλ κΈ°λ₯μ΄ μλ€ -
MethodInvocationꡬν ν΄λμ€ : μΌμ’ μ 곡μ κ°λ₯ν ν νλ¦Ώμ²λΌ λμ- JDKμ λ€μ΄λλ―Ή νλ‘μλ₯Ό μ§μ μ¬μ©νλ μ½λμ κ°μ₯ ν° μ°¨μ΄μ
-
ProxyFactoryBeanμaddAdvice()λ₯Ό μ΄μ©ν΄ μ¬λ¬ κ°μMethodInterceptorλ₯Ό μΆκ°, μ¬λ¬ λΆκ° κΈ°λ₯μ μ 곡ν΄μ£Όλ νλ‘μλ₯Ό λ§λ€ μ μλ€ -
addAdviceλ‘MethodInterceptorμΆκ°? βΆMethodInterceptorλAdviceμΈν°νμ΄μ€λ₯Ό μμνκ³ μλ€ -
ProxyFactoryBeanμ ꡬνν΄μΌ ν μΈν°νμ΄μ€λ₯Ό μλ €μ£Όμ§ μμλ νκΉ μ€λΈμ νΈκ° ꡬννκ³ μλ μΈν°νμ΄μ€ μ 보λ₯Ό μμλ΄μ΄ ꡬννλ νλ‘μλ₯Ό λ§λ λ€
pointCut : λ©μλ μ μ μκ³ λ¦¬μ¦μ λ΄μ μ€λΈμ νΈ
-
MethodInterceptorμ€λΈμ νΈλ μ¬λ¬ νλ‘μκ° κ³΅μ ν΄μ μ¬μ©ν μ μμΌλ©°, νκΉ μ 보λ₯Ό κ°μ§κ³ μμ§ μλλ‘ κ΅¬μ±λμ΄ μλ€. -> κ·Έλ κΈ° λλ¬Έμ μ€νλ§ μ±κΈν€ λΉμΌλ‘ λ±λ‘ κ°λ₯νλ€- νΈλμμ
μ μ© λμ λ©μλ μ΄λ¦ ν¨ν΄μ λ£μ΄μ£ΌκΈ° κ³€λ. ν¨ν΄μ νλ‘μλ§λ€ λ€λ₯Ό μ μμΌλ©° μ¬λ¬ νλ‘μκ° κ³΅μ νλ
MethodInterceptorμ νΉμ νλ‘μ μ μ© ν¨ν΄μ λ£μ μ μλ€
- νΈλμμ
μ μ© λμ λ©μλ μ΄λ¦ ν¨ν΄μ λ£μ΄μ£ΌκΈ° κ³€λ. ν¨ν΄μ νλ‘μλ§λ€ λ€λ₯Ό μ μμΌλ©° μ¬λ¬ νλ‘μκ° κ³΅μ νλ
-
MethodInterceptorλ νλ‘μκ° ν΄λΌμ΄μΈνΈλ‘λΆν° λ°λ μμ²μ μΌμΌμ΄ μ λ¬λ°μ νμ μμ΄, μ¬μ¬μ© κ°λ₯ν μμ λΆκ°κΈ°λ₯ μ 곡 μ½λλ§ λ¨κ²¨λλ€
π± Branch chapter06/refactor6.5μ μ€μ΅ μ μ©
β μμ§ ν΄κ²°νμ§ λͺ»ν λ¬Έμ
- λΆκ°κΈ°λ₯μ μ μ©μ΄ νμν νκΉ μ€λΈμ νΈλ§λ€ κ±°μ λΉμ·ν λ΄μ©μ ProxyFactoryBean λΉ μ€μ μ 보λ₯Ό μΆκ°ν΄μ£Όλ λΆλΆμ΄ μ€λ³΅λ¨
μ€νλ§μ 컨ν μ΄λλ‘μ μ 곡νλ κΈ°λ₯ μ€μμ λ³νμ§ μλ ν΅μ¬μ μΈ λΆλΆ μΈμλ λλΆλΆ νμ₯ν μ μλλ‘ νμ₯ ν¬μΈνΈλ₯Ό μ 곡ν΄μ€λ€
BeanPostProcessor μΈν°νμ΄μ€λ₯Ό ꡬνν΄μ λ§λλ λΉ νμ²λ¦¬κΈ°
* λΉ νμ²λ¦¬κΈ° : μ΄λ¦ κ·Έλλ‘ μ€νλ§ λΉ μ€λΈμ νΈλ‘ λ§λ€μ΄μ§κ³ λ νμ, λΉ μ€λΈμ νΈλ₯Ό λ€μ κ°κ³΅ν μ μκ² ν΄μ€
* λΉ νμ²λ¦¬κΈ°λ₯Ό μ€νλ§μ μ μ©νλ λ°©λ²
- λΉ νμ²λ¦¬κΈ° μ체λ₯Ό λΉμΌλ‘ λ±λ‘
-
μ€νλ§μ λΉ νμ²λ¦¬κΈ°κ° λΉμΌλ‘ λ±λ‘λμ΄ μμΌλ©΄ λΉ μ€λΈμ νΈκ° μμ±λ λλ§λ€ λΉ νμ²λ¦¬κΈ°μ 보λ΄μ νμ²λ¦¬ μμ μμ²
-
- λΉμΌλ‘ λ±λ‘λ λͺ¨λ μ΄λλ°μ΄μ λ΄μ ν¬μΈνΈμ»·μ μ΄μ©ν΄ μ λ¬λ°μ λΉμ΄ νλ‘μ μ μ© λμμΈμ§ νμΈ
- νλ‘μ μ μ© λμμ΄λΌλ©΄, λ΄μ₯λ νλ‘μ μμ±κΈ°μκ² νμ¬ λΉμ λν νλ‘μλ₯Ό λ§λ€κ² νκ³ , λ§λ€μ΄μ§ νλ‘μμ μ΄λλ°μ΄μ λ₯Ό μ°κ²°
- λΉ νμ²λ¦¬κΈ°λ νλ‘μκ° μμ±λλ©΄ μλ 컨ν μ΄λκ° μ λ¬ν΄μ€ λΉ μ€λΈμ νΈ λμ νλ‘μ μ€λΈμ νΈλ₯Ό 컨ν μ΄λμκ² λλ €μ€
- 컨ν μ΄λλ μ΅μ’ μ μΌλ‘ λΉ νμ²λ¦¬κΈ°κ° λλ €μ€ μ€λΈμ νΈ(proxy)λ₯Ό λΉμΌλ‘ λ±λ‘νκ³ μ¬μ©
-
μ΄λ¬ν λΆκ°κΈ°λ₯ μ μ©ν λΉμ μ μ νλ λ‘μ§μ΄ μΆκ°λ ν¬μΈνΈμ»·μ΄ λ΄κΈ΄ μ΄λλ°μ΄μ λ₯Ό λ±λ‘νκ³ λΉ νμ²λ¦¬κΈ° μ¬μ©νλ€λ©΄, :golf: μΌμΌμ΄
ProxyFactoryBeanλΉμ λ±λ‘νμ§ μμλ νκΉ μ€λΈμ νΈμ μλμΌλ‘ νλ‘μκ° μ μ©λκ² ν μ μλ€! π
ν¬μΈνΈ μ»·μ ν΄λμ€ νν°μ λ©μλ λ§€μ² λκ°μ§λ₯Ό λλ €μ£Όλ λ©μλλ₯Ό κ°μ§κ³ μλ€
-
getClassFilter(): νλ‘μλ₯Ό μ μ©ν ν΄λμ€μΈμ§ νμΈ -
getMethodMatcher(): μ΄λλ°μ΄μ€λ₯Ό μ μ©ν λ©μλμΈμ§ νμΈ
Pointcut μ μ κΈ°λ₯μ λͺ¨λ μ μ©νλ€λ©΄?
λ¨Όμ νλ‘μλ₯Ό μ μ©ν ν΄λμ€μΈμ§ νλ¨ ν, μ μ© λμ ν΄λμ€μ κ²½μ° μ΄λλ°μ΄μ€λ₯Ό μ μ©ν λ©μλμΈμ§ νμΈ ν λμ
κΈ°μ‘΄μ μ¬μ©νλ ν¬μΈνΈμ»·μ λ©μλ μ΄λ¦ ν¨ν΄, ν΄λμ€ μ΄λ¦ ν¨ν΄μ κ°κ° ν΄λμ€ νν°μ λ©μλ λ§€μ² μ€λΈμ νΈλ‘ λΉκ΅ν΄μ μ μ νλ λ°©μ
- ν΄λμ€ νν°μ λ©μλ λ§€μ²λ₯Ό ꡬν
- μ€νλ§μ΄ μ 곡νλ νν°λ λ§€μ² ν΄λμ€λ₯Ό κ°μ Έμ νλ‘νΌν° μ€μ
- μΌμ’ μ ννμ μΈμ΄λ₯Ό μ¬μ©ν΄μ ν¬μΈνΈμ»·μ μμ±ν μ μλλ‘ νλ λ°©λ²
-
AspectJExpressionPointcut: ν¬μΈνΈμ»· ννμμ μ§μνλ ν¬μΈνΈμ»·- ν΄λμ€μ λ©μλμ μ μ μκ³ λ¦¬μ¦μ ν¬μΈνΈμ»· ννμμ μ΄μ©ν΄ ν λ²μ μ§μ ν μ μκ² νλ€
-
AspectJ ν¬μΈνΈμ»· ννμμ ν¬μΈνΈμ»· μ§μμλ₯Ό μ΄μ©ν΄ μμ±
-
ν¬μΈνΈμ»· μ§μμ λνμ :
execution()-> λ©μλλ₯Ό μ€νμ λν ν¬μΈνΈμ»·-
execution()μ¬μ© ννμ λ¬Έλ²κ΅¬μ‘°execution( [μ κ·Όμ νμν¨ν΄] 리ν΄νμ ν¨ν΄ [ν¨ν€μ§&ν΄λμ€(μΈν°νμ΄μ€)μ΄λ¦ν¨ν΄.]λ©μλμ΄λ¦ν¨ν΄ (νλΌλ―Έν°ν¨ν΄ | .., ...))
-
-
bean(): μ€νλ§μΌλ‘ μ¬μ©λ λ λΉμ μ΄λ¦μΌλ‘ λΉκ΅- ex) bean(*Service) : μμ΄λκ° Serviceλ‘ λλλ λͺ¨λ λΉ μ ν
-
@annotaion: νΉμ μ΄λ Έν μ΄μ μ΄ νμ , λ©μλ, νλΌλ―Έν°μ μ μ©λμ΄ μλ μνλ₯Ό λ³΄κ³ λ©μλ μ μ ν¬μΈνΈμ»·- ex) @annotaion(org.springframework.transaction.annotation.Transactional)
-
- λ°μ λ¬Έμ μ : νΉμ νΈλμμ κΈ°μ μ μ’ μλλ μ½λ
- ν΄κ²° : νΈλμμ μ μ©μ΄λΌλ μΆμμ μΈ μμ λ΄μ©μ μ μ§ν μ±λ‘ ꡬ체μ μΈ κ΅¬ν λ°©λ²μ μμ λ‘κ² λ°κΏμ μλλ‘ μλΉμ€ μΆμν κΈ°λ² μ μ©
- μ₯μ : μΈν°νμ΄μ€μ DIλ₯Ό ν΅ν΄ 무μμ νλμ§λ λ¨κΈ°κ³ , μ§μ ꡬνμ λΆλ¦¬ν¨μΌλ‘μ¨ λΉμ¦λμ€ λ‘μ§ μ½λμλ μν₯μ μ£Όμ§μκ³ λ 립μ μΌλ‘ λ³κ²½ κ°λ₯
-
- λ°μ λ¬Έμ μ : νΈλμμ μ μ© μ½λλ₯Ό λΉμ¦λμ€ λ‘μ§ μ½λμ λ ΈμΆμμΌμΌνλ€
- ν΄κ²° : DIλ₯Ό μ΄μ©ν΄ λ°μ½λ μ΄μ ν¨ν΄μ μ μ©.ν΄λΌμ΄μΈνΈκ° μΌμ’ μ λ리μμΈ νλ‘μ μν μ νλ νΈλμμ λ°μ½λ μ΄ν°λ₯Ό κ±°μ³μ νκΉμ μ κ·Ό κ°λ₯
- μ₯μ : λΉμ¦λμ€ λ‘μ§ μ½λμ μ±κ²©μ΄ λ€λ₯Έ μ½λλ‘λΆν° λ 립μν¬ μ μμκ³ λ 립μ μΌλ‘ λ‘μ§μ κ²μ¦νλ κ³ λ¦½λ λ¨μ ν μ€νΈ μμ± κ°λ₯
-
- λ°μ λ¬Έμ μ : λΉμ¦λμ€ λ‘μ§ μΈν°νμ΄μ€μ λͺ¨λ λ©μλλ§λ€ νΈλμμ κΈ°λ₯μ λΆμ¬νλ μ½λλ₯Ό λ£μ΄ νλ‘μν΄λμ€λ₯Ό λ§λλ μμ μ΄ λ²κ±°λ‘μ
- ν΄κ²° : JDK λ€μ΄λλ―Ή νλ‘μ κΈ°μ μ μ© -> μ€νλ§ νλ‘μ ν©ν 리 λΉμ μ΄μ©ν΄ λ€μ΄λλ―Ή νλ‘μ μμ± λ°©λ²μ DI λμ
- μ₯μ : λ΄λΆμ μΌλ‘ ν νλ¦Ώ/μ½λ°± ν¨ν΄μ νμ©νλ μ€νλ§μ νλ‘μ λΉ λλΆμ λΆκ°κΈ°λ₯μ λ΄μ μ΄λλ°μ΄μ€μ λΆκ°κΈ°λ₯ μ μ μκ³ λ¦¬μ¦μ λ΄μ ν¬μΈνΈκ²μ νλ‘μμμ λΆλ¦¬ κ°λ₯. μ¬λ¬ νλ‘μκ° κ³΅μ ν΄μ μ¬μ© κ°λ₯
-
- λ°μ λ¬Έμ μ : νΈλμμ μ μ© λμμ΄ λλ λΉλ§λ€ μΌμΌμ΄ νλ‘μ ν©ν 리 λΉμ μ€μ ν΄μ€μΌ νλ λ²κ±°λ‘μ
- ν΄κ²° : μ€νλ§ μ»¨ν μ΄λμ λΉ μμ± νμ²λ¦¬ κΈ°λ²μ νμ©ν΄ 컨ν μ΄λ μ΄κΈ°ν μμ μμ μλμΌλ‘ νλ‘μλ₯Ό λ§λ€μ΄μ£Όλ λ°©λ² λμ . ν΄λμ€λ₯Ό μ μ νλ κΈ°λ₯μ λ΄μ νμ₯λ ν¬μΈνΈμ»· μ¬μ©
- μ₯μ : λΆκ° κΈ°λ₯μ μ΄λμ μ μ©νλμ§μ λν μ 보λ₯Ό ν¬μΈνΈμ»·μ΄λΌλ λ 립μ μΈ μ λ³΄λ‘ μμ ν λΆλ¦¬
- κ·Έ μμ²΄λ‘ μ ν리μΌμ΄μ μ ν΅μ¬κΈ°λ₯μ λ΄κ³ μμ§λ μμ§λ§, μ ν리μΌμ΄μ μ ꡬμ±νλ μ€μν ν κ°μ§ μμμ΄κ³ , ν΅μ¬ κΈ°λ₯μ λΆκ°λμ΄ μλ―Έλ₯Ό κ°λ νΉλ³ν λͺ¨λ
- λΆκ°λ κΈ°λ₯μ μ μν μ½λμΈ
μ΄λλ°μ΄μ€+ μ΄λμ μ μ©ν μ§λ₯Ό κ²°μ νλν¬μΈνΈμ»·
-
μ ν리μΌμ΄μ ν΅μ¬κΈ°λ₯μμ λΆκ°κΈ°λ₯μ λΆλ¦¬ν΄μ μ μ€ννΈλΌλ λ νΉν λͺ¨λλ‘μ μ€κ³νκ³ κ°λ°νλ λ°©λ²
-
μ ν리μΌμ΄μ μ νΉμ ν κ΄μ μ κΈ°μ€μΌλ‘ λ°λΌλ³Ό μ μκ² ν΄μ€λ€λ μλ―Έ
μ€νλ§μ λ€μν κΈ°μ μ μ‘°ν©ν΄ AOPλ₯Ό μ§μνκ³ μλ€. κ·Έ μ€ κ°μ₯ ν΅μ¬μ νλ‘μ μ΄μ© -> νλ‘μλ‘ λ§λ€μ΄μ DIλ‘ μ°κ²°λ λΉ μ¬μ΄μ μ μ©ν΄ νκΉμ λ©μλ νΈμΆ κ³Όμ μ μ°Έμ¬ν΄μ λΆκ° κΈ°λ₯μ μ 곡ν΄μ£Όλλ‘ λ§λ¦
μ€νλ§ AOPμ λΆκ°κΈ°λ₯μ λ΄μ μ΄λλ°μ΄μ€κ° μ μ©λλ λμμ μ€λΈμ νΈμ λ©μλ. νλ‘μ λ°©μμ μ¬μ©νκΈ° λλ¬Έμ λ©μλ νΈμΆ κ³Όμ μ μ°Έμ¬ν΄μ λΆκ° κΈ°λ₯μ μ 곡ν΄μ£Όκ² λμ΄ μλ€.
μ΄λλ°μ΄μ€κ° ꡬννλ MethodInterceptor μΈν°νμ΄μ€λ λ€μ΄λλ―Ή νλ‘μμ InvocationHandlerμ λ§μ°¬κ°μ§λ‘ νλ‘μλ‘λΆν° λ©μλ μμ² μ 보λ₯Ό μ λ¬λ°μμ νκΉ μ€λΈμ νΈμ λ©μλλ₯Ό νΈμΆ.νΈμΆνλ μ νμ λ€μν λΆκ°κΈ°λ₯ μ 곡
νλ‘μ : λ 립μ μΌλ‘ κ°λ°ν λΆκ°κΈ°λ₯ λͺ¨λμ λ€μν νκΉ μ€λΈμ νΈμ λ©μλμ λ€μ΄λλ―Ήνκ² μ μ©νκΈ° μν΄ κ°μ₯ μ€μν μν
μ€νλ§ AOPλ νλ‘μ λ°©μμ AOPλΌκ³ ν μ μλ€
-
AspectJλ νλ‘μλ₯Ό μ¬μ©νμ§ μλ λνμ μΈ AOP κΈ°μ
-
νκΉ μ€λΈμ νΈλ₯Ό λ―μ΄κ³ μ³μ λΆκ°κΈ°λ₯μ μ§μ λ£μ΄μ£Όλ λ°©λ² μ¬μ©
-
μ»΄νμΌλ νκΉμ ν΄λμ€ νμΌ μ체λ₯Ό μμ νκ±°λ ν΄λμ€κ° JVMμ λ‘λ©λλ μμ μ κ°λ‘μ±μ λ°μ΄νΈμ½λλ₯Ό μ‘°μνλ λ°©λ² μ¬μ©
-
AspectJκ° μ»΄νμΌλ ν΄λμ€ νμΌ μμ /λ°μ΄νΈμ½λ μ‘°μκ°μ λ°©λ²μ μ¬μ©νλ μ΄μ
- λ°μ΄νΈμ½λλ₯Ό μ‘°μν΄μ νκΉ μ€λΈμ νΈλ₯Ό μ§μ μμ ν΄λ²λ¦¬λ©΄ DI 컨ν μ΄λμ λμμ λ°μμ μλ νλ‘μ μμ±λ°©μμ μ¬μ©νμ§ μκ³ AOP μ μ© κ°λ₯
- νλ‘μ λ°©μλ³΄λ€ ν¨μ¬ κ°λ ₯νκ³ μ μ°ν AOP κ°λ₯
- νλ‘μ AOPλ₯Ό μ μ©ν λ : λΆκ°κΈ°λ₯μ λΆμ¬ν λμμ ν΄λΌμ΄μΈνΈκ° μ§μ νΈμΆν λ μ¬μ©νλ λ©μλλ‘ μ ν
- λ°μ΄νΈμ½λλ₯Ό μ§μ μ‘°μν΄μ AOPλ₯Ό μ μ©ν λ : μ€λΈμ νΈμ μμ±, νλ κ°μ μ‘°νμ μ‘°μ, μ€νν± μ΄κΈ°ν λ± λ€μν μμ μ λΆκ°κΈ°λ₯μ λΆμ¬ κ°λ₯
λΆκ°κΈ°λ₯μ λΆμ¬ν λμ
ν΅μ¬κΈ°λ₯μ λ΄μ ν΄λμ€μΌ μ μμ§λ§ κ²½μ°μ λ°λΌ λ€λ₯Έ λΆκ°κΈ°λ₯μ μ 곡νλ νλ‘μ μ€λΈμ νΈμΌ μ μλ€
νκΉμκ² μ 곡ν λΆκ°κΈ°λ₯μ λ΄μ λͺ¨λ
μ€λΈμ νΈλ‘ μ μνκΈ°λ νμ§λ§ λ©μλ λ 벨μμ μ μν μλ μλ€
μ΄λλ°μ΄μ€κ° μ μ©λ μ μλ μμΉ
μ€νλ§μ νλ‘μ AOPμμ μ‘°μΈ ν¬μΈνΈλ λ©μλμ μ€ν λ¨κ³ λΏ
μ΄λλ°μ΄μ€λ₯Ό μ μ©ν μ‘°μΈ ν¬μΈνΈλ₯Ό μ λ³νλ μμ λλ κ·Έ κΈ°λ₯μ μ μν λͺ¨λ
μ€νλ§μ μ‘°μΈ ν¬μΈνΈλ λ©μλμ μ€νμ΄λ―λ‘ μ€νλ§μ ν¬μΈνΈμ»·μ λ©μλλ₯Ό μ μ νλ κΈ°λ₯μ κ°κ³ μλ€
ν΄λΌμ΄μΈνΈμ νκΉ μ¬μ΄μ ν¬λͺ νκ²μ‘΄μ¬νλ©΄μ λΆκ°κΈ°λ₯μ μ 곡νλ μ€λΈμ νΈ
DIλ₯Ό ν΅ν΄ νκΉ λμ ν΄λΌμ΄μΈνΈμκ² μ£Όμ λλ©°, ν΄λΌμ΄μΈνΈμ λ©μλ νΈμΆμ λμ λ°μμ νκΉμ μμν΄μ£Όλ©΄μ, κ·Έ κ³Όμ μ λΆκ°κΈ°λ₯μ λΆμ¬
ν¬μΈνΈμ»·κ³Ό μ΄λλ°μ΄μ€λ₯Ό νλμ© κ°κ³ μλ μ€λΈμ νΈ
μ€νλ§ AOPμλ§ νΉλ³νκ² μ¬μ©λλ μ©μ΄
AOPμ κΈ°λ³Έ λͺ¨λ
ν κ° λλ κ·Έ μ΄μμ ν¬μΈνΈμ»·κ³Ό μ΄λλ°μ΄μ€μ μ‘°ν©μΌλ‘ λ§λ€μ΄μ§λ©° λ³΄ν΅ μ±κΈν€ ννμ μ€λΈμ νΈλ‘ μ‘΄μ¬
μ€νλ§ AOPλ₯Ό μ μ©νκΈ° μν΄ μΆκ°νλ λΉ(ex. μ΄λλ°μ΄μ , ν¬μΈνΈμ»·, μλ νλ‘μ etc..)λ€μ λΉμ¦λμ€ λ‘μ§μ μν λΉκ³Όλ μ±κ²©μ΄ λ€λ₯΄λ€.
μ΄λ¬ν λΉλ€μ μ€νλ§ μ»¨ν μ΄λμ μν΄ μλ μΈμλμ νΉλ³ν μμ μ μν΄ μ¬μ©λ¨
- μλ νλ‘μ μμ±κΈ°
- μ€νλ§μ
DefaultAdvisorAutoProxyCreatorν΄λμ€λ₯Ό λΉμΌλ‘ λ±λ‘ - μ ν리μΌμ΄μ 컨ν μ€νΈκ° λΉ μ€λΈμ νΈλ₯Ό μμ±νλ κ³Όμ μ λΉ νμ²λ¦¬κΈ°λ‘ μ°Έμ¬
- λΉμΌλ‘ λ±λ‘λ μ΄λλ°μ΄μ λ₯Ό μ΄μ©ν΄μ νλ‘μλ₯Ό μλμΌλ‘ μμ±νλ κΈ°λ₯ λ΄λΉ
- μ€νλ§μ
- μ΄λλ°μ΄μ€
- λΆκ°κΈ°λ₯μ ꡬνν ν΄λμ€λ₯Ό λΉμΌλ‘ λ±λ‘
- ν¬μΈνΈμ»·
- μ€νλ§μ
AspectJExpressionPointcutμ λΉμΌλ‘ λ±λ‘ν΄μ μ¬μ© - μ΄λλ°μ΄μ€μ ν¬μΈνΈμ»·μ νλ‘νΌν°λ‘ μ°Έμ‘°νλ κ² μΈμλ κΈ°λ₯μ΄ μλ€
- μ€νλ§μ
π± Branch chapter06/refactor6.6μ μ€μ΅ μ μ©
π‘ νΈλμμ
λ§€λμ λ₯Ό ν΅ν΄ νΈλμμ
μ μμν λ €κ³ ν λ getTransaction()μ΄λΌλ λ©μλλ₯Ό μ¬μ©ν΄ DefaultTransactionDefinitionλ₯Ό λ°μμ€λ μ΄μ λ 무μμΌκΉ
νΈλμμ μ κ²½κ³μμ μ΄λ―Έ μ§νμ€μΈ νΈλμμ μ΄ μμ λ λλ μμ λ μ΄λ»κ² λμν κ²μΈκ°λ₯Ό κ²°μ νλ λ°©μ
-
- κ°μ₯ λ§μ΄ μ¬μ©λλ νΈλμμ μ ν μμ±
- μ§ν μ€μΈ νΈλμμ μ΄ μμΌλ©΄ μλ‘ μμνκ³ , μ΄λ―Έ μμλ νΈλμμ μ΄ μμΌλ©΄ μ΄μ μ°Έμ¬
- A, B, A->B, B->A λ€ κ°μ§μ μ‘°ν© νΈλμμ μ΄ κ°λ₯
-
DefaultTransactionDefinitionμ νΈλμμ μ ν μμ±
-
- νμ μλ‘μ΄ νΈλμμ μ μμ (λ 립μ μΈ νΈλμμ μ 보μ₯ν λ μ¬μ©)
- μμμ μμλ νΈλμμ μ΄ μλ μλ μκ΄μμ΄ μλ‘μ΄ νΈλμμ μ λ§λ€μ΄μ λ μμ μΌλ‘ λμνκ² ν¨
-
-
νΈλμμ μμ΄ λμνλλ‘ λ§λ€κ³ , μ§ν μ€μΈ νΈλμμ μ΄ μμ΄λ 무μ
-
- νκΊΌλ²μ μ μ©λλ λ§μ λ©μλ μ€μ νΉμ λ©μλλ§ νΈλμμ μ μ©μμ μ μΈνλ €λ©΄, ν¬μΈνΈμ»·μ΄ μλΉν 볡μ‘ν΄μ§ μ μλ€. νΉμ λ©μλλ₯Ό μ μΈμν¬ λ μ¬μ©νλ μμ±
-
β νΈλμμ
λ§€λμ λ₯Ό ν΅ν΄ νΈλμμ
μ μμν λ €κ³ ν λ getTransaction()μ΄λΌλ λ©μλλ₯Ό μ¬μ©νλ μ΄μ λ νΈλμμ
μ ν μμ±μ΄ μκΈ° λλ¬Έ
-
λͺ¨λ DB νΈλμμ μ 격리μμ€μ κ°μ§κ³ μμ΄μΌ νλ€
-
μ μ νκ² κ²©λ¦¬μμ€μ μ‘°μ ν΄μ κ°λ₯ν ν λ§μ νΈλμμ μ λμμ μ§νμν€λ©΄μλ λ¬Έμ κ° λ°μνμ§ μκ² νλ μ μ΄κ° νμ
-
DefaultTransactionDefinitionμ κΈ°λ³Έμ μΌλ‘ ISOLATION_DEFAULT λ‘ κ²©λ¦¬ μμ€μ΄ μ€μ λμ΄μκ³ , νΉλ³ν μμ μ μννλ λ©μλμ κ²½μ°μλ 격리 μμ€μ μ§μ ν νμκ° μλ€
- νΈλμμ μ μννλ μ νμκ° μ€μ κ°λ₯
-
DefaultTransactionDefinitionμ κΈ°λ³Έ μ€μ μ μ νμκ° μμ - μλ‘μ΄ νΈλμμ μ μμνλ PROPAGATION_REQUIRES_NEW, PROPAGATION_NOT_SUPPORTEDμ ν¨κ» μ¬μ©ν΄μΌ μλ―Έ μμ
- νΈλμμ λ΄μμ λ°μ΄ν°λ₯Ό μ‘°μνλ μλλ₯Ό λ§μμ€ μ μλ€
- λ°μ΄ν° μ‘μΈμ€ κΈ°μ μ λ°λΌμ μ±λ₯μ΄ ν₯μλ μ μλ€
λ©μλλ³λ‘ λ€λ₯Έ νΈλμμ μ μλ₯Ό μ μ©νλ €λ©΄ μ΄λλ°μ΄μ€μ κΈ°λ₯μ νμ₯ν΄μΌνλ€
μ€νλ§μλ νΈλ¦¬νκ² νΈλμμ
κ²½κ³μ€μ μ΄λλ°μ΄μ€λ‘ μ¬μ©ν μ μλλ‘ λ§λ€μ΄μ§ TransactionInterceptorκ° μ‘΄μ¬
TransactionInterceptorμ λμ λ°©μ = κΈ°μ‘΄μ TransactionAdvice + νΈλμμ
μ μλ₯Ό λ©μλ μ΄λ¦ ν¨ν΄μ μ΄μ©ν΄ μ§μ κ°λ₯
- PlatformTransactionManager
- Properties νμ
transactionAttributes : νΈλμμ
μμ±μ μ μν νλ‘νΌν°
-
TransactionDefinitionλ€ κ°μ§ κΈ°λ³Έ νλͺ© +rollbackOn() - *
rollbackOn(): μ΄λ€ μμΈκ° λ°μνλ©΄ λ‘€λ°±μ ν κ²μΈκ° κ²°μ νλ λ©μλ
-
- λ°νμ μμΈ λ°μ μ, νΈλμμ λ‘€λ°±
- μ²΄ν¬ μμΈκ° λ°μν κ²½μ°, μμΈμν©μΌλ‘ ν΄μνμ§ μκ³ μΌμ’ μ λΉμ¦λμ€ λ‘μ§μ λ°λ₯Έ μλ―Έ μλ λ¦¬ν΄ λ°©μμ ν κ°μ§λ‘ μΈμν΄ νΈλμμ 컀λ°
-
rollbackOn()μμ±μ λ¬ κΈ°λ³ΈμμΉκ³Ό νΉμ μμΈμ λ°λΌ 컀μ€ν κ°λ₯
- μ§μ νκΉμ νΈλμμ μμ± μ 보λ₯Ό κ°μ§ μ΄λ Έν μ΄μ μ§μ
- @Transactionμ νκΉ : λ©μλ & νμ
-
@Transactionμ νΈλμμ
μμ± μ λ³΄λ‘ μ¬μ©ν λ ? : @Transactionκ° λΆμ¬λ λͺ¨λ μ€λΈμ νΈλ₯Ό μλμΌλ‘ νκΉ μ€λΈμ νΈλ‘ μΈμ ->
TransactionAttributeSourcePointcutν¬μΈνΈμ»· μ¬μ© - λ©μλλ§λ€ λ€λ₯΄κ² μ€μ ν μλ μλ€
@Transaction νΈλμμ λΆκ°κΈ°λ₯ μ μ© λ¨μλ λ©μλμ΄λ©°, μ μ°ν μμ± μ μ΄κ° κ°λ₯
But, λμΌν μμ± μ 보λ₯Ό κ°μ§ μ΄λ Έν μ΄μ μ λ°λ³΅μ μΌλ‘ λ©μλλ§λ€ λΆμ¬νλ©΄ μ½λκ° μ§μ λΆν΄μ§κ³ μ€μ μ λ°
- νκΉ λ©μλ : ꡬν λ©μλ
- **νκΉ ν΄λμ€ **: ꡬν ν΄λμ€ λ΄ λͺ¨λ λ©μλ
- μ μΈ λ©μλ : μΈν°νμ΄μ€ λ©μλ
- μ μΈ νμ : μΈν°νμ΄μ€ νμ λ΄ λͺ¨λ λ©μλ
4λ¨κ³ μμλλ‘ @Transactionμ΄ μ μ©λλμ§ νμΈνκ³ κ°μ₯ λ¨Όμ λ°κ²¬λ μμ±μ 보 μ¬μ©
λκΉμ§ λ°κ²¬λμ§ μμΌλ©΄ ν΄λΉ λ©μλλ νΈλμμ μ μ©λμ X
- AOPλ₯Ό μ΄μ©ν΄ μ½λ μΈλΆμμ νΈλμμ μ κΈ°λ₯μ λΆμ¬ν΄μ£Όκ³ μμ±μ μ§μ ν μ μκ² νλ λ°©λ²
- κ°λ³ λ°μ΄ν° κΈ°μ μ νΈλμμ APIλ₯Ό μ¬μ©ν΄ μ§μ μ½λ μμμ μ¬μ©νλ λ°©λ²
- ν μ€νΈ ν΄λμ€/λ©μλμ @Transactional μ΄λ Έν μ΄μ μ λΆμ¬ν΄μ£Όλ©΄ λ§μΉ νκΉ ν΄λμ€λ μΈν°νμ΄μ€μ μ μ©λ κ²μ²λΌ ν μ€νΈ λ©μλμ νΈλμμ κ²½κ³κ° μλμΌλ‘ μ€μ
- ν
μ€νΈμ μ μ©λ @Transactional μ ν
μ€νΈκ° λλλ©΄ μλ λ‘€λ°±λλ€
- κ°μ λ‘€λ°±μ΄ μλ λ©μλ ν μ€νΈ λ΄μ©μ΄ DBμ λ°μνκ³ μΆλ€λ©΄ @Rollback μ΄μ©
- λ©μλ λ λ²¨μ΄ μλ ν΄λμ€ λ 벨μμ λΆμ¬νλ λ‘€λ°± μμ± μ§μ μ @TransactionConfiguration