DI(Dependency injection: 의존성 주입)

devyumi·2023년 12월 4일
0

Spring

목록 보기
3/14

DI

  • 컨테이너가 객체 간의 의존 관계를 Bean 설정 정보를 바탕으로 외부에서 주입하는 것
  • 즉, 객체를 외부에서 생성하여 주입하는 것

클래스 내에서 객체 생성

  • Car 객체가 생성될 때 Engine 객체도 함께 만들어짐.

  • 즉, Engine 객체가 Car 클래스 내부에서 생성됨(new)

  • 클래스 간 결합도가 높고, 코드 유지보수가 어려움
public class Car{
	private Engine engine;
	public Car(){
		engine = new Engine();
	}
}

객체를 외부에서 생성하여 클래스에 주입

  • Engine 객체가 외부에서 생성되고(new) Car 클래스에 주입함

  • 클래스 간 결합도가 낮고, 코드의 유연성을 확보함
public class Car{
	private Engine engine;
	public Car(Engine engine){
		this.engine = engine;
	}	
} 


장점

  • 클래스 간 의존성, 결합성을 낮춤

  • 코드의 유연성을 확보하여 유지보수가 용이함



방법

1. 생성자 주입

  • 가장 권장되는 방식

  • 장점으로는 final 선언이 가능하여 불변성 보장, 테스트 코드 작성 용이, 순환참조 방지 등이 있음

public class MemberController {
	private final MemberService memberService;

	public MemberController(MemberService memberService){
		this.memberService = memberService;
  	}
}

  • 혹은 lombok 라이브러리를 사용하여 간결하게 코드를 작성할 수 있음
@RequiredArgsConstructor
public class MemberController{
	private final MemberService memberService;
}

2. 필드 주입

  • @Autowired를 이용하는 방식

  • 단점으로는 프레임워크 의존성이 큼, 단일 테스트가 어려움 등이 있음

  • 테스트 코드의 중요성이 높아지자 점차 사용하지 않게 됨

@Autowired //4.3부터 단일 생성자인 경우 생략해도 됨
public class MemberController {
	private MemberService memberService;
}

3. 수정자(setter) 주입

  • setter을 이용하는 방식

  • setter을 통해 필요한 값이 할당되기 전까지 객체를 사용할 수 없음

  • 안정성이 낮으므로 거의 사용되지 않음

public class MemberController {
	private MemberService memberService;

	public void setMemberService( MemberService memberService){
		this.memberService = memberService;
	}
}

0개의 댓글

관련 채용 정보