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
'자바(Java) 실무와 이론' 카테고리의 다른 글
[자바] JSON 데이터 파싱후 JUnit5로 테스트 (json/application) (0) | 2024.02.18 |
---|---|
JSON 이해하기: 개발자의 기본기 (WITH 자바예제) (0) | 2024.02.18 |
[디자인패턴-구조] 어댑터 패턴: 음악플레이어 예제를 통한 GOF 디자인 패턴의 이해 (WITH 자바) (0) | 2024.02.16 |
[디자인패턴-생성] 싱글톤 패턴: 싱글톤 인스턴스 생성의 3가지 방법 (WITH 자바) (0) | 2024.02.13 |
[디자인패턴-생성] 프로토타입 패턴: 문서 템플릿 예제를 통한 GOF 디자인 패턴의 이해 (WITH 자바) (0) | 2024.02.12 |