Backend/SpringBoot

의존성 주입 (List, Map 포함)

Dean83 2024. 10. 23. 13:16

Repository 의 interface를 활용하기 위해서, 각 클래스에서 의존성 주입을 통해 DB 연동을 해야 한다.

 

@Autowired 어노테이션을 통해 자동으로 의존성 주입을 하는데, 여러 방법이 있으나 생성자에서 주입하는 방식을 원칙으로 한다.  

 

  • 생성자 주입
    • @Autowired 어노테이션을 사용하지 않아도 된다.
    • 클래스의 생성자에 인자값 형식으로 받는다.
public class 클래스명 {
    private final 리파지토리interface명 _repoValue;
    
    public 클래스명(리파지토리interface명 _repo)
    {
        this._repoValue = _repo;
    }
    
    ....
    
}
  • @ RequiredArgsConstructor 어노테이션
    • 해당 어노테이션을 사용하면 롬복에서 자동으로 final로 지정된 변수에 인젝션을 해준다.
    • 따라서 생성자를 따로 작성할 필요가 없다.

 

 

  • 맴버변수에 주입
    • 비추천하는 방식이고, 테스트 코드에서만 사용
public class 클래스명 {

	@Autowired
    private repository인터페이스명 _repoInt;
    
    ...
}

 

  • setter 주입이나 메서드 주입도 있으나 이는 다룰 필요가 없어 보인다. 생성자 주입을 쓰자.

 

List나 Map 자료형에 의존성 주입을 받아야 할 때도 있다.(많이 쓰인다)

  • Payment 부모 빈이 있고,
    • Account, Card, Paypal 등 자식 빈들이 있을 경우
    • 이 3개를 모두 사용해야 할 경우
@Service
public class PayService {
	
	/* 1. List 타입으로 주입 */
	private List<Payment> payList;

	@Autowired
	public PayService(List<Payment> payList) {
		this.payList = payList;
	}

	public void payment() {
		payList.forEach(pay::payment);
	}
}

 

@Service
public class PayService {
	
	/* 2. Map 타입으로 주입 
    	key 값은 빈의 이름
    */
    
	private Map<String, Payment> payMap;
	
	@Autowired
	public PayService(Map<String, Payment> payMap) {
		this.payMap = payMap;
	}
	
	public void pay() {
      payMap.forEach((k, v) -> {
          System.out.println("key : " + k);
          System.out.print("pay : ");
          v.pay();
      });
  }
}