API First Desgin 은 MSA 설계를 진행하며 서비스를 어떤 기준으로 나눌 것인가? 에서 시작해 각 서비스들이 어떤 기능을 제공할 수 있고, 서비스의 제공 API에 따라 크기나 트랜젝션 범위를 설정할 수 있기 때문에 API를 우선적으로 디자인 하라는 MSA 모델링 관점에서 중요한 내용이다.
API First Design이란?
협업하는 개발 프로세스에서 API를 첫 번째 우선 순위로 가져가는 것
좋은 설계를 하기 위해서는 개발 팀의 아키텍처를 지속적으로 살펴야하며 클린코드를 짜는 것에 집중해야 한다.
릴리즈가 반복될 수록 코드의 양이 많이지고, API의 수도 늘어난다.
이 상황에서 클라이언트도 늘어난다면 우리는 더 많은 API를 필요로하게 된다.
그렇기 때문에 서비스를 운영하면서 변경 사항이 생기고 백로그를 생성할 때 API를 가장 우선순위로 두고 작업을 시작하는 것을 API First Design이라 한다.
즉, API First Design은 다른 것이 아니라 개발자들간에 API를 우선순위로 두고 협업하여 설계하는 것을 말한다.
API 디자인
동기식
- 백엔드 개발자들이 IMPL 을 만들고
- API를 열어놓은 다음
- 프론트 개발자들이 이를 사용한다
이 방식의 문제점은 백엔드 개발자들이 개발을 마치기 전까지 프론트 개발자들은 기다려야 하고, API문서가 나오더라도 명확하지 않을 것이다.
비동기식
- 백, 프론트엔드 개발자들이 우선 API설계를 진행한다
- 그 후 백은 API에 등록될 IMPL을 만들고 프론트는 API를 사용할 준비를 한다.
이 방식을 사용하면 기다릴 필요가 없고, 명확하게 문서를 작성할 수 있다.
마이크로 서비스 API First Design
이벤트 스토밍
서비스간 상호 이벤트를 설계한다.
서비스가 운영될 때 한 이벤트를 처리하기 위해 어떠한 서비스들이 관계를 맺는지 우선 설계해야 한다.
식별해야 할 것들
서비스 식별
서비스들이 어떤 식으로 있을지 후보 서비스군을 정한다.
이때 후보 서비스군들은 서비스 정의서를 통해 관리하며 이 문서에 있는 내용들을 다이어그램으로 표현한다.
컴포넌트 식별
서비스 별로 어떤 컴포넌트들이 있을지 다이어그램으로 표현한다.
오퍼레이션 식별
컴포넌트 별로 어떤 기능을 제공할 것인지 다이어그램으로 표현한다.
- DAO : Data Access Object로 Spring에서 Repository로 치환된다.
- SVI : Service Interface로 Spring Controller/Service/ServiceImpl 로 치환된다
- DI : Domain Interface로 SVI 오퍼레이션 중 타 서비스에 노출시킬 오퍼레이션의 집합이다.
API 식별
DI로 노출시킬 부분들을 API로 확인하고, 서비스가 책임지는 업무데이터 API와 프로세스 처리에 대해 타 서비스에 제공할 API 두 개로 나누어야 한다.
서비스간 상호작용
서비스간 어떤 이벤트 스토밍 관계가 있는지 확인한다.
API 정의서
서비스 정의서와 서비스 다이어그램을 작성했으면 이를 바탕으로 API 정의서를 작성한다.
시퀀스 다이어그램
API 정의서와 서비스 다이어그램을 바탕으로 타 서비스 사이에 어떤 이벤트 스토밍이 이루어지는지 관계를 그리며 이때 정말로 필요한 API를 정련한다.
위 시퀀스 다이어그램은 설계 도중에 작성한 내용이라 추후 변경될 수 있다.