학습목표
- Spring 컨테이너(Container)와 빈(Bean)의 의미를 이해할 수 있다.
- 빈 스코프(Bean Scope)의 의미를 이해할 수 있다.
- Java 기반 컨테이너(Container) 설정에 대해 이해할 수 있다.
- Spring DI(Dependency Injection)의 의미를 이해할 수 있다.
- Component 스캔에 대해 이해할 수 있다.
▶Spring 컨테이너
- 애플리케이션 빈의 생성, 관리, 제거 등 생명주기를 관리
- 개발자가 정의한 빈을 객체롤 만들어 관리하고 개발자가 필요로 할 때 제공
- 의존성 주입을 통해 애플리케이션의 컴포넌트를 관리
- 개발자는 모듈 간에 의존 및 결합으로 인해 발생하는 문제로부터 자유로움
- ApplicationContext 를 스프링 컨테이너라고 하고 인터페이스로 구현되어 있음(다형성)
- 사용 방법: xml, annotation 기반의 자바 설정 클래스
- 컨테이너 사용 이유: 애플리케이션 규모가 커지고 객체가 무수히 많아지고 서로 참조하게 됨(의존성), 낮은 결합도와 높은 캡슐화가 객체지향프로그래밍의 핵심 중 하나인데 높은 의존성으로 이를 못지키는 상황에 처함 => 객체 간의 의존성을 낮추기 위해 스프링 컨테이너가 사용됨
- 구현 클래스에 있는 의존을 제거하고 인터페이스에만 의존하도록 설계할 수 있음
- 종류: BeanFactory, ApplicationContext(빈팩토리를 상속받고 MessageSource, EnvironmentCapable, ApplicationEventPublisher, ResourceLoader 와 같은 부가기능을 제공)
▶ 빈(Bean)
- 스프링 컨테이너에 의해 관리되는 재사용 소프트웨어 컴포넌트
- @Bean이 적힌 메서드를 모두 호출해서 반환된 객체를 스프링 컨테이너에 등록
- BeanDefinition(빈 설정 메타정보)으로 정의되고 이에 따라서 활용하는 방법이 달라짐
▶빈스코프
- 빈이 존재할 수 있는 범위
singleton | (Default) 각 Spring 컨테이너에 대한 단일 객체 인스턴스에 대한 단일 bean definition의 범위 지정 |
prototype | 스프링 컨테이너는 프로토타입 빈의 생성과 의존관계 주입까지만 관여하고 더는 관리하지 않는 매우 짧은 범위 |
request | 웹 요청이 들어오고 나갈때 까지 유지 |
session | 웹 세션이 생성되고 종료될 때 까지 유지 |
application | 웹의 서블릿 컨텍스와 같은 범위로 유지 |
websocket | 단일 bean definition 범위를 WebSocket의 라이프사이클까지 확장 Spring ApplicationContext의 컨텍스트에서만 유효 |
▶ 자바 기반 컨테이너 설정
- AnnotationConfigApplicationContext
- ApplicationContext 구현은 아래와 같은 애너테이션이 달린 클래스를 파라미터로 전달받음
- @Configuration 클래스
- 해당 객체가 bean definitions의 소스임을 나타내는 애너테이션
- 빈을 선언
- @bean 메서드에 대한 호출을 사용하여 bean 사이의 의존성을 정의
- @Component 클래스
- JSR-330 메타데이터(@Autiwired 또는 @Inject 같은 DI 메타데이터가 사용되는 것을 의미)
- @Configuration 클래스
- Config → Config@CGLIB : 스프링 컨테이너에 등록되어 있지 않을 때에만 필요한 빈을 생성하고 스프링 컨테이너에 등록
- 자바 코드에서 애너테이션을 사용해 Spring 컨테이너를 구성하는 방법
▶Component 스캔
- 설정 파일에서 빈들을 직접 작성하지 않아도 됨
- @ComponentScan: @Component가 붙은 모든 클래스를 스프링 빈으로 등록해줌, 설정 정보에 붙임
- @Autowired : 의존관계 자동으로 주입
- 기존에 작성한 AppConfig가 있다면 정상적으로 작동하지 않음
- DependencyConfig 등 @Configuration 설정이 된 파일이 있을 시
- 코드 추가 : @ComponentScan(excludeFilters = @Filter(type = FilterType.ANNOTATION, classes = Configuration.class))
'부트캠프 기록 > Serction2' 카테고리의 다른 글
부트캠프 2달차 KPT 회고 (0) | 2022.10.19 |
---|---|
[Spring Core] (1) | 2022.10.15 |
MySQL 설치 오류: installer 중단 (0) | 2022.10.08 |
MySQL 실행 오류: Could not acquire management access for administration, MySQL 서비스가 로컬 컴퓨터에서 시작했다가 중지되었습니다. (0) | 2022.10.08 |
[데이터베이스] 이상현상과 정규화 (1) | 2022.10.08 |