http://www.slideshare.net/reinkim/dvcs-final



git 번역 자료


어노테이션



(추가)

GIT과 어노테이션(메타 데이터를 이용한 프로그래밍 지원)은 결코 가벼이 할만한 개념이 아니다.

스프링으로 공부시, @MVC 를 활용한 XML이 아닌, 코드에 직접 선언적으로 DI, 조건 제약을 함으로서

얼마나 복잡도와 코드의 양이 줄었는지를 생각하자.


GIT또한.. 기존 SVN과는 다른, 원격 분산 저장소의 개념이다.(FORK,CLONE,CHECK OUT, ADD, COMMIT, PUSH,

PULL, 각종 브랜치를 왔다리 갔다리) 이것.. GITHUB를 통해서 폭발적으로 대세가 되었다. SVN을 제대로 연마 못했지만

GIT으로 넘어가야 한다.

'챙겨볼것' 카테고리의 다른 글

  (0) 2014.01.02
나중에 다시 한번 체크할 것들  (0) 2014.01.01
집에가서 마저 볼것  (0) 2014.01.01
불논리 + 정체성  (0) 2014.01.01
읽을거리.. 스프링,보안,기타  (0) 2014.01.01
by givingsheart 2014. 1. 1. 16:17
클라용 소켓 인터페이스부
서버용 소켓 인터페이스부

소켓 imple <-- 이것도 추상클래스로 빼놔서..

실제 추상화된 단계는
1.abstract class More ...AbstractPlainSocketImpl extends SocketImpl
2.class More ...PlainSocketImpl extends AbstractPlainSocketImpl
3.class More ...SocksSocketImpl extends PlainSocketImpl implements SocksConsts

하여튼.. 자신의 단계에서 가능한 메서드를 정의해두고 나머진 하위 클래스에게 맡겨버림..


1에서 볼만한건.. 클래스 멤버(static) 초기화 부분에서 먼짓을 하고 있는지!

79     static {
80         java.security.AccessController.doPrivileged(
81                   new sun.security.action.LoadLibraryAction("net"));
82     }

또한 create메서드에서 동기화 처리및 , 스트림 여부에 따라 udp 소켓 생성.. 리소스 매니저 사용..등

88     protected synchronized void More ...create(boolean stream) throws IOException {
89         fd = new FileDescriptor();
90         this.stream = stream;
91         if (!stream) {
92             ResourceManager.beforeUdpCreate();
93             try {
94                 socketCreate(false);
95             } catch (IOException ioe) {
96                 ResourceManager.afterUdpClose();
97                 fd = null;
98                 throw ioe;
99             }
100        } else {
101            socketCreate(true);
102        }
103        if (socket != null)
104            socket.setCreated();
105        if (serverSocket != null)
106            serverSocket.setCreated();
107    }

3에서 볼만한건..((SocketInputStream)in).read(data, received, len - received, remainingMillis(deadlineMillis));

117     private int More ...readSocksReply(InputStream in, byte[] data, long deadlineMillis) throws IOException {
118         int len = data.length;
119         int received = 0;
120         for (int attempts = 0; received < len && attempts < 3; attempts++) {
121             int count;
122             try {
123                 count = ((SocketInputStream)in).read(data, received, len - received, remainingMillis(deadlineMillis));
124             } catch (SocketTimeoutException e) {
125                 throw new SocketTimeoutException("Connect timed out");
126             }
127             if (count < 0)
128                 throw new SocketException("Malformed reply from SOCKS server");
129             received += count;
130         }
131         return received;
132     }

여튼 맞는지 모르겟지만,, 브릿지 패턴같음 


