본문 바로가기
Spring

[Spring] Ioc(제어의 역전)와 DI(의존성 주입)란?

by 오늘부터개발시작 2022. 7. 26.

개발을 하다보면 의존성이라는 단어를 많이 사용하게 된다. 의존성을 줄여야 한다, 의존성이 있어서 수정이 어렵다 등등. 의존성이라는 단어는 이해하기가 쉽다. A 클래스와 B 클래스 사이에 의존성이 있다는 것은 A 클래스를 수정했을 때 B 클래스가 영향을 받는 다는 것이고 쉽게 말해 버그가 생길 가능성이 있다는 것이다. 

 

그런데 의존성 주입(DI) Ioc 같은 용어들을 보게되면 이해가 바로 되지는 않는다. 의존성 주입은 A라는 클래스에 B라는 클래스의 객체를 주입해준다는 것인데 예를 들면 이런 것이다.

 

@Service
@RequiredArgsConstructor
public class UserService {
    private final UserRepository userRepository;

}

 

UserService라는 클래스에 UserRepository라는 의존성을 주입한 예시이다. 더 어렵게 생각할 것 없이 그냥 이렇게 의존성을 주입해주는 것이 Dependency Injection이라고 보면 된다. 이제 IOC(Inversion of Control)이라는 용어가 나오게 되는데 이것도 간단하다. IOC는 한글로 역전의 제어라는 의미이다. IOC가 없다면 new 키워드를 사용해서 UserService 클래스에 new UserRepository() 같이 객체를 직접 만들어서 의존성을 생성한다. 물론 이렇게 해도되지만 불필요한 객체가 생긴다는 문제가 있다. IOC를 사용하게되면 위의 예시처럼 constructor로 객체를 주입해주거나 @Autowired로 객체를 주입해준다. 새로운 객체를 만들 필요가 없어진다. 

IOC를 사용하는 이유는 다소 객체지향의 철학적인 이유 때문인 것 같다.  예를 들면, 개발할 때 불필요하게 신경쓰지 않아도 될 부분을 제거해줄 수 있다. 불필요한 객체 생성을 막기 위해 싱글톤 인스턴스를 직접 구현하는 작업들을 할 필요가 없이 IOC 컨테이너가 주입하도록 하면 된다. 이를 통해 개발자가 비즈니스 로직에 집중할 수 있도록 한다. 역전의 제어는 다시 말해 객체를 제어하는 것을 개발자가 new 키워드 등을 사용해서 하는게 아니라 스프링 프레임워크에 넘긴다는 것이다. 

 

IOC를 사용하고자하는 객체는 스프링에 Bean으로 등록을 해주어야 한다. 예전에는 xml에 일일이 작성을 해야하는 불편함이 있었는데 지금은 @Bean, @Component, @Service 등과 같은 어노테이션 한줄이면 간단하게 등록할 수 있어 편리하다. 이런 작업은 IOC 컨테이너가 수행한다. IOC 컨테이너는 스프링 컨테이너라고도 보면 된다. IOC 컨테이너는 인스턴스의 생성부터 소멸까지 책임진다. 이렇게 개발자의 역할을 분담해 주기 때문에 개발자는 조금 더 비즈니스 로직에 집중할 수 있다는 의미인 것 같다.