본문 바로가기
교재 실습/자바 웹 프로그래밍 Next Step

5.1.2.1 요청 데이터를 처리하는 로직을 별도의 클래스로 분리한다(HttpRequest)

by Jint 2025. 3. 16.
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

댓글