51 public
52 class More ...ServerSocket implements java.io.Closeable {
    

55 
56     private boolean created = false;
57     private boolean bound = false;
58     private boolean closed = false;
59     private Object closeLock = new Object();

    
63 
64     private SocketImpl impl;

   
68 
69     private boolean oldImpl = false;

    
75     More ...ServerSocket(SocketImpl impl) {
76         this.impl = impl;
77         impl.setServerSocket(this);
78     }

    

85 
86     public More ...ServerSocket() throws IOException {
87         setImpl();
88     }

    
//팩토리 클래스에서 실제 소켓 구현 클래스 얻고.. 추상 팩토리 패턴;;;
//시큐리티 매니저도.. 아.. 모르겠다..
SocketImpl
SocketImplFactory.createSocketImpl()
setSocketFactory(java.net.SocketImplFactory)
java.lang.SecurityManager.checkListen(int)
126
127    public More ...ServerSocket(int port) throws IOException {
128        this(port, 50, null);
129    }

    

180    public More ...ServerSocket(int port, int backlog) throws IOException {
181        this(port, backlog, null);
182    }


228
229    public More ...ServerSocket(int port, int backlog, InetAddress bindAddr) throws IOException {
230        setImpl();
231        if (port < 0 || port > 0xFFFF)
232            throw new IllegalArgumentException(
233                       "Port value out of range: " + port);
234        if (backlog < 1)
235          backlog = 50;
236        try {
237            bind(new InetSocketAddress(bindAddr, port), backlog);
238        } catch(SecurityException e) {
239            close();
240            throw e;
241        } catch(IOException e) {
242            close();
243            throw e;
244        }
245    }

    

//아래의 AccessController.doPrivileged .. 내가 awt 분석하면서 많이본 코드 조각.. 
//특별한 권한을 부여한다는 건데..  아래보면 reflect를 통해 소켓구현 클래스에..
//정의된 connect메서드를 얻는다.  하여간.. 이코드의 존재 의미를 명확히 모르겠다..

254
255    SocketImpl More ...getImpl() throws SocketException {
256        if (!created)
257            createImpl();
258        return impl;
259    }
260
261    private void More ...checkOldImpl() {
262        if (impl == null)
263            return;
264        // SocketImpl.connect() is a protected method, therefore we need to use
265        // getDeclaredMethod, therefore we need permission to access the member
266        try {
267            AccessController.doPrivileged(
268                new PrivilegedExceptionAction<Void>() {
269                    public Void More ...run() throws NoSuchMethodException {
270                        Class[] cl = new Class[2];
271                        cl[0] = SocketAddress.class;
272                        cl[1] = Integer.TYPE;
273                        impl.getClass().getDeclaredMethod("connect", cl);
274                        return null;
275                    }
276                });
277        } catch (java.security.PrivilegedActionException e) {
278            oldImpl = true;
279        }
280    }
281
282    private void More ...setImpl() {
283        if (factory != null) {
284            impl = factory.createSocketImpl();
285            checkOldImpl();
286        } else {
287            // No need to do a checkOldImpl() here, we know it's an up to date
288            // SocketImpl!
289            impl = new SocksSocketImpl();
290        }
291        if (impl != null)
292            impl.setServerSocket(this);
293    }

 
300
301    void More ...createImpl() throws SocketException {
302        if (impl == null)
303            setImpl();
304        try {
305            impl.create(true);
306            created = true;
307        } catch (IOException e) {
308            throw new SocketException(e.getMessage());
309        }
310    }

328
329    public void More ...bind(SocketAddress endpoint) throws IOException {
330        bind(endpoint, 50);
331    }

    
//유효한 연결인지 체크하고, 시큐리티 검사하고, 바인드 하고 , 바로 리슨을 해주는 걸 확인..

357
358    public void More ...bind(SocketAddress endpoint, int backlog) throws IOException {
359        if (isClosed())
360            throw new SocketException("Socket is closed");
361        if (!oldImpl && isBound())
362            throw new SocketException("Already bound");
363        if (endpoint == null)
364            endpoint = new InetSocketAddress(0);
365        if (!(endpoint instanceof InetSocketAddress))
366            throw new IllegalArgumentException("Unsupported address type");
367        InetSocketAddress epoint = (InetSocketAddress) endpoint;
368        if (epoint.isUnresolved())
369            throw new SocketException("Unresolved address");
370        if (backlog < 1)
371          backlog = 50;
372        try {
373            SecurityManager security = System.getSecurityManager();
374            if (security != null)
375                security.checkListen(epoint.getPort());
376            getImpl().bind(epoint.getAddress(), epoint.getPort());
377            getImpl().listen(backlog);
378            bound = true;
379        } catch(SecurityException e) {
380            bound = false;
381            throw e;
382        } catch(IOException e) {
383            bound = false;
384            throw e;
385        }
386    }

    
398    public InetAddress More ...getInetAddress() {
399        if (!isBound())
400            return null;
401        try {
402            return getImpl().getInetAddress();
403        } catch (SocketException e) {
404            // nothing
405            // If we're bound, the impl has been created
406            // so we shouldn't get here
407        }
408        return null;
409    }

    
421    public int More ...getLocalPort() {
422        if (!isBound())
423            return -1;
424        try {
425            return getImpl().getLocalPort();
426        } catch (SocketException e) {
427            // nothing
428            // If we're bound, the impl has been created
429            // so we shouldn't get here
430        }
431        return -1;
432    }

    
449
450    public SocketAddress More ...getLocalSocketAddress() {
451        if (!isBound())
452            return null;
453        return new InetSocketAddress(getInetAddress(), getLocalPort());
454    }

 
484    public Socket More ...accept() throws IOException {
485        if (isClosed())
486            throw new SocketException("Socket is closed");
487        if (!isBound())
488            throw new SocketException("Socket is not bound yet");
489        Socket s = new Socket((SocketImpl) null);
490        implAccept(s);
491        return s;
492    }

//시큐리티 매니저의 역할에 대해 생각해볼것! (즉 외부인 네트워크를 통한 스트림 연결에대해 인증및, 권한 설정등의 보안 작업)
509
510    protected final void More ...implAccept(Socket s) throws IOException {
511        SocketImpl si = null;
512        try {
513            if (s.impl == null)
514              s.setImpl();
515            else {
516                s.impl.reset();
517            }
518            si = s.impl;
519            s.impl = null;
520            si.address = new InetAddress();
521            si.fd = new FileDescriptor();
522            getImpl().accept(si);
523
524            SecurityManager security = System.getSecurityManager();
525            if (security != null) {
526                security.checkAccept(si.getInetAddress().getHostAddress(),
527                                     si.getPort());
528            }
529        } catch (IOException e) {
530            if (si != null)
531                si.reset();
532            s.impl = si;
533            throw e;
534        } catch (SecurityException e) {
535            if (si != null)
536                si.reset();
537            s.impl = si;
538            throw e;
539        }
540        s.impl = si;
541        s.postAccept();
542    }

556
557    public void More ...close() throws IOException {
558        synchronized(closeLock) {
559            if (isClosed())
560                return;
561            if (created)
562                impl.close();
563            closed = true;
564        }
565    }


582
583    public ServerSocketChannel More ...getChannel() {
584        return null;
585    }

592
593    public boolean More ...isBound() {
594        // Before 1.3 ServerSockets were always bound during creation
595        return bound || oldImpl;
596    }

    

603
604    public boolean More ...isClosed() {
605        synchronized(closeLock) {
606            return closed;
607        }
608    }


625
626    public synchronized void More ...setSoTimeout(int timeout) throws SocketException {
627        if (isClosed())
628            throw new SocketException("Socket is closed");
629        getImpl().setOption(SocketOptions.SO_TIMEOUT, new Integer(timeout));
630    }

    
639
640    public synchronized int More ...getSoTimeout() throws IOException {
641        if (isClosed())
642            throw new SocketException("Socket is closed");
643        Object o = getImpl().getOption(SocketOptions.SO_TIMEOUT);
644        /* extra type safety */
645        if (o instanceof Integer) {
646            return ((Integer) o).intValue();
647        } else {
648            return 0;
649        }
650    }


687
688    public void More ...setReuseAddress(boolean on) throws SocketException {
689        if (isClosed())
690            throw new SocketException("Socket is closed");
691        getImpl().setOption(SocketOptions.SO_REUSEADDR, Boolean.valueOf(on));
692    }

    
702
703    public boolean More ...getReuseAddress() throws SocketException {
704        if (isClosed())
705            throw new SocketException("Socket is closed");
706        return ((Boolean) (getImpl().getOption(SocketOptions.SO_REUSEADDR))).booleanValue();
707    }


714
715    public String More ...toString() {
716        if (!isBound())
717            return "ServerSocket[unbound]";
718        return "ServerSocket[addr=" + impl.getInetAddress() +
719                ",port=" + impl.getPort() +
720                ",localport=" + impl.getLocalPort()  + "]";
721    }
722
723    void More ...setBound() {
724        bound = true;
725    }
726
727    void More ...setCreated() {
728        created = true;
729    }

    
The factory for all server sockets.
733
734    private static SocketImplFactory factory = null;


760
761    public static synchronized void More ...setSocketFactory(SocketImplFactory fac) throws IOException {
762        if (factory != null) {
763            throw new SocketException("factory already defined");
764        }
765        SecurityManager security = System.getSecurityManager();
766        if (security != null) {
767            security.checkSetFactory();
768        }
769        factory = fac;
770    }


806
807     public synchronized void More ...setReceiveBufferSize (int size) throws SocketException {
808        if (!(size > 0)) {
809            throw new IllegalArgumentException("negative receive size");
810        }
811        if (isClosed())
812            throw new SocketException("Socket is closed");
813        getImpl().setOption(SocketOptions.SO_RCVBUF, new Integer(size));
814    }

828
829    public synchronized int More ...getReceiveBufferSize()
830    throws SocketException{
831        if (isClosed())
832            throw new SocketException("Socket is closed");
833        int result = 0;
834        Object o = getImpl().getOption(SocketOptions.SO_RCVBUF);
835        if (o instanceof Integer) {
836            result = ((Integer)o).intValue();
837        }
838        return result;
839    }


878
879    public void More ...setPerformancePreferences(int connectionTime,
880                                          int latency,
881                                          int bandwidth)
882    {
883        /* Not implemented yet */
884    }
885
886}


