사용자 정의 객체


(1) 기존 방법


1
2
3
4
5
6
7
8
9
10
function makePerson(first, last){
    return {
        first : first,
        last : last    
    }
}
 
function personFullName(person){
    return person.first + ' ' + person.last;
}
cs



> master = makePerson("susan" , "wilson");

> persnFullName (master);


: sunsan wilson


-> 작동은 하지만 어설픈 방법이다. 전역 공간에 관련 함수가 많이 생성되기 때문. 가장 중요한 것은 객체에 함수를 붙여 놓는 것이다.




(2) 객체에 함수 추가


1
2
3
4
5
6
7
8
9
10
function Person(first, last) {
 
    return {
        first : first,
        last : last,
        fullName : function(){
            return this.first + ' ' + this.last;    
        }
    }
}
cs


> master = Person("susan" , "wilson");

> master.fullName()


: sunsan wilson



-> 여기서 this 는 함수 안쪽에 사용되어 현재 객체를 참조한다. 실제 의미하는 바는, 함수를 지정하는 것


> fullName() 


: undefined


-> 그냥 fullName 메소드를 호출하면, this는 전역에 속해 있기 때문에 undefined를 할당한다.




(3) 전역 함수 추가


1
2
3
4
5
6
7
8
9
10
11
12
13
14
function personFullName(){
    return this.first + ' ' + this.last;
}
 
 
function Person(first, last) { 
    return {
        this.first : first,
        this.last : last,
        fullName : function(){
            return this.first + ' ' + this.last;    
        }
    }
}
cs


> master = new Person("susan" , "wilson");


: new라는 키워드가 새로 추가 되었다. new는 this와 연관이 깊다. 새로운 빈 객체를 만든 다음 지정된 함수를 불러 새로운 객체를 this에 설정한다.

 'new'에 의해 불려지도록 디자인 된 함수를 construct 함수라 일컫는다. 



-> 점차 코드가 개선되고 있지만, 안에 있는 fullName에 정의된 함수를 전역에 있는 함수와 공유하는 것이 좀 더 좋은 방법일 것이다.




(4) 전역 함수와 공유


1
2
3
4
5
6
7
8
9
10
11
12
13
function personFullName(){
    return this.first + ' ' + this.last;
}
 
 
function Person(first, last) { 
    return {
        this.first : first,
        this.last : last,
        fullName : personFullName;
        }
    }
}
cs



-> 프로토타입을 추가하여 조금 더 개선이 가능하다. 프로토타입은 인스턴스된 모든 객체에서 공유할 수 있는 객체이다. 

    이것은 찾아보기 체인 (prototype chain 이라 일컫는)의 한 부분을 이룬다. 

    즉, person 객체에 설정되지 않은 속성에 접근을 시도할 때마다 javascript는 prototype에 대신 존재하는 속성이 있는지 없는지 찾아본다.




(5) 프로토타입 설정 


1
2
3
4
5
6
7
8
9
10
11
12
13
Person.Prototype.fullName = function(){
    return this.first + ' ' + this.last;
}
 
 
function Person(first, last) { 
    return {
        this.first : first,
        this.last : last,
        fullName : personFullName;
        }
    }
}
cs



프로토타입은 Javascript의 가장 강력한 도구 중에 하나이다. 프로토 타입을 통해 언제든지 객체의 속성 및 메소드를 추가 할 수 있다는 뜻이된다.





(6) 프로토타입을 통해 기존 객체에 없던 메소드 추가


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Person.Prototype.firstName = function(){
    return this.first;
}
 
Person.Prototype.fullName = function(){
    return this.first + ' ' + this.last;
}
 
 
function Person(first, last) { 
    return {
        this.first : first,
        this.last : last,
        fullName : personFullName;
        }
    }
}
cs



firstName 이라는 property는 Person 객체에 없지만, 프로토타입을 통해 설정할 수 있다.


정의한 객체 이외에 기존 객체에도 prototype을 정의 할 수 있다.





(6) 프로토타입을 통해 Javascript 내부에 정의된 객체에 메소드 추가


1
2
3
4
5
6
7
8
9
String.prototype.checkNum = function(){    
    var str = "";
    
    if(!isNaN(parseInt(str))){
        return true;
    }else{
        return false;
    }
}
cs






(6) Call , Apply 함수


