suyeonme

[Spring] Spring Bean, Ioc란? 본문

프로그래밍👩🏻‍💻/Spring

[Spring] Spring Bean, Ioc란?

suyeonme 2022. 6. 5. 11:18

1. Spring Container란?

  • xml이나 annotation등을 사용하여 bean을 생성한다.
  • 스프링 컨테이너는 Bean에 의존성을 주입(dependency injection)한다.
  • 스프링 컨테이너는 인스턴스의 생명주기(생성~소멸) 및 의존성을 관리한다. 따라서 개발자는 비즈니스 로직에만 집중할 수 있다.

2. Spring Bean이란?

  • 스프링 컨테이너가 생성한 객체를 Bean 이라고 한다.
  • 스프링은 스프링 컨테이너에 빈(bean)을 등록할 때 기본적으로 Singleton Scope로 등록한다. 따라서 스프링 빈은 기본적으로 싱글톤(Singleton)이다.  따라서 한개의 인스턴스이며 전역에서 공유된다. 

2.1 스프링 컨테이너에 Bean 등록

스프링 컨테이너에 빈을 등록하는 방법은 크게 두가지이다. 상황에 따라서 두가지 방식 모두 사용되지만, 주로 컴포넌트 스캔을 이용한 방식이 사용된다. 

 

1. 컴포넌트 스캔(Component Scan)과 자동 의존 관계 설정

2. @Configuration 애노테이션을 사용하여 수동으로 등록

 

컴포넌트 스캔(Component Scan)과 자동 의존 관계 설정

  • 클래스에 @Component 애노테이션을 사용하면 스프링 빈으로 등록이 된다.
  • @Controller, @Service, @Repository 애노테이션은 내부적으로 @Component를 포함한다.
  • @Autowired 애노테이션을 사용하여 자동으로 클래스(bean)간 의존 관계를 주입한다. 
  • Application 클래스의 @SpringBootApplication 애노테이션 내부에도 @Component가 포함되어있으므로, 스프링 컨테이너가 뜰 때 자동으로 애노테이션이 붙은 빈들은 컨테이너에 등록이 된다.
@Repository
public class MemberRepository {}

@Service
public class MemberService {}

@Controller
public class MemberController {}

@Component
public class TestBean {}

 

@Configuration 애노테이션을 사용하여 수동으로 등록

  • 최상위에 Config 클래스를 생성한다. (위치는 자유롭게 선정해도 된다.)
  • 상황에 따라 구현 클래스를 변경해야할 경우, 아래와 같이 수동으로 등록하는 방식을 사용할 수 있다. 예를 들어, 아직 데이터베이스가 선정되지 않아서 임시 Repository를 사용하고 추후에 진짜 데이터베이스로 교체하는 상황을 떠올릴 수 있다.
  • db를 연결하거나, 공통적으로 로그를 처리하는등의 작업과 같이 사용 용도가 utility적인 양상을 띄는 클래스(bean)는 수동 등록을 사용하면 좋다. 애플리케이션 전반에 영향을 미치고, 문제가 발생하면 디버깅이 어렵기 때문에 Bean 등록을 명확하게 들어내는 것이 좋다.
  • 일일히 빈을 등록해야하는 번거로움이 있다.
@Configuration
public class SpringConfig() {
	@Bean
	public MemberService memberService() {
		return new MemberService(memberRepository());
	} 

	@Bean
	public MemberRepository memberRepository() {
		return new MemberRepository();
	}
}

3. Inversion of Control (IoC)

  • 빈의 생성, 의존 관계 설정, 사용, 소멸등의 작업을 스프링 컨테이너가 담당한다.
  • 스프링 컨테이너가 빈에 대한 제어권을 갖고 있기 때문에, 스프링 컨테이너를 IoC Container라고 부르기도 한다.
Comments