2019년 1월 25일 금요일

jQuery.ajax 파라미터 설명.

http://api.jquery.com/jquery.ajax/
write less, do more.

jQuery.ajax()는 비동기 HTTP 요청을 수행할 때 쓴다.

jQuery.ajax(url [, settings])의 실로 간단한 함수 표기지만 settings에 들어갈 수 있는 내용이 꽤나 복잡하다. 표기대로 모든 세팅 항목은 선택사항이고, 디폴트 설정은 $.ajaxSetup()을 이용해 지정할 수 있다.

1. accepts: 응답받고 싶은 형식을 서버에게 알려주는데 쓰인다. text/* 라면 텍스트 형식이면 어떤 것이든 괜찮다는 의미로 서버에게 전달되는 것이다.

2. async: 기본값은 true이고, false로 바꾸는 경우 동기 요청이 된다. 동기 요청인 경우 서버로부터 응답이 오기까지 브라우저가 락된다는 의미가 된다. dataType이 jsonp이거나 크로스-도메인 요청인 경우 false로 세팅할 수 없다.

3. beforeSend: ajax 요청 전에 필요한 동작을 지정할 수 있다.

4. cache: 캐쉬 옵션. false인 경우 요청 페이지가 브라우저에 의해 캐시되지 않도록 한다.

5. complete: 요청이 완전히 끝난 다음에 호출된다. (success, error 콜백 이후에.)

6. contents: jQuery가 응답을 어떻게 파싱할 것인지에 대한 방법을 결정해주는 설정. (잘 모르겠음.)

7. contentType: 서버에게 전달할 때 알려주는 데이터 형식. 기본값은 'application/x-www-form-urlencoded; charset=UTF-8'.  false 값을 지정하는 경우엔 jQuery에게 컨텐트 유형 헤더를 설정하지 말라는 의미가 된다.

9. context: ajax 관련 콜백의 컨텍스트를 지정한다.

10. converters: 특정 데이터 형식에 대한 converter를 지정해줄 수 있다.

11. crossDomain: 크로스-도메인 요청 (such as JSONP)을 같은 도메인에서 강제로 호출하고 싶은 경우 true 값을 준다.

* JSONP: JSON with Padding. 다른 도메인으로부터 데이터를 가져오고 싶은 경우 사용하게 되는 편법. cross-domain 이슈를 회피하기 위해 json 형식의 데이터를 script 요소로 감싸 실행시키는 것처럼 하여 데이터를 가져오는 기법.

12. data: 서버로 전달할 데이터. 데이터가 query string 형태로 변환되는 것을 원하지 않으면 processData를 false로 설정해주어야 한다.

13. dataFilter: XMLHttpRequest의 raw 응답 데이터를 핸들링하기 위한 함수를 지정할 수 있다.

14. dataType: 서버의 응답으로부터 예상되는 데이터 형식. 기본적으론 jQuery가 추측해준다.

15. error: 요청이 실패했을 때의 콜백.

16. global: 잘 모르겠다.

17. headers: XMLHttpRequest 전송을 사용하여 요청과 함께 전송할 추가 key/value 쌍.

18. ifModified: 잘 모르겠다.

19. isLocal: 현재 환경을 '로컬'로 인식하도록 할 수 있다.

20. jsonp: JSONP 요청에서 쿼리 스트링 'callback='의 'callback' 대신 사용할 이름을 오버라이딩 한다.

21. jsonpCallback: JSONP 요청의 콜백 함수 이름을 지정한다.

22. method: GET, POST, PUT, ..

23. mimeType: XMLHttpRequest mime type을 재정의한다.

* MIME: Multipurpose Internet Mail Extentions. 전송된 문서의 형식을 알려주기 위한 메커니즘. type/subtype의 구조로 '/'로 구분해 type과 subtype으로 나뉜다. 공백은 허용되지 않고, 소문자로 쓰는것이 관례. type은 개별 타입과 멀티파트 타입으로 구분된다.
개별 타입은 text, image, audio, video, 마지막으로 이진 데이터 형식의 application으로 구분된다. 특정 subtype이 없는 텍스트엔 text/plain이 쓰이고, 특정 subtype이 없는 이진 데이터엔 application/octet-stream이 쓰인다.
멀티파트 타입은 multipart/form-data, multipart/byteranges로 구분되는데 multipart/form-data는 브라우저에서 서버로 HTML Form의 내용을 전송할 때 쓰인다.

24. password: HTTP 엑세스 인증 요청에 대한 응답으로 XMLHttpRequest와 함께 사용할 암호.

25. processdata: object 형식의 데이터가 전달될 때 쿼리 스트링으로 변환할 것인지 여부를 지정한다.

26. scriptCharset: 크로스-도메인 요청같은 것을 할 때 로컬 페이지의 charset과 원격 스크립트의 charset이 같지 않을 때 쓴다.

27. statusCode: 각종 응답 코드에 대한 동작을 지정할 수 있다.

28. success: 요청이 성공했을 때의 콜백.

29. timeout: 요청에 대한 타임 아웃을 지정할 수 있다. '0'인 경우 무한정 기다린다.

30. traditional: traditional style의 param 직렬화를 사용하고 싶은 경우에 true를 지정하면 된다.

31. type: alias for 'method'

32. url: URL

33. username: HTTP 엑세스 인증 요청에 대한 응답으로 XMLHttpRequest와 함께 사용할 사용자 이름.

34. xhr: XMLHttpRequest 객체를 만들기 위한 콜백.

35. xhrFields: 네이티브 XMLHttpRequest 객체를 설정할 field-name/field-value 쌍.


2019년 1월 2일 수요일

[Netty] IdleStateHandler - Idle 상태를 감지하는 핸들러.

https://netty.io/4.0/api/io/netty/handler/timeout/IdleStateHandler.html

IdleStateHandler는 특정 시간 동안 read, write, 또는 read/write 동작이 없을 때 이를 체크해 사용자에게 알려주는 역할을 수행한다. IdleStateHandler는 Inbound와 Outbound를 모두 처리하는 ChannelDuplexHandler를 상속받아 구현되어 있다.

보통 인스턴스를 만드는데 사용하는 생성자는 아래와 같다.
IdleStateHandler(int readerIdleTimeSeconds, int writerIdleTimeSeconds, int allIdletimeSeconds)

앞서 적혀있듯이 IdleStateHandler는 read에 대한 idle 감지, write에 대한 감지, read/write에 대한 idle 감지의 3가지 타입을 제공해주고 있다. 내부적으로는 one-shot 타이머 쓰레드가 반복적으로 송수신 메시지가 있는지 없는지를 확인해주는 방식이므로 불필요한 자원을 낭비하지 않으려면 필요없는 타입의 timeout 파라미터에 '0' 값을 전달해 해당 기능을 끄는게 좋다.

마지막으로 사용자는 IdleStateHandler가 통지하는 이벤트를 받아 처리하기 위해 ChannelDuplexHandler를 상속받아 userEventTriggered 메서드를 구현해야 한다.

온라인 API 문서엔 다음과 같은 예제가 있다.


// 60초 동안 수신하는 메시지가 없으면 MyHandler에 의해 클라이언트와의 연결을 끊는다.
// 30초 동안 송신하는 메시지가 없으면 MyHandler가 핑 메시지를 클라이언트로 전송한다.
public class MyChannelInitializer extends ChannelInitializer<Channel> {
    @Override
    public void initChannel(Channel channel) {
        channel.pipeline().addLast("idleStateHandler", new IdleStateHandler(60, 30, 0));
        channel.pipeline().addLast("myHandler", new MyHandler());
    }
}

public class MyHandler extends ChannelDuplexHandler {
    // 사용자는 userEventTriggered에서 이벤트의 상태를 읽어 필요한 동작을 지정해주면 된다.
    @Override
    public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
        if (evt instanceof IdleStateEvent) {
            IdleStateEvent e = (IdleStateEvent) evt;
            if (e.state() == IdleState.READER_IDLE) {
                ctx.close();
            } else if (e.state() == IdleState.WRITER_IDLE) {
                ctx.writeAndFlush(new PingMessage());
            }
        }
    }
}

ServerBootstrap bootstrap = ...;
...
bootstrap.childHandler(new MyChannelInitializer());
...