2017의 게시물 표시

Write Me...: blogger 에 마크다운(Markdown) 적용하기

Write Me...: blogger 에 마크다운(Markdown) 적용하기 : 블로거를 다시 시작하면서 맥북에서 사용하는 블로그 앱들 중에 iA Writer 라는 앱을 소개했었습니다. iA Writer 에서 주요하게 다루는 markdown 문서를 알게 되었고, 문서작성에서 상당히 유용한 방식이라고 합니다. m... css 적용 후 <article class="markdown-body"> 블로그 내용 </article>

RESTful 자바 패턴과 실전 응용: 3장 보안과 추적성

이미지
3장 보안과 추적성 REST API 로깅 javax.servlet.Filter를 활용하고, log4j를 이용한 REST API 로깅 예제. 대규모 분산 환경에서 로그 데이터는 개발자가 디버깅을 시작할 수 있는 거의 유일한 단서이다. 따라서, 로깅은 서버 문제를 추척하고 오류가 발생하기 직전까지의 과정을 재연하는데 상당한 도움이 된다. 이를위해 로그는 아래와 같은 정보를 포함하여야 한다. 현재 날짜/시간 로깅 레벨 스레드명 간단한 로거명 상세한 메시지 최초 호출자(initiator) 또한, 요청 관련 메타 정보(요청 실행 소요 시간, 요청 상태, 요청 객체의 크기 등 상세한 정보)를 로깅하면 성능 이슈나 응답 지연 문제를 조사하는데 도움이 된다. 아래와 같은 민감한 데이터는 마스킹 또는 숨김처리를 해야한다. 고객 정보(신용카드 정보) 암호: 패스워드 은닉기(obfuscator) 개인 식별 정보(Personally Identifiable Information): 성명, 이메일, 신용카드 번호 -> 치환, 셔플링, 암호화 기법으로 마스킹 처리한다. 더 자세한 정보는  Data Masking 참고. 기본적으로 민감한 정보를 다루는 리소스의 페이로드는 로깅을 하지 않는다. 로깅 시스템을 모니터링 시스템과 연계하면 백그라운드로 SLA 지표 등 통계 관련 자료를 수집할 수 있다. 페이스 북은 스크립(Scribe) 이라는 자체 솔루션을 개발했고, 구글은 대퍼(Dapper) 라는 수천 개의 요청으로부터 데이터를 샘플링하여 추적 가능할 정도의 충분한 데이터로 가공하여 저장한다. 대부분의 경우 충분한 양의 샘플링만으로도 상세한 내용을 추적하는데 큰 도움이 된다는 것이 밝혀졌다. RESTful 서비스 검증 JAX-RS는 리소스 클래스를 검증하기 위한 Bean Validation 기능을 갖고 있다. 아래의 두 단계를 거쳐 검증한다. 리소스 메소드 파라미터에 어노테이션을 붙여 제약...

RESTful 자바 패턴과 실전 응용: 2장 리소스 설계

2장 리소스 설계 Contents Negotiation (콘텐츠 협상) 동일한 URI의 리소스를 여러 가지 표현형으로 제공하여, 클라이언트가 원하는 하나를 선택할 수 있게 하는 것을 말한다. 콘텐츠 협상에는 HTTP 헤더를 이용하는 방법과 URL 패턴을 이용하는 두 가지 방법이 있다. HTTP 헤더를 이용해서 처리하는 것이 더 좋다. 복잡한 비즈니스 관련 문제들을 따로 분리하기 용이하기 때문이다. HTTP 헤더를 이용한 콘텐츠 협상 Accept Accept-Charset Accept-Encoding Accept-Language Accept-Ranges @Produces(MediaType.APPLICATION_JSON) HTTP 406 Not Acceptable : Accept 요청에 정의된 유형을 서비스할 수 없을 경우 HTTP 415 Unsupported Media Type : 요청 유형을 지원하지 않을 경우 Runtime Contents Negotiation in JAX-RS Variant JAX-RS 명세에서 Variant는 미디어 타입, 콘텐츠 언어, 콘텐츠 인코딩, ETags, 최근 변경 헤더, 기타 다른 필수 조건들이 조합된 객체로, 서버가 지원하는 리소스 표현형을 나타낸다. URL 패턴을 이용한 콘텐츠 협상 URL의 확장자(.xml, .json 등)에 따라 처리한다. 엔티티 제공자와 여러 가지 표현형 Java 클래스를 entity(representation)으로 변환하거나 역변환하는 방법들에 대해 설명한다. 변환은 Java Serializable 을 이용한다. Serialization은 MessageBodyWriter, Deserialization은 MessageBodyReader를 이용한다. MessageBodyReader Inbound entity -> Java로 deserialization Representation-to-Java Methods isRe...

RESTful 자바 패턴과 실전 응용: 1장 REST: 태생의 기원