'자바se api > net' 카테고리의 다른 글

네트워크 관련  (0) 2014.01.01
java.net.socket 파고들기2  (0) 2014.01.01
java.net 중 서버 소켓 -> IOCP -> NIO -> NODE JS + 팩토리 패턴  (0) 2014.01.01
by givingsheart 2014. 1. 1. 16:16


java.net.serversocket 

이 클래스는 서버 소켓을 구현합니다. 서버 소켓은, 네트워크 경유로 요구가 보내져 오는 것을 기다립니다. 이것은, 그 요구에 근거해 몇개의 조작을 실행합니다. 그 후, 경우에 따라서는 요구 바탕으로 결과를 돌려줍니다.  

서버 소켓의 실제의 처리는,SocketImpl 클래스의 인스턴스에 의해 실행됩니다. 어플리케이션은, 소켓 구현을 작성하는 소켓 팩토리를 변경하는 것으로, 로컬 방화벽(fire wall)에 적절한 소켓을 작성하도록(듯이) 어플리케이션 자체를 구성할 수가 있습니다.

도입된 버젼:
JDK1. 0
관련 항목:
SocketImpl , setSocketFactory(java.net.SocketImplFactory) , ServerSocketChannel

=>서버 소켓의 accecpt() 메서드는 인터페이스 클래스(상위 클래스) 구현 클래스(하위클래스)
로 구성되었다(왜냐묜.. 소스코드 로직 유출 막을라고;; 사실 클라가 알 필요도 없고.. 추상화)

