1. 개요
- 스프링은 클래스에서 객체를 생성하고, 객체들의 의존성 관리도 내부에서 해결함
- 스프링에서 관리되는 객체를
빈(Bean)
이라 부름- 이
빈(Bean)
에 대한 설정을 xml과 java를 이용해 처리할 수 있다
- 이
- xml 설정 파일을 이용한 의존성 주입
- 프로젝트의 src 폴더 내에 있는
root-context.xml
이 스프링 프레임워크에서 관리해야하는 객체를 설정하는 파일이다 - 여기서 객체란 스프링에서는
빈(Bean)
이라고 표현
- 프로젝트의 src 폴더 내에 있는
- java 설정을 이용한 의존성 주입
- Java설정 이용시,
root-context.xml
을 대체하는 것은RootConfig
클래스 - XML로 설정된 내용은,
RootConfig
에서@ComponentScan
어노테이션을 사용해 처리할 수 있다
- Java설정 이용시,
2. 스프링이 동작하면 생기는 일
- Spring의 컨텍스트 생성
- 스프링 프레임워크가 시작되면, 스프링이 사용하는 메모리 영역이 할당된다. 이를
컨텍스트(Context)
라고 함 - 스프링에서는
ApplicationContext
라는 이름의 객체가 만들어짐
- 스프링 프레임워크가 시작되면, 스프링이 사용하는 메모리 영역이 할당된다. 이를
- root-context.xml 설정파일을 참조해 패키지를 스캔
- 스프링은 생성하고 관리해야하는 객체들에 대한 설정이 필요. 이에 대한 설정이
root-context.xml
설정파일. root-context.xml
에 설정되어 있는<context:component-scan>
태그의 내용을 통해 패키지를 스캔(scan)하기 시작- 비즈니스 계층의 인터페이스와 구현클래스(네이밍: ~Service, ~ServiceImpl) 작성이 완료되면, 이를 스프링 빈으로 인식시키기 위해
root-context.xml
에 @Service 어노테이션이 있는 패키지를 스캔(조사)하도록 추가하는 작업이 필요하다
- 스프링은 생성하고 관리해야하는 객체들에 대한 설정이 필요. 이에 대한 설정이
- Spring의 컨텍스트에 객체 생성
- 해당 패키지에 있는 클래스들 중, 스프링이 사용하는
@Component
어노테이션이 존재하는 클래스의 인스턴스를 생성 (객체 생성)
- 해당 패키지에 있는 클래스들 중, 스프링이 사용하는
+) Restaurant객체는 Chef 객체가 필요하다는 어노테이션(@Autowired) 설정
이 있는 경우, 스프링은 Chef객체의 레퍼런스를 Restaurant 객체에 주입함
그림자료 추가
3. Spring에서의 Context
3.1. Context의 종류
- 자바에는 Servlet(서블릿)이라는 객체가 존재
- 모든 객체는 Bean으로 관리되므로, 서블릿도 Bean이 존재한다
- 그러나 서블릿은 모두 독립적인 객체로 서로 간섭(공유)가 불가능하다는 특징이 있음
- 따라서 공통부분을 따로 떼어내 관리할 필요성을 느낌
- 그리하여 2가지의 Context로 분리
- 모든 서블릿이 공유할 수 있는 Bean들이 모인 공간
- DB와 관련된 Repositories, Services 등이 있다
Root WebApplicationContext
는ContextLoaderListener
에 의해 생성되는Root WebApplicationContext
이며, 자식 Context에서 Root Context를 참조할 수 있다
- 서블릿 각자의 Bean 들이 모인 공간
- 웹, 앱마다 한 개씩 존재한다
- 이 Context 내에 있는 Bean들은 서로 공유될 수 없음
- MVC의
Controller
가 여기에 해당한다 Servlet WebApplicationContext
는DispatcherServlet
에 의해 생성되는 자식 WebApplicationContext이며, Root Context와는 상속 개념이기에 참조가 불가하다
3.2. Java설정시 root-context.xml을 대체하는 RootConfig 클래스
- root-context.xml을 대신하는 RootConfig 클래스를 이용해
@ComponentScan
을 추가할수도 있다@Configuration @ComponentScan(basePackages="~service경로") @MapperScan(basePackages={"~mapper경로"}) public class RootConfig { ...(생략) }
추가 tip
- 스프링에서 root-context.xml은 스프링이 로딩되면서 읽어 들이는 문서이다
- 주로, 이미 만들어진 클래스들을 이용해 스프링의 빈(Bean)으로 등록할 때 사용된다
- 일반적인 상황으로는 프로젝트에 직접 작성하는 클래스들은 어노테이션을 이용하는 경우가 많고,
- 외부 jar 파일 등으로 사용하는 클래스들은 태그를 이용해 작성하는 경우가 대부분이다
참고 서적 및 블로그
- (코드로 배우는 스프링 웹 프로젝트) - 구멍가게 코딩단
- https://linked2ev.github.io/spring/2019/09/15/Spring-5-%EC%84%9C%EB%B8%94%EB%A6%BF%EA%B3%BC-%EC%8A%A4%ED%94%84%EB%A7%81%EC%97%90%EC%84%9C-Context(%EC%BB%A8%ED%85%8D%EC%8A%A4%ED%8A%B8)%EB%9E%80/
- https://docs.spring.io/spring-framework/reference/web/webmvc/mvc-servlet/context-hierarchy.html
- https://workshop-6349.tistory.com/entry/Spring-Spring-Context-%EC%84%A4%EB%AA%85