[Spring] 4.์คํ๋ง ์ปจํ ์ด๋์ ์คํ๋ง ๋น
1. ์คํ๋ง ์ปจํ ์ด๋ ์์ฑ
์คํ๋ง ์ปจํ ์ด๋ ์์ฑ ๊ณผ์
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
- ApplicationContext : ์คํ๋ง ์ปจํ ์ด๋ (์ธํฐํ์ด์ค)
- xml ๊ธฐ๋ฐ์ผ๋ก ๋ง๋ค ์๋ ์๊ณ Annotation ๊ธฐ๋ฐ์ ์๋ฐ ์ค์ ํด๋์ค๋ก ๋ง๋ค ์๋ ์๋ค.
- AppConfig ๋ฐฉ์ -> Annoation ๊ธฐ๋ฐ ์๋ฐ ์ค์ ํด๋์ค
- new AnnotaionConfigApplicationContext(AppConfig.class) = ์ธํฐํ์ด์ค ๊ตฌํ์ฒด
* ๋ ์ ํํ๋ BeanFactory / ApplicationContext๋ก ๊ตฌ๋ถํด์ ์ด์ผ๊ธฐํจ
* BeanFactory๋ฅผ ์ง์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ ๊ฑฐ์ ์์
์คํ๋ง ์ปจํ ์ด๋์ ์์ฑ ๊ณผ์
1) ์คํ๋ง ์ปจํ ์ด๋ ์์ฑ
- new AnnotaionConfigApplicationContext(AppConfig.class)
- ์คํ๋ง ์ปจํ ์ด๋๋ฅผ ์์ฑํ ๋ ๊ตฌ์ฑ ์ ๋ณด๋ฅผ ์ ์ฅํด์ค์ผํจ (AppConfig.class)
2) ์คํ๋ง ๋น ๋ฑ๋ก
- ์ค์ ์ ๋ณด(AppConfig.class) ๋๊ฒจ์ฃผ๋ฉด ๊ทธ๊ฑธ ๋ณด๋ฉด์ @Bean ๋ถ์๊ฑฐ ํธ์ถํด์ ๋ฑ๋ก
[๋น์ด๋ฆ] = ๋ฉ์๋๋ช , [๋น๊ฐ์ฒด] = ๋ฐํ ๊ฐ์ฒด
* ๋น์ด๋ฆ ์ง์ ๋ถ์ฌ ๊ฐ๋ฅ @Bean(name="memberService2")
* ์ฃผ์) ๋น ์ด๋ฆ์ ํญ์ ๋ค๋ฅธ ์ด๋ฆ์ผ๋ก ๋ถ์ฌํด์ผํจ
3) ์คํ๋ง ๋น ์์กด๊ด๊ณ ์ค์ - ์ค๋น
4) ์คํ๋ง ๋น ์์กด๊ด๊ณ ์ค์ - ์๋ฃ
- ์คํ๋ง ์ปจํ
์ด๋๋ ์ค์ ์ ๋ณด๋ฅผ ์ฐธ๊ณ ํด์ ์์กด๊ด๊ณ๋ฅผ ์ฃผ์
ํ๋ค. (DI)
- ๋จ์ํ ์๋ฐ ์ฝ๋๋ฅผ ํธ์ถํ๋ ๊ฒ ๊ฐ์ง๋ง ์ฐจ์ด๊ฐ ์์
* ์ฐธ๊ณ ) ์คํ๋ง ๋น์ ์์ฑํ๊ณ ์์กด๊ด๊ณ ์ฃผ์ ๋จ๊ณ ๋๋ ์ ธ์์
ํ์ง๋ง ์๋ฐ์ฝ๋๋ก ์คํ๋ง ๋น ๋ฑ๋กํ๋ฉด ์์ฑ์๋ฅผ ํธ์ถํ๋ฉด์ ์์กด๊ด๊ณ ์ฃผ์ ๋ ํ๋ฒ์ ์ฒ๋ฆฌ๋จ
๊ทธ๋ฐ๋ฐ ์คํ๋ง ๋ผ์ดํ ์ฌ์ดํด์ ๋๋ ์ ธ์์ (๋์ค์ ์ค๋ช )
2. ์ปจํ ์ด๋์ ๋ฑ๋ก๋ ๋ชจ๋ ๋น ์กฐํ
ใดhello.cored.beanfind
class ApplicationContextInfoTest {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
@Test
@DisplayName("๋ชจ๋ ๋น ์ถ๋ ฅํ๊ธฐ")
void findAllBean() {
String[] beanDefinitionNames = ac.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames) {
Object bean = ac.getBean(beanDefinitionName);
System.out.println("name=" + beanDefinitionName + " object=" + bean);
}
}
@Test
@DisplayName("์ ํ๋ฆฌ์ผ์ด์
๋น ์ถ๋ ฅํ๊ธฐ")
void findApplicationBean() {
String[] beanDefinitionNames = ac.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames) {
BeanDefinition beanDefinition = ac.getBeanDefinition(beanDefinitionName);
//Role ROLE_APPLICATION: ์ง์ ๋ฑ๋กํ ์ ํ๋ฆฌ์ผ์ด์
๋น
//Role ROLE_INFRASTRUCTURE: ์คํ๋ง์ด ๋ด๋ถ์์ ์ฌ์ฉํ๋ ๋น
if (beanDefinition.getRole() == BeanDefinition.ROLE_APPLICATION) {
Object bean = ac.getBean(beanDefinitionName);
System.out.println("name=" + beanDefinitionName + " object=" + bean);
}
}
}
3. ์คํ๋ง ๋น ์กฐํ - ๊ธฐ๋ณธ
์คํ๋ง ์ปจํ ์ด๋์์ ์คํ๋ง ๋น์ ์ฐพ๋ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ์กฐํ ๋ฐฉ๋ฒ
- ac.getBean(๋น์ด๋ฆ, ํ์ )
- ac.getBean(ํ์ )
์กฐํ ๋์ ์คํ๋ง ๋น์ด ์์ผ๋ฉด ์์ธ ๋ฐ์ : NoSuchBeanDefinitionException: No bean named 'xxxxx' available
class ApplicationContextBasicFindTest {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
@Test
@DisplayName("๋น ์ด๋ฆ์ผ๋ก ์กฐํ")
void findBeanByName() {
MemberService memberService = ac.getBean("memberService",MemberService.class);
assertThat(memberService).isInstanceOf(MemberServiceImpl.class);
}
@Test
@DisplayName("์ด๋ฆ ์์ด ํ์
๋ง์ผ๋ก ์กฐํ")
void findBeanByType() {
MemberService memberService = ac.getBean(MemberService.class);
assertThat(memberService).isInstanceOf(MemberServiceImpl.class);
}
@Test
@DisplayName("๊ตฌ์ฒด ํ์
์ผ๋ก ์กฐํ")
void findBeanByName2() {
MemberServiceImpl memberService = ac.getBean("memberService",MemberServiceImpl.class);
assertThat(memberService).isInstanceOf(MemberServiceImpl.class);
}
@Test
@DisplayName("๋น ์ด๋ฆ์ผ๋ก ์กฐํX")
void findBeanByNameX() {
//ac.getBean("xxxxx", MemberService.class);
Assertions.assertThrows(NoSuchBeanDefinitionException.class, () ->
ac.getBean("xxxxx", MemberService.class));
}
}
* ์ฐธ๊ณ ) ๊ตฌ์ฒด ํ์ ์ผ๋ก ์กฐํํ๋ฉด ๋ณ๊ฒฝ์ ์ ์ฐ์ฑ์ด ๋จ์ด์ง๋ค.
* ๋ง์ง๋ง ํ ์คํธ์์ ์ค๋ฅธ์ชฝ ๋ฉ์๋๋ฅผ ์คํํ์๋ ์ผ์ชฝ Exception์ด ๋ฐ์ํด์ผ ํ ์คํธ ์ฑ๊ณต
4. ์คํ๋ง ๋น ์กฐํ - ๋์ผํ ํ์ ์ด ๋ ์ด์
- ํ์ ์ผ๋ก ์กฐํ์ ๊ฐ์ ํ์ ์ ์คํ๋ง ๋น์ด ๋ ์ด์์ด๋ฉด ์ค๋ฅ ๋ฐ์
์ด๋ ๋น ์ด๋ฆ์ ์ง์ ํ์
- ac.getBeansOfType()์ ์ฌ์ฉํ๋ฉด ํด๋น ํ์ ์ ๋ชจ๋ ๋น์ ์กฐํํ ์ ์๋ค.
class ApplicationContextSameBeanFindTest {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(SameBeanConfig.class);
@Test
@DisplayName("ํ์
์ผ๋ก ์กฐํ์ ๊ฐ์ ํ์
์ด ๋ ์ด์ ์์ผ๋ฉด, ์ค๋ณต ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค")
void findBeanByTypeDuplicate() {
//MemberRepository bean = ac.getBean(MemberRepository.class);
assertThrows(NoUniqueBeanDefinitionException.class, () -> ac.getBean(MemberRepository.class));
}
@Test
@DisplayName("ํ์
์ผ๋ก ์กฐํ์ ๊ฐ์ ํ์
์ด ๋ ์ด์ ์์ผ๋ฉด, ๋น ์ด๋ฆ์ ์ง์ ํ๋ฉด ๋๋ค")
void findBeanByName() {
MemberRepository memberRepository = ac.getBean("memberRepository1", MemberRepository.class);
assertThat(memberRepository).isInstanceOf(MemberRepository.class);
}
@Test
@DisplayName("ํน์ ํ์
์ ๋ชจ๋ ์กฐํํ๊ธฐ")
void findAllBeanByType() {
Map<String, MemberRepository> beansOfType = ac.getBeansOfType(MemberRepository.class);
for (String key : beansOfType.keySet()) {
System.out.println("key = " + key + " value = " + beansOfType.get(key));
}
System.out.println("beansOfType = " + beansOfType);
assertThat(beansOfType.size()).isEqualTo(2);
}
@Configuration
static class SameBeanConfig {
@Bean
public MemberRepository memberRepository1() {
return new MemoryMemberRepository();
}
@Bean
public MemberRepository memberRepository2() {
return new MemoryMemberRepository();
}
}
}
5. ์คํ๋ง ๋น ์กฐํ - ์์๊ด๊ณ
- ๋ถ๋ชจํ์ ์ผ๋ก ์กฐํํ๋ฉด ์์ ํ์ ๋ ํจ๊ป ์กฐํ๋๋ค.
- ๊ทธ๋์ ๋ชจ๋ ์๋ฐ ๊ฐ์ฒด์ ์ต๊ณก ๋ถ๋ชจ์ธ Object ํ์ ์ผ๋ก ์กฐํํ๋ฉด ๋ชจ๋ ์คํ๋ง ๋น์ ์กฐํํ๋ค.
class ApplicationContextExtendsFindTest {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(TestConfig.class);
@Test
@DisplayName("๋ถ๋ชจ ํ์
์ผ๋ก ์กฐํ์, ์์์ด ๋ ์ด์ ์์ผ๋ฉด, ์ค๋ณต ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค")
void findBeanByParentTypeDuplicate() {
//DiscountPolicy bean = ac.getBean(DiscountPolicy.class);
assertThrows(NoUniqueBeanDefinitionException.class, () ->
ac.getBean(DiscountPolicy.class));
}
@Test
@DisplayName("๋ถ๋ชจ ํ์
์ผ๋ก ์กฐํ์, ์์์ด ๋ ์ด์ ์์ผ๋ฉด, ๋น ์ด๋ฆ์ ์ง์ ํ๋ฉด ๋๋ค")
void findBeanByParentTypeBeanName() {
DiscountPolicy rateDiscountPolicy = ac.getBean("rateDiscountPolicy",DiscountPolicy.class);
assertThat(rateDiscountPolicy).isInstanceOf(RateDiscountPolicy.class);
}
@Test
@DisplayName("ํน์ ํ์ ํ์
์ผ๋ก ์กฐํ")
void findBeanBySubType() {
RateDiscountPolicy bean = ac.getBean(RateDiscountPolicy.class);
assertThat(bean).isInstanceOf(RateDiscountPolicy.class);
}
@Test
@DisplayName("๋ถ๋ชจ ํ์
์ผ๋ก ๋ชจ๋ ์กฐํํ๊ธฐ")
void findAllBeanByParentType() {
Map<String, DiscountPolicy> beansOfType =
ac.getBeansOfType(DiscountPolicy.class);
assertThat(beansOfType.size()).isEqualTo(2);
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));
}
}
@Configuration
static class TestConfig {
@Bean
public DiscountPolicy rateDiscountPolicy() {
return new RateDiscountPolicy();
}
@Bean
public DiscountPolicy fixDiscountPolicy() {
return new FixDiscountPolicy();
}
}
}
6. BeanFactory์ ApplicationContext
BeanFactory
- ์คํ๋ง ์ปจํ ์ด๋์ ์ต์์ ์ธํฐํ์ด์ค
- ์คํ๋ง ๋น์ ๊ด๋ฆฌํ๊ณ ์กฐํํ๋ ์ญํ
- getBean()์ ๊ณต
- ์ง๊ธ๊น์ง ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ๋ ๋๋ถ๋ถ์ ๊ธฐ๋ฅ์ BeanFactory๊ฐ ์ ๊ณตํ๋ ๊ธฐ๋ฅ
ApplicationContext
- BeanFactory๊ธฐ๋ฅ์ ๋ชจ๋ ์์ํด์ ์ ๊ณต
- ๋น์ ๊ด๋ฆฌํ๊ณ ๊ฒ์ํ๋ ๊ธฐ๋ฅ์ BeanFactory๊ฐ ์ ๊ณตํด์ฃผ๋๋ฐ, ๊ทธ๋ฌ๋ฉด ๋์ ์ฐจ์ด๋?
์ฌ๋ฌ ์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ์์ ์ฌ์ฉ
- ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ ๋ ๋น์ ๊ด๋ฆฌํ๊ณ ์กฐํํ๋ ๊ธฐ๋ฅ + ์ ๋ง์ ๋ถ๊ฐ๊ธฐ๋ฅ์ด ํ์
- ๋ฉ์ธ์ง ์์ค๋ฅผ ํ์ฉํ ๊ตญ์ ํ ๊ธฐ๋ฅ : ์๋ฅผ ๋ค์ด ํ๊ตญ์์ ๋ค์ด์ค๋ฉด ํ๊ตญ์ด๋ก, ์์ด๊ถ๋์์ ๋ค์ด์ค๋ฉด ์์ด๋ก ์ถ๋ ฅ
- ํ๊ฒฝ๋ณ์ : ๋ก์ปฌ, ๊ฐ๋ฐ, ์ด์ ๋ฑ์ ๊ตฌ๋ถํด์ ์ฒ๋ฆฌ
- ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ฒคํธ : ์ด๋ฒคํธ ๋ฐํ ๋ฐ ๊ตฌ๋ ํ๋ ๋ชจ๋ธ์ ํธ๋ฆฌํ๊ฒ ์ง์
- ํธ๋ฆฌํ ๋ฆฌ์์ค ์กฐํ : ํ์ผ, ํด๋์คํจ์ค, ์ธ๋ถ ๋ฑ์์ ๋ฆฌ์์ค๋ฅผ ํธ๋ฆฌํ๊ฒ ์กฐํ
7. ๋ค์ํ ์ค์ ํ์ ์ง์ - ์๋ฐ์ฝ๋, XML
- ์คํ๋ง ์ปจํ ์ด๋๋ ๋ค์ํ ํ์์ ์ค์ ์ ๋ณด๋ฅผ ๋ฐ์๋๋ฆด ์ ์๊ฒ ์ ์ฐํ๊ฒ ์ค๊ณ๋์ด์๋ค.
ex) ์๋ฐ์ฝ๋, XML, Grovvy
XML ์ค์ ์ฌ์ฉ
- ๋ ๊ฑฐ์ ํ๋ก์ ํธ
- ์ปดํ์ผ ์์ด ๋น ์ค์ ์ ๋ณด ๋ณ๊ฒฝ (์ฅ์ )
- GenericXmlApplication ์ฌ์ฉํ์ฌ xml ์ค์ ํ์ผ ๋๊ธฐ๋ฉด ๋จ
XmlAppConfig ์ฌ์ฉ ์๋ฐ ์ฝ๋
public class XmlAppContext {
@Test
void xmlAppContext() {
ApplicationContext ac = new GenericXmlApplicationContext("appConfig.xml");
MemberService memberService = ac.getBean("memberService", MemberService.class);
assertThat(memberService).isInstanceOf(MemberService.class);
}
}
xml ๊ธฐ๋ฐ ์คํ๋ง ๋น ์ค์ ์ ๋ณด
ใด src/main/resources/appConfig.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http:// www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="memberService" class="hello.core.member.MemberServiceImpl">
<constructor-arg name="memberRepository" ref="memberRepository" />
</bean>
<bean id="memberRepository" class="hello.core.member.MemoryMemberRepository" />
<bean id="orderService" class="hello.core.order.OrderServiceImpl">
<constructor-arg name="memberRepository" ref="memberRepository" />
<constructor-arg name="discountPolicy" ref="discountPolicy" />
</bean>
<bean id="discountPolicy" class="hello.core.discount.RateDiscountPolicy" />
</beans>
- AppConfig์ ๊ฑฐ์ ๋น์ท
8. ์คํ๋ง ๋น ์ค์ ๋ฉํ ์ ๋ณด - BeanDefinition
- ์คํ๋ง ์ด๋ป๊ฒ ๋ค์ํ ์ค์ ์ง์? : BeanDefinition์ด๋ผ๋ ์ถ์ํ!
- ์ญํ ๊ณผ ๊ตฌํ์ ์ ๋๋๊ฒ
- BeanDefinition์ ๋น ์ค์ ๋ฉํ์ ๋ณด๋ผ๊ณ ํ๋ค.
- @Bean, <bean> ๋น ๊ฐ๊ฐ ํ๋์ฉ ๋ฉํ์ ๋ณด๊ฐ ์์ฑ๋จ
- ์คํ๋ง ์ปจํ ์ด๋๋ ์ด ๋ฉํ์ ๋ณด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์คํ๋ง ๋น ์์ฑ
- AnnotaionConfigApplicationContext๋ AnnotationBeanDefinitionreader๋ฅผ ์ฌ์ฉํด์ AppConfig.class๋ฅผ ์ฝ๊ณ BeanDefinition์ ์์ฑ
- GenericXmlApplicationContext๋ XmlBeanDefinitionReader๋ฅผ ์ฌ์ฉํด์ appConfig.xml ์ค์ ์ ๋ณด๋ฅผ ์ฝ๊ณ BeanDefinition์ ์์ฑ
- ์๋ก์ด ํ์์ ์ค์ ์ ๋ณด๊ฐ ์ถ๊ฐ๋๋ฉด XmlBeanDefinitionReader๋ฅผ ๋ง๋ค์ด์ BeanDefinition์ ์์ฑํ๋ฉด ๋จ
BeanDefinition ์ ๋ณด
- BeanClassName: ์์ฑํ ๋น์ ํด๋์ค ๋ช (์๋ฐ ์ค์ ์ฒ๋ผ ํฉํ ๋ฆฌ ์ญํ ์ ๋น์ ์ฌ์ฉํ๋ฉด ์์)
- factoryBeanName: ํฉํ ๋ฆฌ ์ญํ ์ ๋น์ ์ฌ์ฉํ ๊ฒฝ์ฐ ์ด๋ฆ, ์)
- appConfig factoryMethodName: ๋น์ ์์ฑํ ํฉํ ๋ฆฌ ๋ฉ์๋ ์ง์ , ์) memberService
- Scope: ์ฑ๊ธํค(๊ธฐ๋ณธ๊ฐ)
- lazyInit: ์คํ๋ง ์ปจํ ์ด๋๋ฅผ ์์ฑํ ๋ ๋น์ ์์ฑํ๋ ๊ฒ์ด ์๋๋ผ, ์ค์ ๋น์ ์ฌ์ฉํ ๋ ๊น์ง ์ต๋ํ ์์ฑ์ ์ง์ฐ์ฒ๋ฆฌ ํ๋์ง ์ฌ๋ถ
- InitMethodName: ๋น์ ์์ฑํ๊ณ , ์์กด๊ด๊ณ๋ฅผ ์ ์ฉํ ๋ค์ ํธ์ถ๋๋ ์ด๊ธฐํ ๋ฉ์๋ ๋ช
- DestroyMethodName: ๋น์ ์๋ช ์ฃผ๊ธฐ๊ฐ ๋๋์ ์ ๊ฑฐํ๊ธฐ ์ง์ ์ ํธ์ถ๋๋ ๋ฉ์๋ ๋ช
- Constructor arguments, Properties: ์์กด๊ด๊ณ ์ฃผ์ ์์ ์ฌ์ฉํ๋ค. (์๋ฐ ์ค์ ์ฒ๋ผ ํฉํ ๋ฆฌ ์ญํ ์ ๋น์ ์ฌ์ฉํ๋ฉด ์์)
public class BeanDefinitionTest {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
// GenericXmlApplicationContext ac = new
GenericXmlApplicationContext("appConfig.xml");
@Test
@DisplayName("๋น ์ค์ ๋ฉํ์ ๋ณด ํ์ธ")
void findApplicationBean() {
String[] beanDefinitionNames = ac.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames) {
BeanDefinition beanDefinition = ac.getBeanDefinition(beanDefinitionName);
if (beanDefinition.getRole() == BeanDefinition.ROLE_APPLICATION) {
System.out.println("beanDefinitionName" + beanDefinitionName + " beanDefinition = " + beanDefinition);
}
}
}
}
์ ๋ฆฌ
- BeanDefinition์ ์ง์ ์์ฑํด์ ์คํ๋ง ์ปจํ ์ด๋์ ๋ฑ๋กํ ์ ๋ ์๋ค. ํ์ง๋ง ์ค๋ฌด์์ BeanDefinition์ ์ง์ ์ ์ํ๊ฑฐ๋ ์ฌ์ฉํ ์ผ์ ๊ฑฐ์ ์๋ค. ์ด๋ ค์ฐ๋ฉด ๊ทธ๋ฅ ๋์ด๊ฐ๋ฉด ๋๋ค^^!
- BeanDefinition์ ๋ํด์๋ ๋๋ฌด ๊น์ด์๊ฒ ์ดํดํ๊ธฐ ๋ณด๋ค๋, ์คํ๋ง์ด ๋ค์ํ ํํ์ ์ค์ ์ ๋ณด๋ฅผ BeanDefinition์ผ๋ก ์ถ์ํํด์ ์ฌ์ฉํ๋ ๊ฒ ์ ๋๋ง ์ดํดํ๋ฉด ๋๋ค.
- ๊ฐ๋ ์คํ๋ง ์ฝ๋๋ ์คํ๋ง ๊ด๋ จ ์คํ ์์ค์ ์ฝ๋๋ฅผ ๋ณผ ๋, BeanDefinition ์ด๋ผ๋ ๊ฒ์ด ๋ณด์ผ ๋๊ฐ ์๋ค. ์ด๋ ์ด๋ฌํ ๋ฉ์ปค๋์ฆ์ ๋ ์ฌ๋ฆฌ๋ฉด ๋๋ค.
'๐จโ๐ป Web Development > Spring - ๊ธฐ๋ณธ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring] 6.์ปดํฌ๋ํธ ์ค์บ (0) | 2023.02.24 |
---|---|
[Spring] 5.์ฑ๊ธํค ์ปจํ ์ด๋ (0) | 2023.02.22 |
[Spring] 3.์คํ๋ง ํต์ฌ ์๋ฆฌ ์ดํด2 - ๊ฐ์ฒด ์งํฅ ์๋ฆฌ ์ ์ฉ (0) | 2023.02.18 |
[Spring] 2.์คํ๋ง ํต์ฌ ์๋ฆฌ ์ดํด1 - ์์ ๋ง๋ค๊ธฐ (0) | 2023.02.17 |
[Spring] 1.๊ฐ์ฒด ์งํฅ ์ค๊ณ์ ์คํ๋ง (0) | 2023.02.16 |
์ต๊ทผ๋๊ธ