imple 클래스 선언부만 보면 아주 심플함.. 서버 소켓도 될수 있고, 일반 소켓도 될수
있고.. 게다가 인터페이스(메서드)의 경우.. 초 단순.. create , connect, accept , bind,
listen, getInputStream, getOutputStream, close .. 물론 다른 메서드도 있지만.. 초심플
아닌가??  


44 public abstract class More ...SocketImpl implements SocketOptions {
    
The actual Socket object.
47 
48     Socket socket = null;
49     ServerSocket serverSocket = null;

54     protected FileDescriptor fd;

59     protected InetAddress address;


64     protected int port;

69     protected int localport;


79     protected abstract void More ...create(boolean stream) throws IOException;

89     protected abstract void More ...connect(String host, int port) throws IOException;

99     protected abstract void More ...connect(InetAddress address, int port) throws IOException;

112    protected abstract void More ...connect(SocketAddress address, int timeout) throws IOException;

121    protected abstract void More ...bind(InetAddress host, int port) throws IOException;

132    protected abstract void More ...listen(int backlog) throws IOException;

141    protected abstract void More ...accept(SocketImpl s) throws IOException;

150    protected abstract InputStream More ...getInputStream() throws IOException;

159    protected abstract OutputStream More ...getOutputStream() throws IOException;

170    protected abstract int More ...available() throws IOException;

177    protected abstract void More ...close() throws IOException;

194    protected void More ...shutdownInput() throws IOException {
195      throw new IOException("Method not implemented!");
196    }

214    protected void More ...shutdownOutput() throws IOException {
215      throw new IOException("Method not implemented!");
216    }

224    protected FileDescriptor More ...getFileDescriptor() {
225        return fd;
226    }

234    protected InetAddress More ...getInetAddress() {
235        return address;
236    }

244    protected int More ...getPort() {
245        return port;
246    }

257    protected boolean More ...supportsUrgentData () {
258        return false; // must be overridden in sub-class
259    }

269    protected abstract void More ...sendUrgentData (int data) throws IOException;

277    protected int More ...getLocalPort() {
278        return localport;
279    }
280
281    void More ...setSocket(Socket soc) {
282        this.socket = soc;
283    }
284
285    Socket More ...getSocket() {
286        return socket;
287    }
288
289    void More ...setServerSocket(ServerSocket soc) {
290        this.serverSocket = soc;
291    }
292
293    ServerSocket More ...getServerSocket() {
294        return serverSocket;
295    }

302    public String More ...toString() {
303        return "Socket[addr=" + getInetAddress() +
304            ",port=" + getPort() + ",localport=" + getLocalPort()  + "]";
305    }
306
307    void More ...reset() throws IOException {
308        address = null;
309        port = 0;
310        localport = 0;
311    }

350
351    protected void More ...setPerformancePreferences(int connectionTime,
352                                          int latency,
353                                          int bandwidth)
354    {
355        /* Not implemented yet */
356    }
357}


