BE/Spring & Spring Boot

[Spring Boot] IoC 컨테이너

baek-dev 2024. 12. 21. 14:46

IoC 컨테이너

객체의 생성, 라이프사이클 관리, 의존성 주입을 책임지는 Spring프레임워크의 핵심 구성 요소이다

제어의 역전(Inversion of Control, IoC) 원칙을 구현하여 애플리케이션의 객체와 객체 간의 의존성을 관리한다


IoC

객체 생성 및 의존성 관리를 개발자가 아닌 컨테이너가 담당하는 디자인 원칙이다

즉, 객체는 자신이 사용할 의존성을 직접 생성하거나 관리하지 않고, 외부에서 주입받는다

 

IoC 의 핵심 개념

  • 객체 간의 결합도를 낮추어 코드 재사용성과 유지보수성을 높임
  • 애플리케이션의 구성 요소를 유연하고 확장 가능하게 설계

IoC 컨테이너의 주요 역할

1. 빈 등록 및 관리

  • 개발자가 정의한 빈을 생성하고 컨테이너에 등록
  • 빈의 라이프사이클(생성, 초기화, 소멸)을 관리

2. 의존성 주입(DI)

  • 빈 간의 의존성을 분석하고 필요한 객체를 자동으로 주입

3. 빈 스코프 관리

  • 빈의 생성 및 사용 범위를 지정하여 효율적으로 리소스 관리

4. AOP (Aspect Oriented Programming) 지원

  • IoC 컨테이너는 애스펙트를 적용하여 횡단 관심사를 관리

IoC 컨테이너의 구현체

1. BeanFactory

  • Spring IoC 컨테이너의 가장 기본적인 구현체
  • 지연 로딩(Lazy Loading) 방식으로 필요한 시점에 빈을 생성
  • 가벼운 애플리케이션에 적합

2. ApplicationContext

  • BeanFactory를 확장한 고급 컨테이너
  • 빈 생성을 포함하여 AOP, 이벤트 리스닝, 메시지 소스 처리 등 다양한 기능 제공
  • 대부분의 Spring 애플리케이션에서 기본으로 사용

IoC 컨테이너 동작 방식

1. 설정 파일 또는 어노테이션 읽기

  • XML 파일, 자바 설정 클래스, 또는 어노테이션에서 빈 설정 정보를 읽음

2. 빈 등록

  • 설정 정보를 기반으로 빈 정의를 IoC 컨테이너에 등록

3. 빈 생성 및 초기화

  • 등록된 빈을 생성하고 초기화 메서드 실행

4. 의존성 주입

  • 빈 간의 의존성을 주입하여 연결

5. 빈 관리

  • 빈의 상태를 관리하고 컨테이너 종료시 필요한 경우 소멸 메서드 호출

IoC 컨테이너 예시

XML 설정

<beans xmlns="http://www.springframework.org/schema/beans">
    <bean id="myBean" class="com.example.MyClass">
        <property name="dependency" ref="myDependency"/>
    </bean>
    <bean id="myDependency" class="com.example.MyDependency"/>
</beans>

 

Java Config

@Configuration
public class AppConfig {
    @Bean
    public MyClass myBean() {
        return new MyClass(myDependency());
    }

    @Bean
    public MyDependency myDependency() {
        return new MyDependency();
    }
}

 

어노테이션 기반

@Component
public class MyClass {
    private final MyDependency dependency;

    @Autowired
    public MyClass(MyDependency dependency) {
        this.dependency = dependency;
    }
}

@Component
public class MyDependency {
}

IoC 컨테이너의 장점

  1. 의존성 관리:
    • 객체 간의 의존성을 명확히 정의하고 자동으로 주입함으로써 결합도를 낮춤
  2. 코드 간결화:
    • 객체 생성 및 관리 코드가 줄어듦
  3. 테스트 용이성:
    • 객체 의존성이 외부에서 주입되므로 단위 테스트 작성이 쉬워짐
  4. 유연한 설정:
    • XML, Java Config, 어노테이션 등 다양한 방식으로 설정 가능
  5. 기능 확장성:
    • AOP, 이벤트 처리, 리소스 로딩 등 IoC 컨테이너의 다양한 부가 기능 활용 가능

IoC 컨테이너를 활용한 예제

서비스 계층 의존성 주입

@Service
public class UserService {
    private final UserRepository userRepository;

    @Autowired
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public void performOperation() {
        userRepository.save(new User("John Doe"));
    }
}

@Repository
public class UserRepository {
    public void save(User user) {
        System.out.println("Saving user: " + user.getName());
    }
}

 

메인 애플리케이션

@SpringBootApplication
public class MyApp {
    public static void main(String[] args) {
        ApplicationContext context = SpringApplication.run(MyApp.class, args);

        UserService userService = context.getBean(UserService.class);
        userService.performOperation();
    }
}

 

 

 

 

 

 

출처 : ChatGPT

'BE > Spring & Spring Boot' 카테고리의 다른 글

[Spring Boot] @ManyToOne, @OneToMany  (1) 2024.12.22
[Spring Boot] Eager, Lazy  (0) 2024.12.21
[Spring Boot] 빈이란  (1) 2024.12.15
[Spring Boot] ApplicationRunner  (0) 2024.12.14
[Spring Boot] ORM, @Query  (1) 2024.12.14