티스토리 뷰

728x90
반응형

자바에서 의존성 주입이란 객체 지향 프로그래밍에서 객체 간의 의존성을 외부에서 주입하는 것을 가리킨다.

 

이를 통해 객체 간의 결합도를 낮추고 코드의 유지보수성을 높일 수 있다.

 

이 글에서는 의존성 주입을 구현하는 몇 가지 방법과 특징에 대해 간단히 알아본다.

 

늘 그렇듯이 선요약부터:

 

  • 생성자 주입: 강한 의존성을 보장하며 불변성을 유지할 수 있다.
  • 세터 주입: 유연하고 지연 주입이 가능하지만 의존성이 강제되지 않는다.
  • 필드 주입: 코드가 간결해지지만 가독성이 떨어지고 테스트가 어렵다.
  • 인터페이스 주입: 유연하지만 복잡도가 증가한다.

 

Constructor Injection

 

생성자 주입은 객체가 생성될 때 필요한 의존성을 생성자를 통해 주입하는 방법이다.

public class Service {
    private final Repository repository;

    // 생성자를 통한 의존성 주입
    public Service(Repository repository) {
        this.repository = repository;
    }

    public void performAction() {
        repository.doSomething();
    }
}

특징은 다음과 같다.

 

  • 강한 의존성 보장: 객체가 생성될 때 필요한 의존성이 반드시 주입되도록 보장한다.
  • 불변성: 의존성 필드를 'final'로 선언할 수 있어 객체의 상태가 불변임을 보장할 수 있다.
  • 테스트 용이성: 주입된 의존성을 쉽게 모킹할 수 있어 단위 테스트가 편하다.

 

Setter Injection

 

세터 주입은 객체가 생성된 후 필요한 의존성을 세터 메서드를 통해 주입하는 방법이다.

public class Service {
    private Repository repository;

    // 세터를 통한 의존성 주입
    public void setRepository(Repository repository) {
        this.repository = repository;
    }

    public void performAction() {
        if (repository != null) {
            repository.doSomething();
        }
    }
}

특징은 다음과 같다.

 

  • 유연성: 객체 생성 후에도 의존성을 주입할 수 있어 더 유연하다.
  • 지연 주입: 의존성이 필요한 시점에 주입할 수 있다.
  • 선택적 의존성: 필수적이지 않은 의존성을 선택적으로 주입할 수 있다.

 

Field Injection

 

필드 주입은 의존성을 객체의 필드에 직접 주입하는 방식이다.

public class Service {
    @Autowired
    private Repository repository;

    public void performAction() {
        repository.doSomething();
    }
}

특징은 다음과 같다.

 

  • 간결성: 코드가 간결해진다
  • 숨겨진 의존성: 의존성이 명시적이지 않아 코드의 가독성이 떨어질 수 있다.
  • 테스트 어려움: 필드에 직접 주입된 의존성을 모킹하거나 주입하기 어려울 수 있다.

 

Interface Injection

 

인터페이스 주입은 의존성을 주입하기 위한 메서드를 정의한 인터페이스를 통해 주입하는 방법이다.

public interface RepositoryAware {
    void setRepository(Repository repository);
}

public class Service implements RepositoryAware {
    private Repository repository;

    @Override
    public void setRepository(Repository repository) {
        this.repository = repository;
    }

    public void performAction() {
        repository.doSomething();
    }
}

특징은 다음과 같다.

 

  • 복잡성: 주입을 위한 인터페이스를 별도로 정의해야 하므로 코드의 복잡성이 올라간다.
  • 유연성: 인터페이스를 통해 의존성을 주입받기 때문에 유연한 설계가 가능하다.
반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함