상세 컨텐츠

본문 제목

[Spring] IoC 컨테이너 / Bean

Spring/개념

by Chan.94 2021. 10. 14. 20:40

본문

반응형

IoC란

IoC는 Inversion of Control (제어의 역전)이라고한다.

class Study {
    private Coffee coffee;

    public Study(Coffee coffee) {
    	this.coffee = coffee;
    }
    
    public startStudy() {
    	this.coffee.drink(); 
        ...
    }
}

Study는 Coffee를 사용하지만 직접 객체를 생성하지 않고 생성자를 통해 받아온다.

그렇다면 의존성을 생성하는 일은 더 이상 Study의 일이 아니므로 제어권이 역전되었다고 한다.

이렇게 의존성을 주입하는것을 DI (Dependency Injection)라고 하는데 DI 또한 일종의 IoC 라고 할 수 있다.

DI에 대해서는 [Spring/개념] - DI(의존성 주입) 포스팅을 확인바란다.


컨테이너란

컨테이너는 보통 인스턴스의 생명주기를 관리하며, 생성된 인스턴스들에게 추가적인 기능을 제공하도록하는 것이라 할 수 있다. 다시말해, 컨테이너란 당신이 작성한 코드의 처리과정을 위임받은 독립적인 존재라고 생각하면 된다. 컨테이너는 적절한 설정만 되어있다면 누구의 도움없이도 프로그래머가 작성한 코드를 스스로 참조한 뒤 알아서 객체의 생성과 소멸을 컨트롤해준다.

 


IoC 컨테이너 / Bean

IoC 컨테이너는 오브젝트의 생성과 관계설정, 사용, 제거 등의 작업을 대신 해준다하여 붙여진 이름이다. 이때, IoC 컨테이너에 의해 관리되는 오브젝트들은 Bean 이라고 부른다. IoC 컨테이너는 Bean을 저장한다고 하여, BeanFactory 라고도 불린다. BeanFactory는 하나의 인터페이스이며, Application Context는 BeanFactory의 구현체를 상속받고 있는 인터페이스이다.

실제로 스프링에서 IoC Container 라고 불리는 것은 Application Context의 구현체이다.

AppicationContext를 통해 우리는 JAVA에서 Bean을 가지고올 수 있다.

 

Application Context

모든 싱글톤 빈을 미리 로드한 후 애플리케이션 기동 후에는 Bean을 지연 없이 얻을 수 있다.

@Autowired
private ApplicationContext applicationContext;

MailSender mailSender = (MailSender)applicationContext.getBean("mailSender");

※ Bean의 이름이 어떻게 등록되는 지에 대해서는 필히 알아 두도록하자.

1. @Component로 등록한 Bean들은 클래스명에서 제일 앞 문자가 소문자로 변경된 형태로 등록된다.
2. @Bean으로 등록한 Bean들은 메소드명으로 등록된다.

ApplicationContext는 IoC 컨테이너이면서 싱글톤을 저장하고 관리하는 싱글톤 레지스트리이다.

(별 다른 설정을 하지 않으면 내부에서 생성하는 빈 오브젝트를 모두 싱글톤으로 만든다.)

 

Singleton

싱글톤이란 애플리케이션이 시작될 때 어떤 클래스가 최초 한번만 메모리를 할당하여 그 메모리에 인스턴스를 만들어 사용하는 디자인 패턴이다. 이로 인해 얻을 수 있는 장점은, 고정된 하나의 메모리를 사용하기 때문에 쓸데없이 같은 일을 하는 여러개의 객체가 메모리를 사용하여 낭비가 일어나는 것을 방지할 수 있다.

[Spring/개념] - [싱글톤 패턴] Singleton Pattern


Bean 등록 방법

1. @ComponentScan

우리가 흔히 사용하는 @Controller, @Service, @Repository는 해당 어노테이션을 달아주고 @ComponentScan을 통해 Bean으로 등록된다.

자세한 내용은 [Spring/개념] - [Spring] component-scan 사용이유 포스팅을 참고 바란다.

 

2. XML or JAVA에 @Bean으로 등록

<!-- ConsolePrinter 클래스를 bean으로 등록 -->
<bean id="consolePrinter" class="com.cm.ConsolePrinter"/>
@Configuration
public class MvcConfiguration{
	@Bean
	public MailSender mailSender() {
		return new MailSenderImpl();
	}
	
}

 

반응형

'Spring > 개념' 카테고리의 다른 글

[Spring] ApplicationContext / WebApplicationContext 개념  (0) 2022.03.21
[JAVA] Multi-Thread 사용법  (0) 2022.03.02
Spring AOP (Proxy)  (0) 2021.10.08
@Autowired 인터페이스 사용이유  (0) 2021.10.07
@Autowired 사용법  (0) 2021.10.06

관련글 더보기

댓글 영역

>