***************************************************************

소켓의 인풋스트림에 뭔가 데이터가 들어왔을때.. 통지 해주는 객체와 내가 리스너(콜백메서드)
를 정의해서 붙여주는 처리는 아닌가? 
그냥 while()문에서 0.001초마다 메세지 들어와있나 확인해야 하나?

그리고 iocp개념, non blocking 통신은.. 아..................


iocp 관련 논의 (자바에선 어찌하는지 찾아봐야함)

http://www.gamecodi.com/board/zboard-id-GAMECODI_Talkdev-no-1607-z-14.htm

(추가)
다중 접속 처리를 위해 -> 소켓당 여러 프로세스 배정 -> 조금 더 가벼운 멀티 스레드 할당 ->
스레드 풀의 개념(스레드 생성,소멸 시간 절약해 재사용) -> 메모리 문제, 성능 문제등이 발생을
한다. 동기화 IO의 한계가 존재함으로.. 비동기 IO인 NIO패키지로 해결을 하며, 고속의 성능이
필요할 경운.. 자바가 아닌 C++ 등으로 구현하는 것이 현명할 것이다.

(추가)
NODE JS 를 공부하게 되었다. 싱글 스레드 서버로서 파일등 I/O의 경우는 비동기로 처리한다.(이벤트
큐와 리스너와 콜백)

