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();
});
}
}'Backend > SpringBoot' 카테고리의 다른 글
| [기본구조4] 서비스 (0) | 2024.10.23 |
|---|---|
| 응답으로 템플릿 리턴하기 (model, 타임리프, layout) (0) | 2024.10.23 |
| [기본구조3] Repository with JPA (DB CRUD동작,Interface, findby) (0) | 2024.10.23 |
| [기본구조2] JPA 초기 설정 (DB 관리) 및 Entity 예제(validation 포함) (0) | 2024.10.22 |
| 프로젝트 설정파일 application.properties (또는 application.yml) (0) | 2024.10.22 |