SlideShare una empresa de Scribd logo
1 de 36
Descargar para leer sin conexión
Open API Client 개발


            NHN Technology Service
                  신규서비스 개발팀
                            정상혁
목차



1. 예제

2. 개발 원칙

3. 라이브러리
1. 예제
        1.1 예제 위치
        1.2 공통 모듈
        1.3 검색 API
        1.4 단축 URL API
1.1 예제 위치

  SVN, Maven, Eclipse 활용
    SVN
     https://dev.naver.com/svn/naverapis/trunk/naver-java-client-samples/

     ID : anonsvn
     Password : anonsvn
    Maven 프로젝트
    Checkout후 mvn eclipse:eclipse로 이클립스 프로젝트 생성




                                                                            4
1.2 공통 모듈

  URL 연결 담당 클래스
    ResourceConnector.java :GET 요청 공통 interface
    SimpleConnector.java : JDK의 URLConnection 활용
    HttpClient3Connector.java: Apache HttpClient 3.x 활용
    HttpClient4Connector.java: Apache HttpComponent 4.x 활용




                                                             5
1.3 검색 API

  RSS 라이브러리 ROME 활용
    SearchApiClient.java
    SearchApiClientTest.java
     파일로 파싱 테스트
    SearchApiClientIntegationTest
     실제 API 서버와 연결해서 테스트
    Spring RestTemplate + ROME 활용
     NaverSearchHttpMessageConverter.java
       메시지 파싱 모듈
     NaverSearchRestTemplateTest.java

                                            6
1.4 단축 URL API

  JAXB2 활용
    ShortUrlApiClientJaxbImpl.java
    ShortUrlApiClientJaxbImplTest.java
      파일을 이용해서 파싱만을 테스트
    ShortUrlApiClientJaxbImplIntegrationTest.java
      실제 서버와 연결 테스트




                                                    7
1.4 단축 URL API

  JacksonJson Object mapping 활용
    ShortUrlApiClientJsonMapperImpl.java
    ShortUrlApiClientJsonMapperImplTest.java
    ShortUrlApiClientJsonMapperImplIntegrationTest.java
    LinkProcessorJsonMapperImpl.java
       API의 결과 값과 매핑하는 목표 객체의 형태가 다를 때
    LinkProcessorJsonMapperImplTest.java
    ShortUrlRestTemplateTest
       Spring rest template 활용



                                                          8
1.4 단축 URL API

  JacksonJson Streaming 활용
    LinkProcessorJsonStreamImpl.java
    LinkProcessorJsonStreamImplTest.java




                                           9
2. 개발 원칙
           2.1 어느 클라이언트 코드
           2.2 예외에 대비하라
           2.3 성능을 높이고 메모리를 아껴라
           2.4 쓰레드 안정성을 늘 의식해라
           2.5 모듈별 역할과 책임을 구분해라
           2.6 다시 보는 어느 클라이언트 코드
2.1 어느 클라이언트 코드

 무엇을 걱정해야 할까?

  public User findUser(String userId) {
    String response = HttpUtils.callGet(API_URL + userId);
    String username = ParseUtils.getTagValue(response, "username");
    String address = ParseUtils.getTagValue(response, "address");
    return new User(userId, username, address);
  }




                                                                      11
2.2 예외에 대비하라

 Timeout을 설정하라
   전체 Application의 스레드 풀을 고갈시킬 수도 있다.
    (501 error)
   설정 예
    Tomcat max thread가 500개, max TPS(Transaction per
    second)가 100일 때 API timeout을 4초로 설정




                                                       12
2.2 예외에 대비하라

 Timeout을 설정하라
    JDK URLConnection


  public InputStream open(String url) throws IOException {
    URLConnection con = new URL(url).openConnection();
    con.setConnectTimeout(this.connectTimeoutMilsec);
    con.setReadTimeout(this.readTimeoutMilsec);
    return con.getInputStream();
  }




                                                             13
2.2 예외에 대비하라

 Timeout을 설정하라
    Apache HttpClient 3.x

  HttpConnectionManagerParams params = new HttpConnectionManager-
  Params();
  params.setConnectionTimeout(connectTimeoutMilsec);
  params.setSoTimeout(readTimeoutMilsec);
  params.setDefaultMaxConnectionsPerHost(100);
  params.setMaxTotalConnections(100);

  connManager = new MultiThreadedHttpConnectionManager();
  connManager.setParams(params);
  this.httpClient = new HttpClient(connManager);




                                                                    14
2.2 예외에 대비하라

 Timeout을 설정하라
     Apache HttpComponent 4.x

  connManager = new ThreadSafeClientConnManager();
  connManager.setMaxTotal(100);
  connManager.setDefaultMaxPerRoute(100);

  HttpClient client = new DefaultHttpClient(connManager);
  client.getParams().setIntParameter(CoreConnectionPNames.CONNECTION_T
  IMEOUT, connectTimeoutMilsec);
  client.getParams().setIntParameter(CoreConnectionPNames.SO_TIMEOUT,
  readTimeoutMilsec);

  this.httpClient = client;




                                                                         15
2.2 예외에 대비하라

 예외 상황을 테스트하라
   예외메시지 파싱을 테스트하라.
    예외 메시지 파일을 따로 저장해서 테스트
    Text based protocol의 장점을 활용
   통합 테스트도 자동화하면 도움이 된다.
    매일 돌리다보면 정기 점검 일때, 서버 상태가 이상할 때를 만
    날 수도 있다.
    때로는 스펙에 명시되지 않은 동작까지 알 수 있다.




                                         16
2.3 성능을 높이고 메모리를 아껴라

 불필요한 중간 객체를 생성하지 마라
   과도한 로깅
   파싱 모듈에서도 Stream을 바로 활용해라.




                               17
2.3 성능을 높이고 메모리를 아껴라

 명시적으로 DOM을 쓰지 마라
   Event base인 SAX에 비해서 비효율적.
   XStream은 Stream based의 처리
   JAXB는 보다 high level의 추상화 계층
   SAX, StAX(Streaming API for XML) 등 활용 가능




                                              18
2.3 성능을 높이고 메모리를 아껴라

 Connection Pool을 시도해라
   Apache HttpClient 3.x
    MultiThreadedHttpConnectionManager 활용
    DefaultMaxConnectionsPerHost’ 값 주의
    Default는 2. 성능에 악영향.
    Concurrent user * 2 값이 바람직
   Apache HttpComponent 4.x
    ThreadSafeClientConnManager 활용
    defaultMaxPerRoute 속성의 default값 주의



                                            19
2.3 성능을 높이고 메모리를 아껴라

 여러 API를 함께 쓴다면 병렬 실행을 고려해라
   JDK concurrent API (ExecutorService)
   Apache HttpClientd의 HttpAsyncClient
   Jetty HttpClient
  얼마만큼 효과가 있을지는 해봐야 안다.




                                          20
2.4 쓰레드 안정성을 늘 의식해라

 쓰레드 안정하지 않은 객체를 파악하라
  HttpCient 3.x
     MultiThreadedHttpConnectionManager를 사용하지 않을 때의
    HttpClient
    HttpMethod, HttpState, HostConfigureation
  HttpComponent 4.x
    HttpGet, HttpPost
  Jaxb2
    Marshaller, Unmarshaller
  JacksonJson
    JsonParser


                                                      21
