ποΈ[SpringBoot] μ€νλ§ λΆνΈμ ν΅μ¬ κ°λ
:
μ μ΄μ μμ (IoC) - μ€νλ§μμμ μ μ΄μ μμ
π λͺ©μ°¨
μμ‘΄μ± μ£Όμ μ κΈ°λ³Έ
Springμμ @Autowired
μ λ
Έν
μ΄μ
μ μ¬μ©νλ©΄, μ€νλ§ μ»¨ν
μ΄λκ° ν΄λΉ μΈν°νμ΄μ€λ₯Ό ꡬνν κ°μ²΄λ₯Ό μλμΌλ‘ μ°Ύμμ μ£Όμ
ν΄μ€λλ€.
κΈ°λ³Έ ꡬ쑰 μμ
// μΈν°νμ΄μ€
public interface CoffeeMachine {
String brew();
}
// ꡬν체
@Component
public class EspressoMachine implements CoffeeMachine {
@Override
public String brew() {
return "Brewing coffee with Espresso Machine";
}
}
// μμ‘΄μ± μ£Όμ
@Component
public class CoffeeMaker {
@Autowired
private CoffeeMachine coffeeMachine;
@PostConstruct
public void makeCoffee() {
System.out.println(coffeeMachine.brew());
}
}
λ€μ€ λΉ λ¬Έμ μ ν΄κ²°μ±
π¨ λ¬Έμ μν©
λμΌν μΈν°νμ΄μ€λ₯Ό ꡬνν ν΄λμ€κ° μ¬λ¬ κ° μμ λ λ¬Έμ κ° λ°μν©λλ€:
@Component
public class EspressoMachine implements CoffeeMachine {
@Override
public String brew() {
return "Brewing coffee with Espresso Machine";
}
}
@Component
public class DripCoffeeMachine implements CoffeeMachine {
@Override
public String brew() {
return "Brewing coffee with Drip Coffee Machine";
}
}
μ΄ κ²½μ° λ€μκ³Ό κ°μ μ€λ₯κ° λ°μν©λλ€:
*********************
APPLICATION FAILED TO START
*********************
Description:
Field coffeeMachine in com.example.demo.CoffeeMaker required a single bean
but 2 were found:
- dripCoffeeMachine: defined in file [...\DripCoffeeMachine.class]
- espressoMachine: defined in file [...\EspressoMachine.class]
Action:
Consider marking one of the beans as @Primary, updating the consumer to accept
multiple beans, or using @Qualifier to identify the bean that should be consumed
π‘ ν΄κ²° λ°©λ²
λ°©λ² 1: @Primary
μ¬μ©
μ°μ μμκ° λμ λΉμ μ§μ ν©λλ€:
@Component
@Primary // κΈ°λ³ΈμΌλ‘ μ νλ λΉ
public class DripCoffeeMachine implements CoffeeMachine {
@Override
public String brew() {
return "Brewing coffee with Drip Coffee Machine";
}
}
@Component
public class EspressoMachine implements CoffeeMachine {
@Override
public String brew() {
return "Brewing coffee with Espresso Machine";
}
}
λ°©λ² 2: @Qualifier
μ¬μ©
λΉμ μ΄λ¦μ μ§μ νκ³ , μ£Όμ λ°μ λ νΉμ μ΄λ¦μ λͺ μν©λλ€:
// 1. λΉ λ±λ‘ μ μ΄λ¦ μ§μ
@Component("dripCoffeeMachine")
public class DripCoffeeMachine implements CoffeeMachine {
@Override
public String brew() {
return "Brewing coffee with Drip Coffee Machine";
}
}
@Component("espressoMachine")
public class EspressoMachine implements CoffeeMachine {
@Override
public String brew() {
return "Brewing coffee with Espresso Machine";
}
}
// 2. μ£Όμ
λ°μ λ νΉμ λΉ μ§μ
@Component
public class CoffeeMaker {
@Autowired
@Qualifier("dripCoffeeMachine") // νΉμ λΉ μ ν
private CoffeeMachine coffeeMachine;
@PostConstruct
public void makeCoffee() {
System.out.println(coffeeMachine.brew());
}
}
λ°©λ² 3: λͺ¨λ λΉμ 리μ€νΈλ‘ μ£Όμ
λͺ¨λ ꡬν체λ₯Ό μ¬μ©νκ³ μΆλ€λ©΄ List
λ‘ μ£Όμ
λ°μ΅λλ€:
@Component
public class CoffeeMaker {
@Autowired
private List<CoffeeMachine> coffeeMachines; // λͺ¨λ ꡬν체 μ£Όμ
@PostConstruct
public void makeCoffee() {
for (CoffeeMachine coffeeMachine : coffeeMachines) {
System.out.println(coffeeMachine.brew());
}
}
}
μΆλ ₯ κ²°κ³Ό:
Brewing coffee with Drip Coffee Machine
Brewing coffee with Espresso Machine
μ€μ μ¬μ© μμ
μλ리μ€λ³ μ¬μ©λ²
π― νΉμ ꡬνμ²΄λ§ μ¬μ©νκ³ μΆμ κ²½μ°
@Service
public class CafeService {
@Autowired
@Qualifier("premiumEspressoMachine")
private CoffeeMachine coffeeMachine;
}
π― κΈ°λ³Έ ꡬν체λ₯Ό μ€μ νκ³ μΆμ κ²½μ°
@Component
@Primary
public class DefaultCoffeeMachine implements CoffeeMachine {
// κΈ°λ³ΈμΌλ‘ μ¬μ©ν ꡬν체
}
π― λͺ¨λ ꡬν체μ λν΄ μμ μ μννκ³ μΆμ κ²½μ°
@Service
public class CoffeeTestService {
@Autowired
private List<CoffeeMachine> allMachines;
public void testAllMachines() {
allMachines.forEach(machine ->
System.out.println("Testing: " + machine.brew())
);
}
}
μ 리
π ν΅μ¬ ν¬μΈνΈ
-
κΈ°λ³Έ λμ:
@Autowired
λ μΈν°νμ΄μ€ νμ μ λ§λ λΉμ μλμΌλ‘ μ£Όμ - λ€μ€ λΉ λ¬Έμ : κ°μ μΈν°νμ΄μ€λ₯Ό ꡬνν λΉμ΄ μ¬λ¬ κ°μΌ λ μΆ©λ λ°μ
-
ν΄κ²° λ°©λ²:
-
@Primary
: μ°μ μμ μ§μ -
@Qualifier
: νΉμ λΉ μ ν -
List<T>
: λͺ¨λ λΉ μ£Όμ
-
β‘ λ² μ€νΈ νλν°μ€
-
λͺ
νν λΉ μ΄λ¦ μ¬μ©:
@Component("ꡬ체μ μΈμ΄λ¦")
- @Primary μ μ ν νμ©: κΈ°λ³Έκ°μ΄ λͺ νν λ
- @Qualifier μ κ·Ή νμ©: νΉμ ꡬνμ²΄κ° νμν λ
- μΈν°νμ΄μ€ μ€κ³: μν κ³Ό μ± μμ λͺ νν λΆλ¦¬
π Spring IoCμ ν΅μ¬ μ² ν
Spring μ ν리μΌμ΄μ μμλ λͺ¨λ ν΄λμ€κ° μ€νλ§ λΉμΌλ‘ λ±λ‘λκ³ , μ€νλ§ μ»¨ν μ΄λκ° μμ‘΄μ±μ κ΄λ¦¬ν©λλ€. κ°λ°μλ κ°μ²΄ μμ±κ³Ό μμ‘΄μ± μ£Όμ μ μ§μ κ΄λ¦¬νμ§ μκ³ , Springμ΄ μ΄λ₯Ό λμ μ²λ¦¬νμ¬ λμ¨ν κ²°ν©(Loose Coupling) κ³Ό λμ ν μ€νΈ κ°λ₯μ±μ μ 곡λ°μ μ μμ΅λλ€.