๐ [Spring] ๐ป ์คํ๋ง ํต์ฌ์๋ฆฌ - 4. ์คํ๋ง ์ปจํ ์ด๋์ ์คํ๋ง ๋น
๐ป [Spring] ์คํ๋ง ํต์ฌ์๋ฆฌ - 4. ์คํ๋ง ์ปจํ ์ด๋์ ์คํ๋ง ๋น
์๋
ํ์ธ์. ๐
์คํ๋ง์ผ๋ก ์ฌ๋ฌ ํ๋ก์ ํธ๋ฅผ ๊ฐ๋ฐํ์๋๋ฐ
๋ฌธ๋ ์คํ๋ง ์์ฒด ํต์ฌ ์๋ฆฌ์ ๋ํ ๋ณต์ต์ด ํ๊ณ ์ถ์์ต๋๋ค.
๊ทธ๋์ ๊น์ํ๋์ ์คํ๋ง ํต์ฌ์๋ฆฌ ๊ฐ์๋ฅผ ๋ค์ผ๋ฉฐ
์คํ๋ง์ ์ ์ฌ์ฉํด์ผํ๋์ง์
์คํ๋ง ํต์ฌ์๋ฆฌ์ ๋ํด ํ์ตํ ๋ด์ฉ์
๋๋ค.
๋ค๋ฒ์งธ ํฌ์คํธ์
๋๋ค.
์คํ๋ง ์ปจํ ์ด๋ ์์ฑ
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
-
์คํ๋ง ์ปจํ ์ด๋๋ฅผ ๋ถ๋ฅผ ๋ BeanFactory , ApplicationContext ๋ก ๊ตฌ๋ถํด์ ์ด์ผ๊ธฐ ํ์ง๋ง BeanFactory ๋ฅผ ์ง์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ ๊ฑฐ์ ์์ผ๋ฏ๋ก ์ผ๋ฐ์ ์ผ๋ก ApplicationContext ๋ฅผ ์คํ๋ง ์ปจํ ์ด๋๋ผ ํ๋ค.
-
ApplicationContext ๋ ์ธํฐํ์ด์ค์ด๋ค.
-
์คํ๋ง ์ปจํ ์ด๋๋ XML์ ๊ธฐ๋ฐ์ผ๋ก ๋ง๋ค ์ ์๊ณ , ์ ๋ ธํ ์ด์ ๊ธฐ๋ฐ์ ์๋ฐ ์ค์ ํด๋์ค๋ก ๋ง๋ค ์ ์๋ค. ์ง์ ์ AppConfig ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ์์ด ์ ๋ ธํ ์ด์ ๊ธฐ๋ฐ์ ์๋ฐ ์ค์ ํด๋์ค๋ก ์คํ๋ง ์ปจํ ์ด๋๋ฅผ ๋ง๋ ๊ฒ ์ด๋ค.
-
์๋ฐ ์ค์ ํด๋์ค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์คํ๋ง ์ปจํ ์ด๋( ApplicationContext )๋ฅผ ๋ง๋ค์ด๋ณด์.
new AnnotationConfigApplicationContext(AppConfig.class);
์ด ํด๋์ค๋ ApplicationContext ์ธํฐํ์ด์ค์ ๊ตฌํ์ฒด์ด๋ค.
์คํ๋ง ์ปจํ ์ด๋ ์์ฑ ๊ณผ์
1.์คํ๋ง ์ปจํ ์ด๋ ์์ฑ
new AnnotationConfigApplicationContext(AppConfig.class)
- ์คํ๋ง ์ปจํ ์ด๋๋ฅผ ์์ฑํ ๋๋ ๊ตฌ์ฑ ์ ๋ณด๋ฅผ ์ง์ ํด์ฃผ์ด์ผ ํ๋ค.
- ์ฌ๊ธฐ์๋ AppConfig.class ๋ฅผ ๊ตฌ์ฑ ์ ๋ณด๋ก ์ง์ ํ๋ค.
- ์คํ๋ง ์ปจํ ์ด๋๋ ํ๋ผ๋ฏธํฐ๋ก ๋์ด์จ ์ค์ ํด๋์ค ์ ๋ณด๋ฅผ ์ฌ์ฉํด์ ์คํ๋ง ๋น์ ๋ฑ๋กํ๋ค.
- ๋น ์ด๋ฆ
- ๋น ์ด๋ฆ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฉ์๋ ์ด๋ฆ์ ์ฌ์ฉํ๋ค.
- ๋น ์ด๋ฆ์ ์ง์ ๋ถ์ฌํ ์ ๋ ์๋ค.
- ex) @Bean(name=โmemberService2โ) => memberService2 ๋ก bean name์ ๋ถ์ฌ
์ฃผ์: ๋น ์ด๋ฆ์ ํญ์ ๋ค๋ฅธ ์ด๋ฆ์ ๋ถ์ฌํด์ผ ํ๋ค. ๊ฐ์ ์ด๋ฆ์ ๋ถ์ฌํ๋ฉด, ๋ค๋ฅธ ๋น์ด ๋ฌด์๋๊ฑฐ๋, ๊ธฐ์กด ๋น์ ๋ฎ์ด๋ฒ๋ฆฌ๊ฑฐ๋ ์ค์ ์ ๋ฐ๋ผ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
- ์คํ๋ง ์ปจํ ์ด๋๋ ์ค์ ์ ๋ณด๋ฅผ ์ฐธ๊ณ ํด์ ์์กด๊ด๊ณ๋ฅผ ์ฃผ์ (DI)ํ๋ค.
- ๋จ์ํ ์๋ฐ ์ฝ๋๋ฅผ ํธ์ถํ๋ ๊ฒ ๊ฐ์ง๋ง, ์ฐจ์ด๊ฐ ์๋ค.
- ์คํ๋ง ์ปจํ ์ด๋๋ ๋ฑ๋ก๋ ์คํ๋ง ๋น๋ค์ ์ฑ๊ธํค ํจํด์ผ๋ก ์์ฑํ๊ณ ๊ด๋ฆฌํด์ค๋ค.
์คํ๋ง์ ๋น์ ์์ฑํ๊ณ , ์์กด๊ด๊ณ๋ฅผ ์ฃผ์ ํ๋ ๋จ๊ณ๊ฐ ๋๋์ด์ ธ ์๋ค. ๊ทธ๋ฐ๋ฐ ์ด๋ ๊ฒ ์๋ฐ ์ฝ๋๋ก ์คํ๋ง ๋น ์ ๋ฑ๋กํ๋ฉด ์์ฑ์๋ฅผ ํธ์ถํ๋ฉด์ ์์กด๊ด๊ณ ์ฃผ์ ๋ ํ๋ฒ์ ์ฒ๋ฆฌ๋๋ค.
์ ๋ฆฌ
์คํ๋ง ์ปจํ ์ด๋๋ฅผ ์์ฑํ๊ณ , ์ค์ (๊ตฌ์ฑ) ์ ๋ณด๋ฅผ ์ฐธ๊ณ ํด์ ์คํ๋ง ๋น๋ ๋ฑ๋กํ๊ณ , ์์กด๊ด๊ณ๋ ์ค์ ํ๋ค. ์ด์ ์คํ๋ง ์ปจํ ์ด๋์์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํด๋ณด์.
์ปจํ ์ด๋์ ๋ฑ๋ก๋ ๋ชจ๋ ๋น ์กฐํ
์์ ์ฝ๋
public 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);
}
}
}
}
๋ชจ๋ ๋น ์ถ๋ ฅํ๊ธฐ
- ์คํํ๋ฉด ์คํ๋ง์ ๋ฑ๋ก๋ ๋ชจ๋ ๋น ์ ๋ณด๋ฅผ ์ถ๋ ฅํ ์ ์๋ค.
- ac.getBeanDefinitionNames() : ์คํ๋ง์ ๋ฑ๋ก๋ ๋ชจ๋ ๋น ์ด๋ฆ์ ์กฐํํ๋ค.
- ac.getBean() : ๋น ์ด๋ฆ์ผ๋ก ๋น ๊ฐ์ฒด(์ธ์คํด์ค)๋ฅผ ์กฐํํ๋ค.
- ์ ํ๋ฆฌ์ผ์ด์
๋น ์ถ๋ ฅํ๊ธฐ
- ์คํ๋ง์ด ๋ด๋ถ์์ ์ฌ์ฉํ๋ ๋น์ ์ ์ธํ๊ณ , ๋ด๊ฐ ๋ฑ๋กํ ๋น๋ง ์ถ๋ ฅํด๋ณด์.
- ์คํ๋ง์ด ๋ด๋ถ์์ ์ฌ์ฉํ๋ ๋น์ getRole() ๋ก ๊ตฌ๋ถํ ์ ์๋ค.
- ROLE_APPLICATION : ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ์๊ฐ ์ ์ํ ๋น
- ROLE_INFRASTRUCTURE : ์คํ๋ง์ด ๋ด๋ถ์์ ์ฌ์ฉํ๋ ๋น
์คํ๋ง ๋น ์กฐํ - ๊ธฐ๋ณธ
์คํ๋ง ์ปจํ ์ด๋์์ ์คํ๋ง ๋น์ ์ฐพ๋ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ์กฐํ ๋ฐฉ๋ฒ
- ac.getBean(๋น์ด๋ฆ, ํ์ )
- ac.getBean(ํ์ )
- ์กฐํ ๋์ ์คํ๋ง ๋น์ด ์์ผ๋ฉด ์์ธ ๋ฐ์
- NoSuchBeanDefinitionException: No bean named โxxxxxโ available
์์ ์ฝ๋
package com.mks.core.beanfind;
import com.mks.core.AppConfig;
import com.mks.core.member.MemberService;
import com.mks.core.member.MemberServiceImpl;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
public 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(){
MemberService memberService = ac.getBean("memberService", MemberServiceImpl.class);
assertThat(memberService).isInstanceOf(MemberServiceImpl.class);
}
@Test
@DisplayName("๋น ์ด๋ฆ์ผ๋ก ์กฐํx")
void findBeanByNameX(){
assertThatThrownBy(() -> {
ac.getBean("xxxxx", MemberService.class);
}).isInstanceOf(NoSuchBeanDefinitionException.class);
}
}
๊ตฌ์ฒด ํ์ ์ผ๋ก ์กฐํํ๋ฉด ๋ณ๊ฒฝ์ ์ ์ฐ์ฑ์ด ๋จ์ด์ง๋ค.
์คํ๋ง ๋น ์กฐํ - ๋์ผํ ํ์ ์ด ๋ ์ด์
- ํ์ ์ผ๋ก ์กฐํ์ ๊ฐ์ ํ์ ์ ์คํ๋ง ๋น์ด ๋ ์ด์์ด๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค. ์ด๋๋ ๋น ์ด๋ฆ์ ์ง์ ํ์.
- ac.getBeansOfType() ์ ์ฌ์ฉํ๋ฉด ํด๋น ํ์ ์ ๋ชจ๋ ๋น์ ์กฐํํ ์ ์๋ค
์์ ์ฝ๋
package com.mks.core.beanfind;
import com.mks.core.member.MemberRepository;
import com.mks.core.member.MemoryMemberRepository;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.NoUniqueBeanDefinitionException;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.Map;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
public class ApplicationContextSameBeanFindTest {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(SameBeanConfig.class);
@Test
@DisplayName("ํ์
์ผ๋ก ์กฐํ์ ๊ฐ์ ํ์
์ด ๋ ์ด์ ์์ผ๋ฉด, ์ค๋ณต ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.")
void findBeanByTypeDuplicate(){
assertThatThrownBy(()->{
MemberRepository bean = ac.getBean(MemberRepository.class);
}).isInstanceOf(NoUniqueBeanDefinitionException.class);
}
@Test
@DisplayName("ํ์
์ผ๋ก ์กฐํ์ ๊ฐ์ ํ์
์ด ๋ ์ด์ ์์ผ๋ฉด, ๋น ์ด๋ฆ์ ์ง์ ํ๋ฉด ๋๋ค.")
void findBeanByName(){
MemberRepository memberRepository = ac.getBean("memberRepository1",MemberRepository.class);
assertThat(memberRepository).isInstanceOf(MemberRepository.class);
}
@Test
@DisplayName("ํน์ ํ์
์ ๋ชจ๋ ์กฐํํ๊ธฐ")
void findBeanByType(){
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();
}
}
}
์คํ๋ง ๋น ์กฐํ - ์์ ๊ด๊ณ
- ๋ถ๋ชจ ํ์ ์ผ๋ก ์กฐํํ๋ฉด, ์์ ํ์ ๋ ํจ๊ป ์กฐํํ๋ค.
- ๊ทธ๋์ ๋ชจ๋ ์๋ฐ ๊ฐ์ฒด์ ์ต๊ณ ๋ถ๋ชจ์ธ Object ํ์ ์ผ๋ก ์กฐํํ๋ฉด, ๋ชจ๋ ์คํ๋ง ๋น์ ์กฐํํ๋ค.
์์ ์ฝ๋
public class ApplicationContextExtendsFindTest {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(TestConfig.class);
@Test
@DisplayName("๋ถ๋ชจ ํ์
์ผ๋ก ์กฐํ์, ์์์ด ๋ ์ด์ ์์ผ๋ฉด, ์ค๋ณต ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.")
void findBeanByParentTypeDuplicate(){
assertThatThrownBy(()->{
DiscountPolicy bean = ac.getBean(DiscountPolicy.class);
}).isInstanceOf(NoUniqueBeanDefinitionException.class);
}
@Test
@DisplayName("๋ถ๋ชจ ํ์
์ผ๋ก ์กฐํ์, ์์์ด ๋ ์ด์ ์์ผ๋ฉด, bean ์ด๋ฆ์ ์ง์ ํ๋ฉด ๋๋ค.")
void findBeanByParentTypeBeanName(){
DiscountPolicy rateDiscountPolicy = ac.getBean("rateDiscountPolicy",DiscountPolicy.class);
assertThat(rateDiscountPolicy).isInstanceOf(RateDiscountPolicy.class);
}
@Test
@DisplayName("ํน์ ํ์ ํ์
์ผ๋ก ์กฐํ")
void findBeanBySubType(){
DiscountPolicy rateDiscountPolicy = ac.getBean("rateDiscountPolicy",DiscountPolicy.class);
assertThat(rateDiscountPolicy).isInstanceOf(RateDiscountPolicy.class);
}
@Test
@DisplayName("๋ถ๋ชจ ํ์
์ผ๋ก ๋ชจ๋ ์กฐํํ๊ธฐ")
void findAllBeanByParentType(){
Map<String, DiscountPolicy> beansOfType = ac.getBeansOfType(DiscountPolicy.class);
assertThat(beansOfType.size()).isEqualTo(2);
}
@Configuration
static class TestConfig {
@Bean
public DiscountPolicy rateDiscountPolicy(){
return new RateDiscountPolicy();
}
@Bean
public DiscountPolicy fixDiscountPolicy(){
return new FixDiscountPolicy();
}
}
}
BeanFactory์ ApplicationContext
BeanFactory
- ์คํ๋ง ์ปจํ ์ด๋์ ์ต์์ ์ธํฐํ์ด์ค๋ค.
- ์คํ๋ง ๋น์ ๊ด๋ฆฌํ๊ณ ์กฐํํ๋ ์ญํ ์ ๋ด๋นํ๋ค.
- getBean() ์ ์ ๊ณตํ๋ค.
- ์ง๊ธ๊น์ง ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ๋ ๋๋ถ๋ถ์ ๊ธฐ๋ฅ์ BeanFactory๊ฐ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ด๋ค.
ApplicationContext
- BeanFactory ๊ธฐ๋ฅ์ ๋ชจ๋ ์์๋ฐ์์ ์ ๊ณตํ๋ค.
- ๋น์ ๊ด๋ฆฌํ๊ณ ๊ฒ์ํ๋ ๊ธฐ๋ฅ์ BeanFactory๊ฐ ์ ๊ณตํด์ฃผ๋๋ฐ, ๊ทธ๋ฌ๋ฉด ๋์ ์ฐจ์ด๊ฐ ๋ญ๊น?
- ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ ๋๋ ๋น์ ๊ด๋ฆฌํ๊ณ ์กฐํํ๋ ๊ธฐ๋ฅ์ ๋ฌผ๋ก ์ด๊ณ , ์ ๋ง์ ๋ถ๊ฐ๊ธฐ๋ฅ์ด ํ์ํ๋ค.
- ์ ๋ง์ ๋ถ๊ฐ๊ธฐ๋ฅ์ด ํ์ํ๊ธฐ ๋๋ฌธ์ ์๋ง์ ๋ถ๊ฐ ๊ธฐ๋ฅ๊ฐ ์ถ๊ฐ๋์ด ์๋ ApplicationContext๋ฅผ ์ฌ์ฉํ๋ค.
ApplicatonContext๊ฐ ์ ๊ณตํ๋ ๋ถ๊ฐ๊ธฐ๋ฅ
- ๋ฉ์์ง์์ค๋ฅผ ํ์ฉํ ๊ตญ์ ํ ๊ธฐ๋ฅ
- ์๋ฅผ ๋ค์ด์ ํ๊ตญ์์ ๋ค์ด์ค๋ฉด ํ๊ตญ์ด๋ก, ์์ด๊ถ์์ ๋ค์ด์ค๋ฉด ์์ด๋ก ์ถ๋ ฅ
- ํ๊ฒฝ๋ณ์
- ๋ก์ปฌ, ๊ฐ๋ฐ, ์ด์๋ฑ์ ๊ตฌ๋ถํด์ ์ฒ๋ฆฌ
- ์ ํ๋ฆฌ์ผ์ด์
์ด๋ฒคํธ
- ์ด๋ฒคํธ๋ฅผ ๋ฐํํ๊ณ ๊ตฌ๋ ํ๋ ๋ชจ๋ธ์ ํธ๋ฆฌํ๊ฒ ์ง์
- ํธ๋ฆฌํ ๋ฆฌ์์ค ์กฐํ
- ํ์ผ, ํด๋์คํจ์ค, ์ธ๋ถ ๋ฑ์์ ๋ฆฌ์์ค๋ฅผ ํธ๋ฆฌํ๊ฒ ์กฐํ
์ ๋ฆฌ
- ApplicationContext๋ BeanFactory์ ๊ธฐ๋ฅ์ ์์๋ฐ๋๋ค.
- ApplicationContext๋ ๋น ๊ด๋ฆฌ๊ธฐ๋ฅ + ํธ๋ฆฌํ ๋ถ๊ฐ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
- BeanFactory๋ฅผ ์ง์ ์ฌ์ฉํ ์ผ์ ๊ฑฐ์ ์๋ค. ๋ถ๊ฐ๊ธฐ๋ฅ์ด ํฌํจ๋ ApplicationContext๋ฅผ ์ฌ์ฉํ๋ค.
- BeanFactory๋ ApplicationContext๋ฅผ ์คํ๋ง ์ปจํ ์ด๋๋ผ ํ๋ค.
๋ค์ํ ์ค์ ํ์ ์ง์ - ์๋ฐ ์ฝ๋, XML
- ์คํ๋ง ์ปจํ ์ด๋๋ ๋ค์ํ ํ์์ ์ค์ ์ ๋ณด๋ฅผ ๋ฐ์๋๋ฆด ์ ์๊ฒ ์ ์ฐํ๊ฒ ์ค๊ณ๋์ด ์๋ค.
- ์๋ฐ ์ฝ๋, XML, Groovy ๋ฑ๋ฑ
์ ๋ ธํ ์ด์ ๊ธฐ๋ฐ ์๋ฐ ์ฝ๋ ์ค์ ์ฌ์ฉ
- ์ง๊ธ๊น์ง ํ๋ ๊ฒ์ด๋ค.
- new AnnotationConfigApplicationContext(AppConfig.class)
- AnnotationConfigApplicationContext ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ฉด์ ์๋ฐ ์ฝ๋๋ก๋ ์ค์ ์ ๋ณด๋ฅผ ๋๊ธฐ๋ฉด ๋๋ค.
XML ์ค์ ์ฌ์ฉ
-
์ต๊ทผ์๋ ์คํ๋ง ๋ถํธ๋ฅผ ๋ง์ด ์ฌ์ฉํ๋ฉด์ XML๊ธฐ๋ฐ์ ์ค์ ์ ์ ์ฌ์ฉํ์ง ์๋๋ค. ์์ง ๋ง์ ๋ ๊ฑฐ์ ํ๋ก์ ํธ ๋ค์ด XML๋ก ๋์ด ์๊ณ , ๋ XML์ ์ฌ์ฉํ๋ฉด ์ปดํ์ผ ์์ด ๋น ์ค์ ์ ๋ณด๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ ์ฅ์ ๋ ์์ผ๋ฏ ๋ก ํ๋ฒ์ฏค ๋ฐฐ์๋๋ ๊ฒ๋ ๊ด์ฐฎ๋ค.
-
GenericXmlApplictionContext ๋ฅผ ์ฌ์ฉํ๋ฉด์ xml ์ค์ ํ์ผ์ ๋๊ธฐ๋ฉด ๋๋ค.
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>
XmlAppConfig ์ฌ์ฉ ์๋ฐ ์ฝ๋
public class XmlAppContext {
@Test
void xmlAppContext() {
ApplicationContext ac = new GenericXmlApplicationContext("appConfig.xml");
MemberService memberService = ac.getBean("memberService", MemberService.class);
Assertions.assertThat(memberService).isInstanceOf(MemberService.class);
}
}
-
xml ๊ธฐ๋ฐ์ appConfig.xml ์คํ๋ง ์ค์ ์ ๋ณด์ ์๋ฐ ์ฝ๋๋ก ๋ AppConfig.java ์ค์ ์ ๋ณด๋ฅผ ๋น๊ตํด๋ณด ๋ฉด ๊ฑฐ์ ๋น์ทํ๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
-
xml ๊ธฐ๋ฐ์ผ๋ก ์ค์ ํ๋ ๊ฒ์ ์ต๊ทผ์๋ ์ด์ ์ ์ฌ์ฉ๋์ง ์๋๋ค.
-
๊ณผ๊ฑฐ์๋ ๋ง์ด ์ฌ์ฉ๋๋ ๋ฐฉ๋ฒ์ด๊ธฐ ๋๋ฌธ์ ํ๋ฒ ๋ณด๊ณ ์์๋๋ ์ ๋!
์คํ๋ง ๋น ์ค์ ๋ฉํ ์ ๋ณด - โป BeanDefinition
- ์คํ๋ง์ ์ด๋ป๊ฒ ์ด๋ฐ ๋ค์ํ ์ค์ ํ์์ ์ง์ํ๋ ๊ฒ์ผ๊น? ๊ทธ ์ค์ฌ์๋ BeanDefinition ์ด๋ผ๋ ์ถ์ํ ๊ฐ ์๋ค.
-
์ฝ๊ฒ ์ด์ผ๊ธฐํด์ ์ญํ ๊ณผ ๊ตฌํ์ ๊ฐ๋ ์ ์ผ๋ก ๋๋ ๊ฒ์ด๋ค!
-
XML์ ์ฝ์ด์ BeanDefinition์ ๋ง๋ค๋ฉด ๋๋ค. (XML ๋ฐฉ์)
-
์๋ฐ ์ฝ๋๋ฅผ ์ฝ์ด์ BeanDefinition์ ๋ง๋ค๋ฉด ๋๋ค. (Java ์ฝ๋ ์ค์ ๋ฐฉ์)
-
-
์คํ๋ง ์ปจํ ์ด๋๋ ์๋ฐ ์ฝ๋์ธ์ง, XML์ธ์ง ๋ชฐ๋ผ๋ ๋๋ค. ์ค์ง BeanDefinition๋ง ์๋ฉด ๋๋ค.
-
BeanDefinition ์ ๋น ์ค์ ๋ฉํ์ ๋ณด๋ผ ํ๋ค.
-
@Bean ,
๋น ๊ฐ๊ฐ ํ๋์ฉ ๋ฉํ ์ ๋ณด๊ฐ ์์ฑ๋๋ค. - ์คํ๋ง ์ปจํ ์ด๋๋ ์ด ๋ฉํ์ ๋ณด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์คํ๋ง ๋น์ ์์ฑํ๋ค
-
AnnotationConfigApplicationContext ๋ AnnotatedBeanDefinitionReader ๋ฅผ ์ฌ์ฉํด์
-
AppConfig.class ๋ฅผ ์ฝ๊ณ BeanDefinition ์ ์์ฑํ๋ค.
-
GenericXmlApplicationContext ๋ XmlBeanDefinitionReader ๋ฅผ ์ฌ์ฉํด์ appConfig.xml ์ค์ ์ ๋ณด๋ฅผ ์ฝ๊ณ BeanDefinition ์ ์์ฑํ๋ค.
-
์๋ก์ด ํ์์ ์ค์ ์ ๋ณด๊ฐ ์ถ๊ฐ๋๋ฉด, XxxBeanDefinitionReader๋ฅผ ๋ง๋ค์ด์ BeanDefinition ์ ์์ฑ ํ๋ฉด ๋๋ค.
์ ๋ฆฌ
-
BeanDefinition์ ์ง์ ์์ฑํด์ ์คํ๋ง ์ปจํ ์ด๋์ ๋ฑ๋กํ ์ ๋ ์๋ค.
-
ํ์ง๋ง ์ค๋ฌด์์ BeanDefinition์ ์ง์ ์ ์ํ๊ฑฐ๋ ์ฌ์ฉํ ์ผ์ ๊ฑฐ์ ์๋ค.!
-
โป BeanDefinition์ ๋ํด์๋ ๋๋ฌด ๊น์ด์๊ฒ ์ดํดํ๊ธฐ ๋ณด๋ค๋, ์คํ๋ง์ด ๋ค์ํ ํํ์ ์ค์ ์ ๋ณด๋ฅผ BeanDefinition์ผ๋ก ์ถ์ํํด์ ์ฌ์ฉํ๋ ๊ฒ ์ ๋๋ง ์ดํดํ๋ฉด ๋๋ค.
๋
์คํ๋ง์ ๋ ์ฌ๋ฐ๋ฅด๊ฒ ์ฌ์ฉํ๊ธฐ ์ํด ๊น์ํ๋์ ์คํ๋ง ํต์ฌ ์๋ฆฌ ๊ฐ์๋ฅผ ๋ค์ผ๋ฉฐ ์ ๋ฆฌํ
๋ค๋ฒ์งธ ํฌ์คํธ์์ต๋๋ค.
๊ฐ์ฌํฉ๋๋ค. ๐
์คํ๋ง ํต์ฌ์๋ฆฌ ํฌ์คํธ
1. ๊ฐ์ฒด ์งํฅ ์ค๊ณ์ ์คํ๋ง
2. ์คํ๋ง ํต์ฌ ์๋ฆฌ ์ดํด 1,2
3. IoC, DI, ๊ทธ๋ฆฌ๊ณ ์ปจํ
์ด๋
4. ์คํ๋ง ์ปจํ
์ด๋์ ์คํ๋ง ๋น
Reference