2022. 2. 4. 00:33ใBackend/๐ฟ Spring
๊น์ํ ๊ฐ์ฌ๋์ ์คํ๋ง ํต์ฌ ์๋ฆฌ - ๊ธฐ๋ณธํธ ์๊ฐ ํ ์ ๋ฆฌํ ํฌ์คํ ์ ๋๋ค.
1. ์คํ๋ง ์ปจํ ์ด๋ ์์ฑ
ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
ApplicationContext ๋ฅผ ์คํ๋ง ์ปจํ ์ด๋๋ผ ๋ถ๋ฅธ๋ค.
๊ธฐ์กด์๋ ๊ฐ๋ฐ์๊ฐ AppConfig(์์) class ๋ฅผ ์ฌ์ฉํ์ฌ ์ง์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ DI ๊น์ง ํ์ง๋ง, ApplicationContext ๋ฅผ ํตํด ์คํ๋ง ์ปจํ ์ด๋๋ก ์คํ๋ง ๋น ๊ฐ์ฒด๋ฅผ ์ฐพ๊ณ DI ๊น์ง ํ๋ค.
์ ์ฝ๋์์ AnnotationConfigApplicationContext() ๋ผ๋ ๊ตฌํ์ฒด๋ฅผ ํตํด ์คํ๋ง ์ปจํ
์ด๋๋ฅผ ๋ง๋ค๊ณ , ์ปจํ
์ด๋๋ฅผ ์์ฑํ ๋๋ ๊ตฌ์ฑ ์ ๋ณด
๋ฅผ ์ง์ ํด์ฃผ์ด์ผํ๋ค. ์ฌ๊ธฐ์๋ AppConfig.class ๋ฅผ ๊ตฌ์ฑ์ ๋ณด๋ก ์ง์ ํ๋ค.
์ ์ AppConfig.class ๋ฅผ ์ดํด๋ณด์
@Bean ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํด ๋น์ผ๋ก ๋ฑ๋กํ ๊ฐ์ฒด๋ฅผ ํ์ํ๊ณ ์๋ค. ์คํ๋ง ์ปจํ ์ด๋์ ๊ตฌ์ฑ์ ๋ณด๋ก AppConfig.class ๋ฅผ ์ง์ ํ๋ฉด, @Bean ์ผ๋ก ์ง์ ๋ ๊ฐ์ฒด๋ค์ด ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋ก๋๋ค.
@Configuration
public class AppConfig {
@Bean
public MemberService memberService() {
return new MemberServiceImpl(memberRepository());
}
@Bean
public OrderService orderService() {
return new OrderServiceImpl(memberRepository(), discountPolicy());
}
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
@Bean
public DiscountPolicy discountPolicy() {
return new RateDiscountPolicy();
}
}
์คํ๋ง ๋น์ ๋ฌด์์ธ๊ฐ?
Spring Container ๊ฐ ๊ด๋ฆฌํ๋ ์๋ฐ ๊ฐ์ฒด๋ฅผ Bean ์ด๋ผ ๋ถ๋ฅธ๋ค.
์ ์ฝ๋์์ AnnotationConfigApplicationContext() ๋ผ๋ ๊ตฌํ์ฒด๋ฅผ ํตํด ์คํ๋ง ์ปจํ ์ด๋๋ฅผ ๋ง๋ ๋ค.
2. ์คํ๋ง ๋น ์กฐํ
์ ๊ทธ๋ฆผ์์ ๋น ์ด๋ฆ์ ์๋ก ๋ค๋ฅธ 4๊ฐ์ง ๋น์ด ๋ฑ๋ก๋ ๊ฒ์ ๋ณผ ์ ์๋ค. ๊ฐ๊ฐ์ ๋น์ ํ์ ์ MemberService, OrderService, MemberRepository, DiscountPolicy ์ด๋ค. ๋ง์ฝ ์ด๋ฆ์ ๋ค๋ฅด์ง๋ง ๋์ผํ ํ์ ์ ๋น์ด ๋ฑ๋ก๋๋ฉด ์ด๋ป๊ฒ ๋ ๊น?
NoUniqueBeanDefinitionException
์ด๋ผ๋ ์์ธ๊ฐ ๋ฐ์ํ๋ค. ๊ทธ๋ ๋ค๋ฉด ๋์ผํ ํ์
์ ๋น์ 2๊ฐ ์ด์ ์กด์ฌํ ์ ์๋ ๊ฒ์ผ๊น?
๊ทธ๋ ์ง ์๋ค. ์ ๊ทธ๋ฆผ์์ ๋น ์ด๋ฆ ์ปฌ๋ผ์ด ์๋ฏ์ด, ๊ฐ์์ ๋น์ ์๋ก ๋ค๋ฅธ ๊ฐ์ฒด
์ด๊ธฐ์ ์ด๋ฆ์ ์ง์ ํ์ฌ ๊ฐ๋ณ๋ก ์กด์ฌํ ์ ์๋ค.
3. ์คํ๋ง ๋น ์์ ๊ด๊ณ
์คํ๋ง์์ ๋ถ๋ชจํ์ ์ผ๋ก ๋น์ ์กฐํํ๋ฉด ์์ ํ์ ๋ ํจ๊ป ์กฐํ๋๋ค.
๊ทธ๋์ ๋ชจ๋ ์๋ฐ ๊ฐ์ฒด์ ์ต๊ณ ๋ถ๋ชจ์ธ Object ํ์ ์ผ๋ก ์กฐํํ๋ฉด, ๋ชจ๋ ์คํ๋ง ๋น์ ์กฐํํ๋ค.
public class ApplicationContextExtendsFindTest {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(TestConfig.class);
@Test
@DisplayName("๋ถ๋ชจ ํ์
์ผ๋ก ์กฐํ์, ์์์ด ๋ ์ด์ ์์ผ๋ฉด, ์ค๋ณต ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค")
void findBeanByParentTypeDuplicate(){
Assertions.assertThrows(NoUniqueBeanDefinitionException.class, () -> ac.getBean(DiscountPolicy.class));
}
@Test
@DisplayName("๋ถ๋ชจ ํ์
์ผ๋ก ์กฐํ์, ์์์ด ๋ ์ด์ ์์ผ๋ฉด, ๋น ์ด๋ฆ์ ์ง์ ํ๋ฉด ๋๋ค.")
void findBeanByParentTypeBeanName(){
RateDiscountPolicy rateDiscountPolicy = ac.getBean("rateDiscountPolicy", RateDiscountPolicy.class);
assertThat(rateDiscountPolicy).isInstanceOf(RateDiscountPolicy.class);
}
@Test
@DisplayName("๋ถ๋ชจ ํ์
์ผ๋ก ๋ชจ๋ ์กฐํํ๊ธฐ")
void findAllBeanByParentType() {
Map<String, DiscountPolicy> beansOfType = ac.getBeansOfType(DiscountPolicy.class);
assertThat(beansOfType.size()).isEqualTo(2);
// ์ค์ ํ
์คํธ์ฝ๋ ์์ฑํ ๋๋ ์ด๋ ๊ฒ ๋ฐ๋ณต๋ฌธ์ด๋ println ์ ๋จ๊ฒจ๋๋ ๊ฒ์ ์ ์ ํ์ง ์๋ค. ํ
์คํธ ์์คํ
์ด ํ๋ณํ๊ฒ ํด์ผํ์ง, ์๋ ๊ฐ์ ๋ฐ๋ณต๋ฌธ์ ์ฌ๋์ ๋์ผ๋ก ํ์ธํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ.
for (String key : beansOfType.keySet()) {
System.out.println("key = " + key + " value = " + beansOfType.get(key));
}
}
@Test
@DisplayName("๋ถ๋ชจ ํ์
์ผ๋ก ๋ชจ๋ ์กฐํํ๊ธฐ - Object")
void findAllBeanByObjectType() {
Map<String, Object> beansOfType = ac.getBeansOfType(Object.class);
for (String key : beansOfType.keySet()) {
System.out.println("key = " + key + " value = " + beansOfType.get(key));
}
// ์์์ ํ
์คํธํ ๋น์ ๋ฌผ๋ก , spring ์ ์๋ ๋น๊น์ง ๋ชจ๋ ํ์ด๋์จ๋ค. => java ๋ ๋ชจ๋ ๊ฒ Object ๋ฅผ ์์๋ฐ๊ธฐ ๋๋ฌธ.
}
// AppConfig.class ์์ ๋์ , ์์ config ํด๋์ค ์์ฑ
@Configuration
static class TestConfig {
@Bean
public DiscountPolicy rateDiscountPolicy() {
return new RateDiscountPolicy();
}
@Bean
public DiscountPolicy fixDiscountPolicy() {
return new FixDiscountPolicy();
}
}
}
์ค์ ์ดํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ ๋, ์ด๋ฐ ์์ผ๋ก ApplicationContext ๋ก ๋น์ ์กฐํํ ์ผ์ ๊ฑฐ์ ์์ง๋ง, ๋ถ๋ชจ ํ์ ์ผ๋ก ์กฐํํ ๋ ์ด๋๊น์ง ์กฐํ๋๋์ง ๋ฑ์ ๋ด์ฉ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์์งํด์ผ ํ๋ ๊ฐ๋ ์ด๋ค.
4. BeanFactory ์ ApplicationContext
์์ ApplicationContext ๊ฐ ์คํ๋ง ์ปจํ ์ด๋๋ผ ์๊ฐํ๋๋ฐ, ApplicationContext ๋ ๊ฒฐ๊ตญ์ ์ธํฐํ์ด์ค๋ฉฐ ๋์์ BeanFactory ๋ผ๋ ์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ๊ณ ์๋ค.
[ BeanFactory ]
์คํ๋ง ์ปจํ
์ด๋์ ์ต์์ ์ธํฐํ์ด์ค๋ค.
์คํ๋ง ๋น์ ๊ด๋ฆฌํ๊ณ ์กฐํํ๋ ์ญํ ์ ๋ด๋นํ๋ค. ( getBean() ์ ์ ๊ณต )
์ง๊ธ๊น์ง ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ๋ ๋๋ถ๋ถ์ ๊ธฐ๋ฅ์ BeanFactory๊ฐ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ด๋ค.
BeanFactory ๋ฅผ ์ง์ ์ฌ์ฉํ ์ผ์ ๊ฑฐ์ ์๊ณ , ๋์ ๋ถ๊ฐ๊ธฐ๋ฅ์ด ํฌํจ๋ ApplicationContext ๋ฅผ ์ฌ์ฉํ๋ค.
[ ApplicationContext ]
BeanFactory ๊ธฐ๋ฅ์ ๋ชจ๋ ์์๋ฐ์์ ์ ๊ณตํ๋ค.
๋น์ ๊ด๋ฆฌํ๊ณ ๊ฒ์ํ๋ ๊ธฐ๋ฅ์ BeanFactory๊ฐ ์ ๊ณตํด์ฃผ๋๋ฐ, ๊ทธ๋ฌ๋ฉด ๋์ ์ฐจ์ด๊ฐ ๋ญ๊น?
์ ํ๋ฆฌ์ผ์ด์
์ ๊ฐ๋ฐํ ๋๋ ๋น์ ๊ด๋ฆฌํ๊ณ ์กฐํํ๋ ๊ธฐ๋ฅ์ ๋ฌผ๋ก ์ด๊ณ , ์ ๋ง์ ๋ถ๊ฐ๊ธฐ๋ฅ์ด ํ์ํ๋ค.
๊ทธ ์ค์๋ ๋ฉ์์ง ์์ค๋ฅผ ํ์ฉํ ๊ตญ์ ํ ๊ธฐ๋ฅ
, ํ๊ฒฝ๋ณ์
, ์ดํ๋ฆฌ์ผ์ด์
์ด๋ฒคํธ
, ํธ๋ฆฌํ ๋ฆฌ์์ค ์กฐํ
๋ฑ์ ๋ค์ํ ๋ถ๊ฐ๊ธฐ๋ฅ์ด ์กด์ฌํ๋ค.
BeanFactory ๋ ApplicationContext ๋ชจ๋ ์คํ๋ง ์ปจํ ์ด๋๋ผ ๋ถ๋ฅธ๋ค.
5. ์คํ๋ง ๋น ์ค์ ๋ฉํ ์ ๋ณด - BeanDefinition
์คํ๋ง์ ์ค์ ํ์์๋ xml ํ์ผ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ๊ณผ ๋์์ ์๋ฐ ์ฝ๋๋ฅผ ์ด์ฉํ๋ ๋ฐฉ์์ด ์กด์ฌํ๋ค.
์ด๋ป๊ฒ ์ด๋ฐ ๋ค์ํ ์ค์ ํ์์ ์ง์ํ ์ ์์๊น? ๊ทธ ์ค์ฌ์๋ BeanDefinition ์ด๋ผ๋ ์ถ์ํ๊ฐ ์กด์ฌํ๋ค.
์ฆ ์ญํ ๊ณผ ๊ตฌํ์ ๊ฐ๋ ์ ์ผ๋ก ๋๋ ๊ฒ์ด๋ค.
Annotated ๋ผ๋ ๋ถ๋ถ์, ์ด๋ ธํ ์ด์ ์ ํตํด ๋น์ ์์ฑํ ๊ฒ์ผ๋ก @Bean ์ ์ฌ์ฉํ ๊ฒ์ด๋ผ ์๊ฐํ๋ฉด ๋๋ค.
๊ทธ ๋ค์์ ๋์ค๋ Xml ๋ถ๋ถ์ Xml ํ์ผ๋ก ์คํ๋ง ๋น์ ์ค์ ํ ํ์์ ๋ํ๋ธ๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก ์๋ก์ด ํ์์ ์ค์ ์ ๋ณด๊ฐ ์ถ๊ฐ๋๋ฉด(์ด๋ ธํ ์ด์ ๋, xml ๋ ์๋) XxxBeanDefinitionReader ๋ฅผ ๋ง๋ค์ด BeanDefinition ์ ์์ฑํ๋ฉด ๋๋ค.
'Backend > ๐ฟ Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ปดํฌ๋ํธ ์ค์บ (0) | 2022.02.07 |
---|---|
์ฑ๊ธํค ์ปจํ ์ด๋ (0) | 2022.02.06 |
[Spring] Service, ServiceImpl ์ ๊ด๊ณ (feat. OCP) (1) | 2022.02.02 |
๊ฐ์ฒด ์งํฅ ์ค๊ณ์ ์คํ๋ง (2) | 2022.01.26 |
ResponseEntity ๋์ Custom DTO ๋ฅผ ๋ฆฌํดํ ๋ ์ฃผ์ํ ์ (feat. @ResponseBody) (0) | 2021.12.22 |