Spring Application의 구성 요소
- POJO + 메타 정보 + 스프링 프레임워크 (IoC Container) 로 구성된다.
- POJO : 비즈니스 로직을 가짐.
- 메타 정보 : 애플리케이션 구성 정보를 가짐.
- 위 둘을 IoC Container인 Spring Framework가 조합해서 애플리케이션을 구성한다.
![](https://velog.velcdn.com/images/wnstj1128/post/dbfd051f-791b-46bd-aadb-89e0ec6e25db/image.png)
POJO
- Plain Old Java Object의 약자로 말 그대로 이전부터 사용하던 평범한 자바 객체를 의미한다.
- 객체를 만들 때 특별히 무언가를 상속받아서 확장 할 필요가 없다는 것을 강조하기 위한 말이다.
- 즉, POJO를 사용하면 특정 기술이나 스펙에 종속되지 않는다.
- 스프링과 같은 프레임워크는 반제품 상태라 비즈니스 로직이 빠져있는데, 일반적으로 비즈니스 로직을 제공하는 클래스를 작성할 때 POJO로 작성해주면 된다. 이런 POJO를 Bean이라고 부른다.
- 스프링 프레임워크에서는 이러한 Bean을 관리하므로 스프링을 빈의 Container라고 부른다.
- Container ? 생성이나 소멸 이런 정반을 관리하는 것
- Bean으로 만드는 대상은 스코프에 따라 여러 종류가 있을 수 있는데 일반적으로는 다음과 같다.
- 상태를 갖지 않고 (Stateless), 비즈니스 로직으로만 구성되어 재사용이 가능한 객체들
- DAO나 Service layer
- Singleton으로 구성한다. Spring Framework는 별도의 설정 없이 이러한 Bean들을 Singleton으로 관리해준다.
- 상태가 없다는 것 ? Writable한 멤버 변수가 없이 기능 위주인 것이다.
메타정보
- 스프링 애플리케이션 구성을 위한 다양한 정보로 구성
- POJO를 어떻게 Bean으로 구성할 것인가에 대한 정보. 즉, Bean 들의 생성이나 관계 설정도 메타 정보의 한 부분이다.
- 메타 정보를 작성하는 방법에는 3가지 방법이 있다.
- xml config
- annotation
- java config
xml 기반 메타정보 설정
<bean id="bookRepo" class="com.example.service.BookRepoImpl"> <bean/>
<bean id="bookService" class="com.example.service.BookServiceImpl">
<property name="bookRepo" ref="bookRepo" />
</bean>1
java 기반
@Configuration
public class BookConfig {
@Bean
public BookRepo bookRepo() {
return new BookRepoImpl();
}
@Bean
public BookService bookService(BookRepo brepo) {
return new BookRepoImpl(brepo);
}
}
- 최근에는 java config + annotation 방식이 사용되고 있다.
스프링 프레임워크 (=IoC Container)
- 스프링 프레임 워크는 POJO와 메타 정보를 이용하는 반제품 형태의 애플리케이션이다.
- 스프링 프레임워크의 역할
- Bean Container로서 Bean의 life cycle을 관리
- Bean 객체의 생성, Bean 객체 간 관계 설정(set), Bean 객체 관리(Singleton) 등을 관장한다.
- 이전에는 개발자가 주도해서 Singleton을 구성하는 등을 했는데 이제는 스프링이 제공해주는 대로 코드를 작성해야 한다. 예를들어 스프링이 싱글톤을 짜면 개발자가 거기에 맞춰서 기본 생성자를 갖춘다던지의 식으로 맞춰야 한다.
- 이런것을 제어의 역전 (IoC)라고 한다.
ApplicationContext context = new AnnotationConfigApplicationContext(PracticeConfig.class);
- 스프링의 IoC 컨테이너를 가리키는 인터페이스 (스프링 컨테이너는 빈을 관리하는 컨테이너)
- GenericXmlApplicationContext : XML 파일을 이용하여 스프링 컨테이너를 초기화하는 클래스
참고 - XML에서 component scan을 통해 어노테이션이 있는 Bean 등록 및 주입
<!-- Q7. 컴포넌트 스캔을 통해 어노테이션이 있는 Bean 등록 및 주입 -->
<context:component-scan base-package="com.ssafy.ws" />