IoC


객체의 생성과 생명주기 관리를 개발자가 아닌 프레임워크가 하는 것을 말합니다.

만약 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는 인터페이스가 아닌 구체클래스에 의존하지 않고 사용하도록(의존 역전 법칙) 도와주기에 더욱주요 관심사에만 집중할 수 있도록 도와준다.

IoC가 관리하도록 하려면 어떻게 할까?

@Component

@Component 와 @Bean을 사용하는 방식이 존재합니다.

위 코드에서는 @Component가 없는데 어떻게 IoC가 관리할 수 있을까요?