보내는 데이터가 어떤 형식으로 가고 있는지 확인 (Request 헤더)
예전 글을 읽을 때 마다 드는 생각이 더럽게 글 못 쓴다는 것이다. 그래서 핵심이 뭐냐고 내가 써놓고 내가 이해 못하고 있는 걸 보면 정말 자괴감이 든다.
정리 -
* 보내는 데이터는 content-type이 데이터의 형식과 charset을 지정한다.
* 일반적으로 application/x-www-form-urlencoded; charset=utf-8 로 지정한다. charset이 다르면 다른 것을 설정한다.
1. Spring의 RestTemplate이든 jQuery의 aJax이든 크롬 브라우저이든 http client가 request를 구성해야 한다.
2. 이 request를 구성할 때 중요한 부분 중 하나가 아래 두 가지 이다.
2-1 어떤 형식의 data를 보낼 것인지 - json, xml, form, binary 등 -> content-type
2-2 어떤 encoding을 사용할 것인지 - utf8, euc-kr 등 -> charset
3. 실제로는 3가지 인데,
3-1 어떤 형식의 데이터를 보낼 것인지, json? xml?
3-2 이 데이터를 어떤 encoding으로 보낼 것인지, utf8? euc-kr?
3-3 프로그램 소스에서 data로 전달할 정보의 encoding을 request의 charset에 맞춰줘야 한다.
3-3-1 xml marshalling에서 encoding을 진행하는 하거나 데이터 변환 클래스를 이용하여 변환한다.
3-3-2 Java는 unicode를 사용하므로 utf8을 웹에서 사용한다면 특별히 변환할 필요는 없다.
4. 문제는 request를 보낼 때, 보내는 쪽에서는 데이터가 어떻게 나가는지 알 수가 없다.
4-0 보이는 것은 전부 보내기 전의 decoding된 정보 일 뿐이다.
4-1 이것은 간단하게 node 서버를 만들어 찍어볼 수 있다. 그냥 express 서버 만들어서 찍으면 된다.
5. 하고 싶은 말은
5-1 request header의 content-type이 가장 중요하다. 이것을 정확하게 설정해 주고 다른 것들을 맞추면 된다.
5-2 대부분의 경우 거의 대부분의 경우는 json, xml 같은 거 상관없이
5-2-1 content-type이 application/x-www-form-urlencoded; charset=utf-8 이거면 된다.
5-3 받는 쪽에서 utf8을 사용한다고 하고 xml을 받는다라고 하면 그냥
5-3-1 application/x-www-form-urlencoded; charset=utf-8 보내면 된다.
5-3-2 application/x-www-form-urlencoded 여기에 그냥 모든 데이터를 실어서 보내면 된다.
5-3-3 json, xml은 이렇게 변환되어 보내진 정보를 받은 후에 다시 원래 형식으로 만들 때에 고려할 부분이다.
5-3-4 express에서는 json형식을 받는다면 아래의 middleware를 모두 사용해야 한다는 의미가 된다.
5-3-4-1 express.urlencoded는 application/x-www-form-urlencoded를 해석하고
5-3-4-2 express.json()은 내부의 json형식의 데이터를 복원한다.
5-3-4-3 node에서는 xml의 경우는 string으로 받아서 json형식으로 변환하는 library를 필요로 한다.
app.use(express.json())
app.use(express.urlencoded({ extended: true }))
5-3-4 (x-www-form-urlencoded : (json: data)) 이렇 형식이라고 생각하면 된다.
5-4 encoding도 중요한 부분인데 content-type에 charset에 정확하게 명시하는 것으로 충분하다.
5-4-1 아무리 프로그램 소스에서 charset를 가지고 노력해도 결국 보내는 형식을 지정하는 것은 content-type이다.
5-4-2 content-type에 지정된 charset 형식을 따라 data를 변환하는 것이 프로그램에서 할 부분이다.