β "μ¬κΈ° λ΄κ° κ°μ§κ³ μλ Beanλ€μ΄ μμ΄ !!" νκ³ μλ €μ£Όλ κ²
π‘ μ€μ νμΌ
μ°λ¦¬κ° μ¬μ©νλ λΉλ€μ μ 보μ μμ‘΄μ± μ λ³΄κ° μ΄λ»κ² μ΄λ£¨μ΄μ Έ μλμ§ μ°μ¬μλ νμΌ
β μ€νλ§ μ»¨ν μ΄λνν "μλ€κ° μ¬μ©ν Beanλ€μ΄μΌ !!" νκ³ μλ €μ£Όλ κ²
//μΈμ€ν΄μ€ν ν λ @Configuration //ν΄λμ€λͺ μ μ΄κ±Έ μ°κ³ public class DependencyConfig { @Bean //ν΄λΉ ν΄λμ€ λ΄μ λ©μλλͺ μλ μ΄κ±° μ public MyService myService() { return new MyServiceImpl(); } }
π‘ XML μ€μ λ°©μ
<beans> <bean id="myService" class="com.acme.services.MyServiceImpl"/> </beans>
(μ λν μ΄μ μ μ΄μ©ν΄ Config ν΄λμ€ μ€μ νλ λ°©λ²)
ApplicationContext
ꡬν λ°©λ²βοΈ @Configuration ν΄λμ€
β ν΄λμ€ μμ @Configuration
κ° μ
λ ₯λλ©΄, μ΄ μ λν
μ΄μ
μ΄ λΆμ κ·Έ ν΄λμ€ μμ²΄κ° BeanDefinitionμΌλ‘ λ±λ‘λκ³ , ν΄λμ€ λ΄μμ μ μΈλ λͺ¨λ @Bean
μ΄ λΆμ λ©μλλ€λ Bean μ μλ‘ λ±λ‘λ¨
( @Configuration μ λν
μ΄μ
λ ctrl+B ν΄μ 보면, @Configuate μ ν°ν
μ΄μ
μ΄ λ¬λ €μμ΄ κ·Έ κ°μ²΄ λν BeanμΌλ‘ μλ μ μλ¨ )
Ex.
public static void main(String[] args) { ApplicationContext a = new AnnotationConfigApplicationContext(DependencyConfig.class); ToDo todo = a.getBean(Todo.class); todo.doStuff(); }
βμ μμμμλ @Configuration ν΄λμ€(DependencyConfig.class)λ₯Ό νλΌλ―Έν°μ μ λ ₯ν¨μΌλ‘μ¨ μ¬μ©νκ³ μμ
βοΈ @Component ν΄λμ€
βοΈ JSR-330 λ©νλ°μ΄ν°
-> @Component
κ° λΆμ ν΄λμ€μ JSR-330
ν΄λμ€κ° μ 곡λλ©΄ BeanDefinitionμΌλ‘ λ±λ‘λ¨
( νμν κ²½μ° ν΄λΉ ν΄λμ€ λ΄μμ @Autowired
/@Inject
μ κ°μ DI λ©νλ°μ΄ν°κ° μ¬μ©λλ κ²μΌλ‘ κ°μ )
Ex.
public static void main(String[] args) { ApplicationContext a = new AnnotationConfigApplicationContext(ToDoImpl.class, Dependency1.class, Dependency2.class); ToDo todo = a.getBean(ToDo.class); todo.doStuff(); }
β @Component/JSR-330 μ£Όμμ΄ λ¬λ¦° ν΄λμ€λ μμ±μμ μ λ ₯μΌλ‘ μ¬μ©
( ToDoImpl/Dependency1/Dependency2μ μ€νλ§ μμ‘΄μ± μ£Όμ μ λν μ΄μ @Autowired
λ₯Ό μ¬μ©ν¨ )
λ©μλ λ 벨 μ λν μ΄μ ( λ©μλμ λΆμ΄λ μ λν μ΄μ )
XMLμ μμ μ 곡νλ μΌλΆ μμ±μ μ§μ
( @Beanμ΄ XMLμ μ μ§μ μ μΈ μ μ¬μ²΄λΌμ )
- init-method
[μ°Έκ³ ] https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-factory-lifecycle-initializingbean
β - destroy-method
[μ°Έκ³ ] https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-factory-lifecycle-disposablebean
β - autowiring
[μ°Έκ³ ] https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-factory-autowire
β - name.
@Configuration
-annoted / @Component
-annoted ν΄λμ€μμ μ¬μ© κ°λ₯
( @Configuration
/@Component
κ° λΆμ ν΄λμ€ λ΄μμ μ¬μ© κ°λ₯ )
@Beanμ μ§μ μ μνλ κ²λ κ°λ₯
( But, μ΄λ κ°μμ±μ μ νν¨ β¬οΈ )
π‘ XML μ¬μ© λ°©μ
<beans> <bean id="transferService" class="com.acme.TransferServiceImpl"/> </beans>
β μ λν
μ΄μ
μ¬μ© λ°©μκ³Ό XML λ°©μ λͺ¨λ ApplicationContext
λ΄μμ transferService
λ₯Ό μ¬μ© κ°λ₯νκ² ν¨
βοΈ κΈ°λ³Έ λ©μλ μ¬μ©νμ¬ λΉ μ μνλ λ°©μ
β κΈ°λ³Έ λ©μλμμ λΉ(Bean) μ μκ° μλ μΈν°νμ΄μ€λ₯Ό ꡬννμ¬ Bean configuration μ€μ κ°λ₯public interface BaseConfig { @Bean default TransferServiceImpl transferService() { return new TransferServiceImpl(); } } @Configuration public class DependencyConfig implements BaseConfig { //μ¬κΈ°μ μΈν°νμ΄μ€ ꡬν }
@Bean
-annotated λ©μλλ ν΄λΉ beanμ ꡬμΆνλλ° νμν μμ‘΄μ±μ μ€λͺ
νλ λ§€κ° λ³μλ₯Ό κ°μ§ μ μμ
-> μ΄ νλΌλ―Έν°λ‘ μμ‘΄μ±μ ꡬ체νμν¬ μ μμ
@Configuration
public class DependencyConfig {
@Bean
public TransferService transferService(AccountRepository accountRepository) {
// μ΄ λΆλΆμμ 맀κ°λ³μ μ¬μ© μ€
return new TransferServiceImpl(accountRepository);
}
}
@Configuration
ν΄λΉ κ°μ²΄κ° bean definitionsμ μμ€μμ λνλ΄λ μ λν μ΄μ
@Bean
-annoted λ©μλλ₯Ό ν΅ν΄ beanμ μ μΈ
μ΄ @Configuration
-annoted ν΄λμ€μ @Bean
λ©μλμ λν νΈμΆμ μ¬μ©νμ¬ bean μ¬μ΄μ μμ‘΄μ±μ μ μν μλ μμ
@Bean
-annoted λ©μλκ° @Configuration
ν΄λμ€ λ΄μ μ μΈλ κ²½μ°μλ§ μλ )@Component
ν΄λμ€μλ μ¬μ© λΆκ° )Ex.
@Configuration public class AppConfig { @Bean public BeanOne beanOne() { return new BeanOne(beanTwo()); //μλμ μ μν beanμ μ£Όμ } @Bean public BeanTwo beanTwo() { return new BeanTwo(); } }
β
beanOne
μ μμ±μ μ£Όμ μ ν΅ν΄beenTwo
μ λν μ°Έμ‘°λ₯Ό λ°μ
@Configuration
public class DependencyConfig {
@Bean
public MemberService memberService1() {
MemberServiceImpl memberService = new MemberServiceImpl();
memberService.setMemberHyunju(memberHyunju()); //μ¬κΈ° 1
return memberService;
}
@Bean
public MemberService memberService2() {
MemberServiceImpl memberService = new MemberServiceImpl();
memberService.setMemberHyunju(memberHyunju()); //μ¬κΈ° 2
return memberService;
}
@Bean
public MemberHyunju memberHyunju() {
return new MemberHyunjuImpl();
}
}
μ μμμμ, memberHyunju()
κ° memberService1()
μ memberService2()
μμ κ°κ° νλ²μ© νΈμΆλμ΄ 2λ² λΆλ¦¬κ³ μμ
μ΄ λ©μλλ MemberHyunjuImpl
μ μ μΈμ€ν΄μ€λ₯Ό λ§λ€κ³ μ΄λ₯Ό λ°ννλ―λ‘, μΌλ°μ μΌλ‘ λ κ°μ μΈμ€ν΄μ€(κ° μλΉμ€λ§λ€ νλμ©)κ° μμ΄μΌ ν¨
But, μ¬κΈ°μ λ¬Έμ κ° μμ
Springμ μΈμ€ν΄μ€νλ λΉμ κΈ°λ³Έμ μΌλ‘ μ±κΈν€ λ²μλ₯Ό κ°μ Έ νλ²λ§ μ¬μ©λμ΄μΌ νλλ°,
μ μμλ ν κ°μ²΄κ° λ κ³³μμ λΆλ¦¬κ³ μμ
λͺ¨λ @Configurationλ€μ μμνμλ§μ CGLIB
λ₯Ό μ¬μ©νμ¬ νμλΆλ₯ λ¨
κ·Έ νμ ν΄λμ€μμ μμ λ©μλλ λΆλͺ¨ λ©μλλ₯Ό νΈμΆνκ³ μ μΈμ€ν΄μ€λ₯Ό μμ±νκΈ° μ μ, λ¨Όμ 컨ν μ΄λμ μΊμλ(λ²μ μ§μ λ) beanλ€μ΄ μλμ§ νμΈν¨
π‘ CGLIB (Code Generator Libray)
ν΄λμ€μ λ°μ΄νΈ μ½λλ₯Ό μ‘°μνμ¬ νλ‘μ κ°μ²΄λ₯Ό μμ±ν΄ μ£Όλ λΌμ΄λΈλ¬λ¦¬
π‘ νλ‘μ κ°μ²΄ (Proxy)
νΉμ κ°μ²΄λ₯Ό κ°μΈ νλ‘νΌν° μ½κΈ°, μ°κΈ°μ κ°μ κ°μ²΄μ κ°ν΄μ§λ μμ μ μ€κ°μμ κ°λ‘μ±λ κ°μ²΄
@Import
ꡬμ±μ λͺ¨λννλλ° μ¬μ©
( like. XML νμΌ λ΄μμ μμκ° μ¬μ©λλ κ² )
λ€λ₯Έ κ΅¬μ± ν΄λμ€(configuration ν΄λμ€)μμ @Bean definitionsλ₯Ό κ°μ Έμ¬ μ μκ² ν¨
@Configuration
public class ConfigA {
@Bean
public A a() {
return new A();
}
}
@Configuration
@Import(ConfigA.class) //μ¬κΈ°
public class ConfigB {
@Bean
public B b() {
return new B();
}
}
β μμ κ°μ΄ 컨ν
μ€νΈλ₯Ό μΈμ€ν΄νΈνν λ ConfigA.class
μ ConfigB.class
λ₯Ό λ λ€ μ§μ νμ¬ κ΅¬μ²΄νν νμμμ΄, μλμ κ°μ΄ ConfigB
λ§ μ 곡νμ¬ κ΅¬μ²΄ν νλ©΄ λ¨
public static void main(String[] args) {
ApplicationContext ctx = new AnnotationConfigApplicationContext(ConfigB.class);
// now both beans A and B will be available...
A a = ctx.getBean(A.class);
B b = ctx.getBean(B.class);
}
β ctxμ Import(ConfigA.class) λ°μ ConfigB.class μ¬μ©μΌλ‘ μΈν΄ ctx.getBean(A.class)
κ° κ°λ₯ν΄μ§
β 컨ν
μ΄λ μΈμ€ν΄νΈνλ₯Ό λ¨μνν μ μμ
( @Configuration
μ΄ μ κ·Ό λ°©μ μμ±νλ λμ νλμ ν΄λμ€λ§ μ²λ¦¬νλ©΄ λκΈ° λλ¬Έμ )
μ€μ λ‘ μ¬μ©λ λ, λΉμ 1κ°μ ꡬμ±νμΌλ§ @Import λ°μ§ μκ³ , μ¬λ¬ κ΅¬μ± ν΄λμ€κ°μ κ±Έμ³ μλ‘ μμ‘΄μ± κ°μ§
XMLμ μ¬μ©ν λλ μ»΄νμΌλ¬κ° κ΄μ¬νμ§ μμ 컨ν μ΄λ μ΄κΈ°ν μ€μ ref=βsome Beanβμ μ μΈνμ¬ μ€νλ§μΌλ‘ ν΄κ²°ν μ μμ΄ λ¬Έμ κ° λμ§ μμ
@Configuration
ν΄λμ€λ₯Ό μ¬μ©ν λ, μλ° μ»΄νμΌλ¬λ κ΅¬μ± λͺ¨λΈμ μ μ½μ λκ³ , λ€λ₯Έ λΉμ λν μ°Έμ‘°λ μ ν¨ν μλ° κ΅¬λ¬Έμ΄μ΄μΌ ν¨
π‘ μ΄μ ν΄κ²°λ°©λ²
1. @Bean λ©μλμ λΉ μμ‘΄μ±μ μ€λͺ νλ μμμ κ°μμ νλΌλ―Έν°λ£κΈ°
2. @Autowired / @Value μ£Όμ λλ λ€λ₯Έ beanκ³Ό λμΌν κΈ°λ₯μ μ¬μ©νκΈ°
( λ¨, @Configurationμ μμ±μ μ£Όμ μ μ€νλ§ νλ μμν¬ 4.3μμλ§ μ§μ )
( λμ λΉμ΄ νλμ μμ±μλ§ μ μνλ κ²½μ° @Autowired μ§μ ν νμκ° μμ (νλλ§ μμΌλκΉ μλμΌλ‘ μ§μ λ¨))
β μλλ‘ μμ±ν΄ λμ κ² μ°Έκ³ !!
BeanμΌλ‘ λ±λ‘λ μ€λΉκ° λ ν΄λμ€λ€μ μ€μΊνμ¬, μ€νλ§ λΉμΌλ‘ μλ λ±λ‘ν΄μ£Όλ κ²
( μ§κΈκΉμ§λ μλ° μ½λμ @Bean or XMLμ λ±μ μ€μ μ 보μ λ±λ‘ν μ€νλ§ λΉλ€μ μ§μ μμ±νκ³ μμ‘΄ κ΄κ³λ λͺ
μνμμ )
β @Controller
, @Service
, @Component
, @Repository
μ λ
Έν
μ΄μ
μ λΆμΈ ν΄λμ€λ€μ΄ λΉμΌλ‘ λ±λ‘ λ μ€λΉλ₯Ό ν κ²
Component Scanμ κΈ°λ³Έμ μΌλ‘ @Component μ λ Έν μ΄μ μ λΉ λ±λ‘ λμμΌλ‘ ν¬ν¨ν¨
β
βοΈ κ·Έλ λ€λ©΄ @Controller / @Service λ μ΄λ»κ² μΈμν κΉ?
β μ΄ λ μ λν μ΄μ λ ctrl+B νλ©΄ @Component μ λν μ΄μ μ΄ λΆμ΄μκΈ° λλ¬Έμ μλμΌλ‘ ν¬ν¨λλ€ !
β
π‘ DependencyConfigμ λΉκ΅νλ€λ©΄, μλ @BeanμΌλ‘ λ±λ‘ν ν΄λμ€κ° μμ
@ComponentScan
μ λν
μ΄μ
μ μ ν리μΌμ΄μ
μ΄ λ§¨ μ²μ μμ±λ λ μλμΌλ‘ λΆμ΄μκΈ° λλ¬Έμ λ°λ‘ μ°μ§ μμλ λ¨
βοΈ
@Configuration
μ΄ λΆμ μ€μ νμΌλ μ€νλ§ λΉμΌλ‘ μλ λ±λ‘λ¨
β @Configurationμ ctrl + B ν΄λ³΄λ©΄, μ΄ μ λν μ΄μ μ체μ @Component μ λν μ΄μ μ΄ λΆμ΄μκΈ° λλ¬Έ !
basePackageλ₯Ό μ€μ ν΄μΌν¨
@Autowired
μ λν
μ΄μ
μΌλ‘ μ΄λμ μμ‘΄κ΄κ³λ₯Ό μ£Όμ
ν μ§ μ νλ©΄ μμ‘΄κ΄κ³ λν μλμΌλ‘ μ
λ ₯ν΄μ€
( @ComponentScan
& @Component
λ§ μ¬μ©νμ λμ, μμ‘΄μ± κ΄λ¦¬νλ DependencyConfig
ν΄λμ€μ μ΄λ€ μμ‘΄ κ°μ²΄λ₯Ό μ£Όμ
ν μ§ λͺ
μν΄μ£Όμ§ μκΈ° λλ¬Έμ @Autowired
κΌ λΆμ¬μ£ΌκΈ° )
βοΈ DependencyConfig λ±μ
@Configuration
μ€μ μ΄ λ νμΌμ΄ μμ μ μλ μ½λ μΆκ°νμ¬ ComponentScanμ Fliter μ¬μ© κ°λ₯
@ComponentScan(excludeFilters = @Filter(type = FilterType.ANNOTATION, classes = Configuration.class))
1. Java νμΌ μμμ μ€μ νλ λ°©λ²
@Configuration
@ComponentScan(basePackages = "com.rcod.lifelog")
public class ApplicationConfig {
}
β @Configuration
- μ΄ ν΄λμ€κ° XMLμ λ체νλ μ€μ νμΌμμ μλ €μ£Όμ΄ ν΄λΉ ν΄λμ€λ₯Ό μ€μ νμΌλ‘ μ€μ
β @ComponentScan
- basePackages μ€μ ν΄μ€
( μ΄λ₯Ό μ¬μ©νμ§ μμΌλ©΄, λΉμΌλ‘ μ€μ ν ν΄λμ€λ€μ μ§μ XML νμΌμ μΌμΌμ΄ λ±λ‘ν΄μ£Όμ΄μΌ ν¨ )
βοΈ basePackages
- νμν ν¨ν€μ§μ μμ μμΉλ₯Ό μ§μ νκ³ , ν΄λΉ ν¨ν€μ§λΆν° νμ ν¨ν€μ§ λͺ¨λ νμν¨
- @ComponentScan()μ 맀κ°λ³μλ‘ basePackages = ββλ₯Ό μ€ μ μμ
- μ§μ νμ§ μμΌλ©΄, @ComponentScanμ΄ λΆμ μ€μ μ 보 ν΄λμ€μ ν¨ν€μ§κ° μμ μμΉκ° λ¨
- μ€μ μ 보 ν΄λμ€μ μμΉλ₯Ό νλ‘μ νΈ μ΅μλ¨μ λκ³ ν¨ν€μ§ μμΉλ μ§μ νμ§ μλ λ°©λ²μ΄ κ°μ₯ νΈν μ μμ
( μ€νλ§ λΆνΈλ₯Ό μ¬μ©νλ©΄ @SpringBootApplication λ₯Ό μ΄ νλ‘μ νΈ μμ λ£¨νΈ μμΉμ λλ κ²μ μΆμ² )- γ @SpringBootApplicationμ @ComponentScanμ΄ λ€μ΄μμ
2. XML λ°©μμ Component Scan
<beans>
<context:component-scan base-package="com.acme"/>
</beans>
@Component
β μ»΄ν¬λνΈ μ€μΊμμ μ¬μ©
@Controller / @RestController
β μ€νλ§ MVC λ° REST μ μ© μ»¨νΈλ‘€λ¬μμ μ¬μ©
@Service
β μ€νλ§ λΉμ¦λμ€ λ‘μ§μμ μ¬μ©
β νΉλ³ν μ²λ¦¬λ₯Ό νμ§ μμ
β κ°λ°μλ€μ΄ ν΅μ¬ λΉμ¦λμ€ λ‘μ§μ΄ μ¬κΈ°μ μλ€λ λΉμ¦λμ€ κ³μΈ΅μ μΈμνλλ° λμμ΄ λ¨
@Repository
β μ€νλ§ λ°μ΄ν° μ κ·Ό κ³μΈ΅μμ μ¬μ©
β μ€νλ§ λ°μ΄ν° μ κ·Ό κ³μΈ΅μΌλ‘ μΈμνκ³ , λ°μ΄ν° κ³μΈ΅μ μμΈλ₯Ό μ€νλ§ μμΈλ‘ λ³ν
@Configuration
β μ€νλ§ μ€μ μ 보μμ μ¬μ©
β μ€νλ§ μ€μ μ λ³΄λ‘ μΈμνκ³ , μ€νλ§ λΉμ΄ μ±κΈν€μ μ μ§νλλ‘ μΆκ° μ²λ¦¬ ν¨
( ctrl + B ν΄λ³΄λ©΄, ν΄λΉ ν΄λμ€μ μμ€ μ½λμλ @Componentλ₯Ό ν¬ν¨νκ³ μμ )
includeFilters
β μ»΄ν¬λνΈ μ€μΊ λμμ μΆκ°λ‘ μ§μ
excludeFilters
β μ»΄ν¬λνΈ μ€μΊμμ μ μΈν λμμ μ§μ
βοΈ FilterType μ΅μ
- ANNOTATION
β κΈ°λ³Έκ°, μ λν μ΄μ μΌλ‘ μΈμν΄μ λμ- ASSIGNABLE_TYPE
β μ§μ ν νμ κ³Ό μμ νμ μ μΈμν΄μ λμ- ASPECTJ
β AspectJ ν¨ν΄ μ¬μ©- REGEX
β μ κ· ννμμ λνλ- CUSTOM
β TypeFilterλΌλ μΈν°νμ΄μ€λ₯Ό ꡬνν΄μ μ²λ¦¬
1. ConfigurationClassParser κ° Configuration ν΄λμ€λ₯Ό νμ±
( @Configuration μ΄λ
Έν
μ΄μ
ν΄λμ€λ₯Ό νμ±νλ κ² )
2. ComponentScan μ€μ μ νμ±
( base-package μ μ€μ ν ν¨ν€μ§λ₯Ό κΈ°μ€μΌλ‘
ComponentScanAnnotationParserκ° μ€μΊνκΈ° μν μ€μ μ νμ± )
3. base-package μ€μ μ λ°νμΌλ‘ λͺ¨λ ν΄λμ€λ₯Ό λ‘λ©
4. ClassLoaderκ° λ‘λ©ν ν΄λμ€λ€μ BeanDefinitionμΌλ‘ μ μ
( μμ±ν λΉμ λν μ μλ₯Ό νλ κ² ).
5. μμ±ν λΉμ λν μ μλ₯Ό ν λλ‘ λΉμ μμ±
[μ°Έκ³ ] https://jess-m.tistory.com/m/14
1. μμ±μ μ£Όμ
@Autowired
λ₯Ό νλ©΄ μ€νλ§ μ»¨ν
μ΄λμ @Component
λ‘ λ±λ‘λ λΉμμ μμ±μμ νμν λΉλ€μ μ£Όμ
νΉμ§
- μμ±μ νΈμΆ μμ μ λ± 1λ²λ§ νΈμΆλλ κ²μ΄ 보μ₯
( μμ±μκ° 1κ°λ§ μ‘΄μ¬νλ κ²½μ°μλ@Autowired
λ₯Ό μλ΅ν΄λ μλ μ£Όμ )- λΆλ³κ³Ό νμ μμ‘΄ κ΄κ³μ μ¬μ©
- μμ±κ³Ό λμμ λ°λ‘ μμ‘΄κ΄κ³λ₯Ό μ£Όμ νκΈ° λλ¬Έμ
NullPointerException
μ λ°©μ§- μ£Όμ λ°μ νλλ₯Ό
final
λ‘ μ μΈ κ°λ₯
μμ±μκ° 1κ°μΌ λ @Autowired μμ΄λ μλλλ μ΄μ
μ€νλ§μ΄ ν΄λΉ ν΄λμ€ κ°μ²΄λ₯Ό μμ±νμ¬ λΉμ λ£μ΄μΌνλλ°, μμ±ν λ μμ±μλ₯Ό λΆλ₯Ό μ λ°μ μμ -> λΉμ λ±λ‘ν¨λ μ μμ‘΄ κ΄κ³λ μλμΌλ‘ μ£Όμ λλ κ²
2. μμ μ μ£Όμ (setter μ£Όμ )
setter
λ₯Ό ν΅ν΄ μμ‘΄κ΄κ³ μ£Όμ
νΉμ§
- μ νκ³Ό λ³κ²½ κ°λ₯μ±μ΄ μλ μμ‘΄ κ΄κ³μ μ¬μ©
- μλ°λΉ νλ‘νΌν° κ·μ½μ μμ μ λ©μλ λ°©μμ μ¬μ©νλ λ°©λ²
βοΈ μμ±μ μ£Όμ κ³Όμ μ°¨μ΄μ
μμ±μ λμ setνλλͺ λ©μλλ₯Ό μμ±νμ¬ μμ‘΄ κ΄κ³ μ£Όμ
λ°νμ μμ μ κ°μ²΄λ₯Ό κ»΄μΌνλ κ²½μ°μ μ¬μ©
(But, μμ£Ό λλ¬Όμ΄μ λ³λ‘ μ¬μ© X)
@Autowiredλ₯Ό μ λ ₯νμ§ μμΌλ©΄ μ€νμ΄ μλ¨
λ©μλλ₯Ό publicμΌλ‘ μ΄μ΄λμ΄ λ³κ²½μ΄ κ°λ₯ ( λΆλ³ X )
Ex.
@Component
public class CoffeeService {
private final MemberRepository memberRepository;
private final CoffeeRepository coffeeRepository;
@Autowired
public void setMemberRepository(MemberRepository memberRepository) { //setνλλͺ
//μλ λΉμΌλ‘ λ±λ‘λλ κ²μ΄ μλ (@componentλ₯Ό λ¬μμΌ λΉμ΄ λ¨)
//μλ κ·Έλ₯ λ¨μνκ² μ»¨ν
μ΄λκ° μμ‘΄κ΄κ³λ₯Ό μ΄μ΄μ£Όλ μν λ§ ν¨
this.memberRepository = memberRepository;
}
@Autowired
public void setCoffeeRepository(CoffeeRepository coffeeRepository) { //setνλλͺ
this.coffeeRepository = coffeeRepository;
}
}
3. νλ μ£Όμ
νΉμ§
- μ½λκ° κ°κ²°ν΄μ μμ μ λ§μ΄ μ¬μ©λ λ°©μμ΄μ§λ§, μΈλΆμμ λ³κ²½μ΄ λΆκ°λ₯νμ¬ ν μ€νΈνκΈ° νλ€λ€λ λ¨μ μ‘΄μ¬
- DI νλ μμν¬κ° μμΌλ©΄ μ무κ²λ ν μ μμ
- μ€μ μ½λμ μκ΄ μλ νΉμ ν μ€νΈλ₯Ό νκ³ μΆμ λ μ¬μ©ν μ μμ
( But, μ μμ μΌλ‘ μλλκ² νλ €λ©΄ κ²°κ΅ setterκ° νμ -> μμ μ μ£Όμ μ μ¬μ©νλκ² λ νΈλ¦¬ )
π‘ μμ±μκ° 1κ°μΌ λ @Autowired μμ΄λ μλλλ μ΄μ
μ€νλ§μ΄ ν΄λΉ ν΄λμ€ κ°μ²΄λ₯Ό μμ±νμ¬ λΉμ λ£μ΄μΌνλλ°, μμ±ν λ μμ±μλ₯Ό λΆλ₯Ό μ λ°μ μμ -> λΉμ λ±λ‘νλ©΄μ μμ‘΄ κ΄κ³λ μλμΌλ‘ μ£Όμ λλ κ²
4. μΌλ° λ©μλ μ£Όμ
νΉμ§
- νλ²μ μ¬λ¬ νλλ₯Ό μ£Όμ λ°μ μ μμ
- μΌλ°μ μΌλ‘ μ¬μ©λμ§ μμ
@Autowiredλ§ μ¬μ©ν λ, required μ΅μ κΈ°λ³Έκ°μΈ trueκ° μ¬μ©λμ΄ μλ μ£Όμ λμμ΄ μμΌλ©΄ μ€λ₯κ° λ°μνλ κ²½μ°
μ€νλ§ λΉμ μ΅μ λνκ² ν΄λ μνμμ λ±λ‘μ΄ λμ§ μκ³ , κΈ°λ³Έ λ‘μ§μΌλ‘ λμνκ² νλ κ²½μ°
@Autowired(required=false)
μλ μ£Όμ
ν λμμ΄ μμΌλ©΄ μμ μ λ©μλ μμ²΄κ° νΈμΆλμ§ μκ² λ¨
org.springframework.lang.@Nullable
μλ μ£Όμ
ν λμμ΄ μμΌλ©΄ nullμ΄ μ
λ ₯λ¨
Optional<>
μλ μ£Όμ
ν λμμ΄ μμΌλ©΄ Optional.emptyκ° μ
λ ₯λ¨
1. λΆλ³
2. λλ½
3. final ν€μλ μ¬μ© κ°λ₯
java: variable (λ°μ΄ν° μ΄λ¦) might not have been initialized
λΌλ μ€λ₯ νμΈ κ°λ₯4. μν μ°Έμ‘°
BeanCurrentlyInCreationException
λ°μβοΈ μμ±μ μ£Όμ λ°©μμ μ₯μ μμ½
- μμ‘΄κ΄κ³ μ€μ μ΄ λμ§ μμΌλ©΄ κ°μ²΄μμ±μ΄ λΆκ°λ₯
- μ»΄νμΌ νμμ μΈμ§κ° κ°λ₯
- NPE μλ¬ λ°©μ§κ° κ°λ₯
- μμ‘΄μ± μ£Όμ μ΄ νμν νλλ₯Ό final λ‘ μ μΈ κ°λ₯
- (μ€νλ§μμ) μνμ°Έμ‘° κ°μ§κ° κ°λ₯
( μν μ°Έμ‘° μ μ±κ΅¬λμ΄ μ€ν¨νκ² λ¨ )- ν μ€νΈ μ½λ μμ± μ©μ΄
- μμ μ μ£Όμ μ΄ νμν κ²½μ°κ° μμ μ μμ§λ§ μ΅μ μ΄ νμν λλ§ μ ννλ©΄ λ¨
β μλλ‘ μμ±ν΄ λμ κ² μ°Έκ³ !
β μλλ‘ μμ±ν΄ λμ κ² μ°Έκ³ !
β μλλ‘ μμ±ν΄ λμ κ² μ°Έκ³ !
μΌμ
μμ§κΉμ§λ λ무 μΆμμ μ΄λΌ μ μ΄ν΄κ° μκ°λ λΆλΆμ΄ μ¬λ¬κ΅°λ° μλ€
λκ° μ§μ ν΄λ΄μΌ μ΄ν΄κ° μ λ κ² κ°μλ° λͺλͺ λνμ μΈ λΆλΆλ§ μ΄ν΄κ° κ°κ³ μμ§ μμΈν λΆλΆλ€μ μ λͺ¨λ₯΄κ² μ΄μ μμΌλ‘ μ€μ΅ λ§μ΄ νλ©΄μ μμ£Ό λ€μ λ€μ¬λ€ λ΄μΌκ² λ€γ
γ