DI는 Dependency injection의 준말로 '의존성 주입' 이라는 뜻을 가진다. 소프트웨어 공학에서 말하는 의존성 주입은 하나의 객체에 다른 객체의 의존성을 제공하는 기술이라고 표현한다. '의존 관계'에 있는 클래스들을 '주입'한다는 뜻이다.
@Service
@RequiredArgsConstructor
public class PostService {
private final PostRepository postRepository;
@Transactional
public PostListResponseDto getPosts() {
PostListResponseDto postListResponseDto = new PostListResponseDto();
List<Post> posts = postRepository.findAll();
for (Post post : posts) {
postListResponseDto.addPost(new PostResponseDto(post));
}
return postListResponseDto;
}
}
위의 예시에서는 Postservice클래스를 사용하기 위해선 PostRepository가 필요하다. 이때 PostService는 PostRepository의 의존성을 가진다
고 한다. PostService가 PostRepository의 의존성을 가지기 위해 PostService의 생성자에서 PostRepository클래스를 직접 생성하여 의존 관계를 맺는다.
즉, 객체 내부에서 의존객체를 생성한다.
@Service
public class PostService{
@Autowired
private final PostRepository PostRepository;
//...
}
하지만 이렇게 내부에서 의존객체를 생성하게 되면 코드의 재활용성이 떨어지게 되고 모듈간의 결합도가 높아지고 유연성이 떨어지게 된다
위의 코드와 같이 구현하게 되면 PostService에서 의존 객체를 생성하지 않고 PostService에 PostRepository클래스가 주입되어있다.
즉, 외부에서 등록되어있는 PostRepository객체를 PostService가 생성되었을때 자동으로 PostRepository를 의존되게 한다.
이렇게 외부에서 객체를 주입할 수 있게 하기 위해서는 조건이 있다.
바로 주입 시키려는 객체가 빈(Bean)
이라는 객체로 등록이 되어있어야 하는것이다.
이 빈 객체는 스프링 IoC 컨테이너
라는 곳에서 관리되는 객체인데 컨테이너에 저장되어 있는 빈 객체만이 의존성 주입될 수 있다.
즉, 외부에서 객체를 주입할 수 있게 하는 것은 스프링 IoC 컨테이너의 역할이다.