빗썸 API를 보면 형기증이 나…

어지럽다.. 아니 형기증은 어지러운게 아니지

이거보고 이상한게 안 느껴지는 사람은 API싸개에 적합하지 않으니
진로를 바꾸기 바랍니다

  • https://api.bithumb.com/public/ticker/all_btc
  • https://api.bithumb.com/public/assetsstatus/BTC

나머지는 취향차이로 둘 수 있는데
참을 수 없는게 딱 2가지 있다

Intellij Idea – http api 테스트

intellij idea에서 자체적으로 http client를 제공하는데
*.http 파일에 설정해놓고 사용 가능하다.
postman도 공유 export 등등 다 가능하지만 소스코드에 넣어놓고 프로젝트별로 공유할 때는 이게 좀 더 편하다.

특히 API 만들때

남의 API 쓸 때 : Postman

사용법

예제보기

Tools – HttpClient – Open HTTP Requests Collection

파일생성

오른쪽클릭 – New – Http Request

MSA서비스에서의 API

개요

MSA는 API를 이용해 통신을 한다.
그런데…. 의존성이 생기니까 관리가 힘들다.
버전관리가 필요.

버전관리 방법

동시배포

의존성이 있는 모든것을 동시배포
그냥 전체배포라고 보면 된다.
* 서비스가 작을 때 가능
* 오류가 나면 매우 난감함
* DB스키마가 변경됐을 가능성이 크기 때문에 rollback도 쉽지가 않다.

소스코드 내에서 버전을 관리

컨트롤러, 라우터 등등에서
/v1/
/v2/
이런방법으로 버전을 표시
* 버전업이 자주 발생하면?
* 헷갈리겠지

배포시 태깅

jenkins, git-tag, docker, kubernetes 등등 사용해서 해결할 수 있는 부분
해놓으면 편하긴 하겠지만… 구현자체가 복잡하다.

결론은…

어떻게 배포를 해도 오류가능성이 존재하겠지만… 관리가 쉬운편이 더 낫지 않을까
적절한 방법을 골라서 정책을 정하고 지키는게 중요.

MSA에 필요한 API Doc의 종류

Human – Machine

API Doc은 Hunam, Machine – 두가지 버전이 필요하다.

Human

swagger

Machine

Hataoes
그리고 json형태의 doc???
에러로깅 방식..??
등 지원

Versioning(API Change log doc)

  1. history
  2. plan
    1. deprecated 일정예고
  3. current
    세가지 정보를 모두 표현해야한다

검증테스트

build runtime 버전 check
의존성 api들을 모두 기록해놓는다.
depends on – (auth-1.1)
depends on – (gis-201610)
….
기록해놓은 부분은 내가 참조했 버전이 맞는지 버전만 호출해서 확인.
의존성이 있는 MS들의 test 인스턴스가 떠있거나
docker-compose, kubernetes 등으로 관리되고 있어야 가능한 부분.
아닌가.. 버전만 확인하니까 git 주소만 알아도 가능할 것 같다.

유닛테스트일수도 있는데 좀 더 강하게 빌드시 확인을 해야한다.

API호출방법 – RESTful -> 멱등성Idempotent -> Stateless -> JWT

개요

멱등성 관련 : http://memo.polypia.net/archives/2505

  1. RESTful API를 쓰다보면
  2. 멱등성이 필요하고..
  3. 그러려면 Stateless 해야하고
  4. 그러기위해 JWT(JSON Web Token)를 지원하면 좋다.

JWT간략

JWT참고
http://bcho.tistory.com/999
https://jwt.io/
https://blog.outsider.ne.kr/1160

Claim기반 호출

HMAC을 이용한 보안
PPK필요

PPK(PublicPrivateKey)를 이용한 API인증

