본문 바로가기

프로젝트/캡스톤

[캡스톤] MSA 아키텍쳐 설계

열심히 기능을 만들고 있다

 

먼저 팀원인 친구가 만들고 있는 서버는 메인서버다.

현재 나는 파이썬으로 학습서버를 만드는중..

 

메인서버에서는 다음과 같은 일을 한다.

1. 프론트와 소통하면서 유저 화면 데이터를 리턴해준다.

2. 프론트에서 주문이 들어오면 종목 리스트를 가지고 학습서버에 비율 계산 요청을 한다.

3. 비율 데이터를 학습서버로 부터 받아서 한국투자 Api를 활용해서 리밸런싱을 한다

4. 2~3반복

 

RestTemplate rt = new RestTemplate();
HttpHeaders headers = new HttpHeaders();

//url-> "https://openapivts.koreainvestment.com:29443"+"/uapi/domestic-stock/v1/trading/order-cash";
String url = BASEURL + KISArguments.ORDER_STOCK_URL;

//header
headers.add("authorization", token);
headers.add("appkey",KISArguments.APP_KEY);
headers.add("appsecret", KISArguments.APP_SECRET);
headers.add("tr_id", KISArguments.ORDER_STOCK);
headers.add("content-type","application/json");

//headers.setContentType(MediaType.APPLICATION_JSON);
//body
PostKISOrderStock body = PostKISOrderStock.createOrder(member.getAccount().getAccountHeader(),
        member.getAccount().getAccountTail(), stockId, quantity);

MultiValueMap<String,String> params = new LinkedMultiValueMap<>();
params.add("CANO", "50071508");
params.add("ACNT_PRDT_CD", "01");
params.add("PDNO","009150");
params.add("ORD_DVSN", "01");
params.add("ORD_QTY", "3");
params.add("ORD_UNPR","0");
//header body 연결
String HASH = setHash(params);
headers.add("hashkey", HASH);
HttpEntity<MultiValueMap<String,String>> request = new HttpEntity<>(params, headers);

다만 문제가 생겼다. 대충 저런식으로 리퀘스트를 넣으면

500 Internal Server Error: "{"rt_cd":"1","msg_cd":"IGW00005","msg1":"요청전문 유효성 체크 중 오류가 발생하였습니다."}"
org.springframework.web.client.HttpServerErrorException$InternalServerError: 500 Internal Server Error: "{"rt_cd":"1","msg_cd":"IGW00005","msg1":"요청전문 유효성 체크 중 오류가 발생하였습니다.”}"

이런식으로 Internal Server Error가 뜬다. 나도 자바 코드를 보면서 확인을 해봤는데... 도통 이유를 모르겠다.

그래서 똑같이 쳐보니

파이썬으로 하면 잘된다 ㅋㅋㅋ

이유를 알아보니 뭔가 저쪽 세계에서는 문제가 생기는것 같다. 다른 자바 개발자들도 문제가 생기는듯...

심지어 저친구 PostMan으로 하니 된다고 한다.

그래서 MSA 아키텍쳐를 좀 더 잘 활용해보기로 했따.

약간 허접?해보기는 하지만(앞으로 여러 서비스를 추가할예정) 아무튼 우리 서비스를 서버 단위로 잘랐을 때 다음과 같은 Dependency가 생긴다. 현재 문제가 되는 부분은 메인서버와 KIS 서버 사이의 리퀘스트(원인모를 에러가 생김)

그러니 중간에서 프록시마냥

이런식으로 메인 리퀘스트를 받아서 약간의 정제를 거친 다음 KIS 서버로 리퀘스트를 넣어주는 "간단한" 마이크로서버를 하나 만들기로 했다.

 

https://github.com/inha18minseokkim/KISApi

 

GitHub - inha18minseokkim/KISApi: 한국투자 API를 사용하기 위한 MicroServer Architecture

한국투자 API를 사용하기 위한 MicroServer Architecture. Contribute to inha18minseokkim/KISApi development by creating an account on GitHub.

github.com

class TraderModule:
    def __init__(self, userinfo : UserInfo):
        self.apikey = userinfo.apikey
        self.apisecret = userinfo.apisecret
        self.token = userinfo.token
        self.cano = userinfo.cano
        self.acnt = userinfo.acnt
        logger.debug(f"{self.apikey} {self.apisecret} \n {self.token} \n {self.cano} {self.acnt} 생성 완료")
    def buy(self,code: str,quantity: int):
        global URL
        headers = {"Content-Type":"application/json", 
           "authorization":f"Bearer {self.token}",
           "appKey": self.apikey,
           "appSecret":self.apisecret,
           "tr_id":"VTTC0802U",
           "custtype":"P",
           }
        data = {
            "CANO": self.cano,
            "ACNT_PRDT_CD": self.acnt,
            "PDNO": code,
            "ORD_DVSN": "01",
            "ORD_QTY": str(quantity),
            "ORD_UNPR": "0",
        }
        res = requests.post(URL, headers=headers, data=json.dumps(data))
        logger.debug(f"{res.json()}")
        return res.json()

대충 이런식으로 메인서버에서 오는 리퀘스트만 받아주는 기능을 만들었따.

구름IDE를 사용해서 친구가 사용할 수 있게 따놨다. 다만 문제는..

무료 서비스라 아이피가 유동이다 보니 껐다 키면 아이피가 바뀐다. DNS 서버 지원을 해주는데 잘 안된다.. 되다가 안되다가 한다.

파이썬에서는 신기하게 바로된다 ㅋㅋㅋㅋ

알수없는 웹개발의 세계...

 

이런식으로 리퀘스트를 주면 KIS 서버와 통신 후 결과를 리디렉션 해주는 서버를 만들었다!!