프로그래밍/java, spring

카카오뱅크 해외송금 서비스 구현해 보기

브래드 킴 2023. 4. 13. 10:49
728x90

간편송금업체에 개발자로 일하다보니, 타 업체들의 서비스는 어떻게 돼 있는지 분석할때가 있다.

 

카카오뱅크 해외송금 서비스가 어떻게 돼 있는지 궁금하여 UI를 틈틈히 분석 하여  DB설계 및 rest api를 구현해 보았다.

 

자세한 코드는 여기 github 코드 참고

 

일단, 카뱅 SWIFT 해외송금 화면은 아래와 같이 생겼고, swift 송금 중에 미국(USD)송금만을 분석해보았다. 

 

 

참고로, 카뱅의 송금서비스가 서버단에서 어떻게 구현돼 있는지는 나는 전혀 알지 못한다. 단지 UI만을 분석하여 서버API를 설계해본 것이다.

 

기본적으로 해외송금은 고객으로부터 KRW기준으로 돈을 수령하여 환전 후 국제송금망(SWIFT)를 통해 해외로 송금을 보내는 것이다.(swift를 사용하지 않을때도 있긴하다) 국제송금망을 통해 송금을 하다보니, 규격화된 format이 필요하고, 이를 위해 SWIFT전문이란 것을 사용한다.

 

다만, 여기선 SWIFT전문 조립하는 부분은 기능구현에서 일단 제외하였다.  SWIFT전문을 분석해서 구현해야하고, SWIFT로의 전용망이 있어야 테스트가 가능한데 어차피 테스트 불가이므로 구현하지 않았다. 다만, 전문조립이란게 SWIFT사의 스펙에 맞게 송금내역을 조립만 하면 되는 것으로 기술적으로 크게 어려운 부분은 없다는 것만 참고하길 바란다.

 

1.송금process

예상비용 및 환율조회

-> 송금정보 validation :  1)계좌잔고 여부 확인 2)5천불이상 여부 확인 3)지정외국환 등록 여부 확인 4)1년에 5만불 이상 확인

*참고로, 1년에 5만불이상을 해외로 송금하는 것은 외국환법에 의해 불가하다. 이를 위한 validation을 check하는것

-> 수신자정보 입력

-> 송금 실행(계좌잔액 수정 및 통계금액 가산)

-> 이후 swift 전문 조립을 통한 swift송금

 

2.주요 기능

 1)예상비용 및 환율조회(수수료, 적용환율, 총예상비용) : 환율테이블에서 환율 조회, 수수료 테이블에서 통화별 수수료 조회, 고객별 우대환율 적용 등의 로직을 통해 USD를 INPUT값으로 넣었을때 필요한 KRW 금액 return
 2)송금실행 : 송금에 필요한 송금금액, 적용환율, 수신인 정보 등을 입력하여 송금을 실행하면 송금테이블, 수신인테이블 등에 데이터 적재
 3)고객별 최근3개월 송금내역 조회 
 4)회원가입 : 회원가입시에 기본 송금인 테이블에 데이터가 쌓이고, 계좌도 1구좌가 개설된다. 더불어, 송금 통계를 계산하기 위한 송금인테이블에도 데이터가 1건 생성되도록 하였다.
 5)회원가입 이후 계좌추가개설 : 계좌개설은 회원당 1:N으로 개설이 가능하도록 구현했다.
 6)거래외국환등록 파일업로드 : 송금 1건당 5천불 이상을 보내게 되면, 송금목적을 증빙하는 파일이 사전에 업로드 되어 있어야 하고, 이를 은행에선 거래외국환등록이라 한다. stream을 통한 업로드 기능을 구현하였고, validation에서 등록여부를 체크한다.

 

3.DB설계

DB는 편의상 excel로 설계를 했고, spring의 JPA entity설계를 통해 테이블을 자동생성 하였다.

 

수신인은행정보와 수신인주소 테이블이 다소 특이하다 생각될것인데, 국가마다 수신인정보에 필요로하는 값이 다르다보니 이를 커버하기 위해 key & value 형식으로 설계해 보았다. CODE_TYPE과 CODE만을 두고 key, value형식을 취하고 있다.

 

예를 들어 미국의 주소체계는 state, city, detail, zip code이런식으로 되어 있어 해당 컬럼이 모두 필요할 것이지만 city와 detail정보만 필요한 나라도 있을 것이다. 그렇게 되면 나머지 컬럼은 null값이 들어가게 된다. 이런식의 DB를 현업에서 많이 보게 될 것인데, 사실 프로그래밍에서 null처리를 적절하게 한다면 문제될것은 없는 설계이지만, 가독성 측면이나 깔끔한 테이블 설계를 위해 새롭게 설계를 해보았다.

 

4.테스트

먼저, 회원가입 API를 통해 송금인 정보를 생성하고, 예상비용 API를 통해 돈을 보내기 위해 필요한 금액을 먼저 확인한다. 확인이 끝나면, 송금에 필요한 값들을 세팅하여 실행을 하게 되면 송금테이블, 수신인테이블등에 데이터가 쌓이는 것을 확인 할 수 있을 것이다.

 

github 코드에 디테일한 예외처리나 Log처리 같은 부분은 구현하지 않았고, 송금에 반드시 필요한 API만을 설계하였으니, 송금 서비스에 필요한 API와 data가 어떤것인지 궁금한 분들만 이 코드를 참고하길 바란다.

 

 

728x90