객체의 생성과 생명주기 관리를 개발자가 아닌 프레임워크가 하는 것을 말합니다.
만약 IoC를 사용하지 않고 싱글톤으로 관리하고 싶다면 다음과 같이 사용할 수 있습니다.
/* service */
public class TestNonIoCServiceImpl implements TestNonIoCService {
// singleton
private static TestNonIoCServiceImpl testNonIoCService = new TestNonIoCServiceImpl();
// 생성자 제한
private TestNonIoCServiceImpl() {}
// signleton instance 반환
public static TestNonIoCServiceImpl getInstance() {
return testNonIoCService;
}
// singleton 으로 받아오기
private final TestNonIoCRepository testNonIoCRepository = TestNonIoCRepository.getInstance();
public TestNonIoC findById(Long testId) {
return testNonIoCRepository.findById(testId);
}
}
위 코드를 보며우리가 필요한 관심사 외의 객체 생성을 제한하는 코드와 인스턴스를 반환하는 코드등 관리에 필요한 코드들이 혼제되어 있다.
다음은 Spring을 사용해서 IoC와 DI를 사용해서 작성한 코드를 보자
@Service
@RequiredArgsConstructor
public class TestServiceImpl implements TestService {
private final TestRepository testRepository;
@Override
public Test findById(Long testId) {
return testRepository.findById(testId)
.orElseThrow(() -> new IllegalArgumentException());
}
}
위 코드와 비교해서 관리하는 코드는 빠지고 주요 관심사에만 집중해서 작성된 코드를 볼 수 있다.
IoC는 인터페이스가 아닌 구체클래스에 의존하지 않고 사용하도록(의존 역전 법칙) 도와주기에 더욱주요 관심사에만 집중할 수 있도록 도와준다.
@Component
@Component 와 @Bean을 사용하는 방식이 존재합니다.
위 코드에서는 @Component가 없는데 어떻게 IoC가 관리할 수 있을까요?
