일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 순서 보장
- 룸북
- 다른사람 프로젝트 수정전 가져야할 자세
- 시퀀스 조회
- 타임리프
- #{..}
- 자바스크립트 인라인
- 설정
- 타임리프와 스프링
- it
- js
- Test 룸북 사용하기
- 프로젝트 클린
- 하모니카 OS 5
- linux
- StringUtils.hasText
- select
- 추천 프로그램
- 명령어
- JSON
- 리눅스
- 개발시작전 자세
- Intellij
- 함수 인자값 id
- cmd
- BindingResult
- 비밀번호 변경 명령어
- Java
- 추천 사이트
- 스프링부트
- Today
- Total
웹개발 블로그
[SpringBoot] DispatcherServlet 본문
[스프링 컨테이너]
- DispatchServlet에 의해 생성되어지는 수 많은 객체들은 어디에서 관리될까??
스프링은 아파치만 사용해서 동작할 수 없어 톰캣이 필요해
web.xml에 의해서 스프링 내부로 접근하기 위한 흐름을 보자🔽
request -> web.xml -> DispatchServlet (컴포넌트 스캔을 함)
DispatchServlet 란? FronController 패턴 + ReqeustDispatch 결합
ㄴ ❤️목적 : 주소 분배
ㄴ 분배를 하려면 메모리에 떠 있어야겠지?
🔽 src 소스폴더
new를 해야지 메모리에 뜨게 되는데 스프링에 Ioc 알지? new 안해도 스프링이 빈을 생성해서 관리해줘
스프링은 IoC 핵심 기능으로
패키지를 전부 뒤져서 필요한 자바 파일들을
HEAP메모리에 올린다.
이게 바로 컴포넌트 스캔이야
근데 뭐가 필요한지 안 필요한지 어떻게 알아??
@Controller
@RestController
@Configuration
@Repository
@Service
@Component
어노테이션을 보고 메모리에 띄운다.(어떤 어노테이션을 붙여야 IoC가 가능한지도 알아야겠지)
- 스프링이 특정 목적을 위해 제공하는 어노테이션이다.
ㄴ 우리는 이 어노테이션에 특징을 알아야한다.
ㄴ 우리가 만들수도 있어 ex) @Hello
근데 web.xml 에서 DispatchServlet을 실행하기전에 하는 행동이 ContextLoaderListener야
서블릿이 만들어지면 스레드가 생성되는데
(쓰레드는 독립적이라 영향을 받지 않음, 충돌 날 일이 없)
사실 이렇게 관리하는 것 보다
DataBaseConnection <-- 이런 공통적으로 사용하는 내용은
root-ApplicationContext 파일에 넣어둔다.
ContextLoaderListener가
root-ApplicationContext파일을 읽는다.
쓰레드마다 따로 관리하는 애들 말고
공통적으로 관리하는 애들을 메모리에 띄워주고
Ioc가 관리해준다.
첫째, ApplicationContext란?
- 수 많은 객체들이 ApplicationContext에 등록된다. 이것을 loC라고 한다.
- loC란 제어의 역전을 의미한다.
- 개발자가 직접 new를 통해 객체를 생성하게 된다면 해당 객체를 가르키는 레퍼런스 변수를 관리하기 어렵다.
- 그래서 스프링이 직접 해당 객체를 관리한다
- 이때 우리는 주소를 몰라도 된다.
- 왜냐하면 필요할 때 DI하면 되기 때문이다.
- DI를 의존성 주입이라고 한다.
- 필요한 곳에서 ApplicationContext에 접근하여 필요한 객체를 가져올 수 있다.
- ApplicationContext는 싱글톤으로 관리되기 때문에 어디에서 접근하든 동일한 객체라는 것을 보장해준다.
ApplicationContext의 종류에는 두가지가 있는다
ㄴ root-applicationContext( root는 말그대로 최상단이지? )
ㄴ servlet-applicationContext ( servlet은 웹만 바라봐 )
servlet-applicationContext는 ViewResover, Interceptor, MultipartResolver 객체를 생성하고
웹과 관련된 어노테이션 Controller, RestController를 스캔한다.
--> 해당 파일은 DispatcherServlet에 의해 실행된다.
root-applicationContext
ㄴ 한번만 생성되면 돼
ㄴ 해당 어노테이션을 제외한 어노테이션 Service, Repository등을 스캔하고 DB관련 객체를 생성한다.
(스캔이란 : 메모리에 로딩한다는 뜻)
ㄴ 해당 파일은 ContextLoaderListener에 의해 실행된다.
ㄴ ContextLoaderListener를 실행해주는 녀석은 web.xml이기 때문에 root-applicationContext는 servlet-applicationContext보다 먼저 로드 된다.
당연히 servlet-ApplicationContext에서는 root-ApplicationContext가 로드한 객체를 참조할 수 있지만
그 반대는 불가능하다.(생성 시점이 다르기 때문이다)
둘째, Bean Factory란?
필요한 객체를 Bean Factory에 등록할 수도 있다. 여기에 등록하면 초기에 메모리에 로드되지 않고 필요할 때
getBean()이라는 메소드를 통하여 호출하여 메모리에 로드할 수 있다. 이것 또한 loC이다.
그리고 필요할 때 DI하여 사용할 수 있다.
ApplicationContext와 다른 점은 Bean Factory에 로드되는 개체들은 미리 로드되지 않고
필요할 때 호출하여 로드하기 때문에 lazy-loading이 된다는 점.(게으른)
학습 페이지
www.inflearn.com
'◆ SPRING BOOT > 정리' 카테고리의 다른 글
[SpringBoot] 소켓, HTTP (0) | 2023.02.14 |
---|---|
[SpringBoot] Handler Mapping, 응답 그리고 마지막 전체적인 맥락(스프링 프레임워크) (0) | 2023.02.14 |
[SpringBoot] FrontController 패턴 , RequestDispatcher (0) | 2023.02.14 |
web.xml (0) | 2023.02.12 |
ORM (0) | 2023.02.12 |