개발지식

[SPRING] DI(Dependency Injection) 의존관계 주입 2탄!

우루쾅 2024. 2. 15. 14:58
728x90
반응형
SMALL

DI 를 공부하던 중 깨달음을 얻고 더 적절한 예시와 설명을 하기위해서 추가로 작성해봅니다 ㅎㅎ

 

DI, 의존관계 주입이란

Dependency Injection은 의존성 주입이라고도 하며, 객체 간의 의존성을 외부에서 주입하여 결합도를 낮추고 유연한 코드를 작성하는 방법입니다.

 

말 그대로 메서드 안에 파라미터값을 통해 필요한 메서드나 데이터들을 추가하여 사용하는 것으로 이해하면 편합니다!

 

바로 예시를 들어가보겠습니다

 


우선 DI를 사용하지 않는 경우입니다

public class UserServiceImpl implements UserService {
    private UserRepository userRepository = new UserRepositoryImpl();
    
    public void addUser(User user) {
        userRepository.save(user);
    }
}

 

UserServiceImpl 안에서 private 를 통해 UserRepository 를 선언하고 그 밑에 addUser 메서드 안에서 UserRepository 를 사용하게 됩니다.

 

위 코드에서는 UserRepository 의 구현이 변경되면 UserServiceImpl 도 함께 변경해야 할 가능성이 높아집니다.

이렇게 되면 코드의 결합도가 높아지고, 재사용성과 테스트 용이성이 낮아집니다.

 

이후 DI 를 사용한 경우를 보겠습니다.

public class UserServiceImpl implements UserService {
    private UserRepository userRepository;
    
    public UserServiceImpl(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
    
    public void addUser(User user) {
        userRepository.save(user);
    }
}

@Configuration
public class AppConfig {
    @Bean
    public UserService userService(UserRepository userRepository) {
        return new UserServiceImpl(userRepository);
    }
    
    @Bean
    public UserRepository userRepository() {
        return new UserRepositoryImpl();
    }
}

 

UserServiceImpl 은 UserRepository 의 구현체에 의존하지 않습니다.

대신, 생성자를 통해 UserRepository 객체를 주입받습니다. 이렇게 되면, UserRepository 의 다른 구현체를 사용하거나, 테스트를 위해 가짜 객체를 사용하기 쉬워집니다. 또한 UserRepositoryImpl 의 구현이 변경되더라도 UserServiceImpl 은 영향을 받지 않습니다!

 

이전에 썼던 DI의 예시보다 위 예시가 더 간결하고 이해하기 좋을 것 같아 가져와봤습니다

 

DI 의존성 주입을 이해하는데 더욱 더 도움이 되었기를..

728x90
반응형
LIST