μμ‘΄μ± μ£Όμ (DI; Dependency Injection)
μμ‘΄μ± μ£Όμ
(DI)μ μννΈμ¨μ΄ κ°λ°μμ μ€μν κ°λ
μ
λλ€. DIλ μ»΄ν¬λνΈ κ°μ μμ‘΄μ±μ μΈλΆμμ μ£Όμ
ν¨μΌλ‘μ¨ λμ¨ν κ²°ν©μ μ μ§νλ λ°©λ²μ
λλ€. μ΄λ₯Ό ν΅ν΄ μ½λμ μ μ°μ±κ³Ό μ¬μ¬μ©μ±μ λμΌ μ μμ΅λλ€.
μ€νλ§ DI
μ€νλ§ νλ μμν¬μμλ DIλ₯Ό μ½κ² ꡬνν μ μλ κΈ°λ₯μ μ 곡ν©λλ€. μ€νλ§ DI 컨ν
μ΄λκ° κ°μ²΄ κ°μ μμ‘΄μ±μ κ΄λ¦¬νκ³ νμν μμ‘΄ κ°μ²΄λ₯Ό μ£Όμ
ν΄μ€λλ€. μ΄λ₯Ό ν΅ν΄ κ°λ°μλ κ°μ²΄λ₯Ό μμ±νκ³ μμ‘΄μ±μ κ΄λ¦¬νλ λΆλΆμ μ§μ€ν νμ μμ΄ λΉμ¦λμ€ λ‘μ§μ μ§μ€ν μ μμ΅λλ€.
Ioc 컨ν μ΄λ
Ioc 컨ν
μ΄λλ Inversion of Control(μ μ΄μ μμ ) 컨ν
μ΄λλ‘, μ€νλ§ νλ μμν¬μ ν΅μ¬μ
λλ€. Ioc 컨ν
μ΄λλ μ ν리μΌμ΄μ
μ κ΅¬μ± μμλ€μ κ΄λ¦¬νλ©°, κ°μ²΄μ μμ±κ³Ό μμ‘΄μ± μ£Όμ
μ λ΄λΉν©λλ€. μ΄λ₯Ό ν΅ν΄ κ°λ°μλ κ°μ²΄μ μλͺ
μ£ΌκΈ°μ μμ‘΄μ±μ μ§μ κ΄λ¦¬νμ§ μμλ λλ―λ‘ κ°λ° μμ°μ±κ³Ό μ μ§ λ³΄μμ±μ ν₯μμν¬ μ μμ΅λλ€.
μμ‘΄μ± μ£Όμ νλ λ°©λ²
1.
λΉ μ μ
2.
λΉ λ±λ‘
3.
μμ‘΄μ± μλ μ£Όμ
λΉ μ μ
: κ°λ°μκ° μ€νλ§ IoC 컨ν
μ΄λμ μν΄ κ΄λ¦¬λ κ°μ²΄μ λν μ 보λ₯Ό μ 곡νλ κ²
λ°©λ²
β’
XML κΈ°λ° μ€μ
β’
μ΄λ
Έν
μ΄μ
κΈ°λ° μ€μ
β’
Java Config κΈ°λ° μ€μ
XML κΈ°λ° μ€μ
XML νμΌμ μ¬μ©νμ¬ λΉμ μ μνλ λ°©λ². <bean> νκ·Έλ₯Ό μ¬μ©νμ¬ κ°μ²΄μ ν΄λμ€, μ΄λ¦, λ²μ λ±μ μ§μ ν©λλ€.
μ€νλ§ νλ μμν¬μμλ λΉ μ μμ μ»΄ν¬λνΈ μ€μΊμ XML μ€μ νμΌμ μ¬μ©νλ€.
μ€νλ§ λΆνΈμμλ μλ μ€μ (Auto Configuration) κΈ°λ₯μ΄ μμ΄μ, XML μ€μ νμΌμ μ»΄ν¬λνΈ μ€μΊ μ€μ μ ν νμκ° μκ³ , XML μ€μ νμΌμ μ¬μ©νμ§ μλλ€.
μ€νλ§ νλ μμν¬(ONLY)
root-context.xml λλ servlet-context.xml νμΌμμ λΉ μ μλ₯Ό ν©λλ€.
β’
root-context.xml
: μ€νλ§ IoC 컨ν
μ΄λλ₯Ό μ΄κΈ°ννκ³ μ ν리μΌμ΄μ
μ λ°μ μΈ μ€μ κ³Ό λΉμ ν¬ν¨ν©λλ€. μ΄ νμΌμ μ μμ μΈ λΉ μ μ λ° μλΉμ€ κ³μΈ΅, λ°μ΄ν° μ‘μΈμ€ κ³μΈ΅κ³Ό κ°μ μ ν리μΌμ΄μ
μ λ°μ κ±ΈμΉ λΉμ μ€μ ν©λλ€.
β’
servlet-context.xml
: μλΈλ¦Ώ κΈ°λ° μΉ μ ν리μΌμ΄μ
μμ μ¬μ©λλ©°, μ£Όλ‘ μΉ κ³μΈ΅κ³Ό κ΄λ ¨λ λΉλ€μ μ μν©λλ€. μ΄ νμΌμ μ£Όλ‘ μΉ μ»΄ν¬λνΈ(컨νΈλ‘€λ¬, λ·° λ¦¬μ‘Έλ² λ±)μ κ΄λ ¨λ λΉμ μ€μ ν©λλ€.
μμ
<!-- root-context.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">
<bean id="myBean" class="com.example.MyBean" />
</beans>
XML
볡μ¬
package com.example;
public class MyBean {
private String name;
private int age;
public MyBean() {
this.name = "Default Name";
this.age = 0;
}
public MyBean(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String displayInfo() {
return "Name: " + name + ", Age: " + age;
}
}
Java
볡μ¬
μ΄λ Έν μ΄μ κΈ°λ° μ€μ
μ΄λ
Έν
μ΄μ
| μν |
@Component | μΌλ°μ μΈ μ€νλ§ λΉμΌλ‘ μ¬μ©λ¨. |
@Controller | Spring MVC 컨νΈλ‘€λ¬λ‘ μ¬μ©λλ ν΄λμ€λ₯Ό λνλ. |
@Service | λΉμ¦λμ€ λ‘μ§μ μ²λ¦¬νλ μλΉμ€ ν΄λμ€λ₯Ό λνλ. |
@Repository | λ°μ΄ν° μ‘μΈμ€ κ°μ²΄ (DAO)λ₯Ό λνλ. |
μ€νλ§ νλ μμν¬(ONLY)
β’
servlet-context.xml
<context:component-scan base-package="com.aloha.spring" />
Java
볡μ¬
μ΄λ
Έν
μ΄μ
μΌλ‘ λΉμ λ±λ‘νλ €λ©΄, servlet-context.xml μ μ»΄ν¬λνΈ μ€μΊ νκ·Έλ₯Ό λ±λ‘ν΄μΌνλ€.
μ€νλ§ λΉμ κ²μν base-package μμ±μ μ§μ νλ ν¨ν€μ§ νμμ κ²½λ‘μ μλ μ€νλ§ λΉ ν΄λμ€λ₯Ό μλμΌλ‘ κ²μνκ³ λΉμΌλ‘ λ±λ‘νλ€.
@Component
β’
ν΄λμ€
@Component
public class MyComponent {
}
Java
볡μ¬
μ€νλ§ λΉμΌλ‘ λ±λ‘ν ν΄λμ€λ `@Component` μ΄λ
Έν
μ΄μ
μ λΆμ¬μ£Όλ©΄ μ»΄ν¬λνΈ μ€μΊ μ, μΈμλμ΄ Ioc 컨ν
μ΄λμ λ±λ‘λλ€.
@Service
β’
BoardService.java
@Service
public class BoardService {
}
Java
볡μ¬
`@Service` μ΄λ
Έν
μ΄μ
μ μ¬μ©νλ©΄ λΉμ¦λμ€ λ‘μ§μ μ²λ¦¬νλ μ€νλ§ λΉ ν΄λμ€λ‘ μ§μ νμ¬ Ioc 컨ν
μ΄ν°μ λΉμΌλ‘ λ±λ‘λλ€.
@Repository
β’
BoardDAO.java
@Repository
public class BoardDAO {
}
Java
볡μ¬
`@Repository` μ΄λ
Έν
μ΄μ
μ μ¬μ©νλ©΄ λ°μ΄ν° μ‘μΈμ€ κ³μΈ΅μ ν΄λμ€μ μ§μ νμ¬ Ioc 컨ν
μ΄ν°μ λΉμΌλ‘ λ±λ‘λλ€.
@Controller
β’
BoardControler.java
@Controller
public class BoardController {
}
Java
볡μ¬
`@Controller` μ΄λ
Έν
μ΄μ
μ μ¬μ©νλ©΄ μΉ μ ν리μΌμ΄μ
μ 컨νΈλ‘€λ¬ ν΄λμ€λ‘ μ§μ νμ¬ Ioc 컨ν
μ΄ν°μ λΉμΌλ‘ λ±λ‘λλ€.
Java Config κΈ°λ° μ€μ
@Configuration
β’
Config.java
@Configuration // μ€νλ§ μ€μ λΉμΌλ‘ λ±λ‘
public class Config {
// 1. κ°μ²΄λ₯Ό λ°ννλ λ©μλλ₯Ό μ μ
// 2. λ©μλμ @Bean μ΄λ
Έν
μ΄μ
μ μ
@Bean // IoC 컨ν
μ΄λμ λΉμΌλ‘ λ±λ‘
public Board board() {
return new Board("μ λͺ©", "μμ±μ", "λ΄μ©");
}
}
Java
볡μ¬
β’
@Configuration
: ν΄λμ€λ₯Ό μ€νλ§μ Java κΈ°λ° μ€μ ν΄λμ€λ‘ μ§μ
β’
@Bean
: @Configuration μ΄λ
Έν
μ΄μ
μ κ°μ§ ν΄λμ€ λ΄μμ λ©μλμ λΆμ¬νμ¬ ν΄λΉ λ©μλκ° μ€νλ§ λΉ(Bean)μ μμ±νκ³ κ΄λ¦¬νλλ‘ μ§μ
λΉ λ±λ‘
: μ€νλ§ IoC 컨ν
μ΄λκ° λΉμ μ μμ λ°λΌ κ°μ²΄λ₯Ό μμ±νκ³ , λ±λ‘νλ κ³Όμ
μ»΄ν¬λνΈ μ€μΊ
XML μ€μ , @Component μ΄λ
Έν
μ΄μ
, Config κΈ°λ° μ€μ μ μ¬μ©νμ¬ μλμΌλ‘ λΉμΌλ‘ λ±λ‘λλ μ»΄ν¬λνΈλ₯Ό μ€μΊν©λλ€. μ΄λ₯Ό ν΅ν΄ κ°λ°μλ μΌμΌμ΄ λΉμ λ±λ‘νμ§ μκ³ λ μ»΄ν¬λνΈλ₯Ό μλμΌλ‘ μΈμνκ³ μμ‘΄μ±μ μ£Όμ
ν μ μμ΅λλ€.
μ€νλ§ νλ μμν¬κ° μμμ νλμ.
μμ‘΄μ± μλ μ£Όμ
: κ°μ²΄ κ°μ κ΄κ³λ₯Ό μ€μ νκ³ , ν κ°μ²΄κ° λ€λ₯Έ κ°μ²΄λ₯Ό νμλ‘ ν λ, 컨ν
μ΄λ(μ: μ€νλ§)κ° μλμΌλ‘ νμν κ°μ²΄λ₯Ό μ£Όμ
νλ λ©μ»€λμ¦μ μλ―Έν©λλ€.
μμ‘΄μ± μ£Όμ μ’ λ₯
β’
κΈ°λ³Έ μμ‘΄μ± μλ μ£Όμ
β’
νμ
κΈ°λ° μ£Όμ
β’
μμ±μ μ£Όμ
β’
λ©μλ μ£Όμ
κΈ°λ³Έ μμ‘΄μ± μλ μ£Όμ
β’
`@Autowired` : μμ‘΄μ± μλ μ£Όμ
μ΄λ
Έν
μ΄μ
μ€νλ§ μ»¨ν
μ΄λκ° λΉμ μμ‘΄μ±μ μλμΌλ‘ ν΄κ²°νλλ‘ μ§μν©λλ€.
@Autowired
private MyBean myBean;
Java
볡μ¬
νμ κΈ°λ° μ£Όμ
β’
λΉ μ΄λ¦μ μ§μ ν΄μ μμ‘΄μ±μ μ£Όμ
νλ λ°©λ²μ
λλ€.
β¦
@Autowired
β¦
@Qualifier("λΉμ΄λ¦")
β¦
@Component("λΉμ΄λ¦")
β’
@Autowired
: μμ‘΄μ± μ£Όμ
μ μλμΌλ‘ μ²λ¦¬νλ μ΄λ
Έν
μ΄μ
β’
@Qualifier("λΉμ΄λ¦")
: μ¬λ¬ κ°μ λμΌν νμ
μ λΉ μ€ νΉμ λΉμ μ§μ νμ¬ μ£Όμ
ν λ μ¬μ©νλ μ΄λ
Έν
μ΄μ
β’
@Component("λΉμ΄λ¦")
: ν΄λΉ ν΄λμ€λ₯Ό μ€νλ§ λΉμΌλ‘ λ±λ‘νκ³ , λΉμ μ΄λ¦μ λͺ
μμ μΌλ‘ μ§μ νλ μ΄λ
Έν
μ΄μ
. μ΄λ λ€λ₯Έ @Component μ΄λ
Έν
μ΄μ
μ κΈ°λ°μ΄ λ©λλ€.
β’
Test.java
@Autowired
@Qualifier("myBean")
private MyBean myBean;
Java
볡μ¬
β’
MyBean.java
@Component("myBean") // "MyBean "μ΄λΌλ μ΄λ¦μΌλ‘ λΉμ λ±λ‘ν©λλ€.
public class MyBean {
// ν΄λμ€ λ΄μ©
}
Java
볡μ¬
μμ±μ μ£Όμ
: κ°μ²΄ μμ± μμ νμν μμ‘΄μ±μ μμ±μλ₯Ό ν΅ν΄ μ£Όμ
νλ λ°©μ
μΌλ°μ μΌλ‘ λ λ§μ΄ μ¬μ©λλ©°, λΆλ³μ±κ³Ό νμμ μΈ μμ‘΄μ±μ νμ€νκ² ν λ μ μ©ν¨.
β’
BoardService.java
@Service
public class BoardService {
private BoardDAO boardDAO;
@Autowired
public BoardService(BoardDAO boardDAO) {
this.boardDAO = boardDAO;
}
}
Java
볡μ¬
β’
BoardDAO.java
@Repository
public class BoardDAO {
...
}
Java
볡μ¬
λ©μλ μ£Όμ
: μ£Όλ‘ μΈν° λ©μλλ₯Ό μ΄μ©νμ¬ λΉμ΄ μμ±λ νμ μμ‘΄μ±μ μ£Όμ
νλ λ°©μ
μμ± μ΄νμ μμ‘΄μ±μ΄ λ³κ²½λ μ μλ κ²½μ°μ νμ©λ¨. μμ±μ μ£Όμ
κ³Ό λ¬λ¦¬ μ νμ μΈ μμ‘΄μ±μ μ²λ¦¬ν λ μ¬μ©λ μ μμ.
β’
BoardService.java
@Service
public class BoardService {
private BoardDAO boardDAO;
@Autowired
public void setBoardDAO(BoardDAO boardDAO) {
this.boardDAO = boardDAO;
}
}
Java
볡μ¬
β’
BoardDAO.java
@Repository
public class BoardDAO {
...
}
Java
볡μ¬
λΉ μ μνκ³ IoC 컨ν μ΄λμ λ±λ‘λ λͺ¨λ λΉ μ‘°ν
νλ‘μ νΈ κ΅¬μ‘°
spring-di/
βββ src/
β βββ main/
β β βββ java/
β β β βββ com/
β β β βββ joeun/
β β β βββ springdi/
β β β βββ bean/
β β β β βββ Person.java
β β β β βββ Student.java
β β β β βββ Test.java
β β β βββ ServletInitializer.java
β β β βββ SpringDiApplication.java
β βββ resources/
β β βββ application.properties
β β βββ static/
β β βββ templates/
βββ build.gradle
νλ‘μ νΈ νκ²½
β’
Spring boot version : 3.3.5
β’
Group Id : com.aloha
β’
Artifact Id : spring-di
β’
Java version : JDK 17
β’
Packaging : WAR
β’
Dependency
β¦
Spring Dev Tools
β¦
Lombok
μμ νμΌ
β’
Person.java
β’
Student.java
β’
Test.java
β’
SpringDiApplication.java
Person.java
package com.aloha.spring_di.bean;
import org.springframework.stereotype.Component;
import lombok.Data;
@Data
@Component("person") // μ΄ ν΄λμ€λ₯Ό μ€νλ§ λΉμΌλ‘ λ±λ‘νκΈ° μν μ΄λ
Έν
μ΄μ
public class Person {
private String name;
private int age;
// κΈ°λ³Έ μμ±μ
public Person() {
this.name = "κΉμ‘°μ";
this.age = 20;
}
}
Java
볡μ¬
Student.java
package com.aloha.spring_di.bean;
import org.springframework.stereotype.Component;
import lombok.Data;
@Data
@Component("student")
public class Student extends Person {
private int studentId;
private String grade;
public Student() {
super();
this.studentId = 1001;
this.grade = "1";
}
@Override
public String toString() {
return "Student{name='" + getName() + "', age=" + getAge() + ", studentId=" + studentId + ", grade='" + grade + "'}";
}
}
Java
볡μ¬
Test.java
package com.aloha.spring_di.bean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class Test {
@Autowired
private Person person;
@Autowired
private Student student;
public void print() {
System.out.println("person : " + person);
System.out.println("student : " + student);
}
}
Java
볡μ¬
SpringDiApplication.java
package com.aloha.spring_di;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import com.aloha.spring_di.bean.Test;
// alt + shift + O : μ 체 import
@SpringBootApplication
public class SpringDiApplication {
public static void main(String[] args) {
ApplicationContext context = SpringApplication.run(SpringDiApplication.class, args);
// IoC 컨ν
μ΄λμ λ±λ‘λ λͺ¨λ λΉμ μ΄λ¦ μ‘°ν
String[] allBeanNames = context.getBeanDefinitionNames();
// μ‘°νλ λΉ μ΄λ¦ μΆλ ₯
for (String beanName : allBeanNames) {
System.out.println("λΉ μ΄λ¦: " + beanName);
}
// getBean() : λΉ μ΄λ¦μΌλ‘ λΉ κ°μ²΄λ₯Ό κ°μ Έμ΄
Test test = context.getBean(Test.class);
test.print();
}
}
Java
볡μ¬