Spring FrameWork DI

채종윤·2023년 8월 22일
0
post-thumbnail

1억원에 대한 대출 이자와 저축 이자를 계산하고 그 결과를 출력

1. 저축 이자 및 대출 이자를 계산해 주는 InterestCalculator 인터페이스 작성

public interface InterestCalculator { //이자계산기
	public double calculate(int amount);

}

2. 이 인터페이스를 구현하는 계산 클래스를 각각 작성 ( @Component 사용)

1) LoanInterestCalculator

@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;
	}
}

2) SavingInterestCalculator

@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;
	}

}

3 InterestCalculatorSerivce구현 ( Component이면서, DI를 이용해 InterestCalculator를 구현한 객체를 얻고 사용)

@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);
	}
}

4. main()에서 실행 ( 각각의 이자 계산하고 결과 출력)

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이란?

  • Java에서는 프로그래머가 직접 인스턴스를 생성함
    Book book = new Book();
  • 하지만 Bean은 컨테이너가 관리하는 객체

@Bean

  • 개발자가 컨트롤이 불가능한 외부 라이브러리들을 Bean으로 등록하고 싶은 경우
    에 사용된다.
    메소드 또는 어노테이션 단위에 붙일 수 있다
    .
    @Component
  • 개발자가 직접 컨트롤이 가능한 클래스들의 경우에 사용된다.
    클래스 또는 인터페이스 단위에 붙일 수 있다.

스프링의 ApplicationContext는 카페 운영을 도와주는 것과 유사합니다.

AnnotationConfigApplicationContext(CalculatorContext.class):

이 부분은 카페의 운영 정책을 정의하는 'CalculatorContext'라는 클래스를 스프링에 알려주는 역할을 합니다. 이 클래스는 어떤 종류의 커피가 있는지, 어떤 재료가 필요한지 등을 설정합니다.
InterestCalculatorService interestCalculatorService = context.getBean(InterestCalculatorService.class):

위에서 설정한 카페 정책을 바탕으로, 스프링은 커피를 제조하는 서비스를 자동으로 생성합니다. 이 서비스는 InterestCalculatorService라는 타입으로 정의되어 있을 것입니다.
이 코드는 만들어진 커피 서비스를 가져와서 interestCalculatorService 변수에 담는 것입니다.


결국 의존성주입이란?

만약 자동차 클래스가 엔진을 필요로 한다면, 스프링은 엔진 객체를 생성하고 자동차 클래스에 주입해줍니다. 이렇게 자동차 클래스는 자신이 엔진을 만들지 않아도, 필요한 기능을 사용할 수 있습니다. 이렇게 의존성 주입을 사용하면 클래스 간의 결합도가 낮아져 유연하고 재사용 가능한 코드를 작성할 수 있습니다.

요약하면, 의존성 주입은 필요한 객체를 직접 생성하거나 설정하지 않고, 스프링 컨테이너가 필요한 객체를 자동으로 주입해주는 것입니다. 이렇게 하면 코드의 유연성과 재사용성을 높일 수 있습니다.

profile
안녕하세요. 백앤드 개발자를 목표로 하고 있습니다!

0개의 댓글