스프링 빈 자동설정 보충자료
의존관계 주입 (Dependency Injection)
스프링에서 의존관계 주입은 객체 간의 관계를 설정하고 관리하기 위해 사용됩니다. 의존관계 주입 방법으로는 생성자 주입, 세터 주입, 필드 주입 등이 있으며, 각각의 특징과 적합한 사용 사례가 있습니다.
1. 생성자 주입
특징
불변 및 필수 의존 관계에 적합합니다.
생성자 호출 시점에 의존 관계를 설정하며, 이후 변경할 수 없습니다.
스프링이
@Autowired
를 생략하더라도 자동으로 의존성을 주입합니다.
장점
의존성이 명확하게 보장됩니다.
객체 생성 시 반드시 필요한 의존성을 주입하므로 NPE(NullPointerException) 위험이 줄어듭니다.
테스트 시 Mock 객체를 쉽게 주입할 수 있습니다.
예시 코드
2. 세터 주입
특징
선택적이고 변경 가능성이 있는 의존 관계에 적합합니다.
세터 메서드에
@Autowired
를 사용하여 의존성을 주입합니다.주입할 대상이 없어도 동작해야 한다면
@Autowired(required = false)
를 설정할 수 있습니다.
단점
생성 후 의존 관계를 변경할 수 있어, 불변성을 해칩니다.
모든 의존성을 반드시 필요로 하지 않을 때 사용해야 합니다.
예시 코드
3. 필드 주입 (권장하지 않음)
특징
클래스의 필드에 직접
@Autowired
를 선언하여 의존성을 주입합니다.테스트 코드에서만 제한적으로 사용을 권장합니다.
단점
객체 생성 후 의존성을 변경할 수 없어 테스트가 어렵습니다.
DIP(Dependency Inversion Principle)를 위반할 가능성이 높습니다.
스프링 외부에서 의존성을 주입하기 어렵습니다.
예시 코드
4. 롬복을 활용한 생성자 주입
특징
롬복(Lombok)의
@RequiredArgsConstructor
를 사용하면 생성자를 직접 작성하지 않아도 됩니다.final
로 선언된 필드를 대상으로 자동으로 생성자를 생성합니다.
설정
Lombok 의존성 추가 (Maven)
Lombok 플러그인 설치
IntelliJ IDEA 또는 Eclipse에서 Lombok 플러그인을 설치하고 활성화합니다.
애플리케이션 클래스에서 사용
위 코드에서 롬복은
ProductRepository
와OrderRepository
를 파라미터로 받는 생성자를 자동으로 생성합니다.
5. 조회한 모든 빈이 필요할 때
상황
특정 타입의 빈이 여러 개 존재하며, 이들을 모두 주입받아야 할 때 사용합니다.
스프링은
List
나Map
으로 빈을 주입받을 수 있습니다.
예시 코드
위 코드에서
NotificationService
는MessageSender
타입의 모든 빈을List
로 주입받습니다.이를 통해 이메일과 SMS 발송 로직을 한 번에 처리할 수 있습니다
Last updated