PlantUML Syntax:<br />
== authentication setting ==<br />
ResourceClient -> ResourceClient : when(deploy) generate ppk<br />
ResourceClient -> AuthDirector : send public key and target(ResourceProvider)<br />
AuthDirector -> ResourceProvider : push public key<br />
ResourceProvider -> AuthDirector : response success/fail<br />
AuthDirector -> ResourceClient : response success/fail</p>
<p>== call resource ==<br />
ResourceClient -> ResourceProvider : call resource with JWT<br />
ResourceProvider -> ResourceClient : response resource<br />

JWT을 적용해서 쓴다면 대략이정도 느낌이 되면 될것같다.
gradle, maven 테스트, 배포 타이밍에 적절한 조치가 필요할 것 같다.

local에서 할 때는 auth가 제역할을 못해줄 것 같으니

auth서버도 push를 하려면 ppk(auth-ppk)가 있어야하고 ResourceProvider은 auth-ppk(public key)를 가지고 있어야한다.

종이에 그릴땐 간단해보였는데 다시보니 좀 복잡해보인다. 좀 더 간소화 필요.

Facebook API. 그래프 API 탐색기 사용

탐새끼 : https://developers.facebook.com/tools/explorer

왜 이걸 쓰는가?

보통 OAuth Client샘플코드나 라이브러리를 만들어서 데이터를 확인하는데 그 과정을 거치려면 시간낭비도 심하고

코딩에 익숙하지 않거나 … 익숙하더라도 소셜API 호출에 익숙하지 않은 사람은 고생스럽다. OAuth가 표준이라고는 하지만 사이트마다 호출구조가 묘하게 다르기도 하고

facebookapiexplorer2

형광펜 표시한 부분만 API파라미터 넣어서 호출하면 된다. 예를들어

https://developers.facebook.com/docs/graph-api/reference/v2.8/user/feed

여기있는 feed호출을 보면

/{user-id}/feed

The feed of posts (including status updates) and links published by this person, or by others on this person’s profile. There are other edges which provide filtered versions of this edge:

  • /{user-id}/posts shows only the posts that were published by this person.
  • /{user-id}/tagged shows only the posts that this person was tagged in.

All of these derivative edges share the exact same reading structure, however /feed sh

 

라고 나와있으니 요즘 열받는 피자헛코리아 아이디를 넣어주고 feed를 넣고 호출 하면 결과가 출력된다.

/pizzahutkorea/feed

 

API 뽑고 쓰고 별로재미도 없는데 요즘 자주 하게 되네

자바Java Generic제네릭 콜백Callback 사용시 T.class를 대체Alternative하는 방법들…

결론 : 메서드의 파라미터로 받는다.
T가 있는데 굳이 파라미터로 새로 받으려면 좀 갑갑하지만… 괜히 두번하는것같아서 하기싫지만 현재 이 방법이 가장 좋은것 같다.

토끼 메세지큐 사용중..

//콜백인터페이스
public interface MQCallback<T extends HealthyMonkey> {

	Class<T> getThis();
	T onMessageReceived(T message);
}
//수신인터페이스
public interface MQReceiver<T extends HealthyMonkey> {

	T receive(MQCallback<T> callback) throws IOException;
}
//송신인터페이스
public interface MQSender<T extends HealthyMonkey>{

	void send(T domain) throws IOException;
	void send(List<T> domains) throws IOException;
}

위 구조로 만들었는데…. 메세지 프로토콜을 json형태로 정했는데…

<dependency>
  <groupId>net.sf.json-lib</groupId>
  <artifactId>json-lib</artifactId>
  <version>2.4</version>
  <classifier>jdk15</classifier>
</dependency>

 

위에놈을 가지고 jsonString을 domain으로 만들려고 하니 문제가 생기는거다.

T t = (T)JSONObject.toBean(jsonObject, T.class);

를 쓰고싶은데 안되니까… 그래서 콜백에 메서드를 한개 추가해줬다. getThis() 위의 소스코드는 밑의 메서드가 포함되어있다.

T t = (T)JSONObject.toBean(jsonObject, callback.getThis());

그럼 제네릭될때 처리된다.

까먹을까봐…. 그리고 아무나 참고하시라고 써놓는다
제목에 영어와 한글을 섞는건 검색하기 쉬우라고