DI란?
Dependency injection의 약자로 흔히 의존성 주입이라고 한다.
의존성이란?
객체지향적 프로그래밍에서의 객체간이 협력은 필수적이며, 협력한다는 것은 객체 간의 의존성이 존재한다는 것이다. 여기서 의존성이란 파라미터나 리턴값 또는 지역변수 등으로 다른 객체를 참조하는 것을 의미한다
예를 들어서 비밀번호 값을 암호화하는 다음과 같은 클래스가 있다고 하자.
@Component
public class SimplePasswordEncoder {
public void encryptPassword(final String pw) {
final StringBuilder sb = new StringBuilder();
for(byte b : pw.getBytes(StandardCharsets.UTF_8)) {
sb.append(Integer.toString((b & 0xff) + 0x100, 16).substring(1));
}
return sb.toString();
}
}
그러면 우리가 MemberService에서 사용할 때 위의 클래스를 지역변수로 참조하게 된다.
@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)
public class MemberService {
private final MemberRepository memberRepository;
**private final SimplePasswordEncoder passwordEncoder; (지역변수 참조)**
@Transactional
public void signUp(String email, String pw) {
String encryptedPassword = passwordEncoder.encryptPassword(pw);
final Member member = Member.builder()
.email(email)
.pw(encryptedPassword).build();
memberRepository.save(member);
}
}
이때 구성원에 대한 비지니스 로직을 담당하는 MemberService는 비밀번호를 암호화하는 SimplePasswordEncoder를 지역변수로 가지고 참조하고 있으므로 의존한다고 표현한다.
의존성의 종류
1.컴파일타임 의존성
2.런타임 의존성
의존성 주입(DI)가 무엇인지는 알아보았다.
객체간의 협력, 의존성은 피할 수 없다고 앞서 설명하였지만무분별하게 의존성을 주입하는 것은 위험하므로 최소화 하는 것이 좋다. 객체지향에서의 협력이나 의존성 주입은 필수적이라는 것이지 많다고 좋은 것은 아니기 때문이다. 왜냐하면 의존성 전이가 일어날 수 있기 때문이다.
의존성 전이
한 객체가 다른 객체에 의존할 때, 다른 객체가 변하면서 변경점이 전파된다는 것을 의미한다.
DI(의존성) 주입의 장점