HINT | · 클라이언트 요청 데이터를 담고 있는 InputStream을 생성자로 받아 HTTP 메서드, URL, 헤더, 본문을 분리하는 작업을 한다. · 헤더는 Map<String, String>에 저장해 관리하고 getHeader("필드 이름") 메서드를 통해 접근 가능하도록 구현한다. · GET과 POST 메서드에 따라 전달되는 인자를 Map<String, String>에 저장해 관리하고 getParameter("인자 이름") 메서드를 통해 접근 가능하도록 구현한다. |
위 요구사항을 구현하기 위해 새로운 클래스를 만들어 구현할 때 테스트 코드를 기반으로 개발할 수 있다. 먼저 src/test/resources 디렉토리에 Http_GET.txt라는 이름으로 요청 데이터를 담고 있는 테스트 파일을 추가한다.
- src/test/resources/Http_GET.txt
GET /user/create?userId=javajigi&password=password&name=JaeSung HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Accept: */*
(빈 문자열)
Http_GET.txt 파일의 마지막 라인에 빈 공백 문자열을 포함해야 한다. 이 파일을 활용한 테스트 코드는 다음과 같다.
- src/test/java/http/HttpRequestTest.java
package http;
import static org.junit.Assert.*;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import org.junit.Test;
public class HttpRequestTest {
private String testDirectory = "./src/test/resources/";
@Test
public void request_GET() throws Exception {
InputStream in = new FileInputStream(new File(testDirectory + "Http_GET.txt"));
HttpRequest request = new HttpRequest(in);
assertEquals("GET", request.getMethod());
assertEquals("/user/create", request.getPath());
assertEquals("keep-alive", request.getHeader("Connection"));
assertEquals("javajigi", request.getParameter("userId"));
}
}
테스트를 위한 HTTP 요청 데이터를 텍스트 파일에 생성한 후 FileInputStream으로 읽은 후 이 InputStream을 새로 생성한 HttpRequest 클래스의 생성자로 전달하는 방식으로 테스트할 수 있다. GET에 대한 테스트 뿐만 아니라 POST에 대한 테스트 데이터(Http_POST.txt)를 추가해 테스트할 수 있다.
- src/test/resources/Http_POST.txt
POST /user/create HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Content-Length: 46
Content-Type: application/x-www-form-urlencoded
Accept: */*
userId=javajigi&password=password&name=JaeSung
Http_POST.txt 테스트 데이터에 대한 테스트 코드는 다음과 같다.
- src/test/java/http/HttpRequestTest.java
package http;
import static org.junit.Assert.*;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import org.junit.Test;
public class HttpRequestTest {
private String testDirectory = "./src/test/resources/";
...
@Test
public void request_POST() throws Exception {
InputStream in = new FileInputStream(new File(testDirectory + "Http_POST.txt"));
HttpRequest request = new HttpRequest(in);
assertEquals("POST", request.getMethod());
assertEquals("/user/create", request.getPath());
assertEquals("keep-alive", request.getHeader("Connection"));
assertEquals("javajigi", request.getParameter("userId"));
}
}
GET과 POST에 대한 테스트 코드를 만족하는 HttpRequest 코드를 구현하면 된다.
테스트 데이터를 위해 파일을 만들고 InputStream을 생성하는 과정이 번거롭게 느껴진다면, 이 같은 과정을 생략한 후 String으로 문자열을 전달해 테스트할 수 있는 방법에 대해서도 고민해보기 바란다.
참고도서 : https://roadbook.co.kr/169
[신간안내] 자바 웹 프로그래밍 Next Step
● 저자: 박재성 ● 페이지: 480 ● 판형: 사륙배변형(172*225) ● 도수: 1도 ● 정가: 30,000원 ● 발행일: 2016년 9월 19일 ● ISBN: 978-89-97924-24-0 93000 [강컴] [교보] [반디] [알라딘] [예스24] [인터파크] [샘
roadbook.co.kr
'교재 실습 > 자바 웹 프로그래밍 Next Step' 카테고리의 다른 글
5.1.2.3 다형성을 활용해 클라이언트 요청 URL에 대한 분기 처리를 제거한다 (5) | 2025.03.18 |
---|---|
5.1.2.2 응답 데이터를 처리하는 로직을 별도의 클래스로 분리한다(HttpResponse) (4) | 2025.03.17 |
5.1.1 리팩토링 할 부분 찾기 (3) | 2025.03.15 |
5장 웹 서버 리팩토링, 서블릿 컨테이너와 서블릿의 관계 (2) | 2025.03.14 |
4.3.2 네트워크 (2) | 2025.03.13 |
댓글