본문 바로가기

Local Oriented/jQuery

ajax 에서 데이타가 넘어 오지 않을 때 dataType 을 text 로 해 보심이..

.ajax 가 정상작동하지 않는 경우에는 어떤 것들이 있을까요..?

(헷갈릴 수도 있으니까 A.jsp 가 B.jsp 를 .ajax 로 호출한다고 가정하고 설명할께요.)


1. A.jsp 가 B.jsp 를 호출 할 때 파라미터를 제대로 세팅하지 못하거나,

   A.jsp 가 넘겨준 파라미터를 B.jsp 가 제대로 해석하지 못할 때


2. B.jsp 가 한글이나 공백문자의 문자셋을 제대로 다루지 못하거나,
   B.jsp 가 넘겨주는 데이타에 문제가 있을 때

3. A.jsp 가 B.jsp 에서 넘어온 데이타를 제대로 해석하지 못할 때



자.. 다시 설명을 해 보면요..


1. A.jsp 가 B.jsp 를 호출 할 때 파라미터를 제대로 세팅하지 못하거나,

   A.jsp 가 넘겨준 파라미터를 B.jsp 가 제대로 해석하지 못할 때


- .ajax 는 기본적으로 UTF-8 로 동작합니다. 그런데, A.jsp 나 B.jsp 의 특이성에 따라 약간 달라질 수 있어요.
  A.jsp 나 B.jsp 는 둘다 UTF-8 이 아니거나, 둘 중 하나만 UTF-8 일 수 있다는 거죠.
  문자가 제대로 찍히는지, 어떻게 보완을 해야 하는지 고심해야 합니다.

- A.jsp 에서 파라미터에 한글이나 공백이 들어간다면 파라미터명=escape(encodeURIComponent($('#아이디').val())) 인코딩,
  B.jsp 는 이를 받아서 URLDecoder.decode(Utils.getValue(request.getParameter("파라미터명")),"UTF-8") 디코딩.
  그런데, B.jsp 가 다시 C.jsp 를 호출해서 response 받아 오는 것이거나 redirect 하는 것이라면.. 디코딩 없이 던져 주어야져.
  (주의 form 에 .serialize() 를 사용하는 경우 encodeURIComponent($('#아이디').val()) 만 사용).
  어쨌거나 가장 좋은 방법은 호출하는 쪽이나 호출되는 쪽이나 모두 UTF-8 이면 이런 수고를 하지 않아도 된다.

- ajax 로 가져온 데이타를 decodeURIComponent() 로 디코딩해야 할 수도..

- A.jsp .ajax 에서 아래와 같이 세팅하고
  var data1 = $("form[name='...']").serialize();
  contentType : "application/json;charset=EUC-KR"
  data : data1.replace(/%/g, '%25')  // % 를 %25 로 변환하는 로직, escape() 과 동일.
  B.jsp 에서 java.net.URLDecoder.decode(request.getParameter("..."),"utf-8") 로 추출
  이때 B.jsp 의 문자셋이 EUC-KR 인 경우

* 그런데, escape() 을 해 줘야 할 때가 있고, 이걸 하면 오류가 발생하는 경우가 있어서 이것참..



2. B.jsp 가 한글이나 공백문자의 문자셋을 제대로 다루지 못하거나,
   B.jsp 가 넘겨주는 데이타에 문제가 있을 때

1과 연관된 이야기 인데,웹서버나 서블릿 엔진에 따라서는,

하나의 .jsp 안에 문자셋이 여러개가 나올 수 있는 상황에서 에러가 날 수 있어요.

이클립스에서 경고를 해 주거나, 런타임에서 웹브라우저에 찍힐 수도 있는데..

이를 알아채지 못할 수도 있어서 참 애 먹게 됩니다.. ㅠ.



3. A.jsp 가 B.jsp 에서 넘어온 데이타를 제대로 해석하지 못할 때

사실, 오늘 얘기하려고 하는 것이 바로 이것입니다.

B.jsp 가 A.jsp 에 xml 로 넘겨주는 데이타가 있는데,

A.jsp 에서 dataType 을 'xml' 로 해 놓아도 데이타가 제대로 넘어오지 않을 때가 있더라구요.

B.jsp 가 호출될 때의 파라미터를 제대로 세팅하여 웹브라우저의 주소창에 입력하면 제대로 나오는데,

웹서버에 따라서 약간 다를 수도 있는 모양입니다.

이 때 dataType 을 'text' 로 바꾸면 데이타가 잘 넘어오고, 사용도 xml 과 동일하게 할 수 있어요.

참, 황당한 상황입니다. ㅠ.


그리고 .ajax 는 get 방식으로 데이타를 받아오기 때문에 4 KB 가 넘는 데이타는,

중간에 끊겨서 A.jsp 으로 넘어오면 파싱 오류가 나서 제대로 작동하지 않을 수도 있어요.

A.jsp 에 기술하는 type 이 'post' 이냐 'get' 이냐는 B.jsp 에 데이타가 전달되는 방식일 뿐이고,

B.jsp 를 통해 불러오는 데이타는 항상 get 방식으로 넘나들기 때문에 4 KB 를 넘길 수가 없어요.

그러니까, 목록 데이타를 받아 올 때는 한 번에 넘어오는 건수를 조정해야 할 필요가 있습니다.

B.jsp 를 xml 로 만들기 보다는 jsonp 로 만드는 것이 넘어오는 데이타 사이즈를 경량화 할 수가 있겠네요.


.Fine.