[Spring] 의존성 주입(DI, Dependency Injection) 이해하기

kihongsi·2022년 1월 4일
0

spring

목록 보기
1/7
post-thumbnail

Dependency?

의존 관계란 무엇일까.
A의 기능이 추가되거나 형식이 바뀌는 것이 B에 영향을 끼친다면 A와 B가 의존 관계에 있다고 할 수 있음


class Cook {
    private Recipe recipe;
    public Cook(){
        recipe = new Recipe();
    }
}
    

Recipe 내용이 바뀌면 Cook이 실행하는 내용도 바뀜

의존관계를 인터페이스로 추상화하면 더 다양한 의존관계를 맺게 하여 클래스 간의 결합도를 낮출 수 있음
[TypeScript] 인터페이스와 덕 타이핑(Interface & Duck Typing)



Dependency Injection?

의존관계를 외부에서 결정하고 주입하는 것
자동 주입 기능을 사용하면 의존 객체를 명시하지 않아도 스프링이 필요한 객체를 찾아서 주입해 줌

다음과 같은 조건을 충족해야 함

  • 클래스 모델이나 코드에는 런타임 시점의 의존관계가 드러나지 않으므로 인터페이스만 의존해야 함
  • 런타임 시점의 의존관계는 컨테이너나 팩토리 같은 제3의 존재가 결정함
  • 의존관계는 사용할 오브젝트에 대한 레퍼런스를 외부에서 주입해줌으로써 만들어짐


How to?

런타임 시점의 의존관계를 외부에서 주입하기

매개변수로 클래스를 주입시키기 (new 사용)

이 경우 개발자가 직접 new를 해주지 않아도 됨
코드의 종속을 줄일 수 있음

But, spring이 발전하면서 객체 설정이 많아지는 것을 방지하기 위해 새로운 방식을 만들어냄

어노테이션 사용

...
@Component
public class Apple {
	int width;

    public Apple(){
		width = 100;
    }
    
	public int getWidth(){
		return width;
	}
}
...
@Controller
public class AppleController {
	@Autowired
	Apple apple;
	
	@RequestMapping("/home/apple")
	@ResponseBody
	public String showApple(){
		return "width of apple : " + apple.getWidth();
	}
}

AppleControler 에서 @Autowired 방식을 사용하여 스프링에게 Apple 객체를 참조하도록 하고, Apple 클래스에서 @Component 를 사용하여 해당 클래스를 스프링이 자동으로 주입하게 하는 것

의존성 주입을 사용함으로써 개발의 생산성을 높일 수 있음
주입된 클래스만 수정해주면 된다는 점에서 유지보수의 측면에서도 효율적



DI의 장점?

  1. Reduced Dependencies
  2. More Reusable Code
  3. More Testable Code
  4. More Readabale Code
  5. Reduced Dependency Carrying


참고자료

Spring_spring DI 이해하기
의존관계 주입(Dependency Injection) 쉽게 이해하기

0개의 댓글