Form 데이터를 파싱해보자
웹 개발에서 사용자 입력을 처리하는 것은 필수적인 작업입니다.
1. application/x-www-form-urlencoded 타입
2. application/json 타입
두 MIME 타입은 HTML 폼 데이터를 서버로 전송하는 데 자주 사용되는 인코딩 방식입니다.
그 중에 application/x-www-form-urlencoded 타입을 알아 볼 겁니다.
application/x-www-form-urlencoded의 MIME 타입은 폼 데이터를 키-값 쌍으로 인코딩하며,
각 쌍은 &으로 구분되고 키와 값은 =으로되고 띄어쓰기는 +로 됩니다.
예를 들어, 사용자가 웹 폼에 이름, 나이, 도시를 입력하는 경우를 보겠습니다.
이름 : sumin Kim
나이 : 30
도시 : new York
이라고 작성한 경우, 인코딩된 URL은 아래와 같습니다.
name=sumin+Kim&age=30&city=New+York
이러한 방식의 데이터는 서버 측에서 적절히 파싱하고 처리해야 하는 중요한 정보를 담고 있습니다.
서버측에서 파싱하는 방법을 아래에 구현해보고, Junit으로 잘 파싱을 하는지 테스트 해보겠습니다.
파싱 구현
URL가정 : http://www.example.com/formSubmit?name=sumin+Kim&age=30&city=New+York
public class FormDataParsing {
public static Map<String, List<String>> parseDate(String data) {
// 쿼리스트링
// name=sumin+kim&age=30&city=New+York
Map<String, List<String>> parameters = new LinkedHashMap<>();
String[] pairs = data.split("&");
for (String pair : pairs) {
String[] nameValue = pair.split("=");
String name = URLDecoder.decode(nameValue[0], StandardCharsets.UTF_8);
String value = "";
if (nameValue.length == 2) {
value = URLDecoder.decode(nameValue[1], StandardCharsets.UTF_8);
}
parameters.computeIfAbsent(name, k -> new LinkedList<>()).add(value);
}
return parameters;
}
}
간단하게 구현을 완료해봤습니다
parameters 변수의 데이터타입을 보면 value쪽에 List<String>이죠. List로 작성한 이유 아시는분?
키값을 여러번 사용하는경우가 많기 때문입니다.
예를 들어 관심사를 여러개 선택 할 수 있는경우가 있습니다.
그럴경우에는 아래처럼 데이터가 담기게끔 해주려고 그런겁니다.
interests=reading&interests=coding&interests=travel
{
"interests": ["reading", "coding", "travel"]
}
여기까지 하고 테스트 해볼게요
테스트 - 파싱로직 검증
class FormDataParsingTest {
@Test
@DisplayName("application/x-www-form-urlencoded 폼 인코딩 형식의 데이터를 파싱해보자.")
void parseDate() {
String encodedFormData = "name=sumin+kim&age=30&city=New+York";
Map<String, List<String>> result = FormDataParsing.parseDate(encodedFormData);
assertEquals("sumin kim", result.get("name").get(0), "Name Parsing Failed.");
assertEquals("30", result.get("age").get(0), "Age Parsing Failed.");
assertEquals("New York", result.get("city").get(0), "City Parsing Failed.");
assertNotEquals("Los Angeles", result.get("city").get(0));
}
}
파싱이 잘 되는걸 볼 수 있습니다.
다음에는 application/json 파싱하는걸 해보면 되겠네요
참고자료
https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST
'자바' 카테고리의 다른 글
[자바] JSON 데이터 파싱후 JUnit5로 테스트 (json/application) (0) | 2024.02.18 |
---|---|
[자바]Java Reflection: ModelMapper를 활용한 효율적인 객체 매핑 기법 (1) | 2024.02.11 |
[자바] 레코드(Records) : 코드 간결성과 효율성을 높이는 새로운 방법 (0) | 2024.01.28 |
[자바] Try-with-resources in Java: 코드를 깔끔하게 유지하는 현대적 방법 (0) | 2024.01.21 |
[자바] 클래스 파일 구조, VM명세서 (0) | 2023.11.14 |