1장 REST: 태생의 기원 SOA 방식의 웹 서비스가 오래동안 활용되어왔음 SOAP: Simple Object Access Protocol WSDL: Web Services Description Language SOAP/WSDL은 XML 기반의 표준이고, 서비스 간 엄격한 규칙이 정립된 상황에서 잘 작동한다. 점점 분산 서비스가 등장하고, 한 서비스는 자신이 클라이언트가 되어 다른 플랫폼에서 제공하는 API를 사용하게 되었다. 따라서, 여러 분산된 서비스 상호간에 손쉽게 정보를 주고 받아야할 필요성이 대두되었다. REST는 HTTP에 기반하여 HTTP가 가능한 곳이면 어디든 쓸 수 있다. REST 개요 REST는 HTTP 메소드와 URI 사용 등의 웹 표준을 준수하는 아키텍처 스타일로, 다음과 같은 기본 철학을 갖고 있다. 모든 리소스를 URI로 구별할 수 있다. 모든 리소스는 복수의 형태로 나타낼 수 있다. 모든 리소스는 HTTP 표준 메소드를 이용하여 접근/수정/생성/삭제할 수 있다. 서버에는 어떠한 상태 정보도 갖고 있지 않다. REST와 Stateless REST는 서버의 Stateless를 기본으로 한다. 클라이언트에서 서버로 전달되는 요청에 가능한 모든 정보가 포함되어 있어야 한다. 덕분에 요청에 대한 가시성(visibility), 신뢰성(reliability), 확장성(scalability)이 향상된다. Visibility: 요청에 대한 상세한 정보를 알고 싶을 때, 요청 객체를 다시 파헤쳐보지 않아도 되므로 Visibility가 좋아진다. Reliability: 서버 실행 중 부분적인 장애가 발생하여도 체크 포인트나 실행을 재개할 지점을 고려하지 않아도 되니 신뢰성(reliability)이 향상된다. Scalability: 서버 측에 상태를 따로 보관하지 않기 때문에 서버를 증설한 만큼 비례하여 요청 처리 한도가 증가한다. 리차드슨 성숙도 모델 RMM(Richardson matur...

RESTful 자바 패턴과 실전 응용: 4장 성능을 고려한 설계

4장 성능을 고려한 설계 Caching String caching header Expire Cache-Control private: 브라우저에서만 캐쉬 가능 public: 브라우저, 프록시, CDN 모두 캐쉬 가능 no-cache: 캐쉬 불가 no-store: 메모리에만 캐쉬 max-age : 리소스 유효 기간 (초) Weak caching header Last-Modified ETag Client -> Server: GET http://api.com/coffee/1234 Client <- Server: 200 OK with ETag "123456789" Client -> Server: GET http://api.com/coffee/1234 with If-None-Match "123456789" Client <- Server 200 OK with new ETag "abcdefghi" (변경된 리소스) 304 Not-Modified (변경되지 않은 경우) Stringly validating ETag match Weakly validating ETag match REST에서 비동기 작업 및 실행 시간이 긴 작업 비동기 요청 응답: 202 Accepted JAX-RS 2.0에 추가된 비동기 인터페이스와 클래스 Server-side AsyncResponse: 주입 가능한 JAX-RS 비동기 응답. 서버 측에서 비동기적으로 응답 처리할 수단 제공 @Suspended: 컨테이너가 HTTP 요청을 다음 스레드에서 처리하도록 지시 CompletionCallback: 요청 처리 완료 시 호출되는 callback ConnectionCallback: 접속과 관련된 비동기 응답의 라이프사이클 이벤트를 받는 비동기 요청 처리 라이프사이클 callback Client-side InvocationCallbac...

[Math] GCD & LCM

GCD(Greatest Common Divisor) & LCM(Least Common Multiple) 1. Find GCD of two number Method 1: use basic Euclidean algorithm. GCD(a, b) = GCD(b%a, a) Method 2: use extended Euclidean algorithm. GCD(a, b) = ax + by Let values of x and y calculated by the recursive call be x 1 and y 1 x = y 1 - ⌊b/a⌋ * x 1 y = x 1 2. Find LCM of two number LCM(a, b) * GCD(a, b) = a * b 3. Reference http://www.geeksforgeeks.org/mathematical-algorithms/#gcd

i++ vs ++i in C and C++

Prefer ++i over i++. In C language, there is no difference between ++i and i++. In C++, ++i has performance gain rather than i++ because of object copy. In detail, refer followings https://stackoverflow.com/questions/24853/what-is-the-difference-between-i-and-i https://stackoverflow.com/questions/24886/is-there-a-performance-difference-between-i-and-i-in-c

Android essentials summary

- Binder Binder is android-specific inter-process communication mechanism and RPC mechanism. Android does not use traditional system V IPC and does use binder, which is efficient and fast. In order to provide efficient IPC, binder driver was added in linux kernel. And for app, AIDL was provided and app developers can develop binder client and server easily without coding the marshalling/unmarshalling stuffs. - ASHMEM Asynchronous shared memory was added to android linux kernel. Compared to system V shared memory, ashmem releases kernel resources when nobody refers the shared memory and kernel can reclaim unpinned shared memory when memory runs low. When app shares large amount of data to other app or service such as surface data and image, passing data by using shared memory does not need to copy data and therefore shared memory outperforms other methods like socket. - AIDL AIDL(Android Interface Definition Language) is a kind of IDL specific to android. AIDL defines programmin...