본문 바로가기
Java

[Java] 요청 데이터 처리 로직을 HttpRequest 클래스로 분리 및 리팩토링

by bkuk 2023. 3. 19.

클라이언트의 요청 데이터를 처리하는 로직을 별도의 클래스로 분리

  • 클라이언트의 요청 데이터를 담고 있는 InputStream을 생성자로 받아 HTTP 메서드, URL, 헤더, 본문을 분리
  • Http Header는 Map<String, String>에 저장해 관리하고, getHeader( String key ) 메서드를 통해 접근 가능
  • GET과 POST 메서드에 따라 전달되는 인자를 Map<String, String>에 저장해 관리하고, getParameter( String key ) 메서드를 통해 접근 가능하도록 구현
public class HttpRequest {
	private static final Logger log = LoggerFactory.getLogger(HttpRequest.class);
	private Map<String, String> httpHeader = new HashMap<>();
	private Map<String, String> httpParameter = new HashMap<>();
	private String method;
	private String path;
	
	public HttpRequest( InputStream in ) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(in, "UTF-8"));
    	String line = br.readLine();
    	
    	String[] tokens = line.split(" ");
    	this.method = tokens[0];
    	
    	while( (line = br.readLine()) != null ) {
    		
    		if( line.equals("")) {
    			break;
    		}
    		
    		String[] header = line.split(": ");
    		httpHeader.put(header[0], header[1]);
    	}
    	
    	if( this.method.equals("GET")) {
    		String[] url = tokens[1].split("\\?");
    		this.path = url[0];
    		httpParameter = HttpRequestUtils.parseQueryString(url[1]);
    		
    	} else if(this.method.equals("POST")) {
    		this.path = tokens[1];
            String requestBody = IOUtils.readData(br, Integer.parseInt(httpHeader.get("Content-Length")));
            httpParameter = HttpRequestUtils.parseQueryString(requestBody);
    	}
	}
	public String getMethod() {
		return method;
	}
	public String getPath() {
		return path;
	}
	public String getHeader(String key) {
		return httpHeader.get(key);
	}
	public String getParameter(String key) {
		return httpParameter.get(key);
	}

 

테스트 코드

  • GET/POST 요청 데이터를 담고 있는 텍스트 파일 생성
  • JUnit test case 클래스 생성

Http.GET.txt

GET /user/create?userId=javajigi&password=password&name=JaeSung HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Accept: */*

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

HttpRequestTest.java

package http;

import static org.junit.Assert.assertEquals;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;

import org.junit.Test;

public class HttpRequestTest {
	private String testDirectory = "./src/test/java/";
			
	@Test
	public void Get_HttpRequest() 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("javajigi", request.getParameter("userId") );
		assertEquals("localhost:8080", request.getHeader("Host"));
		assertEquals("keep-alive", request.getHeader("Connection"));
	}
	
	@Test
	public void Post_HttpRequest() 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("javajigi", request.getParameter("userId") );
		assertEquals("localhost:8080", request.getHeader("Host"));
		assertEquals("keep-alive", request.getHeader("Connection"));
	}
	
}

댓글