2023. 1. 16. 10:54γJAVA/Effective JAVA
item05. μμμ μ§μ λͺ μνμ§ λ§κ³ μμ‘΄κ°μ²΄μ£Όμ μ μ¬μ©νλΌ.
" p30. μμ‘΄ κ°μ²΄κ° λ§μ κ²½μ°μ Dagger, Guice, μ€νλ§ κ°μ μμ‘΄ κ°μ²΄ μ£Όμ νλ μμν¬ λμ μ κ³ λ €ν μ μλ€."
μ€νλ§ IoC (Inversion Of Control)
: BeanFactory, ApplicationContext
μ μ΄μ μμ μ΄λ μ°μ μκΈ° μ½λμ λν μ μ΄κΆμ μκΈ° μμ μ΄ κ°μ§κ³ μμ§ μκ³ μΈλΆμμ μ μ΄νλ κ²½μ°λ₯Ό λ§νλ€.
λνμ μΈ μλ‘ μ€νλ§μ΄ μλλ° μ€νλ§ μ ν리μΌμ΄μ μμλ λΉμ μμ±κ³Ό μμ‘΄ κ΄κ³ μ€μ , μ¬μ©, μ κ±° λ±μ μμ μ μ ν리μΌμ΄μ μ½λ λμ μ€νλ§ μ»¨ν μ΄λκ° λ΄λΉνλ€.
-> μ΄λ₯Ό μ€νλ§ μ»¨ν μ΄λκ° μ½λ λμ μ€λΈμ νΈμ λν μ μ΄κΆμ κ°κ³ μλ€κ³ ν΄μ IoCλΌκ³ νλ€.
SpellChecker
public class SpellChecker
{
private Dictionary dictionary;
public SpellChecker(Dictionary dictionary)
{
this.dictionary = dictionary;
}
public boolean isValid(String word)
{
return dictionary.contains(word);
}
public List<String> suggestions(String typo)
{
return dictionary.closeWordsTo(typo);
}
}
SpringDictionary
public class SpringDictionary implements Dictionary
{
@Override
public boolean contains(String word)
{
System.out.println("contains.word = " + word);
return false;
}
@Override
public List<String> closeWordsTo(String typo)
{
return null;
}
}
-> SpellCheckerμ SpringDictionaryλ 보면 Spring IoCλ₯Ό μ¬μ©νλ€κ³ ν΄μ μ€νλ§ μ½λκ° μ¬μ©λμ§ μλ κ²μ νμΈν μ μλ€.
μ΄κ±΄ μ€νλ§μ μ² ν? λλ¬ΈμΈλ° μ€νλ§μ non-invasiveλΌκ³ ν΄μ λΉμΉ¨ν¬μ μΈ μ½λλ₯Ό μ§ν₯νλλ° μ΄λ μ€νλ§μ μ½λλ₯Ό λ ΈμΆνμ§ μμΌλ©΄μλ μ€νλ§μ΄ μ 곡νλ κΈ°λ₯μ μ¬μ©ν μ μλλ‘ μ§μνλ€.
AppConfig
@Configuration
public class AppConfig
{
@Bean
public SpellChecker spellChecker(Dictionary dictionary)
{
return new SpellChecker(dictionary);
}
@Bean
public Dictionary dictionary()
{
return new SpringDictionary();
}
}
κ·Έλ¦¬κ³ @Configurationμ΄λΌλ κ³³μμ μ¬μ©νκ³ μ νλ κ°μ²΄λ₯Ό λΉ(Bean: μ€νλ§μμ κ΄λ¦¬νλ κ°μ²΄) μΌλ‘ λ±λ‘ν΄μ£Όκ³ , μμ‘΄κ΄κ³λ₯Ό μ€μ ν΄μ£Όλ©΄ λλ€.
μ¬μ© μ½λ
public static void main(String[] args)
{
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
SpellChecker spellChecker = applicationContext.getBean(SpellChecker.class); // μ±κΈν€
spellChecker.isValid("test");
}
μ€νλ§ IoC (Inversion Of Control) 컨ν μ΄λ μ₯μ
- μλ§μ κ°λ°μμκ² κ²μ¦λμμΌλ©° μλ° νμ€ μ€ν© (@Inject)λ μ§μνλ€.
μ€νλ§ IoCμ²λΌ μ§μ μ°λ¦¬λ κ°λ°ν μ μμ§λ§ μ€νλ§ IoC 컨ν μ΄λλ₯Ό μ¬μ©νλ©΄ μ’μ μ μ μ°μ μ§μμ μΌλ‘ κ΄λ¦¬κ° λκ³ μμΌλ©°, κ°μ λκ³ μκ³ , κΈ°λ₯μ΄ μ μ μΆκ°λκ³ μλ μ΄ μ€ν μμ€λ₯Ό μ¬μ©νλ©΄ μ°λ¦¬κ° κ΅³μ΄ λ§λ€ νμ μμ΄ μ€νλ§μ μ¬μ©νλ©΄ λλ€λ νΈλ¦¬ν¨μ΄ μλ€.
- μμ½κ² μ±κΈν€ scopeλ₯Ό μ¬μ©ν μ μλ€.
μ±κΈν€ scopeλ₯Ό λ§λ€μ΄μ μ¬μ©νκΈ° νΈλ¦¬νλ€. (μ€νλ§ μ»¨ν μ΄λ λ΄λΆμμ λ³λ€λ₯Έ μ₯μΉ μμ΄ μ±κΈν€ κ°λ₯)
- κ°μ²΄ μμ±(Bean) κ΄λ ¨ λΌμ΄νμ¬μ΄ν΄ μΈν°νμ΄μ€λ₯Ό μ 곡νλ€.
λΉ μμ± λ° μλ©Έκ³Ό κ°μ λΌμ΄νμ¬μ΄ν΄μ μ€νλ§μ΄ κ΄λ¦¬ν΄μ€λ€. (ex. μ€νλ§ AOP: λΌμ΄ν μ¬μ΄ν΄μ κ΄λ¦¬νλ©΄μ aop κΈ°λ₯μ μ 곡ν΄μ€)