필드주입과 생성자주입의 차이, 장단점(생성자 주입 vs 필드 주입)
- 코딩/Spring
- 2022. 5. 5.
스프링 프레임워크에서 의존성을 주입하는 방법 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. 객체 생성 시점에 모든 의존성이 주입되기 때문에 안전하고, NullPointerException 등의 예외 발생 가능성이 적습니다.
- 2. 생성자 파라미터를 통해 어떤 의존성이 필요한지 명시적으로 표시되기 때문에 코드 가독성이 좋아집니다. 또한, 이를 통해 컴파일 타임에 의존성 문제를 미리 파악할 수 있습니다.
- 3. 필드 주입(Field Injection)이나 수정자 주입(Setter Injection)은 의존성이 런타임 시에 주입되기 때문에 컴파일 타임에 의존성 문제를 파악할 수 없습니다. 또한, 필드 주입이나 수정자 주입은 의존성이 숨겨져 있기 때문에 코드 가독성이 좋지 않을 수 있습니다.
- 4. 생성자 주입 방식을 사용하면 의존성을 주입받지 않아도 객체를 생성할 수 없으므로, 객체 생성 시점에서 의존성이 주입되지 않은 경우를 방지할 수 있습니다.
따라서, 스프링에서는 생성자 주입 방식을 권장합니다. 또한, 생성자 주입 방식을 사용하면 단위 테스트(Unit Test)를 쉽게 작성할 수 있습니다. 생성자 주입 방식을 사용하면 객체 생성 시점에 의존성이 주입되므로, 의존성 없이 객체를 생성할 수 없습니다. 이를 이용해 단위 테스트에서 의존성이 없는 객체를 생성하여 테스트할 수 있습니다.
'코딩 > Spring' 카테고리의 다른 글
[Spring] ResponseEntity 사용법 (0) | 2022.05.06 |
---|---|
[Spring] 스프링 예외 처리 방법 2가지(@ExceptionHandler, @ControllerAdvice) (0) | 2022.05.05 |
[SpringSecurity] JWT 구현 시 javax/xml/bind/DatatypeConverter (0) | 2022.01.13 |
[Spring] 서비스 기동 시키는 방법 3가지 (0) | 2021.10.01 |
[Spring] Jpa Repository 사용하기 (0) | 2021.09.15 |