DI (Dependency Injection)

딩딩당당·2023년 2월 22일
0

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(의존성) 주입의 장점

  • 코드의 재사용성, 유연성이 높아진다. 하나의 작업만 수행하는 작은 객체는 많은 상황에서 재사용하기가 쉽기 때문이다.
  • 객체간 결합도가 낮기 때문에 한 클래스를 수정했을 때 다른 클래스도 수정해야하는 상황을 막아준다.
  • 유지보수테스트에 용이하다.
  • 확장성을 가진다.
    DI(의존성) 주입의 단점
  • 책임이 분리되어 있기 때문에 클래스 수를 늘림으로써 복잡성이 증가한다.
  • 주입된 객체들에 관한 코드 추적이 어렵다.
  • 의존성 주입 프레임워크를 사용하면 빌드 시간이 늘어날 수 있으며, 프레임워크에 대한 의존도를 높인다 ( 예시를 찾아보자 )
profile
자바공부해요흑흑

0개의 댓글