๐ ์ค๋ ๋ฐฐ์ด ๋ด์ฉ!
- Java ๊ธฐ๋ฐ ์ปจํ ์ด๋(Container) ์ค์
- ์ปดํฌ๋ํธ ์ค์บ (Component Scan)
- ์์กด๊ด๊ณ ์ฃผ์ ๋ฐฉ๋ฒ
โ๏ธ Java ๊ธฐ๋ฐ ์ปจํ ์ด๋(Container) ์ค์
โ ์ค์ ์ ๋ํ ์ด์
โ๏ธ @Configuration
- ์ค์ ํ์ผ์ ํด๋์ค ๋ ๋ฒจ์์๋ง ์ฌ์ฉ
( ์ฐ๋ฆฌ๊ฐ ์์ฑํ ๊ฐ์ฒด ํด๋์ค ์์ ์์ฑ )
โ "์ฌ๊ธฐ ๋ด๊ฐ ๊ฐ์ง๊ณ ์๋ Bean๋ค์ด ์์ด !!" ํ๊ณ ์๋ ค์ฃผ๋ ๊ฒ
๐ก ์ค์ ํ์ผ
์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ๋ ๋น๋ค์ ์ ๋ณด์ ์์กด์ฑ ์ ๋ณด๊ฐ ์ด๋ป๊ฒ ์ด๋ฃจ์ด์ ธ ์๋์ง ์ฐ์ฌ์๋ ํ์ผ
- ํด๋์ค ๋ ๋ฒจ์์๋ง ์ฌ์ฉ
โ๏ธ @Bean
- ์ค์ ํ์ผ ๋ด์ ๋ฉ์๋ ๋ ๋ฒจ์์๋ง ์ฌ์ฉ
( ๊ฐ์ฒด ํด๋์ค ๋ด๋ถ์ ์์ฑ์(๋ฉ์๋) ์์ ์์ฑ )
โ ๋ฉ์๋๊ฐ Spring ์ปจํ ์ด๋์์ ๊ด๋ฆฌํ ์ ๊ฐ์ฒด๋ฅผ ์ธ์คํด์คํ, ๊ตฌ์ฑ ๋ฐ ์ด๊ธฐํํ๋ค๋ ๊ฒ์ ๋ํ๋ด๋ ๋ฐ ์ฌ์ฉ
โ ์คํ๋ง ์ปจํ ์ด๋ํํ "์๋ค๊ฐ ์ฌ์ฉํ Bean๋ค์ด์ผ !!" ํ๊ณ ์๋ ค์ฃผ๋ ๊ฒ
//์ธ์คํด์คํ ํ ๋
@Configuration //ํด๋์ค๋ช
์ ์ด๊ฑธ ์ฐ๊ณ
public class DependencyConfig {
@Bean //ํด๋น ํด๋์ค ๋ด์ ๋ฉ์๋๋ช
์๋ ์ด๊ฑฐ ์
public MyService myService() {
return new MyServiceImpl();
}
}
๐ก XML ์ค์ ๋ฐฉ์
<beans>
<bean id="myService" class="com.acme.services.MyServiceImpl"/>
</beans>
โ AnnotationConfigApplicationContext ์ฌ์ฉํ์ฌ ์คํ๋ง ์ปจํ ์ด๋๋ฅผ ์ธ์คํด์คํ
(์ ๋ํ ์ด์ ์ ์ด์ฉํด Config ํด๋์ค ์ค์ ํ๋ ๋ฐฉ๋ฒ)
ApplicationContext
๊ตฌํ ๋ฐฉ๋ฒ
โ ์๋์ ๊ฐ์ ์ ๋ํ ์ด์ ์ด ๋ฌ๋ฆฐ ํด๋์ค๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ ๋ฐ์
1. โ๏ธ @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)๋ฅผ ํ๋ผ๋ฏธํฐ์ ์
๋ ฅํจ์ผ๋ก์จ ์ฌ์ฉํ๊ณ ์์
2. โ๏ธ @Component ํด๋์ค
3. โ๏ธ 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๋ฅผ ์ฌ์ฉํจ )
โ @Bean ์ ๋ํ ์ด์ ์ฌ์ฉํ๊ธฐ
โ๏ธ @Bean
- ๋ฉ์๋ ๋ ๋ฒจ ์ ๋ํ ์ด์ ( ๋ฉ์๋์ ๋ถ์ด๋ ์ ๋ํ ์ด์ )
- 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 ์์กด์ฑ
@Bean
-annotated ๋ฉ์๋๋ ํด๋น bean์ ๊ตฌ์ถํ๋๋ฐ ํ์ํ ์์กด์ฑ์ ์ค๋ช
ํ๋ ๋งค๊ฐ ๋ณ์๋ฅผ ๊ฐ์ง ์ ์์
โ ์ด ํ๋ผ๋ฏธํฐ๋ก ์์กด์ฑ์ ๊ตฌ์ฒดํ์ํฌ ์ ์์
@Configuration
public class DependencyConfig {
@Bean
public TransferService transferService(AccountRepository accountRepository) {
// ์ด ๋ถ๋ถ์์ ๋งค๊ฐ๋ณ์ ์ฌ์ฉ ์ค
return new TransferServiceImpl(accountRepository);
}
}
โ @Configuration ์ ๋ํ ์ด์ ์ฌ์ฉํ๊ธฐ
@Configuration
- ํด๋น ๊ฐ์ฒด๊ฐ bean definitions์ ์์ค์์ ๋ํ๋ด๋ ์ ๋ํ ์ด์
@Bean
-annoted ๋ฉ์๋๋ฅผ ํตํด bean์ ์ ์ธ- ์ด
@Configuration
-annoted ํด๋์ค์@Bean
๋ฉ์๋์ ๋ํ ํธ์ถ์ ์ฌ์ฉํ์ฌ bean ์ฌ์ด์ ์์กด์ฑ์ ์ ์ํ ์๋ ์์
โ๏ธ Bean ๊ฐ ์์กด์ฑ ์ฃผ์
- ์์ฑ์ ์ฃผ์
์ ํตํด ์ฐธ์กฐ
( But, ์ด ๋ฐฉ์์@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์ ๋ํ ์ฐธ์กฐ๋ฅผ ๋ฐ์
โ๏ธ Java ๊ธฐ๋ฐ ์ค์ ํ๊ฒฝ์์ ๋ด๋ถ์ ์ผ๋ก ์๋ํ๋ ๋ฐฉ์
@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
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
์ด ์ ๊ทผ ๋ฐฉ์ ์์ฑํ๋ ๋์ ํ๋์ ํด๋์ค๋ง ์ฒ๋ฆฌํ๋ฉด ๋๊ธฐ ๋๋ฌธ์ )
โ๏ธ Imported @Bean Definitions์ ์์กด์ฑ ์ฃผ์ ์ ๋ฌธ์ ์
- ์ค์ ๋ก ์ฌ์ฉ๋ ๋, ๋น์ 1๊ฐ์ ๊ตฌ์ฑํ์ผ๋ง @Import ๋ฐ์ง ์๊ณ , ์ฌ๋ฌ ๊ตฌ์ฑ ํด๋์ค๊ฐ์ ๊ฑธ์ณ ์๋ก ์์กด์ฑ ๊ฐ์ง
XML์ ์ฌ์ฉํ ๋๋ ์ปดํ์ผ๋ฌ๊ฐ ๊ด์ฌํ์ง ์์ ์ปจํ ์ด๋ ์ด๊ธฐํ ์ค์ ref=”some Bean”์ ์ ์ธํ์ฌ ์คํ๋ง์ผ๋ก ํด๊ฒฐํ ์ ์์ด ๋ฌธ์ ๊ฐ ๋์ง ์์
@Configuration
ํด๋์ค๋ฅผ ์ฌ์ฉํ ๋, ์๋ฐ ์ปดํ์ผ๋ฌ๋ ๊ตฌ์ฑ ๋ชจ๋ธ์ ์ ์ฝ์ ๋๊ณ , ๋ค๋ฅธ ๋น์ ๋ํ ์ฐธ์กฐ๋ ์ ํจํ ์๋ฐ ๊ตฌ๋ฌธ์ด์ด์ผ ํจ
๐ก ์ด์ ํด๊ฒฐ๋ฐฉ๋ฒ
1. @Bean ๋ฉ์๋์ ๋น ์์กด์ฑ์ ์ค๋ช ํ๋ ์์์ ๊ฐ์์ ํ๋ผ๋ฏธํฐ๋ฃ๊ธฐ
2. @Autowired / @Value ์ฃผ์ ๋๋ ๋ค๋ฅธ bean๊ณผ ๋์ผํ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ธฐ
( ๋จ, @Configuration์ ์์ฑ์ ์ฃผ์ ์ ์คํ๋ง ํ๋ ์์ํฌ 4.3์์๋ง ์ง์ )
( ๋์ ๋น์ด ํ๋์ ์์ฑ์๋ง ์ ์ํ๋ ๊ฒฝ์ฐ @Autowired ์ง์ ํ ํ์๊ฐ ์์ (ํ๋๋ง ์์ผ๋๊น ์๋์ผ๋ก ์ง์ ๋จ))
โ๏ธ ์์กด๊ด๊ณ ํธ์ถ ์์ ์์
โ ์๋๋ก ์์ฑํด ๋์ ๊ฒ ์ฐธ๊ณ !!
โ๏ธ Component Scan
- 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))
โ Component Scan ์ฌ์ฉ ๋ฐฉ๋ฒ
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 Scan ๊ธฐ๋ณธ ๋์
- @Component
โ ์ปดํฌ๋ํธ ์ค์บ์์ ์ฌ์ฉ - @Controller / @RestController
โ ์คํ๋ง MVC ๋ฐ REST ์ ์ฉ ์ปจํธ๋กค๋ฌ์์ ์ฌ์ฉ - @Service
โ ์คํ๋ง ๋น์ฆ๋์ค ๋ก์ง์์ ์ฌ์ฉ
โ ํน๋ณํ ์ฒ๋ฆฌ๋ฅผ ํ์ง ์์
โ ๊ฐ๋ฐ์๋ค์ด ํต์ฌ ๋น์ฆ๋์ค ๋ก์ง์ด ์ฌ๊ธฐ์ ์๋ค๋ ๋น์ฆ๋์ค ๊ณ์ธต์ ์ธ์ํ๋๋ฐ ๋์์ด ๋จ - @Repository
โ ์คํ๋ง ๋ฐ์ดํฐ ์ ๊ทผ ๊ณ์ธต์์ ์ฌ์ฉ
โ ์คํ๋ง ๋ฐ์ดํฐ ์ ๊ทผ ๊ณ์ธต์ผ๋ก ์ธ์ํ๊ณ , ๋ฐ์ดํฐ ๊ณ์ธต์ ์์ธ๋ฅผ ์คํ๋ง ์์ธ๋ก ๋ณํ - @Configuration
โ ์คํ๋ง ์ค์ ์ ๋ณด์์ ์ฌ์ฉ
โ ์คํ๋ง ์ค์ ์ ๋ณด๋ก ์ธ์ํ๊ณ , ์คํ๋ง ๋น์ด ์ฑ๊ธํค์ ์ ์งํ๋๋ก ์ถ๊ฐ ์ฒ๋ฆฌ ํจ
( ctrl + B ํด๋ณด๋ฉด, ํด๋น ํด๋์ค์ ์์ค ์ฝ๋์๋ @Component๋ฅผ ํฌํจํ๊ณ ์์ )
โ๏ธ ํํฐ
- includeFilters
โ ์ปดํฌ๋ํธ ์ค์บ ๋์์ ์ถ๊ฐ๋ก ์ง์ - excludeFilters
โ ์ปดํฌ๋ํธ ์ค์บ์์ ์ ์ธํ ๋์์ ์ง์
โ๏ธ FilterType ์ต์
- ANNOTATION
โ ๊ธฐ๋ณธ๊ฐ, ์ ๋ํ ์ด์ ์ผ๋ก ์ธ์ํด์ ๋์- ASSIGNABLE_TYPE
โ ์ง์ ํ ํ์ ๊ณผ ์์ ํ์ ์ ์ธ์ํด์ ๋์- ASPECTJ
โ AspectJ ํจํด ์ฌ์ฉ- REGEX
โ ์ ๊ท ํํ์์ ๋ํ๋- CUSTOM
โ TypeFilter๋ผ๋ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํด์ ์ฒ๋ฆฌ
โ Component Scan ๋์ ๊ณผ์
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. ํ๋ ์ฃผ์
- ํ๋์ @Autowired ๋ถ์ฌ์ ๋ฐ๋ก ์ฃผ์
ํ๋ ๋ฐฉ๋ฒ
( ์์ฆ ์์ ์ฌ์ฉ X )
โ๏ธ ํน์ง
- ์ฝ๋๊ฐ ๊ฐ๊ฒฐํด์ ์์ ์ ๋ง์ด ์ฌ์ฉ๋ ๋ฐฉ์์ด์ง๋ง, ์ธ๋ถ์์ ๋ณ๊ฒฝ์ด ๋ถ๊ฐ๋ฅํ์ฌ ํ ์คํธํ๊ธฐ ํ๋ค๋ค๋ ๋จ์ ์กด์ฌ
- DI ํ๋ ์์ํฌ๊ฐ ์์ผ๋ฉด ์๋ฌด๊ฒ๋ ํ ์ ์์
- ์ค์ ์ฝ๋์ ์๊ด ์๋ ํน์ ํ ์คํธ๋ฅผ ํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ ์ ์์
( But, ์ ์์ ์ผ๋ก ์๋๋๊ฒ ํ๋ ค๋ฉด ๊ฒฐ๊ตญ setter๊ฐ ํ์ -> ์์ ์ ์ฃผ์ ์ ์ฌ์ฉํ๋๊ฒ ๋ ํธ๋ฆฌ )
๐ก ์์ฑ์๊ฐ 1๊ฐ์ผ ๋ @Autowired ์์ด๋ ์๋๋๋ ์ด์
- ์คํ๋ง์ด ํด๋น ํด๋์ค ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ ๋น์ ๋ฃ์ด์ผํ๋๋ฐ, ์์ฑํ ๋ ์์ฑ์๋ฅผ ๋ถ๋ฅผ ์ ๋ฐ์ ์์ -> ๋น์ ๋ฑ๋กํ๋ฉด์ ์์กด ๊ด๊ณ๋ ์๋์ผ๋ก ์ฃผ์ ๋๋ ๊ฒ
4. ์ผ๋ฐ ๋ฉ์๋ ์ฃผ์
- ์ผ๋ฐ ๋ฉ์๋๋ฅผ ์ฌ์ฉํด ์ฃผ์
ํ๋ ๋ฐฉ๋ฒ
( ์์ฆ ์์ ์ฌ์ฉ X )
โ๏ธ ํน์ง
- ํ๋ฒ์ ์ฌ๋ฌ ํ๋๋ฅผ ์ฃผ์ ๋ฐ์ ์ ์์
- ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋์ง ์์
โ๏ธ ์ต์ ์ฒ๋ฆฌ
- ์ฃผ์
ํ ์คํ๋ง ๋น์ด ์์ ๋ ๋์ํด์ผ ํ๋ ๊ฒฝ์ฐ์, ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์๋๋ก ๋์์ด ์๋ค๋ ๊ฒ์ ํํํ๊ธฐ ์ํด ์ฒ๋ฆฌ ํ๋ ๊ฒ
- @Autowired๋ง ์ฌ์ฉํ ๋, required ์ต์ ๊ธฐ๋ณธ๊ฐ์ธ true๊ฐ ์ฌ์ฉ๋์ด ์๋ ์ฃผ์ ๋์์ด ์์ผ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ๊ฒฝ์ฐ
- ์คํ๋ง ๋น์ ์ต์
๋ํ๊ฒ ํด๋ ์ํ์์ ๋ฑ๋ก์ด ๋์ง ์๊ณ , ๊ธฐ๋ณธ ๋ก์ง์ผ๋ก ๋์ํ๊ฒ ํ๋ ๊ฒฝ์ฐ
โ๏ธ ์๋ ์ฃผ์ ๋์ ์ต์ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ
@Autowired(required=false)
์๋ ์ฃผ์ ํ ๋์์ด ์์ผ๋ฉด ์์ ์ ๋ฉ์๋ ์์ฒด๊ฐ ํธ์ถ๋์ง ์๊ฒ ๋จorg.springframework.lang.@Nullable
์๋ ์ฃผ์ ํ ๋์์ด ์์ผ๋ฉด null์ด ์ ๋ ฅ๋จOptional<>
์๋ ์ฃผ์ ํ ๋์์ด ์์ผ๋ฉด Optional.empty๊ฐ ์ ๋ ฅ๋จ
โ๏ธ ์์ฑ์ ์ฃผ์ ์ฌ์ฉ ์ด์
1. ๋ถ๋ณ
- ์ ํ๋ฆฌ์ผ์ด์
์ด ์คํ๋ ๋ ์ ํด์ ธ์ ์ข
๋ฃ ์ ๊น์ง ๋ณ๊ฒฝ๋์ง ์์
( ๋ณ๊ฒฝ๋์ด์๋ ์๋จ )
โ ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ ์ต์ด 1๋ฒ๋ง ํธ์ถ๋๊ณ ๊ทธ ์ดํ์๋ ๋ค์ ํธ์ถ๋๋ ์ผ์ด ์๊ธฐ ๋๋ฌธ์ ๋ถ๋ณํ๊ฒ ์ค๊ณ ๊ฐ๋ฅํ ๊ฒ
2. ๋๋ฝ
- ํธ์ถํ ๋, ์์กด ๊ด๊ฒ ์ฃผ์ ์ด ๋๋ฝ๋๋ฉด NPE(Null Point Exception) ๋ฐ์
- ์์ฑ์ ์ฃผ์
์ฌ์ฉํ๋ฉด, ์ฃผ์
๋ฐ์ดํฐ ๋๋ฝ ์ ์ปดํ์ผ ์ค๋ฅ ๋ฐ์
3. final ํค์๋ ์ฌ์ฉ ๊ฐ๋ฅ
- ํ๋์ fainal ํค์๋ ์ฌ์ฉ ๊ฐ๋ฅ
- ์์ฑ์์์ ๊ฐ์ด ์ค์ ๋์ง ์์ผ๋ฉด ์ปดํ์ผ ์์ ์์
java: variable (๋ฐ์ดํฐ ์ด๋ฆ) might not have been initialized
๋ผ๋ ์ค๋ฅ ํ์ธ ๊ฐ๋ฅ
( ์์ฑ์ ์ฃผ์ ์ธ ๋๋จธ์ง ๋ฐฉ์์ ์์ฑ์ ์ดํ์ ํธ์ถ๋๋ ํํ์ด๊ธฐ์ final ํค์๋ ์ฌ์ฉ ๋ถ๊ฐ )
4. ์ํ ์ฐธ์กฐ
- ์ํ ์ฐธ์กฐ ๋ฐฉ์ง
- ํ๋ ์ฃผ์
๊ณผ ์์ ์ ์ฃผ์
์ ๋น์ด ์์ฑ๋ ํ์ ์ฐธ์กฐํ๊ธฐ ๋๋์ ์ ํ๋ฆฌ์ผ์ด์
์ด ์ด๋ ํ ์ค๋ฅ/๊ฒฝ๊ณ ์์ด ๊ตฌ๋๋จ
( ์ค์ ์ฝ๋ ํธ์ถ๋ ๋๊น์ง ๋ฌธ์ ์ ์ ์์ ) - ์์ฑ์๋ฅผ ํตํด ์ฃผ์
ํ๊ฒ ๋๋ฉด
BeanCurrentlyInCreationException
๋ฐ์
โ๏ธ ์์ฑ์ ์ฃผ์ ๋ฐฉ์์ ์ฅ์ ์์ฝ
- ์์กด๊ด๊ณ ์ค์ ์ด ๋์ง ์์ผ๋ฉด ๊ฐ์ฒด์์ฑ์ด ๋ถ๊ฐ๋ฅ
- ์ปดํ์ผ ํ์์ ์ธ์ง๊ฐ ๊ฐ๋ฅ
- NPE ์๋ฌ ๋ฐฉ์ง๊ฐ ๊ฐ๋ฅ
- ์์กด์ฑ ์ฃผ์ ์ด ํ์ํ ํ๋๋ฅผ final ๋ก ์ ์ธ ๊ฐ๋ฅ
- (์คํ๋ง์์) ์ํ์ฐธ์กฐ ๊ฐ์ง๊ฐ ๊ฐ๋ฅ
( ์ํ ์ฐธ์กฐ ์ ์ฑ๊ตฌ๋์ด ์คํจํ๊ฒ ๋จ )- ํ ์คํธ ์ฝ๋ ์์ฑ ์ฉ์ด
- ์์ ์ ์ฃผ์ ์ด ํ์ํ ๊ฒฝ์ฐ๊ฐ ์์ ์ ์์ง๋ง ์ต์ ์ด ํ์ํ ๋๋ง ์ ํํ๋ฉด ๋จ
๐ผ ์์กด๋ฐฉ์ ๋ณ๊ฒฝ ์์
โ ์๋๋ก ์์ฑํด ๋์ ๊ฒ ์ฐธ๊ณ !
๐ผ ์ปดํฌ๋ํธ ์ค์บ ์์
โ ์๋๋ก ์์ฑํด ๋์ ๊ฒ ์ฐธ๊ณ !
๐ผ BeanDefinition ์์
โ ์๋๋ก ์์ฑํด ๋์ ๊ฒ ์ฐธ๊ณ !
๐ ๋๋์
์ผ์
์์ง๊น์ง๋ ๋๋ฌด ์ถ์์ ์ด๋ผ ์ ์ดํด๊ฐ ์๊ฐ๋ ๋ถ๋ถ์ด ์ฌ๋ฌ๊ตฐ๋ฐ ์๋ค
๋ญ๊ฐ ์ง์ ํด๋ด์ผ ์ดํด๊ฐ ์ ๋ ๊ฒ ๊ฐ์๋ฐ ๋ช๋ช ๋ํ์ ์ธ ๋ถ๋ถ๋ง ์ดํด๊ฐ ๊ฐ๊ณ ์์ง ์์ธํ ๋ถ๋ถ๋ค์ ์ ๋ชจ๋ฅด๊ฒ ์ด์ ์์ผ๋ก ์ค์ต ๋ง์ด ํ๋ฉด์ ์์ฃผ ๋ค์ ๋ค์ฌ๋ค ๋ด์ผ๊ฒ ๋คใ
ใ
( ๋ณธ ๊ฒ์๋ฌผ์ 2022/10/14์ ์์ฑํ ๊ธ์ ์ฎ๊ธด ๊ธ์ ๋๋ค. ์๋ฌธ์ ์๊ธฐ์ ์์! )
'โข CodeStates BootCamp > Section 2' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๐ [Section2] ์ด์ ๊ฐ๋ ํ๊ณ ๐ฅ (0) | 2023.04.09 |
---|---|
๐ [Section2] 20. AOP (Aspect-Oriented Programming) (0) | 2023.04.09 |
๐ [Section2] 18. DI (Dependency Injection) 1 (0) | 2023.04.09 |
๐ [Section2] 17. Spring Framework ๊ธฐ๋ณธ 2 (0) | 2023.04.09 |
๐ [Section2] 16. Spring Framework ๊ธฐ๋ณธ 1 (0) | 2023.04.09 |