ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • java-was mission(controller 분리)
    TIL 2021. 3. 30. 15:05

    바뀐 점은 다음과 같다.

    * 컨트롤러를 분리(다형성을 이용)

    * response작성

     

     

     

    HttpResponse.class

    forward와 redirect를 정의했다.

    forward는 헤더와 바디를 담아서 보내고 redirect는 헤더의 정보만 보낸다.

     

    redirect 하면 브라우저는 다시  index.html 요청을 보내서 webapp 밑으로 들어가게 된다.

    헤더 정보는 response를 사용할 때 따로 넣어준다. 요청에 따라 다른 헤더 정보가 필요하니까.

     

    forward요청은 서버에서 request의 url을 읽어 응답을 만들어 줘야 한다. url의 끝이 css인지를 판단해 css면 contentType을 css로 해서 넘겨준다. html은 html로.

    content-length는  file로 읽은 body의 length를 보내준다. 

     

    마지막엔 processHeaders()를 호출하여 헤더를 만들어 주고 forward에 경우는 responseBody를 최종적으로 호출해 줘서 flush 해준다.

     

    ex) 로그인 시에는 setCookie를 담아서 보낸다.

     

    ControllerDiagram

    컨트롤러는 다형성을 사용하기 위해 다음과 같이 설계했다.

    따로 get이나 post를 구분하지는 않는다. 

    post로 요청이 오면 context-length가 있는지 확인하고 바디를 읽는다.(쿼리 스트링 형태로 바디가 와야지만 읽는다.)

     

    LoginController.class

    로그인 컨트롤러 부분이다. 

    리퀘스트를 받아서 검증을 진행하고 리스폰스로 쿠키를 담아서 보낸다.

     

     

    WebServer.class

    webserver.class에서 디스패처 서블릿의 역할을 하는 controllerMap을 정의했다.

    ControllerKey는 equals와 hashCode를 재정의해서 단일성을 보장했다.

    그렇기 때문에 handler에서 request의 method와 url을 통해 map에서 get을 해서 controller를 찾을 수 있다.

    defaultController는 우리가 정의한 controller 이외의 요청을 처리하기 위해서 정의했다.

     

    RequestHandler.class

     

    RequestHandler는 inputStream을 통해서 request를 얻어서 header와 body(post일 경우)에 저장한다.

    outputStream을 통해 httpResponse를 만든다. 생성자에 넘겨주는 이유는  response 내부에서 정의한 redirect나 forward에서 바로 응답으로 넘겨주기 위해서 outputStream을 갖는다.

     

    ControllerKey를 얻기 위해서 request의 method와 url을 사용한다. 동일성을 보장하기에 

    map의 키로 사용할 수 있다.

    value로 나온 컨트롤러의 service를 호출하면 이제 handler의 일은 끝난다.

     

    'TIL' 카테고리의 다른 글

    2021.04.01 기록장  (0) 2021.03.31
    2021.03.31 기록장  (0) 2021.03.30
    2021.03.30 기록장  (0) 2021.03.29
    java-was mission  (0) 2021.03.29
    2021.03.29 기록장  (0) 2021.03.28

    댓글

Designed by Tistory.