개발지식

[SPRING] 스프링 컨테이너(Spring Container)란?!

우루쾅 2024. 2. 5. 21:10
728x90
반응형
SMALL

스프링 컨테이너(Spring Container)란?!

ApplicationContext 를 스프링 컨테이너라고 합니다.

스프링 컨테이너는 @Configuration 이 붙은 AppConfig 를 설정(구성) 정보로 사용합니다.

여기서 @Bean 이라 적힌 메서드를 모두 호출하여 반환된 객체를 스프링 컨테이너에 등록합니다.

이렇게 스프링 컨테이너에 등록된 객체를 스프링 빈이라고 합니다.

// 스프링 컨테이너 생성
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);

 

일반적으로 'IOC 컨테이너' 와 '스프링 컨테이너'는 동일한 의미로 사용됩니다.

IOC 컨테이너는 Inversion Of Control(제어의 역전)의 개념을 구현한 컨테이너를 가리키는 용어이며,

스프링 컨테이너는 스프링 프레임워크에서 IOC 컨테이너를 구현한 것입니다.

 

스프링 컨테이너의 역할

스프링 컨테이너는 스프링 프레임워크의 핵심 요소로서 객체의 생성, 관리, 의존성 주입 등을 담당하는 역할을 수행합니다.

이를 통해 개발자는 애플리케이션의 객체 관리에 대한 부분을 스프링 컨테이너에 위임할 수 있고, 객체 간의 결합도를 낮추고 유연한 애플리케이션을 개발할 수 있습니다.

 

아래는 스프링 컨테이너를 사용하여 빈을 생성하고 의존성을 주입하는 예시입니다.

// 빈으로 등록할 클래스
public class UserService {
    private UserRepository userRepository;

    // 의존성 주입을 위한 setter 메서드
    public void setUserRepository(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    // UserService의 기능 구현
    public void addUser(String username) {
        userRepository.save(username);
        System.out.println("사용자 추가: " + username);
    }
}

// 빈으로 등록할 인터페이스
public interface UserRepository {
    void save(String username);
}

// UserRepository를 구현한 클래스
public class UserRepositoryImpl implements UserRepository {
    @Override
    public void save(String username) {
        // 데이터베이스에 사용자 정보 저장 로직
        System.out.println("데이터베이스에 저장: " + username);
    }
}

// 메인 메서드에서 스프링 컨테이너 사용
public class Main {
    public static void main(String[] args) {
        // 스프링 컨테이너 생성
        ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);

        // 빈 객체 가져오기
        UserService userService = context.getBean(UserService.class);

        // UserService 기능 호출
        userService.addUser("John");

        // 스프링 컨테이너 종료
        ((AnnotationConfigApplicationContext) context).close();
    }
}

// 스프링 설정 파일
@Configuration
public class AppConfig {
    @Bean
    public UserService userService() {
        UserService userService = new UserService();
        userService.setUserRepository(userRepository());
        return userService;
    }

    @Bean
    public UserRepository userRepository() {
        return new UserRepositoryImpl();
    }
}

 

위 예시 코드에서 UserService 는 UserRepository 에 의존하고 있습니다.

UserService 는 UseRepository 를 주입받아 사용자를 추가하는 addUser 메서드를 구현하고 있습니다.

 

AppConfig 클래스는 스플이 설정 파일로서 @Configuration 어노테이션을 통해 스프링 컨테이너에게

해당 클래스가 설정 정보를 제공한다는 것을 알려줍니다.

@Bean 어노테이션을 사용하여 UserService 와 UserRepository 를 빈으로 등록합니다.

 

Main 클래스에서는 스프링 컨테이너를 생성하고, UserService 빈을 가져와 addUser 메서드를 호출합니다.

이 때 스프링 컨테이너는 UserSerivice 에 필요한 UserRepository 를 주입하여 의존성을 관리합니다.

 

위의 예시는 스프링 컨테이너를 사용하여 빈을 생성하고 의존성을 주입하는 간단한 예시입니다.

스프링 컨테이너는 이를 통해 객체의 생명 주기를 관리하고, 설정 파일이나 어노테이션을 통해 빈의 정의와 의존성을 설정하여 애플리케이션의 객체 관리를 지원합니다.

 

 

 

 

출처

GPT-4

인프런 - 김영한의 스프링 핵심원리 - 기본편 (IoC, DI, 그리고 컨테이너)

728x90
반응형
LIST