server
[Spring/Java] 스프링의 의존성 주입 방식 (DI)
셉인
2024. 4. 4. 14:11
728x90
스프링에서 의존성 주입(Dependency Injection, DI)은 핵심 개념 중 하나다. 의존성 주입은 객체가 자신의 의존성, 즉 다른 객체와의 관계나 협력을 필요로 할 때, 스스로 그 의존성을 생성하거나 찾는 대신 외부에서 받아들이는 방식이다. 이를 통해 컴포넌트 간의 결합도를 낮추고, 유연성 및 재사용성을 높이며, 테스트를 용이하게 한다.
의존성 주입 : 스프링 컨테이너에서 객체 Bean을 먼저 생성한 객체를 지정한 객체에 주입하는 방식
1. 생성자 기반 의존성 주입(Constructor-based Dependency Injection)
- 객체가 생성될 때 생성자를 통해 의존성을 주입받는다.
- 필수적인 의존성이 있는 경우에 주로 사용된다.
- 생성자 인자를 통해 의존성을 명확하게 정의할 수 있으며, 불변성을 강조할 수 있다.
@Controller
public class MyController {
private final MyService myService;
@Autowired
public MyController(MyService myService) {
this.myService = myService;
}
}
- 클래스 내 생성자가 한개
- 주입받을 객체가 Bean으로 등록
- Lombok 라이브러리
위 세개를 이용해서 더 간편하게 작성 가능하다.
@Controller
@RequiredArgsConstructor
public class MyController {
private final MyService myService;
}
@RequiredArgsConstructor로 필드를 포함한 생성자를 포함시켜주고 @Autowired 키워드를 생략해서 가독성을 높인다.
2. 세터 기반 의존성 주입(Setter-based Dependency Injection)
- 객체가 생성된 이후, 세터 메서드나 다른 설정 메서드를 통해 의존성을 주입받는다.
- 선택적인 의존성이 있는 경우에 주로 사용된다.
- 의존성을 변경하거나 설정할 필요가 있는 경우 유용하다.
@Controller
public class MyController {
private MyService myService;
@Autowired
public void MyController(MyService myService) {
this.myService = myService;
}
}
3. 필드 기반 의존성 주입(Field-based Dependency Injection)
- 클래스 내부의 필드에 직접 의존성을 주입한다.
- 간결하지만, 불변성이나 테스트 용이성 측면에서 제한이 있을 수 있다.
- @Autowired 어노테이션을 주입할 필드 위에 명시해준다.
@Controller
public class MyController {
@Autowired
private MyService myService;
}
이를 통해
- 객체 간의 결합도를 관리
- 객체의 생성과 의존성의 관리를 프레임워크에 위임
=> 개발자는 비즈니스 로직 구현에 더 집중할 수 있게 되며, 애플리케이션의 유지보수성과 확장성이 향상된다.
728x90