99클럽 코테 스터디 20일차 TIL Spring 의존성 주입
728x90

스프링에서의 의존성 주입이란

  • 객체 지향 프로그래밍에서 중요한 기술.
  • 객체가 다른 객체들에 의존할 때 필요한 의존 객체들을 외부에서 주입해주는 방법

스프링에서는 어떻게 구현하는가?

  1. 생성자 주입
    생성자를 통해 의존성을 주입받음. 객체가 생성될 때 필요한 모든 의존성이 제공되어야 하므로, 객체는 항상 완전하게 초기화 된 상태로 사용될 수 있음.
  2. 세터 주입
    세터 메소드를 통해 의존성을 주입받음. 이 방법은 객체 생성 후에도 의존성을 변경할 수 있어 유연성을 제공하지만, 객체가 완전히 초기화 되지 않은 상태로 사용될 가능성이 있음.
  3. 필드주입
    필드에 직접 의존성을 주입함. 이 방법은 코드가 간결해지지만, 테스트와 코드 재사용 측면에서는 권장되지는 않음.

스프링 프레임워크는 이러한 의존성 주입 기능을 내부적으로 구현하기 위해 리플렉션, 프록시, 빈 라이프사이클 관리 등 다양한 기술을 사용함.

왜 의존성 주입을 사용해야 하는가?

  1. 결합도 감소
    객체들 사이의 의존 관계가 완화되어, 각 객체의 변경이 다른 객체에 미치는 영향을 줄일 수 있음.
  2. 코드 재사용 증가
    각 객체가 특정 구현에 덜 의존적이기 때문에, 다양한 시나리오에서 재사용할 수 있음.
  3. 테스트 용이성 향상
    의존성을 외부에서 주입할 수 있으므로, 테스트용 구현이나 모의 객체(Mock objects) 를 쉽게 주입하여 테스트가 용이해짐.
  4. 코드의 가독성 및 유지보수성 향상
    의존성이 명확하게 구분되어 관리되므로, 코드의 이해와 수정이 쉬워짐.

BookRepository

public interface BookRepository {
    List<String> findAllBooks();
}

BookRepositoryImpl 구현 클래스

@Repository
public class BookRepositoryImpl implements BookRepository {
    @Override
    public List<String> findAllBooks() {
        // 데이터베이스에서 책 목록을 가져오는 구체적인 로직
        return Arrays.asList("Book 1", "Book 2", "Book 3");
    }
}

BookService 클래스

@Service
public class BookService {
    private final BookRepository bookRepository;

    @Autowired
    public BookService(BookRepository bookRepository) {
        this.bookRepository = bookRepository;
    }

    public List<String> getBooks() {
        return bookRepository.findAllBooks();
    }
}

BookServiceBookRepository의 구체적인 구현에 대해 알지 못함.
스프링 컨테이너는 실행 시점에 BookRepository의 적절한 구현체를 BookService에 자동으로 주입함.
이로 인해 BookService는 어떠한 BookRepository 구현체가 주입되든지 간에 올바르게 작동할 수 있으며, 테스트 시에는 모의 객체(Mock Object)를 주입하여 테스트가 용이해짐.

DI 방식의 장단점

장점

  1. 낮은 결합도
    DI 를 사용하면 객체들이 서로 강하게 연결되어 있지 ㅇ낳아 서로 독립적으로 개발하고 테스트할 수 있음.
  2. 테스트 용이성
    의존성을 외부에서 주입받기 때문에, 단위 테스트 시에 테스트 대상이 사용하는 실제 의존성 대신 모의 객체나 스텁을 주입할 수 있어 테스트가 용이함.
  3. 재사용성 향상
    DI를 통해 생성된 모듈은 재사용이 용이함. 의존성이 외부에서 주입되기 때문에 다른 환경이나 애플리케이션에서도 동일한 컴포넌트를 재사용할 수 있음.
  4. 리팩토링 용이성
    의존성 주입을 사용하면 기존 코드를 변경하지 않고도 의존성을 교체하거나 업데이트할 수 있음.

단점

  1. 구현 복잡성 증가
    의존성 주입을 위한 프레임워크를 사용하면 초기 구현 시 복잡성이 증가할 수 있음. 특히 큰 프로젝트에서는 DI 시스템을 설계하고 관리하는데 많은 노력이 필요할 수 있음.
  1. 런타임 오류 가능성
    컴파일 시간이 아닌 런타임에 의존성이 결정되기 때문에, 잘못 구성된 의존성으로 인해 런타임에 오류가 발생할 수 있음.
  2. 오버헤드
    의존성 주입 프레임워크를 사용하면 성능에 약간의 오버헤드가 발생할 수 있으며, 특히 의존성 해석과 주입 과정에서 추가적인 시간이 소요될 수 있음.
  3. 학습 곡선
    의존성 주입을 효과적으로 사용하기 위해서는 DI 패턴과 프레임워크에 대한 이해가 필요함.
728x90