IoC와 DI

2024. 5. 14. 16:44Back-End/Spring

IoC (Inversion of Control)

우선 IoC는 "제어의 역전"이라는 뜻을 가지고 있습니다. 기존의 프로그램은 개발자가 코드의 제어 흐름을 직접 제어했습니다. 예를 들어, 객체를 생성하고 의존성을 해결하는 작업을 개발자가 수동으로 처리했습니다.

하지만 IoC는 이러한 제어의 흐름을 반전시키는 것을 의미합니다. 즉, 제어 흐름의 주체가 개발자에서 프레임워크나 컨테이너로 넘어가는 것을 의미합니다. 이렇게 하면 개발자는 프레임워크나 컨테이너에 의해 객체가 생성되고 의존성이 해결되는 것을 통제할 수 있습니다.

 

DI (Dependency Injection)

DI는 "의존성 주입"을 의미합니다. 이것은 객체가 직접 필요한 의존성을 생성하거나 찾는 것이 아니라, 외부에서 주입받는 방식을 말합니다. 이는 객체가 자신의 의존성을 만들지 않고 외부에서 주입받아 사용함으로써 결합도를 낮출 수 있습니다.

예를 들어, 서비스 클래스에서 데이터베이스 연결을 필요로 한다면, 이 연결을 직접 생성하는 것이 아니라 외부에서 주입받아 사용하는 것이 DI의 사례입니다.

 

IoC 컨테이너와 DI 프레임워크

IoC 컨테이너는 IoC를 구현한 것으로, 객체의 생명주기와 의존성 주입을 관리합니다. 대표적인 IoC 컨테이너로는 Spring Framework가 있습니다. Spring Framework에서는 DI를 구현한 여러 기능을 제공하며, 개발자는 이를 활용하여 코드의 유연성과 테스트 용이성을 높일 수 있습니다.

 

예제로 보는 IoC와 DI

간단한 예제를 통해 IoC와 DI를 이해해보겠습니다. 아래는 Java와 Spring Framework를 사용한 예제 코드입니다.

 

UserService.java

public interface UserService {
    void greet();
}

public class UserServiceImpl implements UserService {
    @Override
    public void greet() {
        System.out.println("Hello, user!");
    }
}

 

UserController.java

public class UserController {
    private UserService userService;
    
    // Constructor Injection
    public UserController(UserService userService) {
        this.userService = userService;
    }
    
    public void greetUser() {
        userService.greet();
    }
}

 

AppConfig.java

@Configuration
public class AppConfig {
    @Bean
    public UserService userService() {
        return new UserServiceImpl();
    }
    
    @Bean
    public UserController userController() {
        return new UserController(userService());
    }
}

 

Main.java

public class Main {
    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        UserController userController = context.getBean(UserController.class);
        userController.greetUser();
    }
}

 

위의 코드에서 UserController는 UserService에 의존하며, 이 의존성은 생성자를 통해 주입됩니다. AppConfig 클래스에서는 빈(Bean)들의 의존성을 설정하고, Main 클래스에서는 IoC 컨테이너를 통해 UserController를 가져와 사용합니다.

이처럼 IoC DI 코드의 유연성을 높이고 결합도를 낮추는 등의 장점을 제공합니다. 이를 통해 유지보수성이 높은 애플리케이션을 개발할 있습니다.

'Back-End > Spring' 카테고리의 다른 글

ResultSetExtractor  (0) 2024.05.17
@Transactional과 TransactionTemplate  (0) 2024.05.17
배치 업데이트(Batch Update)  (0) 2024.05.17
Spring Data JDBC  (0) 2024.05.16
@Configuration 및 @Bean vs @ComponentScan  (0) 2024.05.14