티스토리 뷰

전 글의 요구사항은 GET Mapping일 때 상황이었기 때문에 Header에 body가 없었다.

이번에는 HTML의 Get을 Post로 바꾸고 회원가입이 제대로 되는 것까지 진행해볼 예정이다.

 

Http Header의 이미지를 구글에서 찾아보면 Header 부분이 진행된 뒤 한 칸 띄어진 후 body가 있는 것을 확인할 수 있다.

BufferedReader.readLine() 을 이용하여 이 부분을 우선 추출해보기로 하겠다.

맨 처음으로 한 것은 'localhost:8080/user/form.html' 에 접근하여 값을 넣고 회원가입을 눌러보았다.

그 후 콘솔 창을 확인했더니 NullPointerException이 확인되었다.

생각해보니 회원가입 버튼을 누르면 나오는 'create.html' 이 없는 상태였음을 알아차리고 간단하게 생성하였다.

대충 쓰다보니 body에 출력될 내용을 잘못 작성했다.

title은 '회원가입'으로 하였고, 회원가입이 성공하게 될 때 웹페이지엔 '회원가입에 성공하셨습니다.' 가 뜰 것이다.

위와 같이 값을 넣고 회원가입을 한 뒤의 url의 모습이다.

콘솔의 로그를 확인해보니 Header가 잘 들어온 것을 볼 수 있었지만, 문제는 경로에 입력한 데이터가 전부 들어가는 문제가 생겼다.

이것은 Get의 특성상 body가 없기 때문에 url과 함께 들어오게 된 것이다.

그리고 길이도 최대 225까지만 가능하다.

이제 'form.html'에 들어가 form 절의 Method를 post로 변경하고 실행해 보았다.

아까와는 다르게 좀 더 긴 값을 넣고 실행해보니

url은 잘 이동되었지만 'create.html' 페이지는 뜨지 않았다.

로그를 확인한 결과 post로 제대로 들어왔기 때문에 url에 값이 들어있지 않았고 다만 body의 값도 찍히지 않은 것이 확인되었다.

이 것은 Header의 부분이 끝난 뒤 한 칸 띄워진 후 body가 있는 형태를 유지하고 있는데 아마도 코드상의 조건문 때문으로 생각한다.

코드를 보면 현재 ""이 아닐 때만 실행되기 때문에 공백 이후 돌아가지 않은 걸로 추측되어 Content-Length의 값을 추출하기로 했다.

Content-Length는 값의 총 길이를 표시해주는 것이기 때문에, 이 길이에 해당하는 Line을 읽어 값을 추출하기 위해

BufferedReader.readLine()의 값을 담고 있는 read 변수의 값 안에 "Content-Length"가 있으면

String dataLength 변수에 넣게 하였다.

Test Code를 작성한 뒤 SplitUtil Class에 bodySplit이라는 Method를 만들었다.

String으로 들어온 Content-Length의 값을 보면 key와 value의 형태로 되어 있는데 콜론을 중점으로 한 칸 띄어진 것을

제거하기 위해 replaceAll을 사용한 뒤 콜론을 기준으로 잘라내 value를 가진 split[1]을 반환하게 하였다.

테스트를 확인해본 결과 원하는 결과가 나오는 것도 확인되었으니, 포비가 만들어두신 Class를 이용하여 값을 추출할 것이다.

해당 Method는 BufferedReader에 담긴 값 중 ContentLength를 찾아낸 뒤 return해주는 Method다.

앞에서 ContentLength를 찾기 위해 replaceAll과 split을 사용한 이유다. 

Request Handler Class로 돌아와 이제 코드를 적용해보자.

Post로 값을 받게 되면 불러오는 과정에서 ContentLength가 없는 경우를 대비하기 위해 Null 처리를 해주고

위에 설명한 readData Method를 이용해 befferedReader와 String 값으로 반환되는 dataLength의 값을 형변환하여 파라미터로 넣었다.

다시 실행하기 전 form.html 에서 버튼을 누를 시 create.html으로 이동하게 바꾼 뒤 제대로 화면이 떴다.

마지막으로 log로 찍었던 값도 제대로 담긴 것을 확인하는 것으로 이번 글을 마무리 하겠다.

 

- 회고 -

BufferedReader.readLine()을 사용하면 Header가 다 읽힌 뒤 body 부분도 출력될 줄 알았지만 출력되지 않는 부분이 아직 잘 모르겠다.

앞으로도 꾸준히 공부하다 보면 알 수 있을 것 같고, Java에서 제공해주는 Method를 사용하면서

오랜만에 다시 복습한 느낌도 들어 많은 공부가 되었다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
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
글 보관함