-
์คํ๋ง ์ปจํ ์ด๋์ ์คํ๋ง ๋นSpring 2022. 4. 12. 10:49
๐ก ์คํ๋ง ์ปจํ ์ด๋ ์์ฑ
: ApplicationContext ๋ ์คํ๋ง ์ปจํ ์ด๋๋ผ ํ๋ฉฐ, ์ธํฐํ์ด์ค๋ค
: ์คํ๋ง ์ปจํ ์ด๋๋ XML์ ๊ธฐ๋ฐ์ผ๋ก ๋ง๋ค ์ ์๊ณ , ์ ๋ ธํ ์ด์ ๊ธฐ๋ฐ์ ์๋ฐ ์ค์ ํด๋์ค๋ก ๋ง๋ค ์ ์๋ค
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
* ์๋ฐ ์ค์ ํด๋์ค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์คํ๋ง ์ปจํ ์ด๋ ApplicationContext ๋ง๋ค๊ธฐ
-> new AnnotationConfigApplicationContext(AppConfig.class);
-> ์ด ํด๋์ค๋ ApplicationContext ์ธํฐํ์ด์ค์ ๊ตฌํ์ฒด์ด๋ค.
* ์คํ๋ง ์ปจํ ์ด๋๋ฅผ ์์ฑํ ๋ ๊ตฌ์ฑ ์ ๋ณด๋ฅผ ์ง์ ํด์ฃผ์ด์ผ ํ๋ค
=> AppConfig.class๋ฅผ ๊ตฌ์ฑ์ ๋ณด๋ก ์ง์ ํ๋ค
๐ก ์คํ๋ง ๋น ๋ฑ๋ก
โ ๋น ์ด๋ฆ : ๋ฉ์๋ ์ด๋ฆ์ ์ฌ์ฉํ๋ค
: ์ง์ ๋ถ์ฌํ๋ค @Bean(name="memberService2")
: ํญ์ ๋ค๋ฅธ ์ด๋ฆ์ ๋ถ์ฌํด์ผ ํ๋ค (์ค๋ณตX)
=> ๋ฐํ๋ ๊ฐ์ฒด๊ฐ ์คํ๋ง ์ปจํ ์ด๋์ ์ด๋ฆ๊ณผ ํจ๊ป ๋ฑ๋ก๋๋ค
๐ ์คํ๋ง์ ๋น์ ์์ฑํ๊ณ , ์์กด๊ด๊ณ๋ฅผ ์ฃผ์ ํ๋ ๋จ๊ณ๊ฐ ๋๋์ด์ ธ ์๋ค
-> ๊ทธ๋ฐ๋ฐ ์ด๋ ๊ฒ ์๋ฐ ์ฝ๋๋ก ์คํ๋ง ๋น์ ๋ฑ๋กํ๋ฉด ์์ฑ์๋ฅผ ํธ์ถํ๋ฉด์ ์์กด๊ด๊ณ ์ฃผ์ ๋ ํ๋ฒ์ ์ฒ๋ฆฌ๋๋ค
๐ก ์ปจํ ์ด๋์ ๋ฑ๋ก๋ ๋ชจ๋ ๋น ์กฐํ
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
๐ ๋์ผํ ํ์ ์ด ๋ ์ด์ ์กฐํ
- ํ์ ์ผ๋ก ์กฐํ์ ๊ฐ์ ํ์ ์ ์คํ๋ง ๋น์ด ๋ ์ด์์ด๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค => ๋น ์ด๋ฆ์ ์ง์ ํ์
- ac.getBeansOfType() : ํด๋น ํ์ ์ ๋ชจ๋ ๋น์ ์กฐํํ ์ ์๋ค
๐ก ์คํ๋ง ๋น ์กฐํ - ์์ ๊ด๊ณ
: ๋ถ๋ชจ ํ์ ์ผ๋ก ์กฐํํ๋ฉด, ์์ ํ์ ๋ ํจ๊ป ์กฐํํ๋ค
: ๊ทธ๋์ ๋ชจ๋ ์๋ฐ ๊ฐ์ฒด์ ์ต๊ณ ๋ถ๋ชจ์ธ object ํ์ ์ผ๋ก ์กฐํํ๋ฉด, ๋ชจ๋ ์คํ๋ง ๋น์ ์กฐํํ๋ค
๐ก BeanFactory์ ApplicationContext
๐ BeanFactory
- ์คํ๋ง ์ปจํ ์ด๋ ์ต์์ ์ธํฐํ์ด์ค
- ์คํ๋ง ๋น์ ๊ด๋ฆฌํ๊ณ ์กฐํํ๋ ์ญํ ๋ด๋น
- getBean()์ ์ ๊ณตํ๋ค
๐ ApplicationContext
- BeanFactory ๊ธฐ๋ฅ์ ๋ชจ๋ ์์๋ฐ์์ ์ ๊ณตํ๋ค
- ๋น ๊ด๋ฆฌ + ํธ๋ฆฌํ ๋ถ๊ฐ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค
- ๋ถ๊ฐ๊ธฐ๋ฅ์ด ํฌํจ๋ ApplicationContext๋ฅผ ์ฌ์ฉํ๋ค
* BeanFactory๋ ApplicationContext๋ฅผ ์คํ๋ง ์ปจํ ์ด๋๋ผ๊ณ ํ๋ค
๐ก ๋ค์ํ ์ค์ ํ์ ์ง์ - ์๋ฐ ์ฝ๋, XML
- ์คํ๋ง ์ปจํ ์ด๋๋ ๋ค์ํ ํ์์ ์ค์ ์ ๋ณด๋ฅผ ๋ฐ์๋๋ฆด ์ ์๊ฒ ์ ์ฐํ๊ฒ ์ค๊ณ๋์ด ์๋ค
- ์๋ฐ ์ฝ๋, XML, Groovy ๋ฑ
๐ XML ์ค์ ์ฌ์ฉ
- GenericXmlApplicationContext๋ฅผ ์ฌ์ฉํ๋ฉด์ 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>
* ์๋ฐ ํ์ผ์ด ์๋ ๋ชจ๋ ๊ฒ์ resources์ ์์ฑ
๐ก ์คํ๋ง ๋น ์ค์ ๋ฉํ ์ ๋ณด - BeanDefinition
- ์คํ๋ง์ด ๋ค์ํ ์ค์ ํ์์ ์ง์ํ๋๊ฒ์ -> ์ญํ ๊ณผ ๊ตฌํ์ ๊ฐ๋ ์ ์ผ๋ก ๋๋์๊ธฐ ๋๋ฌธ์ด๋ค
ex) XML์ ์ฝ์ด์ BeanDefinition์ ๋ง๋ค๋ฉด ๋๋ค
์๋ฐ ์ฝ๋๋ฅผ ์ฝ์ด์ BeanDefinition์ ๋ง๋ค๋ฉด๋๋ค
-> ์คํ๋ง ์ปจํ ์ด๋๋ ๋ฌด์์ธ์ง ๋ชฐ๋ผ๋ ์ค์ง BeanDefinition๋ง ์๋ฉด๋๋ค
- BeanDefinition : ๋น ์ค์ ๋ฉํ์ ๋ณด
- ์คํ๋ง ์ปจํ ์ด๋๋ ์ด ๋ฉํ์ ๋ณด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์คํ๋ง ๋น์ ์์ฑํ๋ค
* ์คํ๋ง์ด ๋ค์ํ ํํ์ ์ค์ ์ ๋ณด๋ฅผ BeanDefinition์ผ๋ก ์ถ์ํํด์ ์ฌ์ฉํ๋ค
'Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ปดํฌ๋ํธ ์ค์บ (0) 2022.04.12 ์ฑ๊ธํค ์ปจํ ์ด๋ (0) 2022.04.12 Spring ํต์ฌ (0) 2022.04.11 ์คํ๋ง์ด๋?, SOLID, IoC, DI, ์ปจํ ์ด๋ (0) 2022.03.24 MVC, API ์๋ฆฌ (0) 2022.03.22