NODE의 경우 싱글 스레드로서, 동기화의 문제 , 멀티스레드 문제를 극복하게 하지만, 싱글 스레드 임으로
서버 컴퓨터(멀티코어)의 능력을 제대로 쓰기 위해서는 클러스터 모듈을 사용해서 분산 처리해야 한다.
또한 서버단에서 CPU 연산이 많은 작업을 하게 되면, 비동기적 프로그래밍을 제대로 구현하지 못할 경우..
 병목 현상이 발생한다. 서버는 참으로 어렵고 크리티컬한 분야이다.


게임서버 관련 쟁점
http://cafe.naver.com/jzsdn/23094?social=1

(추가)
게임 서버는.. 다중 접속, 빠른 처리, 지역 분할과 동기화란.. 너무나 많은 이슈가 걸려있다.

서버 동작 방식 결정하게끔 생성하는 팩토리 메서드 패턴?
http://cafe.naver.com/gogoxna/934

(추가)
일단 팩토리 패턴이란.. 객체 생성 과정을 추상화 하기 위한 개념이다. GETINSTANCE ("객체 이름")
서로 다른 모듈(또는 시스템)간에는 서로를 구체적으로 몰라야 유연성(루즈커플링)이 높아진다.
유연성이 높아야, 변경에 취약하지가 않게 된다.


'자바se api > net' 카테고리의 다른 글

네트워크 관련  (0) 2014.01.01
java.net.socket 파고들기2  (0) 2014.01.01
java.net.socket 파고들기1  (0) 2014.01.01
by givingsheart 2014. 1. 1. 16:14

원본데이터 xor 키 ->암호데이터 xor 키 =  원본데이터 

위의 xor에 대해 깊이있게 이해하려다.. 말림..



아래 글은 2%도 이해 못했다.. 슬프다..



(추가)
뭐랄까.. 불논리, 회로 설계.. 요런 로우 레벨에 대한 공부는 지적 호기심일까? 나는 회로 구현 OR 임베디드 분야를
할것이 아니지 않은가..? 쓸수 없는,필요없는 지식을 채워넣는것 아닐까? (허나.. 모르는 것을 고민하고 공부하는 것은
즐겁다. 모든 것이 궁금하고, 알고 싶고.. 이런게 장호 아닌가?) 


by givingsheart 2014. 1. 1. 16:13

'챙겨볼것' 카테고리의 다른 글

  (0) 2014.01.02
나중에 다시 한번 체크할 것들  (0) 2014.01.01
집에가서 마저 볼것  (0) 2014.01.01
중요한거 아니니 나~중에 진행 (git,어노테이션등) - 중요한 것임!!!  (0) 2014.01.01
불논리 + 정체성  (0) 2014.01.01
by givingsheart 2014. 1. 1. 16:13

예전에 처음 접하면서.. 머리 싸맬때 비하면 훨씬 쉽게(26배 정도) 읽힌다;;


