본문 바로가기
IT개발/Spring5

[Spring5] 의존성 주입(Dependency Injection) 이해하기(이걸로 끝)

by Thompson 2025. 3. 20.
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은 사용 안함.