티스토리 뷰

☠️ Java

Spring Framework 주요 기능

James Wetzel 2024. 11. 7. 14:37
728x90
반응형

IoC(제어의 역전, Inversion of Control)란?

 

IoC 컨테이너는 Spring Framework의 핵심 기능입니다.

IoC 컨테이너는 POJO(Plain Old Java Object, 오래된 방식의 자바 객체)를 구성하고 관리합니다.

 

POJO(Plain Old Java Object, 오래된 방식의 자바 객체)란?

개발자에 의해 객체의 인스턴스가 생성이 되고 관리되어 지는 방식을 의미합니다.

 

 

가령 예를 들어

IoC 컨테이너를 사용하기 이전 방식(POJO)의 코드는 다음과 같습니다.

// 개발자에 의해 성성된 인스턴스
Product product = new Product()

 

하지만

IoC 컨테이너를 사용할 경우 기존 POJO 방식과는 다르게 객체의 인스턴스가 생성이 됩니다.

// @Component 어노테이션에 의해 객체의 인스턴스가 생성이되며
// 생성된 객체의 인스턴스는 IoC 컨테이너에 의해 관리되어 집니다.
@Component
Class Product {
	...
}

 

 

이처럼 객체의 인스턴스 생성 및 관리의 주체가 개발자에서 IoC 컨테이너로 넘어가는 현상을

우리는 "제어의 역전" 이라고 하며 제어의 역전은 곧 "IoC(제어의 역전, Inversion of Control)"를 의미합니다.


추가 정보

IoC(제어의 역전) 컨테이너는

@Configuration, @Bean, @Repository, @Service, @Controller, @RestController... 등

다양한 어노테이션(annotation)을 스캐닝하여 인스턴스를 생성한 후 관리 합니다.


@Configuration, @Been 이해하기

Spring Framework가 @Configuration 어노테이션을 발견하면 @Bean을 찾습니다.

 

@Bean이 설정된 메소드가 발견이 되면 인스턴스를 생성한 후 반환합니다.

이렇게 생성이 된 인스턴스는 IoC 컨테이너에 의해 관리 되어 집니다.

 

@Configuration
Class ProductConfig {
	@Bean
	public Product getProduct() {
    	Proeuct product = new Product();
        product.setName("TV");
    	
        return product;
    }
}

어노테이션(annotation) 스캐닝

 

"자바 프로젝트"의 경우 Spring Framework가 어노테이션을 스캐닝할 수 있도록 설정을 해주어야합니다.

// 특정 객체 스캐닝
ApplicationContext context = new AnnotationConfigApplicationContext(ProductConfig.class);

// 패키징 단위 스캐닝
ApplicationContext context = new AnnotationConfigApplicationContext("com.demo.product");

 

 

하지만 

"Spring Web 프로젝트"의 경우 별도의 설정 없이 Spring Framework가 자동으로 어노테이션을 스캐닝합니다.

(필자의 능력 부제로 인해 어떤 매커니즘으로 자동 스캐닝이 되는지는 알 수 없습니다.ㅠㅠ)


IoC 컨테이너에서 인스턴스 가져오기

어노테이션(annotation)에 의해 생성된 인스턴스는 "IoC 컨테이너"에서 관리 되어 진다고 이야기했습니다.

 

그럼 우리는 어떻게 "IoC 컨테이너"에서 우리가 원하는 특정 인스턴스를 가져올 수 있을까요?

바로 getBean() 메소드를 사용하는 것입니다.

 

// 1. 선언
@Configuration
Class ProductConfig {
	@Bean
	public Product getProduct() {
    	Proeuct product = new Product();
        product.setName("TV");
    	
        return product;
    }
}

// 2. 스캐닝
ApplicationContext context = new AnnotationConfigApplicationContext(ProductConfig.class);


// 호출
Product product = (Product)context.getBean("getProduct");

// "2. 스캐닝" 과정을 생략하고 바로 호출
Product product = (Product)context.getBean("getProduct", Product.class);

@Component

 

728x90
반응형