public static Object invokeObjectMethod(Object object, String methodName,

                                                               Class[] paramClasses, Object[] params)  throws Exception
    {

       //아래의 삼항 연산자의 사용은 훌륭하다. 모든 Object형은 Class(타입)형 or Object(인스턴스)형 이다.(인터페이스 깜박했네

       //인터페이스도 결국 타입이지..)

        Class cls = object instanceof Class ? (Class)object : object.getClass(); 
        Method method = null;
        Object value = null;

        //클래스 계층을 순회하면서 메서드를 찾았다면 중단.

        while (cls != null && method == null)
        {
            try
            {
                method = cls.getDeclaredMethod(methodName, paramClasses); //메서드는 기본적으로 이름(타입,타입,타입)으로 식별

                //못찾으면 null이겠지 -_-a

                //내 기억으론 선언된 모든 메서드 몽땅 가져오는게 있었다. 그거라면 메서드 이름 몰라도 상관없이 실행가능..

                //정의된 메서드 객체를 가져오면 각 메서드마다 필요한 매개변수 정보도 가져올수 있었던가..? 기억이 가물..
                method.setAccessible(true); //public,private 깨부수기.. setAccessible()은 method가 null일 경우 조건 처리 안해도 되나?

                //modifier를 가져와서 내맘대로 요리할수도 있음;;
                value = method.invoke(object, params); //오브젝트=메서드가 정의된 클래스의 인스턴스와 오브젝트 배열=매개변수들로 

                //해당 메서드 수행해서 리턴값(메서드의 리턴결과)도 오브젝트 타입으로 받는다. 으하하 

                //다형성 만만세!
            }
            catch (NoSuchMethodException e) //메서드 못찾았으니 상위클래스 뒤져봐야지;;(하위 클래스가 필드 추가하고 생성자만 

            {                                                   //추가했을수 있으니.. 한마디로 재정의 메서드도 없고, 추가한 메서드도 없고..

                cls = cls.getSuperclass();
            }
            catch (IllegalAccessException e)
            {
                cls = null;
            }
        }

        return value; //얍삽하게? 메서드 수행결과를 얻어냈다. 
    }


=> reflect 활용하면.. 도대체 못할짓이 뭐냐 -_-;;


(추가)


모든 객체는 프로퍼티와 함수로 구성되어 있고, 해당 프로퍼티는 문자열의 이름을 갖고 있다. 함수도 문자열의 이름을 갖고 있다. 이름을 알고, 접근할 메서드도 있고, 함수를 수행할수 있는 로우레벨의 INVOKE도 알게 되었다. 

오픈소스 - 보안 이슈가 문득 머리를 스친다. 




(etc) iBatis vs Hibernate (나중에 여유되면 보기.. 빈 vs db간 동기화(매핑)를 지원하는 프레임워크 개념임)


http://blog.naver.com/killer10004?Redirect=Log&logNo=70105825997



(추가)


DB와 서버단에서 OO와 RDB의 갭을 조율해주는 미들웨어 이다. DI란 개념, CONFIG와 XML을 이용한 선언적인 처리, 

쿼리에 대한 자동 바인딩및 리절트 셋을 바로 OO 객체로 바인딩 해주는 기술로서.. 개발자의 어려움을 덜어준다.


다시 한번 느끼지만.. 이 당시 이 개념을 한번 접해둔게, 추후 많은 이해에 도움이 되었다. 아는 만큼 볼수 있으며 아는만

큼 상대에게 종속되지 않고 능동적이 될 수 있다. 힘내자!



by givingsheart 2014. 1. 1. 16:12

http://bankienkate.tistory.com/1



http://blog.naver.com/PostView.nhn?blogId=leeyoon0607&logNo=70141623447  <-- 10번 이상 볼것! (현재 3회 - 중단)


기타 별로 볼건 없지만 java ee 기반 프레임웍..책소개-_-; (이름도 기억안남;;)



(추가) EE.. 객체의 라이프 사이클 관리, 트랜잭션 관리등 .. 정말 지원하는게 많은 시스템이다. 이것을 억지로 공부해둔 

덕분에.. 스프링이란 경량 프레임워크를 접근하는데 도움을 받았다.

'자바ee api > 삽질' 카테고리의 다른 글

자바ee 삽질 (2013/12/02)  (0) 2014.01.01
by givingsheart 2014. 1. 1. 16:10
자바 보안 관련 블로그




파이썬 보안 문서(자바도 쬐금 들었음)

http://heehiee.codns.com:9000/060611/0_%B8%B6%C0%CC%C5%A9%B7%CE%BC%D2%C7%C1%C6%AE%C0%E2%C1%F6/2002/9%BF%F9%C8%A3/New!%20About/0209-380.pdf




