ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring, Spring Boot] 의존성 주입 (Dependency Injection, DI)
    Spring 2024. 11. 28. 14:05

    의존성 주입 (Dependency Injection, DI) 이란?

    의존성 주입(Dependency Injection, DI)은 객체지향 프로그래밍에서 객체 간의 의존성을 줄이고, 코드의 유연성재사용성을 높이기 위해 사용하는 디자인 패턴입니다. 의존성 주입은 객체가 다른 객체에 의존할 때, 이를 객체 내부에서 직접 생성하는 것이 아니라 외부에서 주입받는 방식을 의미합니다. 이러한 방식은 객체 간 결합도를 낮추고, 테스트 용이성을 높여 유지보수를 쉽게 만듭니다.

    의존성 주입의 세 가지 방법

    의존성 주입을 구현하는 방법에는 크게 세 가지가 있습니다: 생성자 주입(Constructor Injection), 세터 주입(Setter Injection), 필드 주입(Field Injection)입니다. 각각의 방법에 대해 간단히 설명하고 예제를 살펴보겠습니다.

    1. 생성자 주입 (Constructor Injection)

    생성자 주입은 객체의 생성자를 통해 의존성을 주입하는 방식입니다. 이 방식은 객체의 불변성을 유지할 수 있어 선호되는 방식 중 하나입니다.

     

    @Component
    public class Car {
        private final Engine engine;
    
        // 생성자 주입
        public Car(Engine engine) {
            this.engine = engine;
        }
    
        public void start() {
            engine.run();
        }
    }
    
    // 위의 예제에서 Car 클래스는 Engine 객체에 의존하고 있으며, 
    // 이 의존성은 생성자를 통해 주입됩니다. 
    // 스프링 프레임워크는 필요한 의존성을 자동으로 주입해줍니다.

     

    주의사항

    만약 생성자가 여러 개 있는 경우, 스프링은 어느 생성자를 이용할지 혼란스러워할 수 있습니다. 이 경우에는 @Autowired를 명시적으로 붙여줄 필요가 있습니다. 하지만 생성자가 오직 하나만 있다면 @Autowired 없이도 잘 동작하게 됩니다.

     

    2. 세터 주입 (Setter Injection)

    세터 주입은 객체가 생성된 이후에 세터 메서드를 사용해 의존성을 주입하는 방식입니다. 유연하게 의존성을 변경하거나 선택적으로 주입할 때 사용됩니다.

     

    @Component
    public class Car {
        private Engine engine;
    
        // 세터 주입
        @Autowired
        public void setEngine(Engine engine) {
            this.engine = engine;
        }
    
        public void start() {
            engine.run();
        }
    }
    
    // 위 코드에서는 setEngine() 메서드를 통해 Engine 객체를 주입받습니다. 
    // 세터 주입은 선택적인 의존성에 적합하지만, 
    // 의존성을 변경할 수 있는 특성 때문에 불변성을 보장할 수 없습니다.

     

    3. 필드 주입 (Field Injection)

    필드 주입은 클래스의 필드에 직접 의존성을 주입하는 방식입니다. 간결하게 작성할 수 있지만, 테스트 시에는 의존성을 주입하기 어려운 단점이 있습니다.

     

    @Component
    public class Car {
        @Autowired
        private Engine engine;
    
        public void start() {
            engine.run();
        }
    }
    
    
    // 여기서는 @Autowired를 사용하여 engine 필드에 직접 의존성을 주입하고 있습니다.
    // 이 방식은 코드가 간단해 보이지만, 
    // 주로 테스트나 리팩토링이 어려워 생성자 주입만큼 권장되지는 않습니다.

     

    결론

    의존성 주입객체 간 결합도를 줄이고 코드의 유연성테스트 용이성높이기 위한 중요한 설계 패턴입니다. 스프링 프레임워크에서 의존성 주입을 쉽게 적용할 수 있는 어노테이션을 제공하고, 이를 통해 더 가독성 좋고 유지보수하기 쉬운 코드를 작성할 수 있습니다. 생성자 주입, 세터 주입, 필드 주입은 각각 장단점이 있으므로 상황에 따라 적절한 방식을 선택하는 것이 중요합니다. 특히 생성자 주입은 불변성을 보장하고 객체 상태를 명확하게 정의할 수 있어 가장 권장되는 방식입니다.

    댓글

Designed by Tistory.