๐ IoC
๐ข IoC ๋?
IoC๋ Inversion of Control์ ์ฝ์๋ก ‘์ ์ด์ ์ญ์ ’์ด๋ผ๋ ์๋ฏธ๋ฅผ ๊ฐ์ง๋ค.
์ด๋, ‘์ ์ด์ ์ญ์ ’์ ๋ฌด์จ ์๋ฏธ๋ฅผ ๊ฐ์ง๋ ๊ฑธ๊น?
์ ์ด
๊ฐ์ฒด ์๋ช ์ฃผ๊ธฐ๋ ๋ฉ์๋์ ํธ์ถ์ ์ง์ ์ ์ดํ๋ค ⇒ ๊ฐ์ฒด ์๋ช ์ฃผ๊ธฐ๋ ๋ฉ์๋์ ํธ์ถ์ ์ง์ ๊ด๋ฆฌํ๋ค
์ง์ ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ ์ฝ๋๋ฅผ “์ ์ด”
public class A {
private B b;
public A() {
this.b = new B();
}
}
A ํด๋์ค์์ B๋ฅผ ํ๋๋ก ๊ฐ์ง๊ณ ์๊ณ , ์์ฑ์ ๋ด๋ถ์์ ์ง์ ์์ฑํด ํ๋๋ฅผ ์ด๊ธฐํํ๊ณ ์๋ค.
์ด๋ฌํ ์ฝ๋๋ฅผ ๊ฐ์ฒด ์๋ช ์ฃผ๊ธฐ๋ฅผ ์ง์ ์ ์ดํ๋ ์ฝ๋๋ผ๊ณ ๋งํ ์ ์๋ค.
์ญ์
ํ๋ก๊ทธ๋จ์ ์ ์ด ํ๋ฆ์ ์ง์ ์ ์ดํ๋ ๊ฒ์ด ์๋๋ผ ์ธ๋ถ์์ ๊ด๋ฆฌํ๋ ๊ฒ
public class A {
private B b;
public A(B b) {
this.b = b;
}
}
์ด์ ์ฝ๋์ ๊ฐ์ด A ํด๋์ค๊ฐ ์กด์ฌํ๋ค.
ํ์ง๋ง ์ด ์ฝ๋์์๋ ์ธ๋ถ๋ก๋ถํฐ B๋ฅผ ์ธ์๋ก ๋ฐ์ ์ด๊ธฐํํ๊ณ ์๋ค.
์ด๋ ๊ฒ ํ๋ก๊ทธ๋จ์ ์ ์ด ํ๋ฆ์ ์ง์ ์ ์ดํ๋ ๊ฒ์ด ์๋๋ผ ์ธ๋ถ์์ ๊ด๋ฆฌํ๋ ๊ฒ์ ์ ์ด๋ฅผ ์ญ์ ์์ผฐ๋ค๊ณ ๋งํ ์ ์๋ค.
๐ข IoC๊ฐ ์ ํ์ํ๊ฐ?
๊ฐ์ฒด์งํฅ ์์น์ ์ ์งํค๊ธฐ ์ํด!
์ญํ ๊ณผ ๊ด์ฌ์ ๋ถ๋ฆฌํด ์์ง๋๋ฅผ ๋์ด๊ณ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๋ฉฐ,
์ด์ ๋ฐ๋ผ ๋ณ๊ฒฝ์ ์ ์ฐํ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ ๊ตฌ์กฐ๊ฐ ๋ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๐ข IoC์ DIP
๋ชฉ์
ํ ํด๋์ค์ ๋ณ๊ฒฝ์ ๋ฐ๋ฅธ ๋ค๋ฅธ ํด๋์ค๋ค์ ์ํฅ์ ์ต์ํ๋ฐ๋ผ์ IoC์ DIP๋ ๊ฐ์ด ์ฌ์ฉ๋๋ ๊ฒ์ด ์ข๋ค.
์ฆ, ์ ํ๋ฆฌ์ผ์ด์ ์ ์ง์๊ฐ๋ฅํ๊ณ ํ์ฅ์ฑ ์๊ฒ ๋ง๋ ๋ค.
ํด๋์ค ๊ฐ ๊ฒฐํฉ์ ๋์จํ ํ๊ธฐ ์ํจ
IoC์ DIP์ ๋น๊ต
๊ฐ์ ๋ชฉ์ ์ ๊ฐ์ก์ง๋ง IoC๋ ์ ์ด์ ์ญ์ , DIP๋ ์์กด ๋ฐฉํฅ์ ์ญ์ ์ด๋ค.
IoC์ DIP๋ ๋ชจ๋ principle(์์น)์ด๋ค.
๐ Spring Bean
๐ข ์์กด์ฑ์ด๋?
public class A {
private B b;
public A(B b) {
this.b = b;
}
...
}
public class B {
...
}
A ํด๋์ค๋ฅผ ์์ฑํ๊ธฐ ์ํด์ B ํด๋์ค๊ฐ ์กด์ฌํด์ผํ๋ค.
์ด๋, A ํด๋์ค๋ B ํด๋์ค์ ๋ํ ์์กด์ฑ์ ๊ฐ์ง๋ค๊ณ ๋งํ๋ค.
์ฆ, ํ ๊ฐ์ฒด๊ฐ ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ ๋ ์์กด์ฑ์ด ์๋ค๊ณ ํ๋ค.
public static void main(String[] args) {
A a = new A(new B());
}
๊ทธ๋์ A ํด๋์ค๋ฅผ ์์ฑํ๊ธฐ ์ํด์ ์์ ๊ฐ์ ๊ตฌ๋ฌธ์ด ํ์ํ๋ค.
ํด๋์ค ๊ฐ์ ์์กด ๊ด๊ณ๊ฐ ์๋ค๋ ๊ฒ์ ํ ํด๋์ค๊ฐ ๋ฐ๋ ๋ ๋ค๋ฅธ ํด๋์ค๊ฐ ์ํฅ์ ๋ฐ๋๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค.
Spring์ Spring Bean์ ํตํด ์์ ๊ฐ์ ์์กด์ฑ ๋ฌธ์ ๋ฅผ ๋ ์ฝ๊ฒ ํด๊ฒฐํ ์ ์๋๋ก ํด์ค๋ค.
๐ข Spring Bean์ด๋?
Spring document์์ Bean์ ๋ํด ์ด๋ ๊ฒ ์ฐ์ฌ์๋ค.
In Spring, the objects that form the backbone of your application and that are managed by the Spring IoC container are called beans. A bean is an object that is instantiated, assembled, and managed by a Spring IoC container.
๊ฐ๋จํ ๋งํด, ์คํ๋ง IoC ์ปจํ ์ด๋์ ์ํด ๊ด๋ฆฌ๋๋ ์๋ฐ ๊ฐ์ฒด์ด๋ค.
๊ทธ๋ ๋ค๋ฉด ์คํ๋ง IoC ์ปจํ ์ด๋๋ ๋ฌด์์ผ๊น?
๐ข ์คํ๋ง IoC ์ปจํ ์ด๋๋?
The org.springframework.context.ApplicationContext interface represents the Spring IoC container and is responsible for instantiating, configuring, and assembling the beans.
๋น์ ๊ด๋ฆฌํ๋ ๊ฐ์ฒด์ด๋ค.
document์ ๋์จ ์ค๋ช ์์ ๋ณผ ์ ์๋ฏ์ด, ApplicationContext ๋ผ๋ ์ธํฐํ์ด์ค๊ฐ IoC ์ปจํ ์ด๋๋ฅผ ๋ํํ๋ค.
ApplicationContext๋ ์ฌ๋ฌ ์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ์ ๋ง๋ค์ด์ง๋ค.
์ด์ ๋น ์กฐํ, ์ด๋ฒคํธ ๋ฐํ, ํ๊ฒฝ๋ณ์ ์กฐํ ๋ฑ ๋ค์ํ ๊ธฐ๋ฅ์ ๊ตฌํํ ์ ์๋ค.
@Test
void findAllBean(){
String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames) {
Object bean = applicationContext.getBean(beanDefinitionName);
log.info("name=" + beanDefinitionName + " object=" + bean);
}
}
์๋ ๋ชจ๋ ๋น์ ์กฐํํ๋ ํ ์คํธ๋ค.
์ ๊ฒฐ๊ณผ ๊ฐ์์ ๋ณผ ์ ์๋ฏ์ด ApplicationContext ๋ฅผ ํตํด ๋น์ ๋ํ ์์ ์ ํ ์ ์๋ค.
๐ข ๋น ์ค์ฝํ
๋น์ ์์ฑ๋๊ณ ์กด์ฌํ๊ณ ์ ์ฉ๋๋ ๋ฒ์๋ฅผ ์ง์ ํ ์ ์๋ค.
์ด๋ฅผ ๋น ์ค์ฝํ๋ผ๊ณ ํ๋ค.
์คํ๋ง์ ๋ค์๊ณผ ๊ฐ์ ๋ค์ํ ์ค์ฝํ๋ฅผ ์ง์ํ๋ค.
- ์ฑ๊ธํค : ๊ธฐ๋ณธ ์ค์ฝํ, ์คํ๋ง ์ปจํ ์ด๋์ ์์๊ณผ ์ข ๋ฃ๊น์ง ์ ์ง๋๋ ๊ฐ์ฅ ๋์ ๋ฒ์์ ์ค์ฝํ
- ํ๋กํ ํ์ : ์คํ๋ง ์ปจํ ์ด๋๋ ํ๋กํ ํ์ ๋น์ ์์ฑ๊ณผ ์์กด๊ด๊ณ ์ฃผ์ ๊น์ง๋ง ๊ด์ฌํ๊ณ ๋๋ ๊ด๋ฆฌํ์ง ์๋ ๋งค์ฐ ์งง์ ๋ฒ์์ ์ค์ฝํ
- ์น ๊ด๋ จ ์ค์ฝํ
- request : ์น ์์ฒญ์ด ๋ค์ด์ค๊ณ ๋๊ฐ๋๊น์ง ์ ์ง๋๋ ์ค์ฝํ
- session : ์น ์ธ์ ์ด ์์ฑ๋๊ณ ์ข ๋ฃ๋ ๋ ๊น์ง ์ ์ง๋๋ ์ค์ฝํ
- application : ์น์ ์๋ธ๋ฆฟ ์ปจํ ์คํธ์ ๊ฐ์ ๋ฒ์๋ก ์ ์ง๋๋ ์ค์ฝํ
๋น์ ์ค์ฝํ๋ @Scope ์ด๋ ธํ ์ด์ ์ ํตํด ์ง์ ํ ์ ์๋ค.
@Scope("prototype")
@Component
public class Prototype {
...
}
์คํ๋ง์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ณ๋ค๋ฅธ ์ค์ ์ ํ์ง ์์ผ๋ฉด ๋ด๋ถ์์ ์์ฑํ๋ ๋น ์ค๋ธ์ ํธ๋ฅผ ๋ชจ๋ ์ฑ๊ธํค์ผ๋ก ๋ง๋ ๋ค.
๐ข ์ฑ๊ธํค์ ๋จ์
- ๋คํ์ฑ์ ์ด์ฉํ์ง ๋ชปํ๋ค.
์ฑ๊ธํค ํจํด์ ์ฌ์ฉํ๋ฉด ์์ฑ์์ ์ ๊ทผ ์ง์ ์๋ฅผ private์ผ๋ก ์ค์ ํด์ผ ํ๋ค.
ํ์ง๋ง ์ด๋ ๊ฒ ๊ตฌํํ๋ฉด ํด๋น ๊ฐ์ฒด๋ ์์์ด ๋ถ๊ฐ๋ฅํ๋ค.
๊ทธ๋ฌ๋ฏ๋ก ๊ฐ์ฒด์งํฅ์ ์ด์ ์ธ ๋คํ์ฑ์ ์ ์ฉํ์ง ๋ชปํ๊ฒ ๋๋ค. - ์์ ์ฑ์ด ์ค์ํ ์ ํ๋ฆฌ์ผ์ด์
์์ ํ์์ ์ธ ๋จ์ ํ
์คํธ๊ฐ ์ด๋ ต๋ค.
๊ฐ์ฒด๋ฅผ ์ฑ๊ธํค ํจํด์ผ๋ก ๊ตฌํํ ๊ฒฝ์ฐ ํด๋น ๊ฐ์ฒด๋ ๊ณต์ ๊ฐ์ฒด๊ฐ ๋๋ฏ๋ก
๋จ์ํ ์คํธ๋ฅผ ์คํํ ๋ ํ ์คํธ์ ์์์ ๋ฐ๋ผ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง๋ค. - ์์กด๊ด๊ณ์ ํด๋ผ์ด์ธํธ๊ฐ ๊ตฌ์ฒด ํด๋์ค์ ์์กดํ๋ค. DIP๋ฅผ ์๋ฐํ๋ค.
- ํด๋ผ์ด์ธํธ๊ฐ ๊ตฌ์ฒด ํด๋์ค์ ์์กดํด์ OCP ์์น์ ์๋ฐํ ๊ฐ๋ฅ์ฑ์ด ๋๋ค.
- ๋ด๋ถ ์์ฑ์ ๋ณ๊ฒฝํ๊ฑฐ๋ ์ด๊ธฐํํ๊ธฐ ์ด๋ ต๋ค.
- private ์์ฑ์๋ก ์์ ํด๋์ค๋ฅผ ๋ง๋ค๊ธฐ ์ด๋ ต๋ค.
์ข ํฉ์ ์ผ๋ก ์ ์ฐ์ฑ์ด ๋จ์ด์ง๋ค๋ ํน์ง์ ๊ฐ์ง๋ค.
๐ข ์คํ๋ง๊ณผ ์ฑ๊ธํค
์คํ๋ง์ ์ฑ๊ธํค ํจํด์ ์ฌ์ฉํ๋ค.
์ ํ๋ฆฌ์ผ์ด์ ์ด ์์๋ ๋, ์ธ์คํด์ค๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ๋ฑ ํ๋ ํ ๋นํ๊ณ , ๋ค์ ํธ์ถ ์๋ง๋ค ํด๋น ์ธ์คํด์ค๋ฅผ ๋ฐํํด ์ฃผ๋ ๋์์ธ ํจํด์ด๋ค.
์ด๋ฅผ ์ ์ฉํ๋ฉด ์ด๋ฏธ ๋ง๋ค์ด์ง ๊ฐ์ฒด๋ฅผ ๊ณต์ ํด์ ํจ์จ์ ์ธ ์ฌ์ฉ์ด ๊ฐ๋ฅํด์ง๋ค.
์คํ๋ง์์๋ ์ด๋ฅผ ์ํด IoC ์ปจํ ์ด๋๋ฅผ ์ฌ์ฉํ๋ค.
์ด๋ฅผ ์ด์ฉํ์ฌ ์ฑ๊ธํด ํจํด์ ๋ชจ๋ ๋จ์ ์ ํด๊ฒฐํ๋ฉด์ ๊ฐ์ฒด๋ฅผ ์ฑ๊ธํค์ผ๋ก ์ ์งํ ์ ์๋ค.
๐ข ๋น๊ณผ ์์กด์ฑ ์ฃผ์
์์กด์ฑ์ ์ฃผ์ ํ๋ค๊ณ ํ๋ฉด ์ด๋์์ ๊ฐ new ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ฒด๋ฅผ ์์ฑํด์ผ ํ๋ค.
public class Service {
private final Dao dao;
public Service(Dao dao) {
this.dao = dao;
}
}
Service service = new Service(new JdbcDao());
์์ ์ฝ๋๋ฅผ ๋ณด๋ฉด Service๋ฅผ ์ด๊ธฐํํ๋๋ฐ Service์ ์์ฑ์๋ก Dao ๊ตฌํ์ฒด๋ฅผ ์์ฑํ์ฌ ๋ฃ์ด์ฃผ๊ณ ์๋ค.
Q. ๋ง์ฝ Dao์ ๊ตฌํ์ฒด๊ฐ ๋ฐ๋๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น?
์๋น์ค๋ฅผ ์์ฑํ๋ ๊ณณ์์๋ ๋ณ๊ฒฝ์ด ์ผ์ด๋๋ค.
์๋น์ค๋ฅผ ์์ฑํ ๋ Dao๋ฅผ ์ด๊ธฐํํจ๊ณผ ๋์์ ์ด๋ค Dao์ ๊ตฌํ์ฒด๋ฅผ ์ ํํ ๊ฒ์ธ์ง์ ๋ํ ์ฑ ์๋ ์๊ธฐ ๋๋ฌธ์ด๋ค.
LineService lineService = new LineServie(new StationsDao(), new LineDao(), new SectionDao());
๋ํ ์์กด์ฑ์ ์ฃผ์ ํ ๋ ์ฌ๋ฌ ๊ฐ์ ์์กด์ฑ์ด ํ์ํ๋ค๋ฉด ํด๋น ์์กด์ฑ ์ฃผ์ ์์๋ฅผ ์์์ผ ํ๋ค.
์ง์ ์์กด์ฑ์ ์ฃผ์ ํ๊ธฐ ์ํด์๋ ์์กด ๊ด๊ณ๋ฅผ ๋ชจ๋ ํ์ ํด์ผ ํ๋ ๋ฒ๊ฑฐ๋ก์์ด ์๊ธด๋ค.
๋ํ ๋ง์ ๊ฐ์ฒด๊ฐ ์ค๋ณต ์์ฑ์ด ๋๊ฒ ๋๋ค.
๊ทธ๋์ ์์กด์ฑ ์ฃผ์ ์ด ํ์ํ ๊ฐ์ฒด๋ฅผ ๋น์ผ๋ก ๋ฑ๋กํ์ฌ,
์คํ๋ง IoC ์ปจํ ์ด๋๊ฐ ๊ฐ์ฒด์ ์์ฑ๊ณผ ์์กด์ฑ ์ฃผ์ ์ ๊ด๋ฆฌํ๋๋ก ํด์ผ ํ๋ค.
๐ข ์คํ๋ง IoC ์ปจํ ์ด๋๋ ์ด๋ป๊ฒ ๋น์ ๊ด๋ฆฌํ ๊น?
IoC ์ปจํ ์ด๋๊ฐ ๋น์ ๋ผ์ดํ์ฌ์ดํด์ ๊ด๋ฆฌํ๋ ๊ณผ์ ์ ์ด๋ฌํ๋ค.
1. ๊ฐ์ฒด ์์ฑ + property ์ค์
๋จผ์ Spring IoC ์ปจํ ์ด๋๊ฐ ์์ฑ์ด ๋๋ฉด ๋น ์ค์ฝํ๊ฐ ์ฑ๊ธํค์ธ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
์ด๋ ๋น์ผ๋ก ๋ฑ๋กํ๊ธฐ ์ํด์ ๋ค์ํ Configuration ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ด์ฉํ์ฌ ํต์ผ๋ Bean Definition์ ์์ฑํ๋ค.
๊ทธ๋ฆฌ๊ณ ๋น์ผ๋ก ๋ฑ๋กํ POJO์ Bean Definition ์ ๋ณด๋ฅผ ์ด์ฉํ์ฌ ๋น์ ์์ฑํ๋ค.
์ด ๊ณผ์ ์์ ์ฑ๊ธํค ํจํด์ ์ฌ์ฉํ๋ ๊ฒ์ด ์๋ ํ๋ฒํ ์๋ฐ ํด๋์ค๋ฅผ ์ด์ฉํ์ฌ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
2. ์์กด ์ค์
๋น ๊ฐ์ฒด๊ฐ ์์ฑ์ด ๋๋ฉด IoC ์ปจํ ์ด๋๋ ์์กด ์ค์ ์ ํ๋ค.
์ด๋ ์์กด์ฑ ์๋ ์ฃผ์ ์ด ์ผ์ด๋๊ฒ ๋๋ค.
3. ๊ฐ์ฒด ์ด๊ธฐํ → ์ฌ์ฉ → ์๋ฉธ
๋ชจ๋ ๊ฐ์ฒด๊ฐ ๋ค ์ด๊ธฐํ๊ฐ ํ์ํ ๊ฒ์ ์๋์ง๋ง ์ฌ์ฉ ์ ์ ์ด๊ธฐํ ๊ณผ์ ์ด ํ์ํ ๊ฐ์ฒด๋ค์ ์ด๊ธฐํ ๊ณผ์ ์ ์งํํ๋ค.
์ด๊ธฐํ๊ฐ ๋๋๋ฉด ๋๋์ด ๋น์ ์ฌ์ฉํ ์ ์๊ฒ ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์คํ๋ง ์ปจํ ์ด๋๊ฐ ์ข ๋ฃ๋ ๋ ๋น ์ค์ฝํ๊ฐ ์ฑ๊ธํค์ธ ๊ฐ์ฒด๋ค๋ ํจ๊ป ์๋ฉธ๋๋ค.
๐ข ๋น ์ค์ ๋ฐฉ๋ฒ
๋น์ ์ค์ ํ๋ ๋ฐฉ๋ฒ์ ๊ฐ๋จํ๋ค.
@Bean ์ด๋ ธํ ์ด์ ์ ์ด์ฉํ๋ฉด ๋๋ค.
public class Appconfig {
@Bean
public BeanA beanA() {
return new BeanA();
}
@Bean
public BeanB beanB() {
return new BeanB(beanA());
}
@Bean
public BeanC beanC() {
return new BeanC(beanA());
}
}
@Test
void notSingleton(){
Appconfig appConfig = new Appconfig();
BeanA beanA1 = appConfig.beanA();
BeanA beanA2 = appConfig.beanA();
log.info("beanA1 = " + beanA1);
log.info("beanA2 = " + beanA2);
assertThat(beanA1).isNotSameAs(beanA2);
}
์ ์์์์ ๋ณผ ์ ์๋ฏ์ด, ๊ฐ์ ๊ฐ์ฒด๋ฅผ ์ถ๋ ฅํ์ง๋ง ๊ฐ์ด ๋ค๋ฅด๋ค.
BeanA ๊ฐ์ฒด๊ฐ 2๋ฒ ๋ง๋ค์ด์ง ๊ฒ์ด๋ค.
์ด๋ ์ฑ๊ธํค์ด ์๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ด๋ป๊ฒ ์ฑ๊ธํค์ ๋ง๋ค ์ ์์๊น?
์คํ๋ง์์ ๋น์ ์ฑ๊ธํค์ผ๋ก ๊ด๋ฆฌํ๊ธฐ ์ํด, @Configuration ์ด๋ ธํ ์ด์ ์ ์ด์ฉํด์ผ ํ๋ค.
@Configuration
public class Appconfig {
@Bean
public BeanA beanA() {
return new BeanA();
}
@Bean
public BeanB beanB() {
return new BeanB(beanA());
}
@Bean
public BeanC beanC() {
return new BeanC(beanA());
}
}
@Test
void singleton(){
ApplicationContext ac = new AnnotationConfigApplicationContext(Appconfig.class);
BeanA beanA1 = ac.getBean("beanA",BeanA.class);
BeanA beanA2= ac.getBean("beanA",BeanA.class);
log.info("beanA1 = " + beanA1);
log.info("beanA2 = " + beanA2);
assertThat(beanA1).isSameAs(beanA2);
}
@Test
void singleton2(){
ApplicationContext ac = new AnnotationConfigApplicationContext(Appconfig.class);
BeanB beanB = ac.getBean("beanB",BeanB.class);
BeanC beanC= ac.getBean("beanC",BeanC.class);
BeanA beanA1 = beanB.getBeanA();
BeanA beanA2= beanC.getBeanA();
log.info("beanA1 = " + beanA1);
log.info("beanA2 = " + beanA2);
assertThat(beanA1).isSameAs(beanA2);
}
ApplicationContext์ ๊ตฌํ์ฒด์ธ AnnotationConfigApplicationContext ์ ํ๋ผ๋ฏธํฐ๋ก ๋๊ธด ๊ฐ์ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋ก๋๋ค.
์ ์ฝ๋์์ AppConfig ๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๋๊ฒผ์ผ๋ฏ๋ก, AppConfig ์ ํด๋น ํ์ผ์ ๋น์ผ๋ก ๋ฑ๋กํ ๊ฒ๋ค์ด ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋ก๋๋ค.
BeanB๋ฅผ ๋ง๋ค๊ธฐ ์ํด BeanA๊ฐ ์์ฑ๋์ด์ผ ํ๊ณ , BeanC๋ฅผ ๋ง๋ค๊ธฐ ์ํด BeanA๊ฐ ๋ ์์ฑ๋์ด์ผ ํ๋ค.
์ด๋ ๊ฒ ํ๋ค๋ฉด ์ฑ๊ธํค์ด ์๋๊ฒ ๋๋ค.
ํ์ง๋ง ์คํ๋ง์ด ์ด๋ฅผ ์ฑ๊ธํค์ผ๋ก ์ ์งํ ์ ์๊ฒ ๋์์ค๋ค.
@Configuration ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ๋ฉด,
์คํ๋ง์ด ๋ฐ์ดํธ ์ฝ๋๋ฅผ ์กฐ์ํด์ ์ฑ๊ธํค์ด ๋ณด์ฅํ ์ ์๊ฒ ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์์ฑํด์ ์ ์ฅํ๋ค๊ณ ํ๋ค.
๊ฐ๋จํ ๋งํด์, ๋น์ ์ฑ๊ธํค์ผ๋ก ์์ฑํ๊ธฐ ์ํด์ ,
@Configuration ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ ๊ฐ์ฒด๋ฅผ ApplicationContext์ ํ๋ผ๋ฏธํฐ๋ก ๋๊ธฐ๋ฉด ๋๋ค ํ ์ ์๋ค.
๐ข ๋น ์ค์ ์ ์ฃผ์์
1. ์ฑ๊ธํค ์ค์ฝํ์ ๋น์ด ์ํ๋ฅผ ๊ฐ์ง๋ฉด ์๋๋ค.
์๋ฅผ ๋ค์ด ์ฑ๊ธํค ์ค์ฝํ์ ๋น์ด value๋ผ๋ ์ํ๋ฅผ ๊ฐ์ง ๋ Thread 1์ value์ ๊ฐ์ ์ฆ๊ฐ์ํจ๋ค๊ณ ๊ฐ์ ํด๋ณด์.
๊ทธ๋ฆฌ๊ณ Thread2๋ value๋ผ๋ ๊ฐ์ ๊ฐ์ ธ์ ์ฌ์ฉํ๋ค๊ณ ํ๋ฉด Thread2๋ ๋งค๋ฒ ๋ค๋ฅธ ๊ฐ์ ์ฌ์ฉํ ์ ์๋ค.
ํด๋น ๋น์ ์ํ๋ฅผ ํญ์ ์์ธกํ ์ ์๊ธฐ ๋๋ฌธ์ ์ฐ๋ฆฌ๊ฐ ์๋ํ ๊ฒฐ๊ณผ๊ฐ ๋์ฌ ์ ์๋ค.
๊ทธ๋ฌ๋ฏ๋ก ๋น ์ค์ฝํ๋ ์ฑ๊ธํค์ผ๋ก ์ค์ ํ ๊ฒฝ์ฐ ์ํ๋ฅผ ๊ฐ์ง๋ฉด ์๋๋ค.
2. ์์กด์ฑ์ ์๋ ์ฃผ์ ํด์ผ ํ ์ธํฐํ์ด์ค์ ๊ตฌํ์ฒด๊ฐ ๋ ๊ฐ ์ด์์ผ ๊ฒฝ์ฐ
@Repository
public class StationInMemoryStationDao implements StationDao {
}
@Repository
public class StationJdbcStationDao implements StationDao {
}
@Service
public class StationService {
private final StationDao stationDao;
public StationService(final StationDao stationDao) {
this.stationDao = stationDao;
}
}
์์กด์ฑ์ ์๋ ์ฃผ์ ํด์ผํ ์ธํฐํ์ด์ค์ ๊ตฌํ์ฒด๊ฐ ๋ ๊ฐ ์ด์์ด๋ผ๋ฉด,
์คํ๋ง์ ์ด๋ค ๊ตฌํ์ฒด๋ฅผ ์๋ ์ฃผ์ ํ ์ง ์ ํ์ง ๋ชปํด์ ์ถฉ๋์ด ์ผ์ด๋๊ฒ ๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ถฉ๋๋ก ์ธํด์ ๋คํ์ฑ์ ์ด์ฉํ์ง ๋ชปํ๋ ๊ฑด๊ฐ?
์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ์ฌ ์์กด์ฑ ์ฃผ์ ์ ์ฐ์ ์์๋ฅผ ์ ํ๋ฉด ๋๋ค - Primary, Qualifier
'Backend' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
<Spring> WARN ๋ ๋ฒจ ์ด์ ๋ก๊ทธ Slack ์๋ฆผ ๋ณด๋ด๊ธฐ (0) | 2024.03.17 |
---|---|
<Spring> Spring Bean, IoC/DI ์ ๋ฆฌ 2 (0) | 2023.10.03 |
<Spring> Redis ๊ธฐ๋ฐ ๊ฒ์์ด ์๋ ์์ฑ ๊ธฐ๋ฅ ๊ตฌํํ๊ธฐ (1) | 2023.10.01 |
<Spring> AOP ๊ธฐ๋ฐ ๋ถ์ฐ๋ฝ (0) | 2023.10.01 |
<Spring> ResponseEntityExceptionHandler ์ด์ฉํ ๊ณตํต ์๋ฌ ์ฒ๋ฆฌ (0) | 2023.05.07 |