Spring Overview.
자바 서버계를 정복한 서버 프레임 워크인 스프링! 어떻게 발전해 왔고 어떤 철학을 가지고 있는지, 왜 자바 생태계에서 표준이 되었는지. 우리는 이 서버 프레임워크에서 어떤 아이디어를 차용 할 수 있을까에 대한 이야기를 해보려고 합니다.
자바의 유명 서버군.
- Spring 은 웹서버 프레임워크로 시작했습니다.
- Servlet 은 기본적으로 블락킹
- 유저가 오면 유저당 쓰레드를 하나씩 할당.
- I/O 등 비동기 콜이 발생되면 유저 쓰레드를 블락
Servlet interface
void do[Method](HttpServletRequest req, HttpServletResponse resp)
void doGet(HttpServletRequest req, HttpServletResponse resp)
웹서버 기본
- 유저의 특정 요청을 처리한다.
- 라우터 + 핸들러
Spring
DispatherHandler
DispatherHandler == 라우터
handler().method(url, criteria, handler)
route().GET("/person/{id}", accept(APPLICATION_JSON), handler::getPerson)
- url, handler mapping.
- 여러가지 조건에 따라 맵핑 가능.
Handler
유저 리퀘스트를 처리해 리스판스를 작성 후 리턴
public class WebHandler {
public String getPerson(ServerRequest request) {
return "Hello"
}
}
Service
비지니스 로직을 수행
public class Service {
public String getPersonName(int id) {
return JDBC.selectName(id);
}
}
Sequence flow
sequenceDiagram
User ->>+ Servlet : GET /person/1
Servlet ->>+ DispatherHandler : Create new thread
DispatherHandler ->>+ WebHandler : handler::getPerson(req)
WebHandler ->>+ Service : getPersonName(id)
Service ->>+ DB : select id from person where..
DB -->>- Service : record
Service -->>- WebHandler : 1
WebHandler -->>- DispatherHandler : resposne.body(1)
DispatherHandler -->>- Servlet : response.body(1)
Servlet -->>- User : response.body(1) , return thread to thread pool
0. 유저가 person 1에 대해 요청
0. Servlet이 유저 request 에 new Thread 생성(or 쓰레드 풀에 요청)
0. DispatherHandler 가 유저의 요청을 보고 Webhandler 결정
0. WebHandler가 해당 요청을 특정 서비스로 요청
0. 서비스가 해당 작업을 처리
0. WebHandler 가 response 작성
0. 유저에게 response 리턴
0. Servlet 이 Thread를 Thread pool 로 리턴