상호 배척의 필터 개념인가? 아니면 서로 포장(데코레이트)될수 있는 필터인가?

1.내경운 애초에..  
a.클라가 객체를 전송할때 해당 객체에 String 타입의 "한글" text (2byte input필요) 필드가 존재했다면... 
b.받는 입장 서버나 다른 클라가 읽는(input) 경운.. 소켓은 기본적으로 1byte단위 InputStream을 제공하니까.. 
  요걸 InputStreamReader 필터 클래스로 포장해서 2바이트 단위(text)로 변환한후 데이터(스트림)를 읽어와야  
  안깨진 문자를 쓸수있고.. 
c. 상대가 보낸 스트림 타입이 객체 단위이니까.. ObjectInputStream을 통해 다시 한번 더 포장을 해야한다고 생각했다.

즉 (상대가 보낸 객체 데이터안에 한글 String이 있을경우)
isr = new InputStreamReader(socket.getInputStream() );
bir = new BufferedReader(isr);  
oir = new ObjectInputStream(bir); <--ObjectInputStream의 경우 InputStream 계열만 받는다. 그럼으로 오류!

is = new BufferedInputStream(socket.getInputStream() );
ois = new ObjectInputStream(is); 

MyClass a = (MyClass)oir.getObject();
sysout(a.getTextString()); //한글 출력 잘됨;; 
sysout(a.toString()); //별 의미는 없지만.. 

위의 경우에 해보진 않았지만.. 1byte 단위로 직렬화, 역직렬화를 하게 되는것 아닌가? 내가 InputStreamReader를
통해 2byte 단위로 i/o 처리하게 했다면.. 역직렬화 실패 아닐까??? 등의 고민을 했다.(현재까진 InputStreamReader ,
ObjectInputStream 스트림 필터 클래스를 서로 배척되는 것이라 판단함)

InputStreamReader 없이   ObjectInputStream의 getObject()를 했을때.. 읽어온 오브젝트의 멤버 필드인 한글 String(char[]중 byte가 아닌 text타입)은 어떻게 되는가?   <-- 이 문제 또한 직렬화가 해결해 주는건가? 

생각을 해보자고.. 문자or문자열을 i/o 할땐 직렬화 구현한다고 정의 안했잖아.. 아무런 추가 정보 없이 1바이트 스트림을 이용
해 파일or 네트워크에 1byte로 쐈으니.. 받는 입장(input)에선 text 데이터의 표현을 위해 2byte로 변환이 필요하니까
 InputStreamReader란 필터를 사용한 것이고..  내보낼땐 2byte -> 1byte (Writer -> outputStream)  읽어올땐 1byte->
2byte(inputStream -> Reader) ..
 
ObjectInputStream의 경운.. Serializabe를 통해 알아서 마샬링,언마샬링? 하고.. String 클래스 =  implements Serializabe 할뿐
아니라, 말그대로 인코딩을 지원하기 위한 CharSequence 인터페이스를 구현하고 있다. 해당 문자가 utf-8인지 utf-16인지
아니면 디폴트로 ms949인가 인지..

자.. 내 경우에 이클립스 편집기 언어 인코딩 설정을  utf-8로 변경했을때.. 한글이 전부 깨졌지.. 이게 왜 그럴까?
모든 캐릭터를 8bit로 표현한단 의미잖아. 한글은 표현에 16bit가 필요한데..  

=>결론.. 스트림간 인코딩의 통일! or 약속

2.클라가 Writer를 이용해 텍스트 보내고 , bmp등 Image객체를 보냈을때.. 

(1)text로 보낸 문자는 소켓이 byte로 넘겨주기에 InputStreamReader(socket.getInputStream)을 사용해서 읽어오고
(2)byte로 보낸 이미지 데이터는 ObjectInputStream(socket.getInputStream)을 사용해 읽어온다.


=>1,2에 대해 내게 무엇이 부족해서 명확히 구분을 못하는건지.. 이것조차 헷갈린다.. OTL


**********************************************************************
분산 처리를 위해 A,B,C를 배치하고 네트웍으로 연결시켰을때
 1. org.omg.CORBA(이종의 app간 통신 지원 request, response 웹에서 클라요청->jsp컨테이너의 response) = 한마디로 
  네트웍을 통해 객체가 왔다 갔다 한다. a.니가 가지고 있는 객체좀 줘(request) b.객체를 바로 전달해주거나 or 결과값을 전달
  해주거나(response or resultSet) 
 2. java.rmi(remote method invocation 원격에 있는 객체,메서드를 내 로컬에서 사용하듯이.. reflect에서 많이 봤던..)  로 발전
  과정..
  
  (위의 1,2 등의 작업을 지원하는 프레임워크가 java ee.. 근데 위와 같은 작업은 jsp 컨테이너의 역할과 같은것 아닌가?)

 => 객체라는 reference 타입이 왔다 갔다 i/o를 하기 때문에 

3.직렬화(serializable)의 개념이 필요함.. 
     (etc) 직렬화에서 제외(transient)되어야 할 경우 : 참조 객체가 직렬화 구현 안했을때, 보안이 필요한 객체(필드)일때, 상위 클래스
           가 직렬화를 구현 안했을때(이건 내가 상속받아 직렬화 구현하고 + readObject,writeObject 재정의 하면서 상위 클래스
           멤버 필드를 명시적으로 read,write 해줘야함), 인스턴스가 실제 Object타입의 경우(실제 인스턴스타입이 직렬화를 
           구현했으면 참조 타입이 Object 타입이라도 가능)
     (etc) 직렬화 객체의 구성 요소 각각의 타입이 다를때.. 이 순서를 기억해야 한다. (내가 어제 복리 계산 프로그램에서 double
            형 int형 있어서.. 반복자 처리가 안되었던 사례.) 상위 타입을 준비하고 가급적 순서(List계열)를 유지하는 컨테이너 
            객체로서 관리 하는게 사용에 편리하다. 
            (ex)  ArrayList<Base> list = new ArrayList<Base>();  만들어서 순서가 유지 되어야할 타입이 다른 원소들을 
           생성해서 "순서대로" 집어 넣고..    list 채로 i/o를 하게 되면.. 받는 쪽에서 list 를 반복문을 이용해 순차 접근해서 처리
           하면 되니.. 얼마나 편리한가?(물론 instanceof 로 실제 타입을 확인해서 타입캐스팅 해줘야 하지만.. 그나저나 
           인스턴스A instance of ClassType   VS   ClassType.class == 인스턴스A.getClass()   만약 인스턴스A가 null일때 
           둘중 무엇이 안정적이냐?) 

=>요게 java ee의 "분산처리" 개념을 지원하는 기반 기술

4.예전에 한번 거론했던..sid or uid 역할은 직렬화/역직렬화 클래스의 버전 식별 
(클래스의 멤버 필드,메서드중 객체의 생성,소멸과 관련된 것들(생성자류)을 문자열로 처리해 순서대로 xor 연산 xor  해당 클래
스의.Class를 문자열로 한 값 => 결과였는듯? 아님 말고;;  xor은 순서 따라 전혀 다른 결과가 나오니.. 원본 xor 키 = 암호 결과
 xor 키 = 원본)


by givingsheart 2014. 1. 1. 16:09