상세 컨텐츠

본문 제목

[Spring/Java] 스프링의 의존성 주입 방식 (DI)

server

by 셉인 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

관련글 더보기

댓글 영역