Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Archives
Today
Total
관리 메뉴

The Office Lover

제어의 역전 - Inversion of Control 본문

Backend

제어의 역전 - Inversion of Control

Michael Gary Scott 2023. 8. 11. 11:21

소개

  • 스프링 프레임워크의 핵심 개념 중 하나인 제어의 역전(Inversion of Control, IoC)은 객체지향 프로그래밍에서 중요한 원칙 중 하나인 "의존성 역전(Dependency Inversion)"을 구현하는 방식입니다.
  • 이를 통해 애플리케이션의 컴포넌트들 간의 결합도를 줄이고 유연하고 확장 가능한 코드를 작성할 수 있게 됩니다.

 

 

제어의역전

Java 코드 예시

1. ArticleService 인터페이스

public interface ArticleService {
    List<Article> getAllArticles();
}

2. ArticleServiceImpl 클래스

public class ArticleServiceImpl implements ArticleService {
    private ArticleRepository articleRepository;

    public ArticleServiceImpl() {
        this.articleRepository = new ArticleRepository(); // 직접 객체 생성
    }

    @Override
    public List<Article> getAllArticles() {
        return articleRepository.getAllArticles();
    }
}

위 코드에서 ArticleServiceImpl은 ArticleRepository라는 데이터베이스와 상호 작용하는 객체를 직접 생성하고 사용하고 있습니다. 이런 경우에는 ArticleServiceImpl이 ArticleRepository에 강하게 의존하게 되며, 유연성과 테스트 용이성이 떨어지게 됩니다.

 

위 예제를 IOC 적용하여 살펴보겠습니다.

 

1. Spring 설정 파일 (applicationContext.xml)

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="articleService" class="com.example.ArticleServiceImpl">
        <property name="articleRepository" ref="articleRepository"/>
    </bean>
    
    <bean id="articleRepository" class="com.example.ArticleRepository"/>
</beans>

위 설정 파일에서 articleService와 articleRepository를 빈(bean)으로 정의하고, articleService의 articleRepository 의존성을 주입하도록 설정했습니다. 이제 스프링 컨테이너가 이 설정을 기반으로 빈을 생성하고 관리합니다.

 

2. 사용 코드

public class Main {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        ArticleService articleService = context.getBean("articleService", ArticleService.class);

        List<Article> articles = articleService.getAllArticles();
        // articles를 사용하여 작업 수행
    }
}

위 코드에서 ApplicationContext를 생성하고 설정 파일을 로드한 후 articleService 빈을 가져와 사용합니다. 이때 articleService는 스프링 컨테이너가 생성하고 주입한 객체입니다. 이로써 ArticleServiceImpl은 직접적으로 ArticleRepository를 생성하지 않고 스프링 컨테이너에 의해 주입되어 느슨한 결합을 유지할 수 있게 되었습니다.

 

 

 

 

제어의역전

제어의 역전(Inversion of Control)을 사용해야 하는 이유

1. 느슨한 결합

IoC를 사용하면 객체 간의 의존성이 감소하고, 각각의 컴포넌트가 독립적으로 개발될 수 있습니다. 이로써 시스템의 유지 보수 및 확장이 쉬워지며, 컴포넌트 간의 변경이 다른 컴포넌트에 미치는 영향이 최소화됩니다.

 

2. 재사용성

컴포넌트 간의 의존성을 외부에 위임하므로, 같은 컴포넌트를 다른 프로젝트나 모듈에서도 쉽게 재사용할 수 있습니다. 이로써 개발 시간과 비용을 절감할 수 있습니다.

 

3. 테스트 용이성

의존성을 주입하여 가짜(mock) 객체를 주입하거나 테스트용 객체를 쉽게 사용할 수 있습니다. 이로써 단위 테스트난 통합 테스트를 더 쉽게 수행할 수 있으며, 코드의 품질과 안정성을 향상실킬 수 있습니다.

 

4. 유연성과 확장성

객체의 생성과 의존성 주입을 컨테이너가 담당하기 때문에, 새로운 기능을 추가하거나 변경할 때 코드의 수정 없이도 가능합니다. 이로써 애플리케이션을 더 빠르게 확장하고 새로운 기능을 추가할 수 있습니다.

 

5. 중앙화된 관리

IoC 컨테이너는 객체의 생명주기를 관리하므로 객체의 생성, 소멸, 의존성 주입 등을 중앙에서 관리할 수 있습니다. 이로써 코드의 중복을 줄이고 관리하기 쉬운 코드를 작성할 수 있습니다.

 

6. 코드 가독성 및 유지 보수성

객체의 생성과 의존성 주입을 스프링 설정 파일 등 외부로 분리할 수 있습니다. 이로써 코드가 간결하고 가독성이 높아지며, 필요한 정보를 쉽게 파악할 수 있습니다.

 

7. 다양한 환경에 대한 지원

환경 설정을 외부로 분리하여, 다양한 환경에서 동일한 애플리케이션을 실행할 수 있습니다. 예를 들어 개발 환경, 테스트 환경, 운영 환경 등에서 다른 설정을 사용할 수 있습니다.

 

 

 

결론 

소프트웨어 아키텍처의 유연성과 확장성을 높이고, 코드의 품질을 향상하는데 중요한 역할을 합니다.

 

 

 

'Backend' 카테고리의 다른 글

Java IO와 NIO  (0) 2023.07.21
Java blocking과 non-blocking  (0) 2023.07.21
Java Spring Framework - @Transactional  (0) 2023.07.20
@Transaction - isolation 격리 수준에 따른 세가지 현상  (0) 2023.07.20
메세지 큐(Message Queue)  (0) 2023.03.27