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 로 리턴