필드주입과 생성자주입의 차이, 장단점(생성자 주입 vs 필드 주입)

    스프링 프레임워크에서 의존성을 주입하는 방법 3가지

    • 1. 생성자 주입 (Constructor Injection)
    • 2. 필드 주입 (Field Injection)
    • 3. 수정자 주입 (Setter Injection)

    1. 생성자 주입(Constructor Injection)

    • 1. 객체를 생성할 때 생성자를 통해 의존성을 주입하는 방식입니다.
    • 2. 객체 생성 시점에 모든 의존성이 주입되므로, 의존성 누락이나 잘못된 순서로 주입되는 일을 방지할 수 있습니다.
    • 3. 컴파일 타임에 의존성 주입이 일어나므로 런타임에 NullPointerException과 같은 예외가 발생할 가능성이 줄어듭니다.
    • 4. 생성자 파라미터를 통해 어떤 의존성이 필요한지 명시적으로 표시되기 때문에 코드 가독성이 좋아집니다.

    장점

    • 1. 객체 생성 시점에 모든 의존성이 주입되기 때문에 안전하고, NullPointerException 등의 예외 발생 가능성이 적습니다.
    • 2. 생성자 파라미터를 통해 어떤 의존성이 필요한지 명시적으로 표시되기 때문에 코드 가독성이 좋아집니다.

    단점

    • 1. 생성자 파라미터가 많아지면 코드 가독성이 떨어질 수 있습니다.

    2. 필드 주입(Field Injection)

    • 1. 객체의 멤버 변수에 직접적으로 주입하는 방식입니다.
    • 2. 객체 생성 이후에 주입이 이루어지기 때문에 객체 생성 이전에 필요한 의존성이 미리 준비되어 있어야 합니다.
    • 3. 코드가 간결하고 읽기 쉽습니다.

    장점

    • 1. 코드가 간결하고 읽기 쉽습니다.
    • 2. 어노테이션(@Autowired)을 통해 의존성 주입을 처리할 수 있어 코드 작성이 간단합니다.

    단점

    • 1. 객체 생성 이후에 필드 주입이 이루어지므로, 객체 생성 이전에 필요한 의존성이 미리 준비되어 있어야 합니다.
    • 2. 코드 가독성이 떨어질 수 있습니다. 필드 주입을 사용하면 클래스 내부의 의존성이 바로 드러나지 않기 때문입니다.

    3. 수정자 주입(Setter Injection)

    • 1. Setter 메서드를 통해 의존성을 주입하는 방식입니다.
    • 2. 객체 생성 이후에 주입이 이루어지기 때문에 객체 생성 이전에 필요한 의존성이 미리 준비되어 있어야 합니다.
    • 3. 필요한 의존성이 한 번에 모두 주입되지 않아도 됩니다.

    장점

    • 1. 객체 생성 시점과 의존성 주입 시점을 분리할 수 있습니다. 즉, 객체 생성 이후 필요한 시점에 필요한 의존성을 주입할 수 있습니다.
    • 2. Setter 메서드를 사용하면 생성자 파라미터 수가 줄어들어 가독성이 좋아질 수 있습니다.
    • 3. Setter 메서드는 선택적으로 의존성을 주입할 수 있으므로, 모든 의존성이 한 번에 주입되지 않아도 됩니다. 따라서, 매우 많은 의존성이 필요한 경우에 유용합니다.
    • 4. Setter 메서드를 사용하면 객체 생성 시점에 필요하지 않은 의존성을 주입하지 않아도 되므로, 메모리 사용을 최적화할 수 있습니다.
    • 5. 특정 필드에 대해서만 의존성을 주입할 수 있어, 필요한 의존성만 주입할 수 있는 세밀한 제어가 가능합니다.

    단점

    • 1. Setter 메서드를 통해 의존성이 주입되므로, 의존성 주입 시점을 알기 어렵습니다. 따라서 런타임에 NullPointerException 등의 예외가 발생할 가능성이 있습니다.
    • 2. 생성자 주입(Constructor Injection)과 달리 Setter 메서드를 사용하기 때문에 의존성이 누락될 가능성이 있습니다.
    • 3. Setter 메서드는 public으로 공개되어 있어야 하므로, 불필요한 메서드가 공개될 가능성이 있습니다. 이로 인해 보안 상의 문제가 발생할 수도 있습니다.
    • 4. 코드 가독성이 떨어질 수 있습니다. Setter 메서드를 사용하는 경우, 객체 생성과 초기화 코드가 분리되어 있기 때문입니다.

    생성자 주입을 사용해야 하는 이유

    1. 1. 객체 생성 시점에 모든 의존성이 주입되기 때문에 안전하고, NullPointerException 등의 예외 발생 가능성이 적습니다.
    2. 2. 생성자 파라미터를 통해 어떤 의존성이 필요한지 명시적으로 표시되기 때문에 코드 가독성이 좋아집니다. 또한, 이를 통해 컴파일 타임에 의존성 문제를 미리 파악할 수 있습니다.
    3. 3. 필드 주입(Field Injection)이나 수정자 주입(Setter Injection)은 의존성이 런타임 시에 주입되기 때문에 컴파일 타임에 의존성 문제를 파악할 수 없습니다. 또한, 필드 주입이나 수정자 주입은 의존성이 숨겨져 있기 때문에 코드 가독성이 좋지 않을 수 있습니다.
    4. 4. 생성자 주입 방식을 사용하면 의존성을 주입받지 않아도 객체를 생성할 수 없으므로, 객체 생성 시점에서 의존성이 주입되지 않은 경우를 방지할 수 있습니다.

    따라서, 스프링에서는 생성자 주입 방식을 권장합니다. 또한, 생성자 주입 방식을 사용하면 단위 테스트(Unit Test)를 쉽게 작성할 수 있습니다. 생성자 주입 방식을 사용하면 객체 생성 시점에 의존성이 주입되므로, 의존성 없이 객체를 생성할 수 없습니다. 이를 이용해 단위 테스트에서 의존성이 없는 객체를 생성하여 테스트할 수 있습니다.

    댓글

    Designed by JB FACTORY