2.4 쓰레드 안정성을 늘 의식해라

 쓰레드 안전한 객체는 매번 생성하지 말라.
  Apache HttpCient 3.x
    MultiThreadedHttpConnectionManager를 사용 할 때의 HttpCli-
    ent
  Apache HttpComponent 4.x
    DefaultHttpClient
    SingleClientConnManager, ThreadSafeClientConnManager
  Jaxb2
    JAXBContext
  JacksonJson
    Thread-safe after configuration : ObjectMapper, JsonFactory


                                                                  22
2.4 쓰레드 안정성을 늘 의식해라

 쓰레드 안전한 객체는 매번 생성하지 말라.
  사례 : Spring의 RestTemplate을 매번 생성한다면?
   RestTemplated의 기본 생성자는 StringHttpMessageCon-
   verter를 생성
   StringHttpMessageConverter는 생성자에서 encoding을 위
   해 시스템이 지원하는 character set을 확인하게 됨
    charsets.jar 파일 안의 객체를 동적 로딩하게 되는데, 동적 로
   딩을 하는 jdk 코드 내 synchronize로 감싼 코드로 인해 lock-
   ing
   길지 않은 Lock구간이지만 대량 요청 시에는 문제가 됨


                                                   23
2.4 쓰레드 안정성을 늘 의식해라

 쓰레드 안전한 객체는 매번 생성하지 말라.
  사례 : Spring의 RestTemplate을 매번 생성한다면?
    Thread dump

  at java.nio.charset.Charset$1.getNext(Charset.java:317)
  at java.nio.charset.Charset$1.hasNext(Charset.java:332)
  at java.nio.charset.Charset$4.run(Charset.java:551)
  at java.security.AccessController.doPrivileged(Native Method)
  at java.nio.charset.Charset.availableCharsets(Charset.java:546)
  at org.springframework.http.converter.StringHttpMessageConverter.
  (StringHttpMessageConverter.java:52)




                                                                      24
2.4 쓰레드 안정성을 늘 의식해라

 라이브러리를 늘 의심해라
  문서에 스레드 안정성에 대한 언급이 없으면 안전하지 않다고 가
 정해라.
  먼저 검색해봐라.
  사례 : XStream 1.3.1의 버그
   'Infinite loop due to unsafe collection usage'
        http://jira.codehaus.org/browse/XSTR-584
   WeakHashMap을 Threadsafe하지 않게 접근
   무한루프 -> CPU 100%
   네할렘 서버 교체 시기에 나타남
   1.4.0에서 패치됨
                                                    25
2.5 모듈별 역할과 책임을 구분하라

 추상화 계층을 활용해라
  구현체를 갈아 끼울 수 있는 계층 활용
  예) Spring OXM
  직접 정의한 추상화 계층
  여러 프로젝트에서 공유될 수 있도록 해라




                           26
2.5 모듈별 역할과 책임을 구분하라

 통신모듈과 파싱 모듈을 구분해서 구현해라.
  변화 대응 속도가 빨라진다.
   예) 통신 모듈 사용 라이브러리를 바꿀 때.
       Apache HttpClient 3.x => HttpComponent 4.x
  테스트 용이성
   예) 예상되는 결과를 파일에서 읽어서 파싱 모듈만을 테스트하
   기




                                                    27
2.6 다시 보는 어느 클라이언드 코드

 무엇을 걱정해야 할까?
  public User findUser(String userId) {
    String response = HttpUtils.callGet(API_URL + userId);
    String username = ParseUtils.getTagValue(response, "username");
    String address = ParseUtils.getTagValue(response, "address");
    return new User(userId, username, address);
  }


  비정상적인 응답은 어떻게 테스트할까?
  String response대신 Stream으로 넘길 수도 있지 않을까?
  ParseUtils에서는 반복적으로 처음부터 문자열을 검색하지는




                                                                      28
3. 라이브러리
           3.1 Java URLConnection
           3.2 Apache HttpClient 3.x
           3.3 Apache HttpComponet 4.x
           3.4 Jetty HttpClient
           3.5 Spring RestTemplate



                                         29
3.1 Java URLConnection

  기본 JDK 포함
    의존성 추가가 없음.
    HTTP의 용어와 직관적으로 대응되지는 않음.
     POST 요청
      URLConnection.setDoOutput(true);
     Header 설정
       URLConnection.setRequestProperty("Content-Type",
      "text/plain");




                                                          30
3.2 Apache HttpClient 3.x

  많이 쓰였던 라이브러리
    레거시 코드에 많이 보임
    Dependency


   <dependency>
     <groupId>commons-httpclient</groupId>
     <artifactId>commons-httpclient</artifactId>
     <version>3.1</version>
   </dependency>




                                                   31
3.2 Apache HttpComponent 4.x

  3.x의 새 얼굴
   API 대거 개선. 3.x대와 호환성이 없음
   Dependency

   <dependency>
     <groupId>org.apache.httpcomponents</groupId>
     <artifactId>httpclient</artifactId>
     <version>4.1.3</version>
   </dependency>

   <dependency>
     <groupId>org.apache.httpcomponents</groupId>
     <artifactId>httpasyncclient</artifactId>
     <version>4.0-beta3</version>
   </dependency>
                                                    32