1
2
3
4
function add(x,y){
    var total = x + y;
    return total;    
}
cs


> add.call(null, 2,3,4) ;

 : 5     

> add.apply(null,[2,3,4]);

 : 5


apply를 통해 배열을 인자 값으로 넘길 수 있다. apply와 call의 첫 번째 인자값에 해당하는 null은 역할은?

 : this, 즉 자기 자신을 지칭한다.






(6) Call, Apply의 첫번 째 인자 값의 활용


1
2
3
4
5
6
7
8
9
var writer = {
  message: 'HI',
  write: function() {
    alert(this.message);
  }
};
var writer2 = {
  message: 'HELLO'
};
cs


writer 객체에는 write라는 property가 있고, 함수를 대입했다.


writer.write();                    // HI

writer.write.call(writer2);     //HELLO

'programming > JavaScript' 카테고리의 다른 글

클로져 (Closures), 메모리 누출  (0) 2018.06.09
배열, 함수  (0) 2018.05.26
객체 (Object)  (0) 2018.05.26
데이터 타입, 변수, 연산자  (0) 2018.05.26

배열


배열은 실제로 객체의 특별한 타입이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var a = new Array();
a[0= "dog";
a[1= "cat";
a[2= "tiger";
 
a. length
 
 
 
 
var a = ["dog""cat""tiger"];
a[100] = "fox";
a.length
 
cs


>3

> 101


- 2번 째 같은 경우 3번 째부터 100번 째까지는 undefined로 할당 된다.





함수


: javascipt의 핵심 컴포넌트이다.

: javascript의 함수는 강력하다. 객체 일수도 있으며, 함수일 수도 있다.



1
2
3
4
function add(x,y){
    var total = x + y;
    return total;    
}
cs


-> return 이 없다면, undefined를 얻을 수 있을 것이다.



> add()

: NaN        // undefined에 대해 덧셈을 수행할 수 없다.


> add(2,3,4)

 : 5          // 마지막 값 4는 무시된다.






익명 함수



1
2
3
4
5
6
7
8
var avg = function() {
    var sum = 0;
 
    for(var i=0; j=arguments.length; i<j; i++ {
        sum+ = arguments[i];
    }
        return sum / arguments.length;
}
cs


'programming > JavaScript' 카테고리의 다른 글

클로져 (Closures), 메모리 누출  (0) 2018.06.09
사용자 정의 객체, 프로토타입, call, apply  (0) 2018.05.27
객체 (Object)  (0) 2018.05.26
데이터 타입, 변수, 연산자  (0) 2018.05.26

객체


Javascript에서 객체는 간단히 키(key)-값(value) 쌍의 모임이다. 다른언어와 비교하면 다음과 같다.


- Python의 Dictionaries

- C와 C++의 Hash Table

- Java의 HashMap

- PHP의 Associative arrays




Javascript의 모든 것(코어타입을 제외한)은 객체로 취급되고, 기본적으로 검색하는데 매우 빠르기 때문에 유용하게 활용가능.


키(key)는 객체 포함 모든 값이 들어갈 수 있는 반면, 값(value)에는 문자열이 들어가야 한다.






빈 객체를 생성 하는 방법


(1) var obj = new Object(); 

(2) var obj = {};    


-> 두가지는 의미적으로 동치이다.






객체에 접근 하는 방법


(1) obj.name = "YYh"; 

    var name = obj.name;


(2) obj["name"] = "YYs";

     var name2 = obj["name"];


-> 마찬가지로 의미적으로 동치이다. 

2번 째 방법은 속성의 이름이 Runtime(실행시간)에 계산될 수 있는 문자열로 주어진다. 또한 예약어의 사용이 가능하다.



obj.for = "loop" ;         //  구문 오류, for문의 예약어 때문에

obj["for"] = "loop" ;     // 가능





객체에 엄밀 구문으로 초기화 하는 방법


1
2
3
4
5
6
7
8
9
var letter = {
    name : "tom",
    "for" : "jerry",
     details: {
         from : "seoul",
          to : "busan"
     }
    day : 24 
};
cs



- 속성에 연속적인 접근이 가능


 > letter.details.from 

 > letter["details"]["from"] 



























'programming > JavaScript' 카테고리의 다른 글

클로져 (Closures), 메모리 누출  (0) 2018.06.09
사용자 정의 객체, 프로토타입, call, apply  (0) 2018.05.27
배열, 함수  (0) 2018.05.26
데이터 타입, 변수, 연산자  (0) 2018.05.26


수 - Number


: 설계 명세서에 의하면 Javascript의 수는 "이중정밀도 64비트 형식  IEEE 754" 값으로 정의된다.

 Javascript에는 C 나 Java의 정수 타입이 없기 때문에 조심해야한다.


0.1 + 0.2 = 0.300000000000000000000004


- 내장 객체 Math를 통해 연산 가능

- 내장 parseInt() 함수를 사용하여 문자열을 정수로 변환 가능


ex) parseInt("100",10) = 100

     parseInt(100)  = 64   -> default는 8진수로 인식함

     

     parseInt("hello") = NaN 


    1 / 0  -> infinity     양의 값으로 무한대

   -1 / 0  -> -infinity   음의 값으로 무한대




문자열 - String


: Javascript의 문자열은 문자하나가 연결되어 만들어 진것. 즉 16비트로 표현된 유니코드 문자들이 길게 나열된 값


1) 길이 : "str".length

2) 추출 : "str".charAt(index)


.. 소문자변환(toLowerCase), 대문자 변환(toUpperCase) 등등..





정의되지 않음 - Undefined


: 어떤 값도 주어지지 않은(할당되지 않은) 변수 , Null과 구분




Null


: 값이 없음을 의미



NaN


: 수가 아님 ( Not - a - Number)





부울  -  Boolean


: true, false를 구분


- 특징이 있다면, false, 0, "" 빈문자, 수가 아님을 뜻하는 NaN 그리고 null, undefined 모두 false를 반환




변수


: 자바스크립트에서는 변수를 모두 var로 선언, 값을 할당하지 않으면 undefined




연산자 - Operator


: 자바스크립트에서는 변수를 모두 var로 선언, 값을 할당하지 않으면 undefined


 "3" + 4 + 5  

> 345


 3 + 4 + "5"

> 75



 1 == true 

>true


-> 타입이 강제 변환하지 않도록 하려면 삼중등호 연산자 사용해야함.


1 === true

> false








위 내용과 더불어 추가적으로 작성될 내용은 다음 페이지 참조 :  https://developer.mozilla.org/ko/docs/A_re-introduction_to_JavaScript






'programming > JavaScript' 카테고리의 다른 글

클로져 (Closures), 메모리 누출  (0) 2018.06.09
사용자 정의 객체, 프로토타입, call, apply  (0) 2018.05.27
배열, 함수  (0) 2018.05.26
객체 (Object)  (0) 2018.05.26


Request Format









여러 알림에 대한 일괄 처리를 최적의 성능과 함께 수행하는 인터페이스이다.


Command : 1 byte

Frame length : 4 byte

Frame data : 일련의 아이템으로 구성된 가변 데이터









     


프레임은 여러 아이템이 들어있는 뼈대이다.


Item ID : 1byte

Item length : 2 byte

Item data : 가변 데이터



Item ID

 Item length

Item data

 1  ( Device Token)

100 byte 까지

등록된 디바이스의 binary 형태의 값
(
하나이상의 token보내져야함)

 2  (payLoad)

2 kilobyte (2048 byte)

 json 형태의 payload

(하나 이상의 payload가 보내져야 하며

Null로 끝나서는 안됨)

 3  (Notificatin Identifier)

4 byte

Push notification 의 식별 값

 4  (expiry)

4 byte

UTC 로 표현된 날짜 값

( 0 이상이면 적어도 한번 보내고 0이면 즉시 만료되어 알림이 저장되지 않음)

 5  priority

1 byte

 notification의 우선순위

10 아니면 5 중 하나 선택.

10: 즉시 전송

5: 전원의 배터리를 고려하여 전송









Response Format





Apns가  Device에게 성공적으로 알림을 보냈다면, Response Packet을 Provider에게 보내지 않는다.



- command : 1byte이며 Command Number 8

- status code : 발생한 에러에 따라 응답코드를 반환한다.

- Identifier : Provider에서 알림을 보낼 때 포함한 식별자 4byte 값을 반환한다.








참고

https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/BinaryProviderAPI.html#//apple_ref/doc/uid/TP40008194-CH13-SW1






'Cloud & NoSQL & Middleware > Apns' 카테고리의 다른 글

HTTP/2 - based Apns Provider API  (0) 2018.05.31
FeedbackService - Format, Packet  (0) 2018.05.29
APNS Provider Protocol  (0) 2018.05.25
APNS Notification Payload  (0) 2018.05.15
APNS Architecture - Connection & Push Flow  (0) 2018.05.11


Protocol


애플을 통해 푸쉬 알림을 보내기 위한 방식은 TCP 방식과 HTTP 방식이 있다.



애플에서 TCP 기반으로 보내는 API를 Binary Provider API , HTTPS 기반으로 보내는 방식을 APNS Provider API라고 명칭하고 있다.






Compare


 

 Binary Provider API

APNS Provider/Notification API 

 protocol

 TCP

HTTP/2 

 host / port

 

 gateway.sandbox.push.apple.com  // 2195      gateway.push.apple.com  // 2195



feedback.sandbox.push.apple.com  // 2196

: feedback.push.apple.com  // 2196 

api.development.push.apple.com:443

api.push.apple.com:443

Port is 443 or 2197

 data

 2KB

4KB 

 figure

High Capacity

 High Security, High Speed

 certificate

 .p12

 .p8, .p12

 feedback service

 O




(1) protocol : Binary Provider API에서는 TCP, APNS Provider API에서는 HTTP/2 Protocol 기반에서 수행된다.


(2) host / port : sandbox가 붙으면 개발서버, 아니면 운영서버이고 Binary Provider API는 피드백서비스를 활성화 해야한다.


(3) data : Payload의 용량 제한은 위와 같다. (VolP Notification 을 보낼 시 최대 5KB까지 가능.)


(4) figure : Binary Provider API 에서는 비동기 처리가 가능하고 생산성이 좋은 반면, HTTP/2 방식은 보안과 속도 측면에서 뛰어나다는 장점이 있다.


(5) certificate: TCP 방식은 .p12 인증서 파일만 사용가능하며, HTTP/2 방식으로 했을 경우에는 Token 방식을 사용할 수 있기 때문에 .p8 파일을 이용하여 여러 앱에 푸쉬 알림을 보낼 수 있다.


(6) feedback service:  feedback 서비스는 메시지전달 실패에 대한 정보를 제공하는 서비스이다. 자세한 정보는 추가적으로 다룰 예정







Codec


앞서 정의 했듯, 코덱은 인코딩과 디코딩 과정을 거치는 알고리즘이다.


일반적으로 동영상 압축 알고리즘인 MPEG로 알고 있다. 인코딩 과정을 통해 동영상 용량을 줄일 수 있고, 마찬가지로 디코딩 과정으로 원본파일로 변환한다. 


MPEG 확장자를 갖는 동영상 뿐 아니라 jpg 확장자를 갖는 파일도 코덱 과정을 거친 것이다.



Netty에서는 inboundHandler와 outBoundHandler가 각각 인코더와 디코더에 해당하고, 데이터 송수신시 데이터와 패킷으로 각각 변환 시킬 수 있다.





기본 정의된 코덱


- base64 Codec 

 : Base64 인코딩 데이터에 대한 코덱   

 : Base64는 8비트 이진데이터를 문자 코드에 영향을 받지 않는 공통 ASCII 영역의 문자로 이루어진 일련의 문자열로 바꾸는 인코딩


- bytes Codec

 : 바이트 배열에 대한 코덱


- compression Codec

 : 송수신 데이터의 압축을 지원하는 코덱 

 : 네티 4.0에서는 zlib, gzip, snappy - 4.1에서는 bzip2, castle, l24, lzf의 압축 알고리즘이 추가


- mashaslling Codec

 : 마살량 혹은 언마샬링은 객체를 네트워크를 통해 송신 가능한 형태로 변환하는 과정


- ProtoBuf Codec

 : 구글의 포로토콜 버퍼를 사용한 데이터를 송수신을 지원하는 코덱


- rtsp Codec

 : 오디오 및 비디오 같은 실시간 데이터의 전달을 위해 만들어진 애플리케이션 레벨의 프로토콜 (real time streaming protocol)


- sctp Codec

 : TCP가 아닌 sctp 전송 계층을 사용하는 코덱

 : 이 코덱을 사용하려면 부트스트랩 채널에 NioSctpChannel 혹은 NioSctpServerChannel을 설정


- http Codec

 : http 프로로콜을 지원하는 코덱


- spdy Codec

 : Spdy는 기존의 http를 보완하는 프로토콜


- HTTP/2 Codec

  : HTTP/2 Protocol을 지원하는 코덱. 구글에서 spdy 프로토콜의 지원을 중단하고 http/2에 대한 공식 지원을 하는 중이다. 

  : 네티 4.1 버전에서 제공되고 있다.


-  String Codec

  : 문자열 송수신을 지원하는 코덱. 주로 Telnet이나 채팅 서버의 프로토콜에 이용


- Serialization 코덱

  : 객체를 네트워크로 직렬화 / 역직렬화를 지원하는 코덱


- MQTT Codec

 : MQTT Protocol을 지원하는 코덱


- HaProxy

 : Load Balance와 Proxy기능 을 제공하는 오픈 솔루션을 지원하는 코덱


- STOMP

 : STOMP Protocol을 지원하는 코덱






Http/2, Http Codec example


- 아주 심플하게 코덱 구성을 해보았다.



public class Http2ClientInit extends ChannelInitializer<SocketChannel> {
private HttpToHttp2ConnectionHandler connectionHandler;
@Override
protected void initChannel(SocketChannel socketChannel) throws Exception {
Http2Connection connection = new DefaultHttp2Connection(false);
httpResponseHandler responseHandler = new httpResponseHandler();
connectionHandler = new HttpToHttp2ConnectionHandlerBuilder().connection(connection).build();
socketChannel.pipeline().addLast("connection",connectionHandler);
//기본 정의 codec
socketChannel.pipeline().addLast("response",new HttpResponseDecoder());
// 내가 정의한 사용자 정의 codec
socketChannel.pipeline().addLast("response", httpResponseHandler);
}
}




=> http2/0 으로 Connection을 구성하고 응답 온 패킷에 대해 http 데이터로 변환 후, 내가 정의한 핸들러에서 데이터를 정의







참고 : 자바 네트워크 소녀 Netty 


 






 




Enum (열거형) - 서로 연관된 Constants(상수)


Java에서도 Enum을 지원하고 다양한 장점을 갖고 있다.


1) C/C++ 에서의 Enum의 사용은 단순 상수로서의 기능을 갖고 있었다면, Java에서는 여러 기능을 갖춘 클래스로서의 역할을 수행한다.

