2월 13일-IoC&DI

Yullgiii·2024년 2월 14일
0
post-thumbnail

제어의 역전(IoC)과 의존성 주입(DI)은 스프링 프레임워크의 핵심 원칙이다. 이러한 개념들은 애플리케이션의 결합도를 낮추고, 유연성 및 확장성을 높이기 위해 사용한다. 전통적인 프로그래밍 방식과 스프링이 제공하는 솔루션을 비교해 보면, 이 개념들의 가치를 더 잘 이해할 수 있다.

제어의 역전(IoC)

제어의 역전은 프로그램의 흐름을 개발자가 아닌 프레임워크가 관리하는 것을 말한다. 전통적으로, 개발자는 객체의 생성부터 소멸까지 모든 생명 주기를 직접 관리한다. 그러나 IoC에서는 이러한 제어권이 프레임워크로 넘어간다. 이로 인해 개발자는 비즈니스 로직에 더 집중할 수 있으며, 코드의 재사용성과 유지 보수성이 향상된다.

의존성 주입(DI)

의존성 주입은 IoC의 구현 방법 중 하나로, 객체 간의 의존성을 외부에서 주입하는 방식이다. 객체가 다른 객체의 인스턴스를 직접 생성하지 않고, 외부(예: 스프링 컨테이너)로부터 필요한 객체를 주입받아 사용한다. 이 방식은 클래스 간의 결합도를 낮추고, 코드의 재사용성 및 테스트 용이성을 높인다.

구체 클래스 직접 사용 대신 Bean 사용의 이유

구체 클래스를 직접 사용하는 방식은 간단하고, 후보 클래스가 하나뿐인 경우에 적합할 수 있다. 그러나 이 방식은 여러 단점을 가진다:

  • 결합도 증가: 구체 클래스를 직접 사용하면 해당 클래스와 사용하는 클래스 간의 결합도가 높아진다.
  • 유연성 감소: 특정 구현에 직접적으로 의존하게 되면, 구현을 변경하거나 확장하기 어려워진다.
  • 테스트 어려움: 구체 클래스를 직접 사용하면, 해당 클래스를 모의 객체로 대체하기 어려워 테스트가 더 복잡해진다.

스프링에서 Bean을 사용하는 이유

  • 결합도 감소: 의존성 주입을 통해 결합도를 낮추며, 인터페이스 기반으로 프로그래밍할 수 있다.
  • 유연성 증가: 구현체를 스프링 설정 파일이나 어노테이션을 통해 쉽게 교체할 수 있어 시스템의 유연성이 크게 향상된다.
  • 테스트 용이성: 의존성이 외부에서 주입되므로, 테스트 시에 실제 구현 대신 모의 객체를 주입해 테스트하기 용이하다.

예제

// 스프링의 의존성 주입을 활용한 예시
@Service
public class MyService {
    private final MyRepository repository;

    @Autowired
    public MyService(MyRepository repository) {
        this.repository = repository;
    }
}

이 코드에서 MyService 클래스는 MyRepository의 구체적인 구현을 알 필요가 없다. 스프링 컨테이너가 실행 시점에 적절한 의존성을 주입해 준다. 이 접근 방식은 코드의 유연성을 높이고, 테스트를 용이하게 한다.

profile
개발이란 무엇인가..를 공부하는 거북이의 성장일기 🐢

0개의 댓글