학습(구)/Spring 요약

Spring - DI(의존주입)

잉아당 2020. 10. 15. 00:58
728x90

의존이란 클래스 내부에서 다른 클래스의 메소드를 사용하는 것으로 클래스의 변화에 영향을 받는 관계를 말합니다.

 

의존 객체의 직접 생성하는 경우는 클래스 내부에서 의존 객체를 new 연산자를 사용하여 직접 생성하여 사용하는 방식을 말합니다.

의존 객체를 직접 생성하는 경우 다형성이 불가하여 유지보수 측면에서 문제가 생깁니다.

 

의존 주입, 즉 DI의 경우에는 생성자나 setter메서드를 통해 객체를 받아오는 방식을 말합니다. 

의존 주입은 의존 클래스를 변경할 때 사용됩니다.

 

예를 들어 A라는 클래스를 상속 받는 B클래스를 사용해야 할 때 직접생성의 경우 클래스 내부에서 new 연산자를 통해 객체 생성하는 부분을 모두 바꿔 주어야 합니다.

그러나 의존 주입을 통해 생성자나 setter 메서드를 사용할 경우 클래스를 생성하는 부분만 수정하면 됩니다.

 

B클래스는 A클래스를 상속 받았기 때문에 new A()를 new B()로만 바꿔줘도 다형성에 의해 자동 업캐스팅되어 사용 가능하고 B에서 A의 메소드를 오버라이딩을 통해 바꿨을 때 런타임 시 해당 부분을 확인하게 되어 동적 바인딩 처리되어 같은 이름의 메소드라도 재정의 된 B의 메소드가 실행되게 됩니다.

 

생성자를 통해 의존 주입하는 경우 의존을 한번에 처리하고 setter를 이용할 경우 의존 주입 코드를 사용하여 처리하는 방식입니다.

생성자는 한번에 의존 처리를 하여 간편 하고 의존을 놓칠 위험이 적습니다. 

setter는 어떤 객체를 의존했는지 쉽게 알 수 있지만 의존을 놓치고 nullpointException이 발생할 위험이 있습니다.

 

스프링에서의 싱글톤

스프링은 컨테이너 생성시 설정 클래스 자체를 사용하는 것이 아닌 설정 클래스를 상속받은 클래스를 생성하고 이 클래스를 인자로 사용하여 생성하게 됩니다.

Map의 형식으로 Bean 객체를 관리하며 getBean메소드 사용시 Map을 확인하여 리턴하고 Map에 없을 경우 객체를 생성하고 Map에 등록후 리턴하여 싱글톤을 구현하게 됩니다.