▶ApplicationContext란?
스프링을 공부할 때 ApplicationContext를 많이 들어봤을것이다. 듣기만 하고 넘기면 안된다. ApplicationContext란 뭘까?
바로 스프링 컨테이너이다.
스프링 컨테이너의 이름이 ApplicationContext이다.
그러면 컨테이너는 뭘까?
컨테이너는 빈의 생명주기를 관리하고, 객체를 어떤 방식(싱글톤, 프로토타입)으로 만들지 정하는 역할을 한다.
즉, 스프링의 핵심이다.
그러면 빈은 뭘까?
빈. Bean은 컨테이너가 관리하는 객체를 말한다.
즉, 빈을 관리하는 컨테이너는 스프링의 핵심이고.
그 핵심인 스프링 컨테이너의 이름이 ApplicationContext 인 것이다.
▷Spring Framework의 핵심모듈
그림을 보면 Core Container가 있는데, 그 중 Context 라이브러리만 가져와도
Core Container의 전체를 다 가져온다. 즉 다 의존성이 걸려있다.
그만큼 Context ,
ApplicationContext는 스프링의 핵심이다.
▶ApplicationContext Interface를 구현하고 있는 대표적인 클래스들
스프링 공식 문서에 들어가서 ApplicationContext를 보면
이렇게 Interface ApplicationContext라고 써져있고 org.springframework.context의 위치에 있다고 뜬다.
근데 Interface는 껍데기이기 때문에 인스턴스가 될 수 없다.
그렇다면 ApplicationContext Interface를 구현하고 있는 대표적인 클래스에는 뭐가 있을까?
▷Class ClassPathXmlApplicationContext
ClassPathXmlApplicationContext는 CLASSPATH에서 XML 설정파일을 읽어들여서 인스턴스를 생성한다.
예를 들어서
<bean id="book1" class="exam.Book"></bean>
<bean id="book2" class="exam.Book"></bean>
이렇게 빈으로 등록하고 인스턴스화 시킬 수 있었다.
그런데 사람들은
"자바 개발도하기 힘든데 xml은 또 언제 쓰고있냐... 아 짜증나...걍 자바로 편하게 설정할 수는 없을까??"
라는 생각을하였고, 그래서 나온것이 바로,,
▷Class AnnotationConfigApplicationContext
AnnotationConfigApplicationContext이다!
AnnotationConfigApplicationContext는 Spring 3.0버전부터 나왔다.
Annotation기반으로 동작하브로 Java코드로 설정할 수 있다.
ApplicationContext context = new AnnotationConfigApplicationContext("패키지 이름");
이렇게 "패키지 이름"을 적어주게 되면 AnnotationConfigApplicationContext가 그 패키지 이하를 다 스캔한다.
AnnotationConfigApplicationContext : 내가 읽어들여야 할 Annotation이 있나?
하고 다 뒤진다.
만약 Anntation이 있다면 읽어들여서 내부적으로 초기화시킨다.
▶Bean 등록 방식
▷@Configuration-@Bean 방식
@Configuration //Java Config 설정을 AnnotationConfigApplicationContext가 읽어들인다.
public class ApplicationConfig {
@Bean //Annotation이 달린 클래스에 대한 인스턴스를 만든다.
public Book book1(){ //메서드의 이름이 Bean의 id가 된다.
return new Book();
}
}
이렇게 @Bean을 사용하는 클래스에는 반드기
@Configuration을 활용하여 해당 클래스에서 Bean을 등록하고자 함을 명시해줘야 한다.
▷@Component 방식
@Component
public class MyUtil{
public void print(){
System.out.println("myUtil.print()");
}
}
AnnotationConfigApplicationContext가 @Component를 찾아서 인스턴스를 생성한다.
스프링은 컴포넌트 스캔(Component Scan)을 사용해 @Component 어노테이션이 있는 클래스들을 찾아 자동으로 빈 등록하므로 직접 개발한 클래스를 빈으로 편리하게 등록하고자 하는 경우에 사용된다.
id값을 가지게 하고 싶으면 @Component(value = "myUtil")을 사용하면
value값이 id가 되게된다.
▷@Component 방식이 더 편한 것 같은데 @Configuration-@Bean 방식은 언제 쓰나요?
스프링은 기본적으로 컴포넌트 스캔을 이용한 자동 빈 등록 방식을 권장한다.
이때, @Component의 하위 어노테이션으로 @Configuration, @Controller, @Service, @Repository 등이 있으며,
대부분의 경우 @Component를 이용한 자동 등록 방식을 사용하는 것이 좋다.
하지만
가져다 쓴 오픈소스에 누군가가 만들어 놓은 class에 @Component가 안붙어 있는 경우가 있다.
이럴 때 그 Class를 스프링한테 Bean으로 관리해달라고 하고 싶을 때
@Configuration-@Bean 방식을 사용한다.
또, 개발자가 직접 제어가 불가능한 라이브러리를 사용할 때에도 Bean으로 등록해주는 방식을 사용한다.
'BackEnd > Spring Boot🍃' 카테고리의 다른 글
[Spring] @AllArgsConstructor과 @RequiredArgsConstructor 사용을 "지양"하는 이유, 생성자에관한 어노테이션 알아보기 (0) | 2024.04.13 |
---|---|
[Spring] 의존성주입(DI)이란? 의존성주입의 4가지 방법 (0) | 2024.04.07 |
[Spring]Spring MVC 요청에서 응답까지의 흐름, @Controller와 @RequestMapping 원리 (0) | 2024.03.24 |
[Spring] Servlet과 Spring Web MVC(2) (0) | 2024.03.23 |
[Spring] Servlet과 Spring Web MVC(1) (0) | 2024.03.23 |