2) 불필요한 혹은 중복된 코드를 줄일 수 있다.

3) 리팩토링시 변경하고자 하는 범위를 최소화할 수 있다.




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public enum HttpStatusCode {
    
    Success(200), Forbidden(403),NotFound(404), InternalServerError(500);
    
    private int num;
    
    HttpStatusCode(int num){
        this.num = num;
    }
    
    public static HttpStatusCode valueOf(int num) {
        switch (num) {
            case 200 :
                return Success;
            case 403 :
                return Forbidden;
            case 404 :
                return NotFound;
            case 500:
                return InternalServerError;
            default :
                return null;
        }
    }
    
    public int getStatusCode(){
        return this.num;
    }    
}
 
 
cs



-> 위 예제처럼, httpStatus 상태코드를 미리 지정해 놓으면 효율적으로 관리 할 수 있다.





1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
public class Main {
    
    public static void main(String[] args){
        
        System.out.println(HttpStatusCode.valueOf("Success"));
        System.out.println(HttpStatusCode.valueOf(200));
        System.out.println(HttpStatusCode.valueOf(200)==HttpStatusCode.valueOf("Success"));
    
        // 해당하는 값이 없으면 IllegalArgumentException 발생
        System.out.println(HttpStatusCode.valueOf("success"));
    }
}
 
cs




 정의 되지 않은 값을 가져올 경우 Exception이 발생한다.





=> enum을 사용한다면, 상태코드만으로는 알 수 없는 오류에 대해 명확히 알 수 있었을 뿐 아니라 사용되는 값들의 범위에 대해 용이하게 관리 할 수 있다.  하지만, 빈번하게 추가/변경/삭제가 이뤄진다면 기존에 작성된 코드와의 문제가 발생할 요소가 있으니 주의해야 한다.













+ Recent posts