티스토리 뷰

코드스쿼드에 다닐 때 was를 직접 구현해보는 과제가 있었다.

그 당시 역량이 부족하여 불가능했지만, 취업 준비를 하며 학원 동기와 함께 진행해보기로 했다.

이번 미션에 해당하는 모든 글은 복습하며 동시에 작성함을 미리 말해둔다.

 

맨 첫 구현 조건은 Header의 값을 전부 가져온 뒤 요청된 url를 뽑아내 해당 html로 이동하는 것이다.

어제 실습으로 BufferedReader로 InputStream에 있는 정보를 가져올 수 있다는 것은 기억했다.

다만 여기서 고생한 것은 InputStream을 new BufferedReader에 바로 넣어야 하는지 아니면 위에 InputStreamReader를

새로 생성하여 넣어야 하는지에 대한 부분이었고, 이 부분은 각 클래스를 들어가 return Type과 파라미터 타입을 확인하여 조정하였다.

 

다음으로 할 것은 Header 첫 줄에 들어가는 요청 url을 Split으로 나눠 해당 html이 어디인지를 확인해야 한다.

TDD 연습 겸 Test 코드를 먼저 작성하였다.

테스트 방법은 간단하다.

Header 첫 줄에 들어갈 GET과 index.html 그리고 그 뒤에 있는 값을 넣고 아직 생성하지 않은 Method를 호출하여

return되는 값이 같은지 확인한다.

SplitUtil Class를 생성 후 split Method를 만들어 "/" 기준으로 배열로 받은 뒤

두 번째에 있는 url을 뽑아냈다.

그러나 테스트 결과는 실패했는데 띄어쓰기로 잘라야 하는걸 "/"로 잘라냈기 때문에 결괏값이 다르게 나왔다.

코드를 재수정 뒤 테스트한 결과 

잘 통과하였다.

 

이제 테스트가 끝났으니 코드에 적용해볼 것인데

일단 bufferedReader에서 지원해주는 readLine()을 이용하여 앞서 bufferedReader에 넣었던 InputStreamReader에 넣었던

InputStream에 대한 데이터를 읽어올 것이다.

[log를 자주 사용하긴 했지만 잘못 작성했다.]

일단 readLine으로 읽어올 데이터를 String 값으로 가지고 있고, url이라는 String 변수를 통해 경로를 가지고 있게 하였다.

그 후  log를 이용하여 결과를 볼 수 있게 한 뒤 서버를 실행시켰다.

실행해본 결과 이상하게 /는 나왔지만, 그 뒤에 값이 없다.

생각해보니 localHost:8080 만 작성하고 그 뒤에 입력을 해주지 않았기 때문이었다.

다시 원하는 경로로 갈 수 있도록 /index.html을 붙였다.

결과는 성공적이었고, 요청 값에 맞는 경로로 보내기 전 일단 readLine을 전부 읽어와야 한다.

스프링에서는 이 과정을 다 해주기 때문에 상관없지만 이건 스프링 기반의 코드가 아니다.

그러니 이런 세부적인 부분도 해야 하는데 스프링에서 Header에 있는 데이터를 가지고 있는 것처럼 알아야 해서

읽어오는 것이다.

또한, Header 아래 한 줄이 띄어진 뒤 body가 있는데 그때 띄어진 공간을 읽은 뒤 다음을 읽을 때 null값이 들어간다면

NullPointerException이 생길면 무한 루프에 빠질 수도 있으므로 중요한 부분이라 생각한다.

while문을 작성하고 null 처리를 하지 않은 상태로 진행해봤다.

그런데 뭔가 출력 결과가 이상하다.

뭔가 무척 짧고 몇몇 내용도 없다.

왜 이런가? 한참 고민하다 동기와 아는 개발자분들께 여쭤보니 bufferedReader.readLine()으로 while문을 시작했는데

아래 변수로 bufferedReader.readLine()을 한 번 더 실행하면서 두 개의readLine()이 실행돼서 그런 거였다.

bufferedReader.readLine()은 한 번에 끝까지 전부 읽어내려가는 특성 때문인 것 같다.

코드를 위에서 미리 받았던 read의 값을 확인하고 null처리까지 했다.

그 후 마지막으로 body 안에 "hi".getBytes()로 되어있던 것을 위의 코드와 같이 변경해준다.

new File 안에 "./webapp"은 경로이고 + url은 미리 뽑아둔 html이다.

이 코드 짤 때 한참 고생했는데 제대로 코드 다 짜놓고 맨 뒤에 .toPath()를 붙이지 않았던 일도 있었다.

이제 서버를 기동해보자.

이전엔 /index.html을 붙여도 hi만 나오던 창이 아래와 같이 제대로 /index.html의 내용이 나오는 걸 확인하였다.

Header의 내용도 전부 제대로 들어온 걸 확인할 수 있었다.

근데 이상하게 Thread가 하나 더 생성되며 /Favicon.ico라는게 생겼다.

이 부분은 따로 정리하기로 따로 정리하는 걸로 하겠다.

 

- 회고 -

솔직히 스프링만 쓸 때 HTTP가 어떤 식으로 동작하는지 잘 몰랐다.

Socket을 왜 쓰는지도 몰랐고 Header값도 어떻게 읽어오는지 몰랐는데

이번 기회를 통해 많이 배운 것 같다.

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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
글 보관함