Spring / Spring Container, Bean
by rlaehddnd0422์คํ๋ง ์ปจํ ์ด๋ ์์ฑ
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
ApplicationContext๋ ์คํ๋ง ์ปจํ ์ด๋ ์ธํฐํ์ด์ค
์คํ๋ง ์ปจํ ์ด๋๋ XML์ ๊ธฐ๋ฐ์ผ๋ก ๋ง๋ค ์ ์๊ณ , ์ด๋ ธํ ์ด์ ๊ธฐ๋ฐ ์๋ฐ ์ค์ ํด๋์ค๋ก ๋ง๋ค ์ ์๋ค.
> AppConfig๋ฅผ ์ฌ์ฉํ ๋ฐฉ์์ด ์ด๋ ธํ ์ด์ ๊ธฐ๋ฐ ์๋ฐ ์ค์ ํด๋์ค๋ก ์คํ๋ง ์ปจํ ์ด๋๋ฅผ ์์ฑํ ๋ฐฉ์
AnnotationConfigApplicationContext๋ ApplicationContext Inferface์ ๊ตฌํ์ฒด
โ๏ธ์๋ฐํ ๋งํ์๋ฉด ์คํ๋ง ์ปจํ ์ด๋๋ฅผ ๋ถ๋ฅผ ๋ BeanFactory, ApplicationContext๋ฅผ ๊ตฌ๋ถํด์ ์ด์ผ๊ธฐํ์ง๋ง BeanFactory๋ฅผ ์ง์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ ๊ฑฐ์ ์๊ธฐ ๋๋ฌธ์ ํต์์ ์ผ๋ก ApplicationContext๋ฅผ ์คํ๋ง ์ปจํ ์ด๋๋ผ ํ๋ค.
์คํ๋ง ์ปจํ ์ด๋ ์์ฑ๊ณผ์
1. ์คํ๋ง ์ปจํ ์ด๋ ์์ฑ
์คํ๋ง ์ปจํ ์ด๋๋ฅผ ์์ฑํ ๋๋ ๊ตฌ์ฑ ์ ๋ณด๋ฅผ ์ง์ ํด์ฃผ์ด์ผ ํจ.
์ฌ๊ธฐ์๋ AppConfig.class๋ฅผ ๊ตฌ์ฑ์ ๋ณด๋ก ์ง์ ํ์
2. ์คํ๋ง ๋น ๋ฑ๋ก
์คํ๋ง ์ปจํ ์ด๋๋ ํ๋ผ๋ฏธํฐ๋ก ๋์ด์จ ์ค์ ํด๋์ค ์ ๋ณด๋ฅผ ์ฌ์ฉํด์ ์คํ๋ง ๋น์ ๋ฑ๋กํ๋ค.
@Bean ์ด๋ ธํ ์ด์ ์ด ๋ถ์ด์๋ ๋ฉ์๋๋ค์ ์์ฐจ์ ์ผ๋ก ์คํ๋ง ๋น์ ๋ฑ๋กํจ
โ๏ธ๊ทธ๋ฆผ์๋ ํ์ํ์ง ์์์ง๋ง AppConfig๋ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋ก๋๋ค.
๋น ์ด๋ฆ์ @Bean(name="...")์ ํตํด ์ง์ ๋ถ์ฌํ ์ ์์ง๋ง ์ผ๋ฐ์ ์ผ๋ก ๋ฉ์๋ ์ด๋ฆ์ ์ฌ์ฉํ๋ค.
โ๏ธ๋น ์ด๋ฆ์ ์ค๋ณต๋๋ฉด ์๋๋ค. ๋ค๋ฅธ ๋น์ด ๋ฌด์๋๊ฑฐ๋ ์ค์ ์ ๋ฐ๋ผ ๊ธฐ์กด ๋น์ ๋ฎ์ด๋ฒ๋ฆฌ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํจ
3. ์์กด๊ด๊ณ ์ค์
์คํ๋ง ์ปจํ ์ด๋๋ ์ค์ ์ ๋ณด๋ฅผ ์ฐธ๊ณ ํด์ DI๋ฅผ ์ํํจ.
๋จ์ ์๋ฐ์ฝ๋๋ฅผ ํธ์ถํ๋ ๊ฒ๊ณผ ๊ฐ์ง๋ง ์ฐจ์ด๊ฐ ์๋ค. ์ฑ๊ธํค ์ปจํ ์ด๋์์ ์ค๋ช
โ๏ธ ๋น์ ์์ฑํ๊ณ , DI๋ฅผ ํ๋ ๋จ๊ณ๊ฐ ๋๋์ด์ ธ์๋ค. ์๋ฐ์ฝ๋๋ก ์คํ๋ง๋น์ ๋ฑ๋กํ๋ฉด ์์ฑ์๋ฅผ ํธ์ถํ๋ฉด์ 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_INFASTRUCTURE : ์คํ๋ง ๋ด๋ถ์์ ์ฌ์ฉํ๋ ๋ชจ๋ ๋น
if(beanDefinition.getRole()==BeanDefinition.ROLE_APPLICATION)
{
Object bean = ac.getBean(beanDefinitionName);
System.out.println("name = " + beanDefinitionName + " object = " + bean);
}
}
}
}
โถ๏ธ ๋ชจ๋ ๋น ์ถ๋ ฅ
ac.getBeanDefinitionNames() : ์คํ๋ง์ ๋ฑ๋ก๋ ๋ชจ๋ ๋น ์ด๋ฆ์ ์กฐํ
ac.getBean() : Bean ์ด๋ฆ์ผ๋ก Bean ๊ฐ์ฒด ์กฐํ
โถ๏ธ ์ ํ๋ฆฌ์ผ์ด์ ๋น ์ถ๋ ฅ
์คํ๋ง์ด ๋ด๋ถ์์ ์ฌ์ฉํ๋ ๋น์ ์ ์ธํ๊ณ , ๋ด๊ฐ ๋ฑ๋กํ ๋น๋ง ์กฐํ
getRole()๋ก ๊ตฌ๋ถ ๊ฐ๋ฅ
- getRole() == ROLE_APPLICATION : ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ์๊ฐ ์ ์ํ Bean
- getRole() == ROLE_INFRASTRUCTURE : ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ์๊ฐ ์ ์ํ Bean
์คํ๋ง ๋น ์กฐํ - ๊ธฐ๋ณธ
์คํ๋ง ์ปจํ ์ด๋์์ ์คํ๋ง ๋น์ ์ฐพ๋ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ์กฐํ ๋ฐฉ๋ฒ
ac.getBean(name, type)
ac.getBean(type)
์กฐํ ๋์ ์คํ๋ง ๋น์ด ์์ผ๋ฉด ์์ธ ๋ฐ์
- NoSuchBeanDefinitionException : No bean named 'xxxxxx' available
package hello.core.beanfind;
import hello.core.AppConfig;
import hello.core.member.Member;
import hello.core.member.MemberService;
import hello.core.member.MemberServiceImp;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import static org.junit.jupiter.api.Assertions.*;
public class ApplicationContextBasicFindTest {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
@Test
@DisplayName("๋น ์ด๋ฆ์ผ๋ก ์กฐํ")
void findBeanByName()
{
MemberService memberService = ac.getBean("memberService", MemberService.class);
Assertions.assertThat(memberService).isInstanceOf(MemberServiceImp.class);
}
@Test
@DisplayName("๊ตฌ์ฒด ํ์
์ผ๋ก ์กฐํ")
void findBeanByName2()
{
MemberService memberService = ac.getBean("memberService", MemberServiceImp.class);
Assertions.assertThat(memberService).isInstanceOf(MemberServiceImp.class);
}
@Test
@DisplayName("ํ์
์ผ๋ก๋ง ์กฐํ")
void findBeanByType()
{
MemberService memberService = ac.getBean(MemberService.class);
Assertions.assertThat(memberService).isInstanceOf(MemberServiceImp.class);
}
@Test
@DisplayName("๋น ์ด๋ฆ์ผ๋ก ์กฐํ (์คํจ)")
void findBeanByNameX()
{
// MemberService xxxxxx = ac.getBean("xxxxxx", MemberService.class);
// ์ค๋ฅธ์ชฝ์์๋ ๋ก์ง์คํ์ ์ผ์ชฝException ๋ฐ์ํด์ผํจ
assertThrows(NoSuchBeanDefinitionException.class, ()->
ac.getBean("xxxxxx", MemberService.class));
}
}
โ๏ธ ๊ตฌ์ฒดํ์ ์ผ๋ก ์กฐํ๋ ๊ฐ๋ฅํ์ง๋ง ์ ์ฐ์ฑ์ด ๋จ์ด์ง๋ค.
์คํ๋ง ๋น ์กฐํ - ๋์ผํ ํ์ ๋ ์ด์์ธ ๊ฒฝ์ฐ
package hello.core.beanfind;
import hello.core.AppConfig;
import hello.core.MemberRepository;
import hello.core.MemoryMemberRepository;
import hello.core.discount.DiscountPolicy;
import org.junit.jupiter.api.Assertions;
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.AssertionsForClassTypes.assertThat;
import static org.junit.jupiter.api.Assertions.assertThrows;
public class ApplicaitonContextSamebeanFindTest {
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 memberRepository1 = ac.getBean("memberRepository1", MemberRepository.class);
assertThat(memberRepository1).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();
}
}
}
ํ์ ์ผ๋ก ์กฐํ ์ ๊ฐ์ ํ์ ์ ์คํ๋ง ๋น์ด ๋ ์ด์ ์์ผ๋ฉด ์ค๋ฅ ๋ฐ์.
โถ๏ธ ์ด๋๋ ๋น ์ด๋ฆ์ ์ง์ ํ์.
ac.getBeansOfType()์ ์ฌ์ฉํ๋ฉด ํด๋น ํ์ ์ ๋ชจ๋ ๋น์ ์กฐํํ ์ ์๋ค.
์คํ๋ง ๋น ์กฐํ - ์์๊ด๊ณ
๋ถ๋ชจํ์ ์ ์กฐํํ๋ฉด ์์ ํ์ ๋ ํจ๊ป ์กฐํํ๋ค.
๊ทธ๋์ ๋ชจ๋ ์๋ฐ ๊ฐ์ฒด์ ์ต๊ณ ๋ถ๋ชจ์ธ 'Object' ํ์ ์ ์กฐํํ๋ฉด ๋ชจ๋ ์คํ๋ง ๋น์ ์กฐํํ๋ค.
package hello.core.beanfind;
import hello.core.AppConfig;
import hello.core.discount.DiscountPolicy;
import hello.core.discount.FixDiscountPolicy;
import hello.core.discount.RateDiscountPolicy;
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.AssertionsForClassTypes.assertThat;
import static org.junit.jupiter.api.Assertions.assertThrows;
public class ApplicationContextExtendsFindTest {
@Configuration
static class TestConfig {
@Bean
public DiscountPolicy rateDiscountPolicy() {
return new RateDiscountPolicy();
}
@Bean
public DiscountPolicy fixDiscountPolicy() {
return new FixDiscountPolicy();
}
}
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(TestConfig.class);
@Test
@DisplayName("๋ถ๋ชจ ํ์
์ผ๋ก ์กฐํ ์ ์์ ๋ ์ด์์์ผ๋ฉด ์ค๋ณต ์ค๋ฅ ๋ฐ์")
void findBeanByParentTypeDuplicate() {
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 findBeanByParentAll() {
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 findAllBeansByObj()
{
Map<String, Object> beansOfType = ac.getBeansOfType(Object.class);
for (String key : beansOfType.keySet()) {
System.out.println("key = " + key + "value = " + beansOfType.get(key));
}
}
}
BeanFactory์ ApplicationContext
BeanFactory
- ์คํ๋ง ์ปจํ ์ด๋์ ์ต์์ ์ธํฐํ์ด์ค
- ์คํ๋ง ๋น์ ๊ด๋ฆฌ, ์กฐํํ๋ ์ญํ ๋ด๋น
- getBean() ์ ๊ณต
- ์ง๊ธ๊น์ง ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ ๋๋ถ๋ถ์ ๊ธฐ๋ฅ์ด ์ ์ธ๋์ด ์์
ApplicationContext
- BeanFactory๊ธฐ๋ฅ์ ๋ชจ๋ ์์๋ฐ์ ์ ๊ณต ( ๊ตฌํ๋์ด ์์ง๋ ์์ )
- ๋น์ ๊ด๋ฆฌ,๊ฒ์ํด์ฃผ๋ ๊ธฐ๋ฅ์ธ์๋ ์ฌ๋ฌ๊ฐ์ง ๊ธฐ๋ฅ์ ์์๋ฐ๊ณ ์๋ค.
1. ๋ฉ์์ง์์ค๋ฅผ ํ์ฉํ ๊ตญ์ ํ ๊ธฐ๋ฅ
์๋ฅผ ๋ค์ด์ ํ๊ตญ์์ ๋ค์ด์ค๋ฉด ํ๊ตญ์ด๋ก, ์์ด๊ถ์์ ๋ค์ด์ค๋ฉด ์์ด๋ก ์ถ๋ ฅ
2. ํ๊ฒฝ๋ณ์
๋ก์ปฌ, ๊ฐ๋ฐ, ์ด์๋ฑ์ ๊ตฌ๋ถํด์ ์ฒ๋ฆฌ
3. ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ฒคํธ
์ด๋ฒคํธ๋ฅผ ๋ฐํํ๊ณ ๊ตฌ๋ ํ๋ ๋ชจ๋ธ์ ํธ๋ฆฌํ๊ฒ ์ง์
4. ํธ๋ฆฌํ ๋ฆฌ์์ค ์กฐํ
ํ์ผ, ํด๋์คํจ์ค, ์ธ๋ถ ๋ฑ์์ ๋ฆฌ์์ค๋ฅผ ํธ๋ฆฌํ๊ฒ ์กฐํ
<์ ๋ฆฌ>
- ApplicationContext๋ BeanFactory์ ๊ธฐ๋ฅ์ ์์๋ฐ๋๋ค.
- ApplicationContext๋ ๋น ๊ด๋ฆฌ๊ธฐ๋ฅ + ํธ๋ฆฌํ ๋ถ๊ฐ ๊ธฐ๋ฅ์ ์ ๊ณต.
- BeanFactory๋ฅผ ์ง์ ์ฌ์ฉํ ์ผ์ ๊ฑฐ์ ์๋ค. ๋ถ๊ฐ๊ธฐ๋ฅ์ด ํฌํจ๋ ApplicationContext๋ฅผ ์ฌ์ฉํ๋ค.
- BeanFactory๋ ApplicationContext๋ฅผ ์คํ๋ง ์ปจํ ์ด๋๋ผ๊ณ ํ๋ค.
๋ค์ํ Config ํ์ ์ง์ - java, XML
์คํ๋ง ์ปจํ ์ด๋๋ ๋ค์ํ ํ์์ config ์ ๋ณด๋ฅผ ๋ฐ์๋ค์ผ ์ ์๊ฒ ์ค๊ณ๋์๋ค.
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="memberRepository" class = "hello.core.MemoryMemberRepository">
</bean>
<bean id="discountPolicy" class = "hello.core.discount.RateDiscountPolicy">
</bean>
<bean id="memberService" class = "hello.core.member.MemberServiceImp">
<constructor-arg name="memberRepository" ref="memberRepository"/>
</bean>
<bean id="orderService" class = "hello.core.order.OrderServiceImp">
<constructor-arg index="0" name="memberRepository" ref="memberRepository"/>
<constructor-arg index="1" name="discountPolicy" ref="discountPolicy"/>
</bean>
</beans>
TestCode
public class XmlAppContext {
@Test
void xmlAppContext()
{
ApplicationContext ac = new GenericXmlApplicationContext("appConfig.xml");
MemberService memberService = ac.getBean("memberService",MemberService.class);
assertThat(memberService).isInstanceOf(MemberService.class);
}
}
์คํ๋ง ๋น ์ค์ ๋ฉํ ์ ๋ณด - BeanDefinition
์คํ๋ง์ ๋ค์ํ Config ํ์์ BeanDefinition์ด๋ผ๋ ์ถ์ํ๋ฅผ ์ด์ฉํ์ฌ ์ง์ํ๋ค.
BeanDefinition ์ ๋ณด
BeanClassName: ์์ฑํ ๋น์ ํด๋์ค ๋ช (์๋ฐ ์ค์ ์ฒ๋ผ ํฉํ ๋ฆฌ ์ญํ ์ ๋น์ ์ฌ์ฉํ๋ฉด ์์)
factoryBeanName: ํฉํ ๋ฆฌ ์ญํ ์ ๋น์ ์ฌ์ฉํ ๊ฒฝ์ฐ ์ด๋ฆ, ์) appConfig
factoryMethodName: ๋น์ ์์ฑํ ํฉํ ๋ฆฌ ๋ฉ์๋ ์ง์ , ์) memberService
Scope: ์ฑ๊ธํค(๊ธฐ๋ณธ๊ฐ)
package hello.core.beanDefinition;
import hello.core.AppConfig;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class BeanDefinitionTest {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
@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 ์ด๋ผ๋ ๊ฒ์ด ๋ณด์ผ ๋๊ฐ ์๋๋ฐ, ์ด ๋ ์ด๋ฌํ ๋ฉ์ปค๋์ฆ์ ๋ ์ฌ๋ฆฌ๋ฉด ๋๋ค.
<์ฐธ๊ณ ์๋ฃ>
'๐ Backend' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Spring / @ComponentScan, @Component (1) | 2023.02.02 |
---|---|
Spring / Single-ton Pattern, Single-ton Container (0) | 2023.01.31 |
Spring / IoC, DI, Container (0) | 2023.01.30 |
Spring / AppConfig๋ฅผ ์ด์ฉํ ๊ธฐ์กด์ OCP, DIP ๋ฌธ์ ํด๊ฒฐ (1) | 2023.01.26 |
Spring / ์์ ์๋ฐ๊ธฐ๋ฐ ์์ ( spring framework no use ) (0) | 2023.01.24 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
Study Repository
rlaehddnd0422