public interface InterestCalculator { //이자계산기
public double calculate(int amount);
}
@Component("loanCalcator") //이름등록,안하면 loaninterestCalculator가 기본이름이 됨
public class LoanInterestCalculator implements InterestCalculator{ //대출이자
private static final double RATE = 0.0525;
@Override
public double calculate(int amount) {
System.out.println("LoanInterestCalculator - calculate()");
return amount * RATE;
}
}
@Component("savingCalcator")
public class SavingInterestCalculator implements InterestCalculator{
private static final double RATE = 0.0334;
@Override
public double calculate(int amount) {
System.out.println("SavingInterestCalculator - calculate()");
return amount * RATE;
}
}
@Component
public class InterestCalculatorService {
@Autowired //자동으로 연결
@Qualifier("loanCalcator") //특정한 객체를 찾기위해 사용
InterestCalculator loanInterestCalculator;
@Autowired
@Qualifier("savingCalcator")
InterestCalculator savingInterestCalculator;
public double calculateLoanInterest(int amount) {
return loanInterestCalculator.calculate(amount);
}
public double calculateSavingInterest(int amount) {
return savingInterestCalculator.calculate(amount);
}
}
public class test {
public static void main(String[] args) {
ApplicationContext context =
new AnnotationConfigApplicationContext(CalculatorContext.class);
InterestCalculatorService interestCalculatorService = context.getBean(InterestCalculatorService.class);
int amount = 100_000_000;
double loanInterest = interestCalculatorService.calculateLoanInterest(amount);
System.out.printf("Amount : %10d loanInterest is %.2f", amount, loanInterest);
System.out.println();
double savingInterest = interestCalculatorService.calculateSavingInterest(amount);
System.out.printf("Amount : %10d savingInterest is %.2f", amount, savingInterest);
}
}
공부)
Bean이란?
@Bean
스프링의 ApplicationContext는 카페 운영을 도와주는 것과 유사합니다.
AnnotationConfigApplicationContext(CalculatorContext.class):
이 부분은 카페의 운영 정책을 정의하는 'CalculatorContext'라는 클래스를 스프링에 알려주는 역할을 합니다. 이 클래스는 어떤 종류의 커피가 있는지, 어떤 재료가 필요한지 등을 설정합니다.
InterestCalculatorService interestCalculatorService = context.getBean(InterestCalculatorService.class):
위에서 설정한 카페 정책을 바탕으로, 스프링은 커피를 제조하는 서비스를 자동으로 생성합니다. 이 서비스는 InterestCalculatorService라는 타입으로 정의되어 있을 것입니다.
이 코드는 만들어진 커피 서비스를 가져와서 interestCalculatorService 변수에 담는 것입니다.
결국 의존성주입이란?
만약 자동차 클래스가 엔진을 필요로 한다면, 스프링은 엔진 객체를 생성하고 자동차 클래스에 주입해줍니다. 이렇게 자동차 클래스는 자신이 엔진을 만들지 않아도, 필요한 기능을 사용할 수 있습니다. 이렇게 의존성 주입을 사용하면 클래스 간의 결합도가 낮아져 유연하고 재사용 가능한 코드를 작성할 수 있습니다.
요약하면, 의존성 주입은 필요한 객체를 직접 생성하거나 설정하지 않고, 스프링 컨테이너가 필요한 객체를 자동으로 주입해주는 것입니다. 이렇게 하면 코드의 유연성과 재사용성을 높일 수 있습니다.