Spring의 장점중 하나는 의존성 주입 (DI: Dependency Injection)를 지원한다는 점입니다.
의존성 주입은 싱글톤 패턴으로 객체를 직접 생성하는 것이 아닌 외부로부터 객체를 받아 사용하는 것입니다.
의존성 주입의 장점
1.결합을 느슨하게 합니다.
인터페이스를 사용하여 객체지향의 원칙 (SOLID)의 DIP를 지킬 수 있습니다.
2. 유연성이 높아집니다.
결합이 느슨하기때문에 같은 인터페이스를 사용하는 클래스로 변경이 용의합니다.
3. 테스트가 쉬워집니다.
객체는 자신이 의존하고있는 인터페이스만 생각하고 클래스는 신경쓰지 않아도 됩니다.
의존성 주입 방법
1. 생성자 주입(Constructor Injection)
2. 필드 주입(Field Injection)
3. 수정자 주입(Setter Injection)
미리 말하자면 Spring에서 권장하는 방법은 생성자 주입 방법입니다.
그 이유를 하나씩 알아보도록 하겠습니다.
생성자 주입(Constructor Injection)
@Service
public class CommentService {
private final UserRepository userRepository;
@Autowired
public CommentService(final UserRepository userRepository) {
this.userRepository = userRepository;
}
}
클래스의 생성자가 하나이고, 그 생성자로 주입받을객체가 빈으로 등록되어있다면 @Autowired를 생략 가능합니다.
필드 주입(Field Injection)
@Service
public class CommentService {
@Autowired
private final UserRepository userRepository;
}
필드에 @Autowired를 사용하는 방법입니다.
수정자 주입(Setter Injection)
@Service
public class CommentService {
private UserRepository userRepository;
@Autowired
public void setUserRepository(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
Setter에 @Autowired를 사용하는 방법입니다.
단, Setter를 사용하면 public인 메서드의 특성때문에 어디서든 변경이 가능하기 때문에
안정성을 보장할 수 없습니다.
Spring이 생성자 주입을 권장하는 이유
앞서 의존성 주입의 방법을 소개하기전에 Spring은 생성자 주입을 권장한다고 말씀드렸습니다.
왜 Spring은 생성자 주입방법을 권장할까요?
생성자 주입을 권장하는 이유
1. 순환참조 방지
A가 B를 참조하고, B가 A를참조하는 순환참조되는 코드가 있다고 가정할때
필드 주입과 수정자 주입은 빈이 생성된 후에 참조를 하기 때문에 어플리케이션이 아무런 오류없이 작동이 됩니다.
즉, 실제 서비스 상황에서 장애가 발생한다는 것입니다.
생성자 주입을 사용하면 BeanCurrentlyInCreationException이 발생하여
애플리케이션 실행 시점에서 오류를 체크할 수 있습니다.
2. 불변성
final로 선언하여 객체의 불변성을 보장합니다.
final로 만들기 때문에 null인 객체가 만들어지지 않음을 보장합니다.
필드 주입과 수정자 주입은 객체가 수정될 가능성을 열어두기때문에
객체지향의 원칙 (SOLID)의 OCP 개방 폐쇄의 원칙을 위반하게 됩니다.
3. 테스트 가능한 코드
Test를 작성할때 DI 없이도 의존성을 주입할 수 있습니다.
이를 통해 코드 가독성이 높아지며, 유지보수가 용이하고
테스트의 격리성과 예측 가능성을 높일 수 있다는 장점이 생기게 됩니다.
위와 같은 이유로 필드 주입이나 수정자 주입 보다는 생성자 주입의 사용을 권장합니다.
마무리
오늘은 DI에 대해 배워보았습니다.
사실 스프링의 가장 큰장점이므로 DI를 잘 사용하는것은 Java를 사용하는 개발자라면 필수적인 요소입니다.
개발을 할때 DI를 적극 활용하면서 객체지향적인 코드를 작성하도록 노력하겠습니다.
참고
[Spring] 의존관계 주입(Dependency Injection), 의존성 주입, DI란?
의존관계(Dependency)란? 의존관계 주입(Dependency Injection)에 대하여 알아보기 전에 의존관계가 무엇인지 알아야 한다. 의존관계는 의존 대상 B가 변하면, 그것이 A에 영향을 미칠 때 A는 B와 의존관계
code-lab1.tistory.com
[Spring] 의존성 주입 3가지 방법 - (생성자 주입, Field 주입, Setter 주입)
Spring은 @Autowired 어노테이션을 이용한 다양한 의존성 주입(DI; Dependency Injection) 방법을 제공합니다. 의존성 주입은 필요한 객체를 직접 생성하는 것이 아닌 외부로부터 객체를 받아 사용하는 것입
dev-coco.tistory.com
'Spring' 카테고리의 다른 글
객체지향 설계 원칙 - SOLID (0) | 2023.09.20 |
---|---|
객체지향의 4가지 특징 (0) | 2023.09.19 |
Bean 등록 방법 (0) | 2023.08.19 |
JSP - Request, Response 객체 (0) | 2023.07.28 |
MIME 타입이란? (0) | 2023.07.26 |