두 개의 호환되지 않는 인터페이스를 연결해 주기 위한 패턴으로 새로운 기능의 클래스가 기존의 다른 인터페이스 기능을 사용하려고 할 때 두 인터페이스를 연결하는 용도로 사용할 수 있다.카드리더기를 예로 들 수 있는데 메모리 카드와 노트북 사이에서 노트북이 메모리 카드를 사용할 수 있도록 도와주는 것이다.A가 B의 기능을 사용해야 한다면 A의 인터페이스로 Adapter를 만들고 Adapter가 B를 사용하도록 설계하면 B의 인터페이스가 변하더라도 A의 변경없이 Adapter만을 변경하여 사용할 수 있다.https://www.tutorialspoint.com/design_pattern/adapter_pattern.htm
Java는 메모리를 할당 받는 것은 개발자가 원하는 만큼 받을 수 있지만 해제는 개발자의 영역이 아닌 JVM의 영역이다. 이 Garbage Collection는 Garbage Collector(이하 GC)에 의해서 수행되며 할당된 객체가 더이상 참조되지 않을 경우 수행되게 된다.GC는 개발자가 메모리를 명시적으로 해제해야 하는 고민을 덜어 주었지만 의도와 다른 GC 수행으로 잠시 멈추는 현상인해 CPU를 많이 사용하는 프로그램의 경우 어려운 상황을 초래하기도 한다.Hotspot의 GC Hotspot은 Generational Collection 방식을 사용하는데 익히 들어왔던 것과 같이 Heap영역을 Young Generation과 Old Generation으로 나누는 것이다.객체가 처음 생성되는 영역은 ..
Object class는 자바에서 기본적으로 상속을 받는 클래스로 항상 사용은 하고 있지만 Object 의 메소드는 자주 사용하지 않아서 정확한 사용방법을 모르는 경우가 많다. 나도 정확히 모르는 부분이 있어서 java API와 실제 구현 소스를 보고 정리를 해 보았다.참고 API URL : https://docs.oracle.com/javase/7/docs/api/java/lang/Object.htmlpublic native final Class getClass() 객체의 런타임 class를 반환해 준다. 이 반환되는 Class object는 static syncronized methods에 의해서 잠겨있다.public native int hashCode() 이 메소드는 각 객체의 hashCode를 만..
log파일에서 중복 데이터를 찾아야 하는 경우가 생겼을 때 아래의 명령어를 통하면 쉽게 찾을 수 있다. 물론 로그가 특정 키값을 갖도로 남아야 한다. 우선 로그파일을 모두 보면 명령어에 cat test.log특정 로그를 찾기 위한 필터를 한다. grep의 -a 는 해당 파일이 binary 형태일 경우 넣어준다. cat test.log | grep -a "SEND DATA"그리고 이 로그 중에 찾아야 추출해야 하는 부분을 awk 명령어를 통해서 빼낸다. 여기서 sub는 awk로 추출한 문자열 중 필요없는 문자를 빈 값인 ""로 치환하여 필요한 단어만 추출하는 기능을 한다. 필요한 만큼 sub( "aa", "");를 반복하여 사용해서 필요없는 문자를 지울 수 있다. cat test.log | grep -a ..
Scouter는 JVM을 모니터링 할 수 있는 오픈소스 성능 모니터링 툴로 기본 기능을 사용하기에는 정말 좋으며 tomcat은 상세하게 모니터링 할 수 있는 기능을 제공한다. Scouter는 Agent, Server, Client 세 부분으로 나눠진다. - Agent : jar 로 제공되며 모니터링을 할 JVM에 포함시켜서 같이 기동된다. - Server : Agent가 보내는 데이터를 수집하며 Client에게 데이터를 보내준다. - Client : Server에서 받은 정보를 화면에 보여준다. - Host : 서버의 cpu, memory, disk, network 등의 정보를 수집한다.모든 소스는 github에 있고 소스를 받아 빌드를 해볼 수 있고 release를 다운 받아 설치하여 사용할 수있다.빌..
이번에 개발한 API서버의 성능 테스트를 진행하면서 모니터링을 위해 Thread, CPU, Memory, 개발한 connection pool, Thread pool 등의 자원은 JMX를 사용하고, 처리 속도 및 병목 구간을 확인하기 위해서 Open Source APM인 Scouter를 적용해 보기로 했다. Scouter의 XLog를 사용하면 하나의 서비스에 대해 전체 호출 StackTrace를 확인할 수 있기 때문에 아주 유용할 것으로 보였다.JMXJMX는 체크해야할 클래스의 정보를 MBean Interface를 통해 확인하고 데이터를 변경할 수 있다. 방법은 interface를 만들고 간단하게 MBeanServer에 등록하면 된다.(Interface를 만들 때 get/set를 지켜줘야 하고 Interf..
RESTful API(이하 rest)는 client, server 구조로 client가 서버의 자원을 HTTP를 사용하여 손쉽게 접근할 수 있게 해준다.URL : Resource HTTP Method : 자원을 어떻게 사용할 것인가(행동) Response : 응답Resource - 자원은 상위에서 하위로 표현하며 명사형과 하위를 포함하는 자원일 경우 복수형을 사용한다.- 새로운 버전을 위한 Controller로 Response 분리 또는 Reverse Proxy를 이용하여 서버를 물리적으로 분리 sub domain을 쓸 수 있다면 => GET http://api.fakehost/v1/things sub domain을 쓸 수 없다면 => GET http://fakehost/api/v1/things- Met..
WAS사용 시 Scouter에서는 자동으로 서비스를 감지하여 XLog를 확인해 볼 수 있으니 그 외의 일반적인 어플리케이션의 경우에는 별도의 설정을 해야한다.hook 적용 방법 경로https://github.com/scouter-project/scouter/blob/master/scouter.document/use-case/NON-HTTP-Service-Trace_kr.md단계 1, 2를 진행한 상태에서 모니터링을 해보면 Scouter가 호출되는 모든 메소드를 XLog에 남겨준다. _trace_auto_service_enabled=false 이 설정은 재기동과 상관없이 Scouter의 Configuration을 클릭하면 나오는 창에서 설정을 변경하면 바로 반영된다.원하는 메소드가 private, prot..
TCP_NODELAY : 데이터 송수신에 Nagle알고리즘(가능하면 데이터를 나누어 보내지 말고 한꺼번에 보내라)의 비활성화 여부를 지정한다. (TCP/IP의 헤더 크기는 약 50바이트)SO_KEEPALIVE : 운영제체에서 지정된 시간에 한번씩 keepalive 패킷을 상대방에게 전송한다.SO_SNDBUF : 송신할 커널 송신버퍼 크기SO_RCVBUF : 수신할 커널 수신버퍼 크기SO_REUSEADDR : TIME_WAIT상태의 포트를 서버 소켓이 바인딩 할 수 있게 한다.SO_LINGER : 소켓을 닫을 때 커널의 송신 버퍼에 전송되지 않은 데이터의 전송 대기시간을 지정SO_BACKLOG : 동시에 수용 가능한 소켓 연결 요청 수. TCP 핸드 셰이크 중 SYN를 전송하고 SYN-ACK 패킷을 전송하..
자바에서는 IO와 NIO라는 두 종류의 입/출력을 제공하고 있다. IO는 Blocking 입출력이며 NIO는 Non Blocking 입출력이다. 참고로 여기서 입력과 출력을 구분 짓는 것은 자신의 메모리의 외부(파일, 네트워크)에서 메모리로 가져오는 것을 입력, 자신의 메모리에서 외부로 내보내는 것을 출력이라 한다. * IOIO에서 Blocking이 되는 부분은 ServerSocket의 accept()와 Socket의 read()가 있다. Blocking이 된다는 것은 이 작업을 수행하는 Thread가 다른 일을 하지 못 하고 호출한 Method가 종료될 때까지 기다려야 한다는 것을 뜻한다. ServerSocket의 accept에서의 Blocking을 극복하기 위해서 보통 IO는 accept의 반환값인 ..