일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- hibernate
- 링커
- gradle
- 클린코드
- lambda
- 자바
- AutoConfiguration
- 컴퓨터시스템
- Immutable
- 링킹
- exception
- java
- Kotlin for Java Developers
- 토비의스프링3.1
- DispatcherServlet
- ApplicationContext
- Spring
- IOC
- String
- 메이븐
- 토비의스프링
- springwebmvc
- 프록시
- ORM
- beanfactory
- 빌드툴
- DesignPattern
- JPA
- springboot
- FunctionalInterfaces
- Today
- Total
엔지니어로 가는 길
웹 환경에서 스프링 애플리케이션의 동작 방식 본문
웹 환경에서 스프링 애플리케이션의 동작 방식
스프링 웹 애플리케이션도 결국 스프링 애플리케이션이므로 빈을 생성하고 관리해줄 IoC 컨테이너가 필요하다. 이때 사용되는 IoC 컨테이너가 바로 WebApplicationContext로, 이름 그대로 웹 환경에서 사용할 때 필요한 기능이 추가된 ApplicationContext이다.
웹 환경에서 스프링 애플리케이션의 동작 방식을 이해하려면, 우선 일반적인 스프링 애플리케이션의 동작 방식을 이해해야 한다. 일반적인 스프링 애플리케이션은 IoC 컨테이너가 빈 설정 메타 정보를 이용해서 빈 객체들을 만들고 DI(의존성 주입)를 수행한 후에 최초로 애플리케이션을 기동할 빈 하나를 제공해줌으로써 (마치 자바 애플리케이션에서 main() 메소드를 호출하듯) 동작한다.
또 알아두어야 할 게 있다. 바로 웹 애플리케이션의 동작 방식이다. 웹 애플리케이션의 경우 일반적인 애플리케이션(테스트 또는 독립형 자바 애플리케이션)과 동작하는 방식이 근본적으로 다르다. 독립 자바 프로그램과 달리 자바 VM에게 main() 메소드를 호출할 방법이 없을 뿐만 아니라 사용자도 여럿이며 동시에 웹 애플리케이션을 사용한다. 그래서 웹 환경에서는 main() 메소드 대신 서블릿 컨테이너가 브라우저로부터 오는 HTTP 요청을 받아서 해당 요청에 매핑되어 있는 서블릿을 실행해주는 방식으로 동작한다. 서블릿이 일종의 main() 메소드와 같은 역할을 하는 셈이다.
앞의 두 가지를 이해했다면 웹 환경에서 스프링 애플리케이션이 어떻게 동작하는지를 보다 수월하게 이해할 수 있다. 일단 main() 메소드 역할을 하는 서블릿을 만들어두고, 미리 WebApplicationContext를 생성해둔 다음, WebApplicationContext에게 빈 객체로 구성된 애플리케이션의 기동 역할(main() 역할)을 해줄 빈을 요청해서 받아둔다. 그리고 미리 지정된 메소드를 호출함으로써 애플리케이션의 기능이 시작되는 것이다. (이후에는 요청이 서블릿으로 들어올 때마다 getBean()으로 필요한 빈을 가져와 정해진 메소드를 실행한다. 스프링은 웹 환경에서 ApplicationContext을 생성하고 설정 메타 정보로 초기화해주고, 클라이언트로부터 들어오는 요청마다 적절한 빈을 찾아서 이를 실행해주는 기능을 가진 DispatcherServlet이라는 이름의 서블릿을 제공한다.)
보너스로 WebApplicationContext의 특징도 알아보자. WebApplicationContext는 자신이 만들어지고 동작하는 환경인 웹 모듈에 대한 정보에 접근할 수 있다. 이를 이용해 웹 환경으로부터 필요한 정보를 가져오거나, 웹 환경에 스프링 컨테이너 자신을 노출할 수 있다. (쉽게 말해 WebApplicationContext에서 ServletContext를 참조할 수 있다는 말이다.)
'프로그래밍 > Spring' 카테고리의 다른 글
@WebMvcTest 테스트에서 Formatter가 동작하지 않는 이유 (0) | 2020.09.17 |
---|---|
@ModelAttribute도 Formatter가 필요할까 (0) | 2020.08.25 |
스프링 애플리케이션의 동작 방식 (0) | 2020.07.06 |
스프링의 IoC 컨테이너: BeanFactory와 ApplicationContext (0) | 2020.04.17 |
스프링 프레임워크란 (0) | 2020.04.14 |