728x90
반응형
의존성 주입은 다른 객체에 의존하는 객체를 만들 수 있는 소프트웨어 개발 기법.
(클래스 간에 "상호작용"을 하면서 동시에 독립적으로 유지)
의존성 주입에는 3가지 클래스 유형(Service, Injector, Client)
Public class Car {
private Owner owner;
public Car() {
owner = new Owner();
}
}
- 위에 예시를 보면 클라이언트 객체가 서비스 객체를 직접 생성하므로 의존성 주입은 없음.
public class Car {
private Owner owner;
public Car(Owner owner){
this.owner = owner;
}
}
- 위에 예시를 보면 서비스 객체가 직접 생성되지는 않지만 대신 클라이언트 클래스 생성자에서 매개변수로 전달됨.
의존성 주입에는 두 가지 유형이 존재
생성자 주입, 세터 주입
"생성자 주입"과 "세터 주입"의 차이 :
생성자 주입(객체의 생성과 동시에 여러 서비스 객체의 의존성을 주입가능)
새터 주입(선택적 의존 주입이 가능하고, 메서드의 이름을 보고 어떤 의존성 주입인지 판단이 가능)
사용하는 이유가 무엇인가 : 의존성 주입을 통해 클래스들 끼리 느슨하게 연결할 수 있어 각 클래스에서 동작을 단위 테스트하기 편함.
스프링 부트에서 의존성 주입 이용
(스프링 프레임워크에서 "스프링 ApplicationContext"를 통해 완성됨)
(스프링 AppliactionContext는 "객체(빈)"과 "객체의 의존성"을 생성하고 관리하는 역할(통합 관리))
스프링은 특정 어노테이션(@Servcie, @Repository, @Controller)를 검색하고 빈 객체로 자동 등록하고 이를 의존성 주입을 사용하여 서로를 상호작용하도록 설정을 편리하게 설정이 가능!!!!!
//생성자 주입
public class Car{
private final CarRepository carRepository;
public Car(CarRepository carRepository) {
this.carRepository = carRepository;
}
//데이터베이스에서 모든 자동차 정보를 가져옴.
carRepository.findAll();
}
- 컨테이너에서 등록된 클라이언트 빈 객체가 생성되면서 동시에 필요한 모든 의존성을 반드시 이용하는 기본 방법.
- 여기서 CarPepository를 서비스 객체로 보고 리포지토리는 DB에 대한 접근을 원할 시에 사용하는 서비스 객체.
- 클래스에 생성자가 여러 개 있는 경우 "@AutoWired" 애너테이션을 사용하여 정의함.!!!!
- final을 사용한 이유는 생성자 주입을 사용한 시점부터 내가 꼭 필요한 의존성 주입이다 어떠한 경우에도 변경하기 싫다는 경우에 final을 반드시 붙임.
//세터 주입
@Service
public class AppUserSerivce{
privatee AppUserRepository userRepository;
@Autowired
public void setAppUserRepository(AppUserRepository userRepository) {
this.userRepository = userRepository;
}
// userRepository를 시용하는 다른 메서드들
- 메서드를 통해 의존성을 주입하는 선택적 의존성 주입 방법.
- 런타임(프로그램 실행 도중)에 상호작용을 수행하는 경우에 유용함.
- 생성자 주입과 다르게 세터 주입은 @Autowired가 필수 Why? 스프링 컨테이너가 해당 세터를 인지하지 못하기 때문
- final도 해당 세터 주입은 선택적 주입이고 런타임 도중에 변경되기에 오류 발생이 크므로 final은 사용 안함.
'IT개발 > Spring5' 카테고리의 다른 글
[Spring5]JPA의 기본 어노테이션 (0) | 2025.04.06 |
---|---|
[Spring5] JSP를 사용하지 않는 이유 & JPA, JSON 개념(간단) (0) | 2025.03.20 |
[Spring Boot] 개발 환경 설정부터 H2 데이터베이스 웹 연결 (0) | 2024.11.28 |
[Spring5]@RestController, @JsonIgnore, @RequestBody 정의 및 예시 (0) | 2024.11.25 |
[Spring5]로그인과 쿠키, 세션, 인터셉터 (0) | 2024.11.24 |