자바에서 보안관련 패키지 

java.security.MassegeDigest :요놈 생성해서,..update() 해서 사용하면 끝~~~ 초간단? 
(생성은 스태틱 메서드인   getInstance (String  algorithm)  매개변수는 "MD5" or "SHA")

이 MessageDigest 클래스는, MD5 또는 SHA 등의 메세지 다이제스트 알고리즘의 기능을 제공합니다. 메세지 다이제스트는, 
임의 사이즈의 데이터를 취득해 고정장의 해시치를 출력하는 안전한 한방향의 해시 기능입니다.

MessageDigest 객체는, 초기화되어 기동됩니다. 데이터는, MessageDigest 객체를 개입시켜 update 메소드를 사용해 처리됩니다. 
reset 메소드를 호출하는 것으로, 임의의 시점에서 다이제스트를 리셋 할 수 있습니다. 갱신 대상의 데이터가 모두 갱신된 시점에서,
digest 메소드의 1 개를 호출하는 것으로, 해시 계산을 종료할 필요가 있습니다.

digest 메소드는, 지정 회수의 갱신에 대해서 1 회 호출하는 것만으로 끝납니다. digest 메소드의 호출이 종료한 뒤, MessageDigest 
객체는 초기화 상태에 리셋 됩니다.

Cloneable 인터페이스는, 자유롭게 구현할 수 있습니다. 클라이언트 어플리케이션은, 복제의 생성을 시행해 CloneNotSupportedException 
를 캐치 하면, 복제의 생성이 가능한가 어떤가를 조사할 수가 있습니다.

MessageDigest md = MessageDigest.getInstance("SHA");

try {
md.update(toChapter1);
MessageDigest tc1 = md.clone();
byte[] toChapter1Digest = tc1.digest();
md.update(toChapter2);
...등
} catch (CloneNotSupportedException cnse) {
throw new DigestException("couldn't make digest of partial content");
 }

********************************************************************

java.security 
클래스 KeyFactory

X509EncodedKeySpec bobPubKeySpec = new X509EncodedKeySpec(bobEncodedPubKey);
KeyFactory keyFactory = KeyFactory.getInstance("DSA");
PublicKey bobPubKey = keyFactory.generatePublic(bobPubKeySpec);
Signature sig = Signature.getInstance("DSA");
sig.initVerify(bobPubKey);
sig.update(data);
sig.verify(signature);

*******************************************************************
(RSA 관련 블로그)
http://blog.naver.com/PostView.nhn?blogId=nttkak&logNo=20130239694</p></div>



(추가)

나는 요때부터 보안에도 관심을 가졌었구나.. 하긴 오래전 게임 회사 일할때.. 해킹및 불법 사용자 문제로 고생을 했었지... 실제 서비스를 제공한다고 했을때, 보안이란 문제의 비중은 결코 가볍지 않다.

'프로그래밍 > 보안' 카테고리의 다른 글

jvm의 입장?  (0) 2014.01.02
패킷 암호화 코드 긁어온것 ㅠㅠ  (0) 2014.01.01
by givingsheart 2014. 1. 1. 16:09
상호 배척의 필터 개념인가? 아니면 서로 포장(데코레이트)될수 있는 필터인가?

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

일단 가정하는 것이.. core api들이 제공하는 클래스,메서드 등은 뻑날 확률이 거의 없다.


한마디로 내가 만든 클래스,메서드에 오류가 있을 확률이 99.9%..

이클립스 콘솔창에 콜 스택의 상태가 전부 뿌려지는데..

이중 core api가 제공한 메서드는 가볍게 무시해주고.. 내가 만든 클래스의 메서드를 찾아서
해당 라인을 찾아보자~ (분명 예전에도 수업때 지적해주신것 같은데.. 이제 와서 깨우침 OTL)


by givingsheart 2014. 1. 1. 16:08