Notice
Recent Posts
Recent Comments
Link
꾸준한 개발일기
스프링 의존관계 자동 주입 4가지 방법은? 본문
반응형
🔍 스프링 의존관계 자동 주입 4가지 방법
주입 방식 | 설명 | 장점 | 단점 |
생성자 주입 | 생성자를 이용한 주입 | 불변성 보장, 테스트 용이 | 의존성이 많아지면 코드가 길어질 수 있음 |
수정자(setter) 주입 | setXxx() 메서드를 이용한 주입 | 선택적 의존성 주입 가능 | 필수 의존성을 보장할 수 없음 |
필드 주입 | @Autowiredㄹ르 필드에 직접 사용 | 코드가 짧고 간단 | 테스트 및 유지보수 어려움(지양) |
일반 메서드 주입 | 특정 메서드를 호출하여 주입 | 여러 의존성을 한 번에 주입 가능 | 필수 의존성이 보장되지 않음 |
✅ 1️⃣ 생성자 주입 (Constructor Injection) [권장]
- 생성자를 통해 의존성을 주입하는 방식
- 주입할 객체를 final로 선언 가능 → 불변성 보장
- 순수한 Java 코드로도 테스트 가능
✔ 예제 코드
@Service
public class OrderService {
private final MemberRepository memberRepository;
@Autowired // 생성자가 하나일 경우 생략 가능
public OrderService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
}
✔ 특징
- @Autowired 생략 가능 (스프링이 자동으로 주입)
- 불변성 보장 (final 필드 사용 가능)
- 순수 Java 코드로 테스트 가능
✔ 단점
- 의존성이 많아지면 생성자 코드가 길어질 수 있음
✅ 2️⃣ 수정자(setter) 주입 (Setter Injection)
- @Autowired를 setter 메서드에 붙여 주입하는 방식
- 선택적 의존성(필수가 아닌 의존성)을 주입할 때 유용
- 런타임 중에 변경 가능하여 주의 필요
✔ 예제 코드
@Service
public class OrderService {
private MemberRepository memberRepository;
@Autowired
public void setMemberRepository(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
}
✔ 특징
- @Autowired(required = false) 설정을 통해 선택적 주입 가능
- 의존성을 변경할 수 있어 유연성이 있음
✔ 단점
- 필수 의존성이 보장되지 않음 (객체 없이 실행될 수도 있음)
- 불변성이 깨질 가능성이 있음
🚨 3️⃣ 필드 주입 (Field Injection) [지양]
- 필드에 직접 @Autowired를 붙여 주입하는 방식
- 코드가 간결하지만 테스트 및 유지보수 어려움
- 외부에서 객체를 변경할 방법이 없어 테스트가 어려움
✔ 예제 코드
@Service
public class OrderService {
@Autowired
private MemberRepository memberRepository;
}
✔ 특징
- 코드가 짧고 간단
✔ 단점 (지양해야 하는 이유)
- 순수한 Java 코드로 테스트 불가능 (객체 주입 불가)
- DI 프레임워크 없이는 사용 불가능
- 객체 변경이 불가능해 유연성이 떨어짐
필드 주입은 사용하지 않는 것이 좋음. 대신 생성자 주입을 사용하는 것이 좋음.
✅ 4️⃣ 일반 메서드 주입 (Method Injection)
- 임의의 메서드에 @Autowired를 붙여 주입하는 방식
- 한 번에 여러 개의 의존성을 주입할 때 사용 가능
✔ 예제 코드
@Service
public class OrderService {
private MemberRepository memberRepository;
private DiscountPolicy discountPolicy;
@Autowired
public void init(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
}
✔ 특징
- 여러 의존성을 한 번에 주입 가능
✔ 단점
- 필수 의존성이 보장되지 않음
- 생성자 주입보다 사용 빈도가 낮음
🎯 결론: 언제 어떤 방법을 써야 할까?
주입 방식 | 사용 추천 여부 |
생성자 주입 | ✅ 가장 권장됨 (불변성 보장, 테스트 용이) |
수정자(setter) 주입 | ⭕ 선택적 의존성 주입이 필요할 때 |
필드 주입 | ❌ 테스트 및 유지보수 어려움 → 사용 지양 |
일반 메서드 주입 | ⭕ 여러 개의 의존성을 한 번에 주입할 때 |
💯 정답: 웬만하면 생성자 주입을 사용하라!
반응형
'Programing > 스프링' 카테고리의 다른 글
Lombok과 @RequiredArgsConstructor란? (0) | 2025.03.25 |
---|---|
컴파일 오류(Compile), 런타임(Runtime Error), 논리 오류(Logic Error)란? (0) | 2025.03.24 |
@Service 안 "비즈니스 로직"이란? (0) | 2025.03.22 |
스프링(Spring)과 스프링 부트(Spring Boot)의 차이 (0) | 2025.03.22 |
@Configuration이란? (0) | 2025.03.21 |
Comments