💡 참고 | 주로 사용하는 설정방식은 Java기반의 애너테이션으로 하지만 기존에 사용하던 XML방식에 대해서도 알아야함.
💡사전지식
- Bean? 빈 이란, 스프링 IoC컨테이너가 관리하는 객체이다.
- 빈으로 등록된 객체는 기본적으로 싱글톤 스코프로 정해진다.
- 싱글톤이란? 객체가 하나만 만들어진다. 싱글톤의 장점은 객체를 재사용한다는 것인데 이렇게 하면 메모리를 절약할 수 있고 런타임시 성능 최적화에 유리하다. <-> 프로토타입: 매번 다른 객체가 만들어진다.
스프링 컨테이너는 'ApplicationContext' 인터페이스다.
❗️스프링 컨테이너의 기능?
❗️스프링 컨테이너를 만드는 방식?
- 빈 팩토리(BeanFactory)
- 애플리케이션 컨텍스트(ApplicationContext)
1️⃣ 빈 팩토리는 스프링 IoC 컨테이너의 가장 최상위 인터페이스다. 그러나 이것을 직접 사용하는 경우는 거의 없다. BeanFactory는 빈을 관리하고 검색하는 기능을 담당한다.(빈 등록,생성,조회,return)
2️⃣ 일반적으로는 애플리케이션 컨텍스트(ApplicationContext)를 스프링 컨테이너라고 한다. ApplicationContext는 BeanFactory의 기능을 상속받아 그 외에 부가기능을 제공해준다.
부가기능으로는,
스프링 컨테이너 생성하기
// Spring Container 생성하기
ApplicationContext applicationContext =
new AnnotationConfigApplicationContext(DependencyConfig.class);
스프링 컨테이너가 관리하는 자바 객체이다.
빈은 인스턴스화된 객체이다.
스프링 컨테이너에 등록된 객체가 스프링 빈이다.
@Bean이 적힌 메서드를 모두 호출해서 스프링 컨테이너에 등록한다.
빈은 클래스의 등록정보, getter/setter를 포함하고 있다.
빈은 컨테이너에 사용되는 설정 메타데이터로 생성된다.
빈 이름은 메서드 이름을 사용한다.
빈 이름을 직접 부여할 수 있다. ex)@Bean(name="memberService")
BeanDefintion
: 스프링에서 설정 정보를 BeanDefinition 인터페이스로 추상화 하여 컨테이너에게 정보를 제공한다.
💡 ApplicationContext 인터페이스 구현체 확인하기
- Mac에서 Cmd + O → 클래스에서 ApplicationContext로 검색
- Windows에서 Ctrn + N → 클래스에서 ApplicationContext로 검색
- 화면에서 가장 첫번째 파일인 ApplicationContext 인터페이스를 구현한 하위 클래스들이 나오는 걸 확인할 수 있습니다.
2. 스프링 빈 등록하기
빈을 설정하는 방법에는 여러가지 방법이 있지만 그 중 살펴볼 것은 xml로 설정하는 원초적인 방법과 스프링2.5버젼, 스프링 부트를 통한 빈 설정방법을 살펴보겠다.
// ex) xml 설정파일에 두 클래스를 각각 빈으로 등록하고,
bookService의 특성(프로퍼티)으로 bookRepository를 등록하여 참조함.
<bean id="bookService"
class="me.wordbe.springgoahead.BookService">
<property name="bookRepository" ref="bookRepository" />
</bean>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="me.wordbe.springgoahead" />
</beans>
패키지의 각각 클래스에 애노테이션을 붙여 빈을 등록한다.
import org.springframework.stereotype.Repository;
@Repository
public class BookRepository {
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class BookService {
@Autowired
BookRepository bookRepository;
public void setBookRepository(BookRepository bookRepository) {
this.bookRepository = bookRepository;
}
}