๐ป IoC (Inversion of Control) ์ ์ด์ ์ญ์
- ๊ฐ์ฒด์ ์์ฑ๊ณผ ์์กด์ฑ ๊ด๋ฆฌ์ ์ ์ด๋ฅผ ํ๋ ์์ํฌ / ์ปจํ ์ด๋์ ๋งก๊น (๊ฐ๋ฐ์๋ ๊ด์ฌํ์ง ์๋๋ค)
- ๊ฐ์ฒด๋ฅผ ํ์ํ ๋ ์์ฑํด์ ์ฌ์ฉํ๋ ๋ฐฉ์์ ๋ฏธ๋ฆฌ ์์ฑํด ๋๊ณ ๊บผ๋ด์ ์ฌ์ฉํ๋ ํํ๋ก ๋ณ๊ฒฝ
๐ป DI (Dependency Injection) ์์กด์ฑ ์ฃผ์
DI : Dependency Injection
- IoC ๋ฅผ ๊ตฌํํ๋ ๋ฐฉ์ ์ค ํ๋
- ์์ ์ ์์กด์ฑ์ ์ธ๋ถ์์ ์ฃผ์ ๋ฐ๋ ๋ฐฉ์์ด๋ค.
- ์คํ๋ง Container ์ ๋ง๋ค์ด๋ ๊ฐ์ข ํด๋์ค(bean)๋ค์ ์๋ก ์์กด์ ์ด๋ค.
- ํ๋ก๊ทธ๋๋ฐ์์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ ์ธ๋ถ์์ ๋ฐ๋ก ์ฃผ์ ํ๋ ๋ฐฉ๋ฒ
๐ป ์์กด์ฑ ์ฃผ์ 2๊ฐ์ง ๋ฐฉ๋ฒ
1) ์์ฑ์๋ฅผ ํตํ ์์กด์ฑ ์ฃผ์
2) setter๋ฅผ ํตํ ์์กด์ฑ ์ฃผ์
์์ฑ์ ์ฃผ์ ๋ฐฉ์
pom.xml ์ ์ข ์์ฑ ์ถ๊ฐ (spring framework)
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.25</version>
</dependency>
</dependencies>
์์กด์ฑ ์ฃผ์ ์ ์ํ ์ธํฐํ์ด์ค / ํด๋์ค ์ ์
// Engine.java
public interface Engine {
void start();
}
// EngineImpl.java
public class EngineImpl implements Engine {
public void start() {
System.out.println("Engine started");
}
}
// Car.java
public class Car {
private Engine engine;
// ์์ฑ์ ์ฃผ์
๋ฐฉ์์ผ๋ก DI ์ฒ๋ฆฌ
public Car(Engine engine) {
this.engine = engine;
}
public void drive() {
engine.start();
System.out.println("Car is driving");
}
}
`ApplicationContext` = IoC ์ปจํ ์ด๋ ๋ฅผ ์ฌ์ฉํ์ฌ ์์กด์ฑ ์ฃผ์ ์ค์
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String[] args) {
// IoC ์ปจํ
์ด๋ ์ค์
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
// ์์กด์ฑ ์ฃผ์
๋ Car ๊ฐ์ฒด ๊ฐ์ ธ์ค๊ธฐ
Car car = context.getBean(Car.class);
car.drive();
}
}
XML ์ค์ ํ์ผ์์ Car ๊ฐ์ฒด์ Engine ๊ฐ์ฒด๋ฅผ ์ค์ ํ๊ณ ์์กด์ฑ์ ์ฃผ์
<!-- beans.xml -->
<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">
<!-- Engine ๋น ์ ์ -->
<bean id="engine" class="EngineImpl" />
<!-- Car ๋น ์ ์ (์์ฑ์ ์ฃผ์
๋ฐฉ์) -->
<bean id="car" class="Car">
<constructor-arg ref="engine" />
</bean>
</beans>
์ธํฐ ์ฃผ์ ๋ฐฉ์
// Car.java (์ธํฐ ์ฃผ์
)
public class Car {
private Engine engine;
// ์ธํฐ ๋ฉ์๋๋ก DI ์ฒ๋ฆฌ
public void setEngine(Engine engine) {
this.engine = engine;
}
public void drive() {
engine.start();
System.out.println("Car is driving");
}
}
xml ํ์ผ์์ ์์ฑ์ ์ฃผ์ ๋์ ์ธํฐ ์ฃผ์ ์ฌ์ฉ
<!-- beans.xml -->
<bean id="car" class="Car">
<property name="engine" ref="engine" />
</bean>
๐ป DI ์ค์ ๋ฐฉ๋ฒ
๐ป ์์กด๊ฐ์ฒด ์๋ ์ฃผ์
<constructor-org> , <property> ํ๊ทธ๋ก ์์กด ๋์ ๊ฐ์ฒด๋ฅผ ๋ช ์ํ์ง ์์๋
์๋์ผ๋ก ํ์ํ ์์กด ๋์ ๊ฐ์ฒด๋ฅผ ์ฐพ์์, ํ์ํ ๊ฐ์ฒด์๊ฒ ์ฃผ์ ํด์ฃผ๋ ๊ธฐ๋ฅ
@Autowired
@Resource
์ด๋ ธํ ์ด์ ์ผ๋ก ์ฝ๊ฒ ๊ตฌํ ๊ฐ๋ฅ
๐ปDI ์๋ ์ฃผ์ ์ค์ ๋ฐฉ๋ฒ
๐ป์์กด ๊ฐ์ฒด ์๋ ์ฃผ์ ํ๊ทธ
@Autowired (required = false) | ํ์ ์ ๊ธฐ์ค์ผ๋ก ์์กด์ฑ ์ฃผ์ , ๊ฐ์ ํ์ ์ ๋น์ด ๋๊ฐ ์ด์ ์์ ๊ฒฝ์ฐ "๋ณ์์ด๋ฆ"์ผ๋ก ๋น์ ์ฐพ์ | ์์ฑ๊ฐ, ์ธํฐ, ์์ฑ์ ์ ์ฉ๊ฐ๋ฅ | Spring ์ด๋ ธํ ์ด์ |
@Qualifier | ๋น์ ์ด๋ฆ์ผ๋ก ์์กด์ฑ ์ฃผ์
@Autowired ์ ๊ฐ์ด ์ฌ์ฉ |
๋ชจํธํ bean์ ๊ฐ์ ์ฐ๊ฒฐ ๋์ผํ ๊ฐ์ฒด๊ฐ 2๊ฐ ์ด์์ด๋ฉด ์์ธ๋ฐ์ (์๋ ์ฃผ์ ๋์ ๊ฐ์ฒด ํ๋จ ๋ถ๊ฐ) |
Spring ์ด๋ ธํ ์ด์ |
@Resource | name ์์ฑ์ ์ด์ฉํ์ฌ ๋น์ ์ด๋ฆ์ ์ง์ ์ง์ | ์์ฑ๊ฐ, ์ธํฐ ์ ์ฉ๊ฐ๋ฅ | javaSE์ ์ด๋ ธํ ์ด์ (JDK9 ์๋ ํฌํจ ์๋จ) |
@Inject | @Autowired ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๊ฐ๋ค. | javaSE์ ์ด๋ ธํ ์ด์ |
๐ป Bean ์์ฑ vs ์์กด์ฑ ์ฃผ์
๐ป xml ํ์ผ -> java ํ์ผ๋ก ๋ณ๊ฒฝ
@Configuration : ์คํ๋ง ์ปจํ ์ด๋๋ฅผ ๋์ ์์ฑํ๋ ์ด๋ ธํ ์ด์
@Bean : ๋น์ผ๋ก ๋ฑ๋กํ๋ ์ด๋ ธํ ์ด์