스프링 스터디를 하기 전 김영한님의 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 강의를 듣고있는데 스프링 빈이 정확히 무엇인지 알고 넘어갈 필요가 있다고 생각해서 정리를 해보려고 한다.
IoC(Inversion of Control) - 제어의 역전
객체의 생성, 생명주기의 관리까지 모든 객체에 대한 제어권이 바뀌었다는 것을 의미함.
Spring 프레임워크에서 컨테이너는 객체의 생명주기를 관리하고 의존 관계를 설정해주고 생성된 객체들에게 추가적인 기능을 제공한다.
컨테이너는 적절한 설정만 되어있다면 개발자의 도움 없이도 스스로 객체의 생성과 소멸을 컨트롤해준다.
BeanFactory
ApplicationContext
Spring IoC Container
가 관리하는 자바 객체를 Bean이라고 부른다.
Singleton
: 어떤 클래스가 최초 한번만 메모리를 할당하고 그 메모리에 객체를 만들어 사용하는 디자인 패턴POJO
: 특정 기술에 종속되어 동작하는 것이 아닌 본래 자바의 장점을 살리는 오래된 방식의 순수한 자바 객체 @Component, @Service, @Controller, @Repository, @Bean, @Configuration 등의 Annotation으로 Bean을 등록하고 필요한 곳에서 @Autowired를 통해 주입받아 사용하는 방법
@Controller
public class SpringController {
@GetMapping("spring")
public String spring(Model model){
model.addAttribute("data", "hello!!");
return "spring";
}
...
}
@Service, @Controller, @Repository는 @Component를 상속받고 있으며 해당 어노테이션으로 등록된 클래스는 스프링 컨테이너에 의해 자동으로 생성되어 Bean으로 등록됨
XML로 된 설정파일을 사용하는 방법과 자바 설정 클래스를 사용하는 방법이 있는데 최근 추세는 자바 클래스에서 관련 설정을 대신하는 방법을 주로 사용한다고 한다.
설정 클래스는 @Configuration 어노테이션을 클래스 앞에 추가하면 되는데, 이때 @Bean 어노테이션을 메소드에 사용해 메소드의 리턴 객체가 Bean 객체임을 선언하는 방법이 있다.
@Configuration
public class SpringConfig {
@Bean
public MemberService memberService(){
return new MemberService(memberRepository());
}
...
}
실무에서 사용하는 구조는 편리한 컴포넌트 방식으로 스프링 빈을 등록하지만, 정형화된 틀이 없거나 상황에 따라 구현 클래스를 직접 수정해야 하는 일이 있는 경우에는 Configuration 클래스로 직접 등록하는 게 유리하다.
[스프링 기초] 컨테이너와 IoC (Inversion of Control, 제어의 역전) 란?
[Spring] Bean 정리
[스프링부트] Bean 객체를 등록하는 두 가지 방법(@Component, @Bean)