2023-01-05

Sean Kim·2023년 1월 5일
0

TIL

목록 보기
7/17

http.NewRequest vs httptest.NewRequest

  • http.NewRequest 는 문제가 생기면 에러를 반환
  • httptest.NewRequest 는 문제가 생기면 패닉

클라이언트가 응답을 받아들이는 방식

  • 클라이언트는 먼저 상태코드를 받고, 그 다음에 Response body 를 받아들인다.
  • go의 net/http 에서는 ReposeWriter에서 먼저 response body 를 쓰면, 응답 상태가 200이라고 가정하고 의도적으로 보내고자 하는 시점보다 먼저 클라이언트에 response body 를 보내버리게 된다. (다른 언어의 웹 프레임워크도 이런식으로 동작한다는 법칙은 없다)
  • 예시
    func TestHandlerWriteHeader(t *testing.T) {  
      handler := func(w http.ResponseWriter, r *http.Request) {  
         // 먼저 response body 를 쓰고  
         // 나중에 헤더를 쓰는 핸들러  
         _, _ = w.Write([]byte("Bad Request"))  
         w.WriteHeader(http.StatusBadRequest)  
      }  
      r := httptest.NewRequest(http.MethodGet, "http://test", nil)  
      w := httptest.NewRecorder()                      // 얘는 http.ResponseWriter 의 구현체  
      handler(w, r)                                    // r 요청이 들어왔을때 handler 를 거쳐 w가 어떻게 작성되는지 보자  
      t.Logf("Response status: %q", w.Result().Status) // BadRequest가 안써져 있어야 정상  
     
      handler = func(w http.ResponseWriter, r *http.Request) {  
         w.WriteHeader(http.StatusBadRequest)  
         _, _ = w.Write([]byte("Bad Request"))  
      }  
     
      r = httptest.NewRequest(http.MethodGet, "http://test", nil)  
      w = httptest.NewRecorder()  
      handler(w, r)  
      t.Logf("Response status: %q", w.Result().Status)  
    }
    === RUN   TestHandlerWriteHeader
       first_write_body_test.go:19: Response status: "200 OK"
       first_write_body_test.go:29: Response status: "400 Bad Request"
  • net/http 의 ResponseWriter 구현체... -> 이렇게 헤더가 비어있으면 지맘대로 200 응답을 써버린다.

DI 는 IoC를 위한 수단인가..?

  • 특정 컴포넌트는 그것이 의존하는 것들에 대한 생명주기를 제어하면 안된다. 그것은 역으로 제어되어야 한다....... 가 의존성 역전
  • 그걸 하기 위해서 외부에서 의존하는 것들을 주입해주는게 DI
  • 맞나..
profile
이것저것 해보고있습니다.

0개의 댓글