3.2 Apache HttpComponent 4.x

  3.x의 새 얼굴
   명확한 Thread safety 문서화

   @NotThreadSafe
   public class HttpGet extends HttpRequestBase {

   @ThreadSafe
   public class DefaultHttpClient extends AbstractHttpClient {

   @ThreadSafe
   public class SingleClientConnManager implements Client-
   ConnectionManager {



                                                                 33
3.4 Jetty HttpClient

  Async 실행을 기본적으로 지원
    dependency

   <dependency>
     <groupId>org.eclipse.jetty</groupId>
     <artifactId>jetty-client</artifactId>
     <version>8.1.7.v20120910</version>
   </dependency>




                                             34
3.5 Spring RestTemplate

  여러 통신 모듈과 파싱모듈의 추상화 계층.

    통신 모듈에 Apache Http Client 3,4와 URLConnection 사용
    파싱 모듈에 Jaxb, Jacksonjson등의 다양한 기본 구현체 제공
    확장 가능
    Spring Android에서도 제공
     Android 버전에 따라서 통신 라이브러리를 권장하는 것으로 알
     아서 선택해줌.
       진저브래드(2.3)전에는 구글에서 Apache HttpCompon-
       ents 권장



                                                      35
정리

 검증된 라이브러리로 안전하게, 효율적으로, 유연하게
     안전하게
      쓰레드 안정성, Timeout, 예외 테스트
     효율적으로
      Stream활용, Connection pool, Async 검토
     유연하게
      역할과 책임 구분, 추상화 계층
     추천 라이브러리
      Http Component 4.x, Jetty HttpClient
      Spring RestTemplate
      JAXB2, JacksonJson
                                             36

Más contenido relacionado

La actualidad más candente

Json view 예제 설명
Json view 예제 설명Json view 예제 설명
Json view 예제 설명Hyung Eun Jin
 
막하는 스터디 첫 번째 만남 Node.js
막하는 스터디 첫 번째 만남 Node.js막하는 스터디 첫 번째 만남 Node.js
막하는 스터디 첫 번째 만남 Node.js연웅 조
 
5-5. html5 connectivity
5-5. html5 connectivity5-5. html5 connectivity
5-5. html5 connectivityJinKyoungHeo
 
제 4회 DGMIT R&D 컨퍼런스 : REST API - 리소스 지향적 아키텍처
제 4회 DGMIT R&D 컨퍼런스 : REST API - 리소스 지향적 아키텍처제 4회 DGMIT R&D 컨퍼런스 : REST API - 리소스 지향적 아키텍처
제 4회 DGMIT R&D 컨퍼런스 : REST API - 리소스 지향적 아키텍처dgmit2009
 
Nodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjsNodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjs기동 이
 
Node.js DBMS short summary
Node.js DBMS short summaryNode.js DBMS short summary
Node.js DBMS short summaryHoChul Shin
 
RESTful API 설계
RESTful API 설계RESTful API 설계
RESTful API 설계Jinho Yoo
 
JSP 빠르게 시작하기
JSP 빠르게 시작하기JSP 빠르게 시작하기
JSP 빠르게 시작하기Park JoongSoo
 
[오픈소스컨설팅]Spring MVC
[오픈소스컨설팅]Spring MVC [오픈소스컨설팅]Spring MVC
[오픈소스컨설팅]Spring MVC Ji-Woong Choi
 
이벤트 기반 분산 시스템을 향한 여정
이벤트 기반 분산 시스템을 향한 여정이벤트 기반 분산 시스템을 향한 여정
이벤트 기반 분산 시스템을 향한 여정Arawn Park
 
파크히어 Realm 사용 사례
파크히어 Realm 사용 사례파크히어 Realm 사용 사례
파크히어 Realm 사용 사례선협 이
 
진짜기초 Node.js
진짜기초 Node.js진짜기초 Node.js
진짜기초 Node.jsWoo Jin Kim
 
Pinpoint spring_camp 2015
Pinpoint spring_camp 2015Pinpoint spring_camp 2015
Pinpoint spring_camp 2015Woonduk-Kang
 
(C#,네트워크강좌)간단한 TCP 클라이언트/서버 구현, 멀티쓰레드 기반 에코우 클라이언트/서버_C추천#/WPF/자마린실무교육학원
(C#,네트워크강좌)간단한 TCP 클라이언트/서버 구현, 멀티쓰레드 기반 에코우 클라이언트/서버_C추천#/WPF/자마린실무교육학원(C#,네트워크강좌)간단한 TCP 클라이언트/서버 구현, 멀티쓰레드 기반 에코우 클라이언트/서버_C추천#/WPF/자마린실무교육학원
(C#,네트워크강좌)간단한 TCP 클라이언트/서버 구현, 멀티쓰레드 기반 에코우 클라이언트/서버_C추천#/WPF/자마린실무교육학원탑크리에듀(구로디지털단지역3번출구 2분거리)
 
막하는스터디 두번째만남 Express(20151025)
막하는스터디 두번째만남 Express(20151025)막하는스터디 두번째만남 Express(20151025)
막하는스터디 두번째만남 Express(20151025)연웅 조
 
Ksug 세미나 (윤성준) (20121208)
Ksug 세미나 (윤성준) (20121208)Ksug 세미나 (윤성준) (20121208)
Ksug 세미나 (윤성준) (20121208)Sungjoon Yoon
 
spring.io를 통해 배우는 spring 개발사례
spring.io를 통해 배우는 spring 개발사례spring.io를 통해 배우는 spring 개발사례
spring.io를 통해 배우는 spring 개발사례Daehwan Lee
 
[D2SF] Naver 오픈 API 가이드
[D2SF] Naver 오픈 API 가이드[D2SF] Naver 오픈 API 가이드
[D2SF] Naver 오픈 API 가이드NAVER D2 STARTUP FACTORY
 

La actualidad más candente (20)

Json view 예제 설명
Json view 예제 설명Json view 예제 설명
Json view 예제 설명
 
막하는 스터디 첫 번째 만남 Node.js
막하는 스터디 첫 번째 만남 Node.js막하는 스터디 첫 번째 만남 Node.js
막하는 스터디 첫 번째 만남 Node.js
 
5-5. html5 connectivity
5-5. html5 connectivity5-5. html5 connectivity
5-5. html5 connectivity
 
제 4회 DGMIT R&D 컨퍼런스 : REST API - 리소스 지향적 아키텍처
제 4회 DGMIT R&D 컨퍼런스 : REST API - 리소스 지향적 아키텍처제 4회 DGMIT R&D 컨퍼런스 : REST API - 리소스 지향적 아키텍처
제 4회 DGMIT R&D 컨퍼런스 : REST API - 리소스 지향적 아키텍처
 
Nodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjsNodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjs
 
Node.js DBMS short summary
Node.js DBMS short summaryNode.js DBMS short summary
Node.js DBMS short summary
 
RESTful API 설계
RESTful API 설계RESTful API 설계
RESTful API 설계
 
JSP 빠르게 시작하기
JSP 빠르게 시작하기JSP 빠르게 시작하기
JSP 빠르게 시작하기
 
[오픈소스컨설팅]Spring MVC
[오픈소스컨설팅]Spring MVC [오픈소스컨설팅]Spring MVC
[오픈소스컨설팅]Spring MVC
 
이벤트 기반 분산 시스템을 향한 여정
이벤트 기반 분산 시스템을 향한 여정이벤트 기반 분산 시스템을 향한 여정
이벤트 기반 분산 시스템을 향한 여정
 
파크히어 Realm 사용 사례
파크히어 Realm 사용 사례파크히어 Realm 사용 사례
파크히어 Realm 사용 사례
 
진짜기초 Node.js
진짜기초 Node.js진짜기초 Node.js
진짜기초 Node.js
 
Pinpoint spring_camp 2015
Pinpoint spring_camp 2015Pinpoint spring_camp 2015
Pinpoint spring_camp 2015
 
(C#,네트워크강좌)간단한 TCP 클라이언트/서버 구현, 멀티쓰레드 기반 에코우 클라이언트/서버_C추천#/WPF/자마린실무교육학원
(C#,네트워크강좌)간단한 TCP 클라이언트/서버 구현, 멀티쓰레드 기반 에코우 클라이언트/서버_C추천#/WPF/자마린실무교육학원(C#,네트워크강좌)간단한 TCP 클라이언트/서버 구현, 멀티쓰레드 기반 에코우 클라이언트/서버_C추천#/WPF/자마린실무교육학원
(C#,네트워크강좌)간단한 TCP 클라이언트/서버 구현, 멀티쓰레드 기반 에코우 클라이언트/서버_C추천#/WPF/자마린실무교육학원
 
Spring boot actuator
Spring boot   actuatorSpring boot   actuator
Spring boot actuator
 
Node.js 기본
Node.js 기본Node.js 기본
Node.js 기본
 
막하는스터디 두번째만남 Express(20151025)
막하는스터디 두번째만남 Express(20151025)막하는스터디 두번째만남 Express(20151025)
막하는스터디 두번째만남 Express(20151025)
 
Ksug 세미나 (윤성준) (20121208)
Ksug 세미나 (윤성준) (20121208)Ksug 세미나 (윤성준) (20121208)
Ksug 세미나 (윤성준) (20121208)
 
spring.io를 통해 배우는 spring 개발사례
spring.io를 통해 배우는 spring 개발사례spring.io를 통해 배우는 spring 개발사례
spring.io를 통해 배우는 spring 개발사례
 
[D2SF] Naver 오픈 API 가이드
[D2SF] Naver 오픈 API 가이드[D2SF] Naver 오픈 API 가이드
[D2SF] Naver 오픈 API 가이드
 

Destacado

[Hello world 오픈세미나]거인을 이용해 뻔뻔(fun fun)하게 돈 벌기
[Hello world 오픈세미나]거인을 이용해 뻔뻔(fun fun)하게 돈 벌기[Hello world 오픈세미나]거인을 이용해 뻔뻔(fun fun)하게 돈 벌기
[Hello world 오픈세미나]거인을 이용해 뻔뻔(fun fun)하게 돈 벌기NAVER D2
 
[Hello world 오픈세미나]소셜게임 a to z final
[Hello world 오픈세미나]소셜게임 a to z final[Hello world 오픈세미나]소셜게임 a to z final
[Hello world 오픈세미나]소셜게임 a to z finalNAVER D2
 
[Hello world 오픈세미나]공공정보와 네이버 오픈api
[Hello world 오픈세미나]공공정보와 네이버 오픈api[Hello world 오픈세미나]공공정보와 네이버 오픈api
[Hello world 오픈세미나]공공정보와 네이버 오픈apiNAVER D2
 
MSA를 이용해 구현하는 고가용/고확장성 서비스
MSA를 이용해 구현하는 고가용/고확장성 서비스MSA를 이용해 구현하는 고가용/고확장성 서비스
MSA를 이용해 구현하는 고가용/고확장성 서비스DoHyun Jung
 
[Hello world]nodejs helloworld chaesuwon
[Hello world]nodejs helloworld chaesuwon[Hello world]nodejs helloworld chaesuwon
[Hello world]nodejs helloworld chaesuwonNAVER D2
 
[Hello world]git internal
[Hello world]git internal[Hello world]git internal
[Hello world]git internalNAVER D2
 
[Hello world]play framework소개
[Hello world]play framework소개[Hello world]play framework소개
[Hello world]play framework소개NAVER D2
 
[Hello world]n forge
[Hello world]n forge[Hello world]n forge
[Hello world]n forgeNAVER D2
 
제2회 hello world 오픈세미나 collie html5-animationlibrary
제2회 hello world 오픈세미나 collie html5-animationlibrary제2회 hello world 오픈세미나 collie html5-animationlibrary
제2회 hello world 오픈세미나 collie html5-animationlibraryNAVER D2
 
제2회 hello world 오픈세미나 Web Audio API-가능성엿보기
제2회 hello world 오픈세미나 Web Audio API-가능성엿보기제2회 hello world 오픈세미나 Web Audio API-가능성엿보기
제2회 hello world 오픈세미나 Web Audio API-가능성엿보기NAVER D2
 
제2회 hello world 오픈세미나 hello world-raphael차트
제2회 hello world 오픈세미나 hello world-raphael차트제2회 hello world 오픈세미나 hello world-raphael차트
제2회 hello world 오픈세미나 hello world-raphael차트NAVER D2
 
공공 데이터 활용 방법론 - 오픈 API 기술 및 동향 (KRNET 2014)
공공 데이터 활용 방법론 - 오픈 API 기술 및 동향 (KRNET 2014)공공 데이터 활용 방법론 - 오픈 API 기술 및 동향 (KRNET 2014)
공공 데이터 활용 방법론 - 오픈 API 기술 및 동향 (KRNET 2014)Channy Yun
 
[Hello world 오픈세미나]실시간웹을위한comet과socket.io
[Hello world 오픈세미나]실시간웹을위한comet과socket.io[Hello world 오픈세미나]실시간웹을위한comet과socket.io
[Hello world 오픈세미나]실시간웹을위한comet과socket.ioNAVER D2
 
[Hello world 오픈 세미나]ffmpeg android
[Hello world 오픈 세미나]ffmpeg android[Hello world 오픈 세미나]ffmpeg android
[Hello world 오픈 세미나]ffmpeg androidNAVER D2
 
[Hello world 오픈 세미나]oauth
[Hello world 오픈 세미나]oauth[Hello world 오픈 세미나]oauth
[Hello world 오픈 세미나]oauthNAVER D2
 

Destacado (15)

[Hello world 오픈세미나]거인을 이용해 뻔뻔(fun fun)하게 돈 벌기
[Hello world 오픈세미나]거인을 이용해 뻔뻔(fun fun)하게 돈 벌기[Hello world 오픈세미나]거인을 이용해 뻔뻔(fun fun)하게 돈 벌기
[Hello world 오픈세미나]거인을 이용해 뻔뻔(fun fun)하게 돈 벌기
 
[Hello world 오픈세미나]소셜게임 a to z final
[Hello world 오픈세미나]소셜게임 a to z final[Hello world 오픈세미나]소셜게임 a to z final
[Hello world 오픈세미나]소셜게임 a to z final
 
[Hello world 오픈세미나]공공정보와 네이버 오픈api
[Hello world 오픈세미나]공공정보와 네이버 오픈api[Hello world 오픈세미나]공공정보와 네이버 오픈api
[Hello world 오픈세미나]공공정보와 네이버 오픈api
 
MSA를 이용해 구현하는 고가용/고확장성 서비스
MSA를 이용해 구현하는 고가용/고확장성 서비스MSA를 이용해 구현하는 고가용/고확장성 서비스
MSA를 이용해 구현하는 고가용/고확장성 서비스
 
[Hello world]nodejs helloworld chaesuwon
[Hello world]nodejs helloworld chaesuwon[Hello world]nodejs helloworld chaesuwon
[Hello world]nodejs helloworld chaesuwon
 
[Hello world]git internal
[Hello world]git internal[Hello world]git internal
[Hello world]git internal
 
[Hello world]play framework소개
[Hello world]play framework소개[Hello world]play framework소개
[Hello world]play framework소개
 
[Hello world]n forge
[Hello world]n forge[Hello world]n forge
[Hello world]n forge
 
제2회 hello world 오픈세미나 collie html5-animationlibrary
제2회 hello world 오픈세미나 collie html5-animationlibrary제2회 hello world 오픈세미나 collie html5-animationlibrary
제2회 hello world 오픈세미나 collie html5-animationlibrary
 
제2회 hello world 오픈세미나 Web Audio API-가능성엿보기
제2회 hello world 오픈세미나 Web Audio API-가능성엿보기제2회 hello world 오픈세미나 Web Audio API-가능성엿보기
제2회 hello world 오픈세미나 Web Audio API-가능성엿보기
 
제2회 hello world 오픈세미나 hello world-raphael차트
제2회 hello world 오픈세미나 hello world-raphael차트제2회 hello world 오픈세미나 hello world-raphael차트
제2회 hello world 오픈세미나 hello world-raphael차트
 
공공 데이터 활용 방법론 - 오픈 API 기술 및 동향 (KRNET 2014)
공공 데이터 활용 방법론 - 오픈 API 기술 및 동향 (KRNET 2014)공공 데이터 활용 방법론 - 오픈 API 기술 및 동향 (KRNET 2014)
공공 데이터 활용 방법론 - 오픈 API 기술 및 동향 (KRNET 2014)
 
[Hello world 오픈세미나]실시간웹을위한comet과socket.io
[Hello world 오픈세미나]실시간웹을위한comet과socket.io[Hello world 오픈세미나]실시간웹을위한comet과socket.io
[Hello world 오픈세미나]실시간웹을위한comet과socket.io
 
[Hello world 오픈 세미나]ffmpeg android
[Hello world 오픈 세미나]ffmpeg android[Hello world 오픈 세미나]ffmpeg android
[Hello world 오픈 세미나]ffmpeg android
 
[Hello world 오픈 세미나]oauth
[Hello world 오픈 세미나]oauth[Hello world 오픈 세미나]oauth
[Hello world 오픈 세미나]oauth
 

Similar a [Hello world 오픈세미나]open api client개발

스프링 어플리케이션의 문제해결사례와 안티패턴
스프링 어플리케이션의 문제해결사례와 안티패턴스프링 어플리케이션의 문제해결사례와 안티패턴
스프링 어플리케이션의 문제해결사례와 안티패턴Sanghyuk Jung
 
Spring MVC
Spring MVCSpring MVC
Spring MVCymtech
 
[오픈소스컨설팅]Fault Tolerance Architecture by Netflix
[오픈소스컨설팅]Fault Tolerance Architecture by Netflix[오픈소스컨설팅]Fault Tolerance Architecture by Netflix
[오픈소스컨설팅]Fault Tolerance Architecture by NetflixJi-Woong Choi
 
파이썬 플라스크 이해하기
파이썬 플라스크 이해하기 파이썬 플라스크 이해하기
파이썬 플라스크 이해하기 Yong Joon Moon
 
Spring boot 공작소(1-4장)
Spring boot 공작소(1-4장)Spring boot 공작소(1-4장)
Spring boot 공작소(1-4장)Choonghyun Yang
 
Open source apm scouter를 통한 관제 관리 jadecross 정환열 수석
Open source apm scouter를 통한 관제  관리 jadecross 정환열 수석Open source apm scouter를 통한 관제  관리 jadecross 정환열 수석
Open source apm scouter를 통한 관제 관리 jadecross 정환열 수석uEngine Solutions
 
Netty 세미나
Netty 세미나Netty 세미나
Netty 세미나Jang Hoon
 
ParameterizedTest 와 ContextCaching.pptx
ParameterizedTest 와 ContextCaching.pptxParameterizedTest 와 ContextCaching.pptx
ParameterizedTest 와 ContextCaching.pptxjunu6
 
스프링군살없이세팅하기(The way to setting the Spring framework for web.)
스프링군살없이세팅하기(The way to setting the Spring framework for web.)스프링군살없이세팅하기(The way to setting the Spring framework for web.)
스프링군살없이세팅하기(The way to setting the Spring framework for web.)EunChul Shin
 
[Study]HeadFirst JSP&servlet chapter5
[Study]HeadFirst JSP&servlet chapter5[Study]HeadFirst JSP&servlet chapter5
[Study]HeadFirst JSP&servlet chapter5Hyeonseok Yang
 
Introduction to Fork Join Framework_SYS4U I&C
Introduction to Fork Join Framework_SYS4U I&CIntroduction to Fork Join Framework_SYS4U I&C
Introduction to Fork Join Framework_SYS4U I&Csys4u
 
파이썬 웹 프로그래밍 2탄
파이썬 웹 프로그래밍 2탄 파이썬 웹 프로그래밍 2탄
파이썬 웹 프로그래밍 2탄 SeongHyun Ahn
 
Sonarqube 20160509
Sonarqube 20160509Sonarqube 20160509
Sonarqube 20160509영석 조
 
04.실행환경 교육교재(화면처리)
04.실행환경 교육교재(화면처리)04.실행환경 교육교재(화면처리)
04.실행환경 교육교재(화면처리)Hankyo
 
SpringCamp 2013 : About Jdk8
SpringCamp 2013 : About Jdk8SpringCamp 2013 : About Jdk8
SpringCamp 2013 : About Jdk8Sangmin Lee
 

Similar a [Hello world 오픈세미나]open api client개발 (20)

스프링 어플리케이션의 문제해결사례와 안티패턴
스프링 어플리케이션의 문제해결사례와 안티패턴스프링 어플리케이션의 문제해결사례와 안티패턴
스프링 어플리케이션의 문제해결사례와 안티패턴
 
Spring MVC
Spring MVCSpring MVC
Spring MVC
 
[오픈소스컨설팅]Fault Tolerance Architecture by Netflix
[오픈소스컨설팅]Fault Tolerance Architecture by Netflix[오픈소스컨설팅]Fault Tolerance Architecture by Netflix
[오픈소스컨설팅]Fault Tolerance Architecture by Netflix
 
파이썬 플라스크 이해하기
파이썬 플라스크 이해하기 파이썬 플라스크 이해하기
파이썬 플라스크 이해하기
 
Servlet3
Servlet3Servlet3
Servlet3
 
Spring boot 공작소(1-4장)
Spring boot 공작소(1-4장)Spring boot 공작소(1-4장)
Spring boot 공작소(1-4장)
 
Open source apm scouter를 통한 관제 관리 jadecross 정환열 수석
Open source apm scouter를 통한 관제  관리 jadecross 정환열 수석Open source apm scouter를 통한 관제  관리 jadecross 정환열 수석
Open source apm scouter를 통한 관제 관리 jadecross 정환열 수석
 
Netty 세미나
Netty 세미나Netty 세미나
Netty 세미나
 
ParameterizedTest 와 ContextCaching.pptx
ParameterizedTest 와 ContextCaching.pptxParameterizedTest 와 ContextCaching.pptx
ParameterizedTest 와 ContextCaching.pptx
 
4-3. jquery
4-3. jquery4-3. jquery
4-3. jquery
 
Java(2/4)
Java(2/4)Java(2/4)
Java(2/4)
 
스프링군살없이세팅하기(The way to setting the Spring framework for web.)
스프링군살없이세팅하기(The way to setting the Spring framework for web.)스프링군살없이세팅하기(The way to setting the Spring framework for web.)
스프링군살없이세팅하기(The way to setting the Spring framework for web.)
 
Springmvc
SpringmvcSpringmvc
Springmvc
 
[Study]HeadFirst JSP&servlet chapter5
[Study]HeadFirst JSP&servlet chapter5[Study]HeadFirst JSP&servlet chapter5
[Study]HeadFirst JSP&servlet chapter5
 
Introduction to Fork Join Framework_SYS4U I&C
Introduction to Fork Join Framework_SYS4U I&CIntroduction to Fork Join Framework_SYS4U I&C
Introduction to Fork Join Framework_SYS4U I&C
 
파이썬 웹 프로그래밍 2탄
파이썬 웹 프로그래밍 2탄 파이썬 웹 프로그래밍 2탄
파이썬 웹 프로그래밍 2탄
 
Sonarqube 20160509
Sonarqube 20160509Sonarqube 20160509
Sonarqube 20160509
 
Annotation
AnnotationAnnotation
Annotation
 
04.실행환경 교육교재(화면처리)
04.실행환경 교육교재(화면처리)04.실행환경 교육교재(화면처리)
04.실행환경 교육교재(화면처리)
 
SpringCamp 2013 : About Jdk8
SpringCamp 2013 : About Jdk8SpringCamp 2013 : About Jdk8
SpringCamp 2013 : About Jdk8
 

Más de NAVER D2

[211] 인공지능이 인공지능 챗봇을 만든다
[211] 인공지능이 인공지능 챗봇을 만든다[211] 인공지능이 인공지능 챗봇을 만든다
[211] 인공지능이 인공지능 챗봇을 만든다NAVER D2
 
[233] 대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing: Maglev Hashing Scheduler i...
[233] 대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing: Maglev Hashing Scheduler i...[233] 대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing: Maglev Hashing Scheduler i...
[233] 대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing: Maglev Hashing Scheduler i...NAVER D2
 
[215] Druid로 쉽고 빠르게 데이터 분석하기
[215] Druid로 쉽고 빠르게 데이터 분석하기[215] Druid로 쉽고 빠르게 데이터 분석하기
[215] Druid로 쉽고 빠르게 데이터 분석하기NAVER D2
 
[245]Papago Internals: 모델분석과 응용기술 개발
[245]Papago Internals: 모델분석과 응용기술 개발[245]Papago Internals: 모델분석과 응용기술 개발
[245]Papago Internals: 모델분석과 응용기술 개발NAVER D2
 
[236] 스트림 저장소 최적화 이야기: 아파치 드루이드로부터 얻은 교훈
[236] 스트림 저장소 최적화 이야기: 아파치 드루이드로부터 얻은 교훈[236] 스트림 저장소 최적화 이야기: 아파치 드루이드로부터 얻은 교훈
[236] 스트림 저장소 최적화 이야기: 아파치 드루이드로부터 얻은 교훈NAVER D2
 
[235]Wikipedia-scale Q&A
[235]Wikipedia-scale Q&A[235]Wikipedia-scale Q&A
[235]Wikipedia-scale Q&ANAVER D2
 
[244]로봇이 현실 세계에 대해 학습하도록 만들기
[244]로봇이 현실 세계에 대해 학습하도록 만들기[244]로봇이 현실 세계에 대해 학습하도록 만들기
[244]로봇이 현실 세계에 대해 학습하도록 만들기NAVER D2
 
[243] Deep Learning to help student’s Deep Learning
[243] Deep Learning to help student’s Deep Learning[243] Deep Learning to help student’s Deep Learning
[243] Deep Learning to help student’s Deep LearningNAVER D2
 
[234]Fast & Accurate Data Annotation Pipeline for AI applications
[234]Fast & Accurate Data Annotation Pipeline for AI applications[234]Fast & Accurate Data Annotation Pipeline for AI applications
[234]Fast & Accurate Data Annotation Pipeline for AI applicationsNAVER D2
 
Old version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing
Old version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load BalancingOld version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing
Old version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load BalancingNAVER D2
 
[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지
[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지
[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지NAVER D2
 
[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기
[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기
[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기NAVER D2
 
[224]네이버 검색과 개인화
[224]네이버 검색과 개인화[224]네이버 검색과 개인화
[224]네이버 검색과 개인화NAVER D2
 
[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)
[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)
[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)NAVER D2
 
[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기
[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기
[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기NAVER D2
 
[213] Fashion Visual Search
[213] Fashion Visual Search[213] Fashion Visual Search
[213] Fashion Visual SearchNAVER D2
 
[232] TensorRT를 활용한 딥러닝 Inference 최적화
[232] TensorRT를 활용한 딥러닝 Inference 최적화[232] TensorRT를 활용한 딥러닝 Inference 최적화
[232] TensorRT를 활용한 딥러닝 Inference 최적화NAVER D2
 
[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지
[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지
[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지NAVER D2
 
[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터
[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터
[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터NAVER D2
 
[223]기계독해 QA: 검색인가, NLP인가?
[223]기계독해 QA: 검색인가, NLP인가?[223]기계독해 QA: 검색인가, NLP인가?
[223]기계독해 QA: 검색인가, NLP인가?NAVER D2
 

Más de NAVER D2 (20)

[211] 인공지능이 인공지능 챗봇을 만든다
[211] 인공지능이 인공지능 챗봇을 만든다[211] 인공지능이 인공지능 챗봇을 만든다
[211] 인공지능이 인공지능 챗봇을 만든다
 
[233] 대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing: Maglev Hashing Scheduler i...
[233] 대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing: Maglev Hashing Scheduler i...[233] 대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing: Maglev Hashing Scheduler i...
[233] 대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing: Maglev Hashing Scheduler i...
 
[215] Druid로 쉽고 빠르게 데이터 분석하기
[215] Druid로 쉽고 빠르게 데이터 분석하기[215] Druid로 쉽고 빠르게 데이터 분석하기
[215] Druid로 쉽고 빠르게 데이터 분석하기
 
[245]Papago Internals: 모델분석과 응용기술 개발
[245]Papago Internals: 모델분석과 응용기술 개발[245]Papago Internals: 모델분석과 응용기술 개발
[245]Papago Internals: 모델분석과 응용기술 개발
 
[236] 스트림 저장소 최적화 이야기: 아파치 드루이드로부터 얻은 교훈
[236] 스트림 저장소 최적화 이야기: 아파치 드루이드로부터 얻은 교훈[236] 스트림 저장소 최적화 이야기: 아파치 드루이드로부터 얻은 교훈
[236] 스트림 저장소 최적화 이야기: 아파치 드루이드로부터 얻은 교훈
 
[235]Wikipedia-scale Q&A
[235]Wikipedia-scale Q&A[235]Wikipedia-scale Q&A
[235]Wikipedia-scale Q&A
 
[244]로봇이 현실 세계에 대해 학습하도록 만들기
[244]로봇이 현실 세계에 대해 학습하도록 만들기[244]로봇이 현실 세계에 대해 학습하도록 만들기
[244]로봇이 현실 세계에 대해 학습하도록 만들기
 
[243] Deep Learning to help student’s Deep Learning
[243] Deep Learning to help student’s Deep Learning[243] Deep Learning to help student’s Deep Learning
[243] Deep Learning to help student’s Deep Learning
 
[234]Fast & Accurate Data Annotation Pipeline for AI applications
[234]Fast & Accurate Data Annotation Pipeline for AI applications[234]Fast & Accurate Data Annotation Pipeline for AI applications
[234]Fast & Accurate Data Annotation Pipeline for AI applications
 
Old version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing
Old version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load BalancingOld version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing
Old version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing
 
[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지
[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지
[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지
 
[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기
[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기
[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기
 
[224]네이버 검색과 개인화
[224]네이버 검색과 개인화[224]네이버 검색과 개인화
[224]네이버 검색과 개인화
 
[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)
[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)
[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)
 
[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기
[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기
[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기
 
[213] Fashion Visual Search
[213] Fashion Visual Search[213] Fashion Visual Search
[213] Fashion Visual Search
 
[232] TensorRT를 활용한 딥러닝 Inference 최적화
[232] TensorRT를 활용한 딥러닝 Inference 최적화[232] TensorRT를 활용한 딥러닝 Inference 최적화
[232] TensorRT를 활용한 딥러닝 Inference 최적화
 
[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지
[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지
[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지
 
[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터
[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터
[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터
 
[223]기계독해 QA: 검색인가, NLP인가?
[223]기계독해 QA: 검색인가, NLP인가?[223]기계독해 QA: 검색인가, NLP인가?
[223]기계독해 QA: 검색인가, NLP인가?
 

[Hello world 오픈세미나]open api client개발

  • 1. Open API Client 개발 NHN Technology Service 신규서비스 개발팀 정상혁
  • 2. 목차 1. 예제 2. 개발 원칙 3. 라이브러리
  • 3. 1. 예제 1.1 예제 위치 1.2 공통 모듈 1.3 검색 API 1.4 단축 URL API
  • 4. 1.1 예제 위치 SVN, Maven, Eclipse 활용 SVN https://dev.naver.com/svn/naverapis/trunk/naver-java-client-samples/ ID : anonsvn Password : anonsvn Maven 프로젝트 Checkout후 mvn eclipse:eclipse로 이클립스 프로젝트 생성 4
  • 5. 1.2 공통 모듈 URL 연결 담당 클래스 ResourceConnector.java :GET 요청 공통 interface SimpleConnector.java : JDK의 URLConnection 활용 HttpClient3Connector.java: Apache HttpClient 3.x 활용 HttpClient4Connector.java: Apache HttpComponent 4.x 활용 5
  • 6. 1.3 검색 API RSS 라이브러리 ROME 활용 SearchApiClient.java SearchApiClientTest.java 파일로 파싱 테스트 SearchApiClientIntegationTest 실제 API 서버와 연결해서 테스트 Spring RestTemplate + ROME 활용 NaverSearchHttpMessageConverter.java 메시지 파싱 모듈 NaverSearchRestTemplateTest.java 6
  • 7. 1.4 단축 URL API JAXB2 활용 ShortUrlApiClientJaxbImpl.java ShortUrlApiClientJaxbImplTest.java 파일을 이용해서 파싱만을 테스트 ShortUrlApiClientJaxbImplIntegrationTest.java 실제 서버와 연결 테스트 7
  • 8. 1.4 단축 URL API JacksonJson Object mapping 활용 ShortUrlApiClientJsonMapperImpl.java ShortUrlApiClientJsonMapperImplTest.java ShortUrlApiClientJsonMapperImplIntegrationTest.java LinkProcessorJsonMapperImpl.java API의 결과 값과 매핑하는 목표 객체의 형태가 다를 때 LinkProcessorJsonMapperImplTest.java ShortUrlRestTemplateTest Spring rest template 활용 8
  • 9. 1.4 단축 URL API JacksonJson Streaming 활용 LinkProcessorJsonStreamImpl.java LinkProcessorJsonStreamImplTest.java 9
  • 10. 2. 개발 원칙 2.1 어느 클라이언트 코드 2.2 예외에 대비하라 2.3 성능을 높이고 메모리를 아껴라 2.4 쓰레드 안정성을 늘 의식해라 2.5 모듈별 역할과 책임을 구분해라 2.6 다시 보는 어느 클라이언트 코드
  • 11. 2.1 어느 클라이언트 코드 무엇을 걱정해야 할까? public User findUser(String userId) { String response = HttpUtils.callGet(API_URL + userId); String username = ParseUtils.getTagValue(response, "username"); String address = ParseUtils.getTagValue(response, "address"); return new User(userId, username, address); } 11
  • 12. 2.2 예외에 대비하라 Timeout을 설정하라 전체 Application의 스레드 풀을 고갈시킬 수도 있다. (501 error) 설정 예 Tomcat max thread가 500개, max TPS(Transaction per second)가 100일 때 API timeout을 4초로 설정 12
  • 13. 2.2 예외에 대비하라 Timeout을 설정하라 JDK URLConnection public InputStream open(String url) throws IOException { URLConnection con = new URL(url).openConnection(); con.setConnectTimeout(this.connectTimeoutMilsec); con.setReadTimeout(this.readTimeoutMilsec); return con.getInputStream(); } 13
  • 14. 2.2 예외에 대비하라 Timeout을 설정하라 Apache HttpClient 3.x HttpConnectionManagerParams params = new HttpConnectionManager- Params(); params.setConnectionTimeout(connectTimeoutMilsec); params.setSoTimeout(readTimeoutMilsec); params.setDefaultMaxConnectionsPerHost(100); params.setMaxTotalConnections(100); connManager = new MultiThreadedHttpConnectionManager(); connManager.setParams(params); this.httpClient = new HttpClient(connManager); 14
  • 15. 2.2 예외에 대비하라 Timeout을 설정하라 Apache HttpComponent 4.x connManager = new ThreadSafeClientConnManager(); connManager.setMaxTotal(100); connManager.setDefaultMaxPerRoute(100); HttpClient client = new DefaultHttpClient(connManager); client.getParams().setIntParameter(CoreConnectionPNames.CONNECTION_T IMEOUT, connectTimeoutMilsec); client.getParams().setIntParameter(CoreConnectionPNames.SO_TIMEOUT, readTimeoutMilsec); this.httpClient = client; 15
  • 16. 2.2 예외에 대비하라 예외 상황을 테스트하라 예외메시지 파싱을 테스트하라. 예외 메시지 파일을 따로 저장해서 테스트 Text based protocol의 장점을 활용 통합 테스트도 자동화하면 도움이 된다. 매일 돌리다보면 정기 점검 일때, 서버 상태가 이상할 때를 만 날 수도 있다. 때로는 스펙에 명시되지 않은 동작까지 알 수 있다. 16
  • 17. 2.3 성능을 높이고 메모리를 아껴라 불필요한 중간 객체를 생성하지 마라 과도한 로깅 파싱 모듈에서도 Stream을 바로 활용해라. 17
  • 18. 2.3 성능을 높이고 메모리를 아껴라 명시적으로 DOM을 쓰지 마라 Event base인 SAX에 비해서 비효율적. XStream은 Stream based의 처리 JAXB는 보다 high level의 추상화 계층 SAX, StAX(Streaming API for XML) 등 활용 가능 18
  • 19. 2.3 성능을 높이고 메모리를 아껴라 Connection Pool을 시도해라 Apache HttpClient 3.x MultiThreadedHttpConnectionManager 활용 DefaultMaxConnectionsPerHost’ 값 주의 Default는 2. 성능에 악영향. Concurrent user * 2 값이 바람직 Apache HttpComponent 4.x ThreadSafeClientConnManager 활용 defaultMaxPerRoute 속성의 default값 주의 19
  • 20. 2.3 성능을 높이고 메모리를 아껴라 여러 API를 함께 쓴다면 병렬 실행을 고려해라 JDK concurrent API (ExecutorService) Apache HttpClientd의 HttpAsyncClient Jetty HttpClient 얼마만큼 효과가 있을지는 해봐야 안다. 20
  • 21. 2.4 쓰레드 안정성을 늘 의식해라 쓰레드 안정하지 않은 객체를 파악하라 HttpCient 3.x MultiThreadedHttpConnectionManager를 사용하지 않을 때의 HttpClient HttpMethod, HttpState, HostConfigureation HttpComponent 4.x HttpGet, HttpPost Jaxb2 Marshaller, Unmarshaller JacksonJson JsonParser 21
  • 22. 2.4 쓰레드 안정성을 늘 의식해라 쓰레드 안전한 객체는 매번 생성하지 말라. Apache HttpCient 3.x MultiThreadedHttpConnectionManager를 사용 할 때의 HttpCli- ent Apache HttpComponent 4.x DefaultHttpClient SingleClientConnManager, ThreadSafeClientConnManager Jaxb2 JAXBContext JacksonJson Thread-safe after configuration : ObjectMapper, JsonFactory 22
  • 23. 2.4 쓰레드 안정성을 늘 의식해라 쓰레드 안전한 객체는 매번 생성하지 말라. 사례 : Spring의 RestTemplate을 매번 생성한다면? RestTemplated의 기본 생성자는 StringHttpMessageCon- verter를 생성 StringHttpMessageConverter는 생성자에서 encoding을 위 해 시스템이 지원하는 character set을 확인하게 됨 charsets.jar 파일 안의 객체를 동적 로딩하게 되는데, 동적 로 딩을 하는 jdk 코드 내 synchronize로 감싼 코드로 인해 lock- ing 길지 않은 Lock구간이지만 대량 요청 시에는 문제가 됨 23
  • 24. 2.4 쓰레드 안정성을 늘 의식해라 쓰레드 안전한 객체는 매번 생성하지 말라. 사례 : Spring의 RestTemplate을 매번 생성한다면? Thread dump at java.nio.charset.Charset$1.getNext(Charset.java:317) at java.nio.charset.Charset$1.hasNext(Charset.java:332) at java.nio.charset.Charset$4.run(Charset.java:551) at java.security.AccessController.doPrivileged(Native Method) at java.nio.charset.Charset.availableCharsets(Charset.java:546) at org.springframework.http.converter.StringHttpMessageConverter. (StringHttpMessageConverter.java:52) 24
  • 25. 2.4 쓰레드 안정성을 늘 의식해라 라이브러리를 늘 의심해라 문서에 스레드 안정성에 대한 언급이 없으면 안전하지 않다고 가 정해라. 먼저 검색해봐라. 사례 : XStream 1.3.1의 버그 'Infinite loop due to unsafe collection usage' http://jira.codehaus.org/browse/XSTR-584 WeakHashMap을 Threadsafe하지 않게 접근 무한루프 -> CPU 100% 네할렘 서버 교체 시기에 나타남 1.4.0에서 패치됨 25
  • 26. 2.5 모듈별 역할과 책임을 구분하라 추상화 계층을 활용해라 구현체를 갈아 끼울 수 있는 계층 활용 예) Spring OXM 직접 정의한 추상화 계층 여러 프로젝트에서 공유될 수 있도록 해라 26
  • 27. 2.5 모듈별 역할과 책임을 구분하라 통신모듈과 파싱 모듈을 구분해서 구현해라. 변화 대응 속도가 빨라진다. 예) 통신 모듈 사용 라이브러리를 바꿀 때. Apache HttpClient 3.x => HttpComponent 4.x 테스트 용이성 예) 예상되는 결과를 파일에서 읽어서 파싱 모듈만을 테스트하 기 27
  • 28. 2.6 다시 보는 어느 클라이언드 코드 무엇을 걱정해야 할까? public User findUser(String userId) { String response = HttpUtils.callGet(API_URL + userId); String username = ParseUtils.getTagValue(response, "username"); String address = ParseUtils.getTagValue(response, "address"); return new User(userId, username, address); } 비정상적인 응답은 어떻게 테스트할까? String response대신 Stream으로 넘길 수도 있지 않을까? ParseUtils에서는 반복적으로 처음부터 문자열을 검색하지는 28
  • 29. 3. 라이브러리 3.1 Java URLConnection 3.2 Apache HttpClient 3.x 3.3 Apache HttpComponet 4.x 3.4 Jetty HttpClient 3.5 Spring RestTemplate 29
  • 30. 3.1 Java URLConnection 기본 JDK 포함 의존성 추가가 없음. HTTP의 용어와 직관적으로 대응되지는 않음. POST 요청 URLConnection.setDoOutput(true); Header 설정 URLConnection.setRequestProperty("Content-Type", "text/plain"); 30
  • 31. 3.2 Apache HttpClient 3.x 많이 쓰였던 라이브러리 레거시 코드에 많이 보임 Dependency <dependency> <groupId>commons-httpclient</groupId> <artifactId>commons-httpclient</artifactId> <version>3.1</version> </dependency> 31
  • 32. 3.2 Apache HttpComponent 4.x 3.x의 새 얼굴 API 대거 개선. 3.x대와 호환성이 없음 Dependency <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.1.3</version> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpasyncclient</artifactId> <version>4.0-beta3</version> </dependency> 32
  • 33. 3.2 Apache HttpComponent 4.x 3.x의 새 얼굴 명확한 Thread safety 문서화 @NotThreadSafe public class HttpGet extends HttpRequestBase { @ThreadSafe public class DefaultHttpClient extends AbstractHttpClient { @ThreadSafe public class SingleClientConnManager implements Client- ConnectionManager { 33
  • 34. 3.4 Jetty HttpClient Async 실행을 기본적으로 지원 dependency <dependency> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-client</artifactId> <version>8.1.7.v20120910</version> </dependency> 34
  • 35. 3.5 Spring RestTemplate 여러 통신 모듈과 파싱모듈의 추상화 계층. 통신 모듈에 Apache Http Client 3,4와 URLConnection 사용 파싱 모듈에 Jaxb, Jacksonjson등의 다양한 기본 구현체 제공 확장 가능 Spring Android에서도 제공 Android 버전에 따라서 통신 라이브러리를 권장하는 것으로 알 아서 선택해줌. 진저브래드(2.3)전에는 구글에서 Apache HttpCompon- ents 권장 35
  • 36. 정리 검증된 라이브러리로 안전하게, 효율적으로, 유연하게 안전하게 쓰레드 안정성, Timeout, 예외 테스트 효율적으로 Stream활용, Connection pool, Async 검토 유연하게 역할과 책임 구분, 추상화 계층 추천 라이브러리 Http Component 4.x, Jetty HttpClient Spring RestTemplate JAXB2, JacksonJson 36