오늘은 회사에서 운영중인 API의 버전들을 올리면서 느꼈던 점들에 대해서 회고해보려고 한다.
먼저 API서버의 특성에 대해 알아보자
이번 포스팅에서는 위의 특성들을 API내 버전을 올리는 관점에서 바라보고 느꼈던 장단점에 대해서 생각해 볼 계획이다.
세가지의 API모듈들의 변경사항은 다 다르지만, 각 API의 전체적인 구성은 유사하므로 한번에 다뤄보면 좋을 것 같다. 해당 목차에서는 빠르게 변경사항에 대해서 알아보고 3장에서 변경사항에 대한 회고를 다뤄보도록 하겠다.
세가지 API들은 모두 endpoints에 v1이라는 버전을 알리는 단어를 포함하고 있다. 이번 버전 업을 진행하면서 endpoints내에 버전을 포함하는 것이 필요한가?에 대한 고민을 하게 되었는데 3장에서 함께 다뤄보도록 하자.
다음으로 가장 많은 변화를 겪은 A모듈에 대해 살펴보자. 변경사항은 아래와 같다.
C모듈은 request의 특정 파라미터의 종류가 추가되었다.(자바의 입장에서 enum필드가 추가됨)
이전의 commit과 큰 차이점을 보이지 않아 따로 버저닝을 하지 않았다.
전체적인 변경의 이해를 위해, 변경사항에 대한 내용은
2. 기능 변경
에 작성해두었으므로 함께 읽어주시기 바랍니다.
먼저 가장 큰 문제를 일으킨 개념은 버전이라는 개념이었다. v1 -> v2로의 변경은 내가 해당 프로젝트를 맡기전 전임자가 적용해두고 간 내용이였는데, v1과 v2가 각각 다른 서비스들(앞에 소개한바와 같이 5개의 서비스들에 기능을 제공하고 있다.)을 지원하게 끔 개발이 되어있었다.
이렇게 개발이 되다보니, API모듈의 관점에서는 v1, v2의 코드를 모두 가진채 디렉토리로 구분하고 있었고 유지보수에 어려움을 겪고있었다.(상당히 유사한 클래스명, 방대한 모듈 사이즈 등)
이런 구조를 보니 가장 괴리감을 느꼈던 부분은 형상 관리 툴의 활용도가 떨어진다는 점이였다.
우리는 프로젝트의 버전을 관리하고 개발하기 위해 git을 사용하는데 어플리케이션 코드 내에서도 버전을 관리하면서 git만을 사용하여 버전을 관리하기가 어려워졌다. 원래는 커밋을 통해 바뀌어야할 버전이 같은 커밋 내에서도 다양하게 존재할 수 있다는 것이였다.
이렇게 디렉토리로 구분해 버전을 관리 할 경우 생길 수 있는 문제들에 대해서 생각을 해보았다.
위와 같은 문제때문에 v1의 디렉토리를 제거하고, v2에서 모든 서비스들을 호환 할 수 있도록 개발하기로 했다. 5개의 웹서비스들은 유사한 기능을 API서버로부터 제공받기 때문에, 또한 기획단에서 통일성을 가지는 협의가 가능하므로 이를 호환하는 비용이 크지 않겠다고 생각했기 때문이다.
따라서 최신버전에서 모든 서비스를 호환 할 수 있도록 개발하여 이후의 추가개발에서 상호운용성을 지킬 수 있는 상태를 만들고자 했다.
또 다른 변경사항은 request, reponse의 파라미터의 변경이 생긴 것이였다.
추가적인 기능이 생겨나면서 파라미터의 변경이 클라이언트에게 요구될 수 있다. 하지만 이런 경우도 상호운용성을 지키는 것이 중요한데, 이번 변경사항에서는 이를 완전히 지키지 못해 아쉬움이 있었다.
파라미터에 대해서 생각하며 느낀점은 초기 파라미터의 계획이 굉장히 중요하다는 점이다. 좋은 예시로 HTTP에서의 파라미터를 예시로 가져와보았다.
HTTP 역시 업데이트가 지속적으로 이루어지는 프로토콜로서, 상호운용성을 지키기 위한 노력을 하고있다.(HTTP의 상호운용성이 지켜지지 않으면 웹이 동작할 수 없음) 때문에 초기에 잘못된 설계를 계속하여 가져가는 경우가 있는데 이는 다음과 같다.
HTTP와 같이 대단한 프로토콜을 만드는 사람들도 위와 같은 실수를 하는 것을 보면,, 실수는 정말 누구나 하는 것이고 반면교사를 삼는 것이 중요한 것 같다.
위의 예시에서 알 수 있듯이, HTTP는 상호운용성과 올바른 정의의 선택지에서 상호운용성을 택하여 운영을 해오고 있다. 신중한 파라미터의 정의가 굉장히 중요하다는 일례라고 보여진다.
그렇다면 어떻게하면 유지보수 시 변경이 적은 파라미터 구성을 만들 수 있을까?
API서버의 개발을 해본 경험이 거의 없어 여러 레퍼런스를 찾아보면서 고민을 해보았지만, 많은 부족함이 있는 것 같다..
특정 언어나 프레임워크의 좋은 개발에 대한 책들이 많이 존재하지만 정답이 없는 것처럼 보다 넓은 범위의 개념인 서버의 개발은 더더욱 난해한 영역이라는 생각이 들었다.
때문에 더더욱 개발하는 프로젝트의 특성을 고려하여 이번 회고의 내용대로 개발을 해볼 계획이다. 물론 왜 이렇게 생각했었지 하며 추후 혀를 찰 수 있겠지만, 좋은 과정이 될 것이라고 생각한다.