Spring Container, Java Bean vs. POJO vs. Spring Bean
Spring의 주요 개념을 살펴보도록 하겠습니다.
1. Spring Container란? (Spring Context란?)
(Spring, Spring Container, Spring IOC Container, Spring Context를 혼용하기도 합니다)
Spring Container는 Spring Bean과 Spring Bean의 lifecycle(생명주기)을 관리합니다
앞서 여러 Java 클래스와 설정 파일을 만들었습니다.
그리고 만든 것들을 Spring Container에 input으로 전달했습니다.
POJOs : Person, Address
(Plain Old Java Object, Java Class, record를 활용했습니다)
Config : HelloWorldConfiguration (@Configuration)
(설정파일)
Spring Container의 output은 Ready System입니다.
Java 클래스와 설정을 만들면, IOC Container가 런타임 시스템을 만듭니다.
이 시스템이 Spring Context를 만들고, 모든 Bean을 관리합니다.
참고.
Bean Factory와 Application Context는 IOC Container의 구현체입니다.
1. Bean Factory
기본 Spring Container
2. Application Context
엔터프라이즈 전용 기능이 있는 고급 Spring Container
웹 애플리케이션을 구축하고 있거나
국제화 기능이 필요한 경우 또는
Spring AOP(측면 지향 프로그래밍)와 잘 통합되도록 하려는
시나리오에서 Application Context를 사용
일반적으로 엔터프라이즈 애플리케이션에는 Application Context의 기능이 필요하며
Application Context를 자주 사용합니다.
Application Context는 웹 애플리케이션, 웹 서비스, REST API, 마이크로서비스에 유용합니다.
Bean Factory를 직접 구현하여 사용하는 경우는, 메모리에 대해 강한 제약을 가진 IOT 애플리케이션이 있습니다.
2. Java Bean vs POJO vs Spring Bean
Java Bean
세 가지 제약을 준수하는 클래스입니다.
1. public no-arg-constructor 기본 생성자가 있습니다.
public JavaBean() {
}
2. getters, setters 게터와 세터 메서드를 사용하여 프로퍼티에 접근할 수 있습니다.
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
3. 클래스에서 Java Serializable 구현합니다.
class JavaBean implements Serializable
POJO
아무 제약이 없으며, 모든 Java 클래스를 생성하면, 아무 제약도 없는 POJO객체가 됩니다.
앞서 만든 모든 클래스는 POJO입니다.
(일반적으로 오래된 자바 객체)
class Pojo {
private String text;
private int number;
public String toString() {
return text + ":" + number;
}
}
Spring Bean
SpringFramework에서 관리하는 것은 모두 Spring Bean이 될 수 있습니다.
Spring이 관리하는 모든 Java 객체입니다.
Spring에서 IOC Container를 사용하여 Spring Bean을 관리합니다.
IOC Container가 관리하는 모든 객체는 Spring Bean입니다.
3. SpringFramework에서 관리하는 모든 Bean 확인하기
var context = new AnnotationConfigApplicationContext(HelloWorldConfiguration.class);
context.getBeanDefinitionNames를 사용하면, 이 레지스트리에 정의된 모든 이름을 return합니다.
(return Stinrg[])
context.getBeanDefinitionCount를 사용하면, 이 레지스트리에 정의된 Bean의 개수를 반환합니다.
(return int)
context.getBeanDefinition을 사용하여 Bean의 이름을 매개변수로, 특정 Bean의 정보를 확인할 수 있습니다.
(return BeanDefinition)
getBeanDefinitionNames와 getBeanDefinitionCount를 호출하고
반환값을 출력해보겠습니다.
Arrays.stream(context.getBeanDefinitionNames())
.forEach(System.out::println);
System.out.println(context.getBeanDefinitionCount());
//Bean 이름 리스트 반복문으로 출력한 결과
org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
helloWorldConfiguration
name
age
person
person2MethodCall
person3Parameters
address2
address3
//Bean 개수 출력 결과
13
이렇게 Spring에서 관리하는 Bean을 확인할 수 있었습니다.
다음은 Bean의 우선순위르 정하는 것에 대해 알아보겠습니다.
'Java' 카테고리의 다른 글
[SpringFramework] Lazy Initialization vs. Eager Initialization, Bean Scopes (0) | 2023.12.17 |
---|---|
[SpringFramework] Bean 우선순위 부여(@Primary, @Qualifier) (0) | 2023.11.29 |
[SpringFramework] Spring Bean 생성, 확인, 의존성 주입 (0) | 2023.11.26 |
[SpringFramework] Coupling, 강한 결합과 느슨한 결합 (0) | 2023.11.26 |
[SpringFramework] 스프링프로젝트 생성(spring.io, InteliJ), 클래스 생성 (0) | 2023.11.25 |