8/08/2022

기술 부채의 유형과 관리 방법

 

기술 부채란?

기술 부채는 Ward Cunningham이 1992년도에 만든 표현이다. 오늘날 기술 부채 및 코드 부채는 개발 팀이 애플리케이션을 개발 시 빠른 코드를 작성하는 것을 선택할 때 발생한다. (일정에 쫓겨서 개발) 신속한 코드 전달은 프로젝트 완료일을 맞추는데 도움이 되고 이에 대한 기술 부채를 감내한다고 했을 때, 비지니스 관점에서는 문제가 없어 보일 순 있지만, 향후 부정적인 결과를 초래할 수 도 있다. 기술 부채를 발생시키기로 결정했다면 부정적인 결과가 생기는걸 고려해야 한다.

기술 부채는 처리하기가 복잡하고 특정 지표와 연결되어 있지 않다. 기술 부채를 해결하는데 필요한 정확한 자원을 추정하는 것도 쉬운 일은 아니다. 기술 부채는 어떤 영향을 미칠까?

개발자

개발자의 생산성에 영향을 미치고 개발 수명 주기에 대해 방해하는 기술적 요인을 가장 먼저 느끼게 된다. 기존 코드의 문제를 수정하는 것이 어렵고 기술 부채를 해결하는데 많은 시간을 쏟을 수 도 없는 실정이다. 결과적으로 개발자는 더 깨끗한 코드를 지니고 있는 조직에 합류하기를 원하고 너무 많은 기술 부채로 인해 사람들이 떠나갈 수 도 있다.

조직

기술 부채는 회사 전체에 영향을 미치기 시작한다. 신규 프로젝트와 기존 프로젝트를 수정하는 것이 악몽이 된다. 점점 시간이 지날 수록 기술 부채를 제거하는 것이 어렵게 된다.

기술 부채는 나쁜가?

금융 부채와 마찬가지로 기술 부채도 좋은 방법과 나쁜 방법으로 활용될 수 있다. 상황에 따라 기술 부채는 서비스 출시일을 충족하기위한 계산된 결과일 수 있다. 반면 애플리케이션을 업데이트할때 피할 수 없는 실수의 결과이기도 하다.

기술 부채의 원인은?

기술 부채에는 4가지 원인이 있다. 이를 기술 부채 사분면이라고 한다. 마틴파울러가 만든 4가지 기술 부채 사분면에는 무모함, 신중함, 부주의함이 포함되어 있다. 아래의 사분면에 기술 부채를 할당하면 문제에 대한 의도와 배경을 측정하는데 도움이 된다.


  • Prudent and deliberate - 신속하게 개발하고 나중에 결과를 처리하기로 결정하면 신중하고 고의적인 부채가 발생한다. 이 유형의 부채는 제품의 지분이 상대적으로 낮고 빠른 개발의 이점이 위험보다 클 때 가장 일반적으로 사용된다.
  • Reckless and deliberate - 최고의 코드를 생성하는 방법을 알고 있지만 그보다 빠른 개발을 우선시하는 것이 무모하고 고의적인 부채의 원인이다.
  • rudent and inadvertent - 신중하고 부주의한 부채는 최상의 코드를 생성하려는 욕구가 있지만, 구현 후에 더 나은 솔루션을 찾을 때 발생한다.
  • Reckless and inadvertent - 무모하고 부주의한 부채는 팀이 필요한 지식 없이 최고의 코드를 생성하려고 할 때 발생한다. 그리고 자신들이 저지르는 실수를 인지하지 못한다.

기술 부채의 유형

기술 부채는 두 가지 유형이 있다고 한다.

  • 고의적 기술 부채
  • 의도하지 않은 기술 부채

고의적 기술 부채

고의적 기술 부채는 조직이 미래보다는 현재를 위해 결정을 내릴 때 발생한다. 이 부채는 단기와 장기로 나뉜다. 예를 들어서 이전 부채를 상환하기 위해 발생한 것은 단기 부채이고, 더 큰 미래 부채를 방지하기 위해 발생한 것은 장기 부채이다.

  • 단기 부채 - 기존 자원을 사용하는 등의 전략적 이유로 소극적으로 발생한다.
  • 장기 부채 - 납기일 등의 전략적 이유로 선제적으로 발생한다.

발생한 유형에 따라 부채를 상환하는데 걸리는 시간은 달라지게 된다.

의도하지 않은 기술 부채

의도하지 않은 기술 부채는 이해 부족, 우발적 실수 또는 경우에 따라 잘못 작성된 코드로 인해 발생한다. 이런 상황이 발생하는 이유는 오류가 발생하기 쉬운 설계에 있다. 이는 피할 수 없는 실수를 저지른 비전략적 결과이다. 의도하지 않은 기술적 부채는 팀에서 고의로 발생시키지 않았기에 우발적인 것으로 간주할 수 있다. 대부분 프로젝트를 완료한 후에 실수를 깨닫게 된다.

기술 부채를 관리하는 방법

대출 받은 금융 부채를 점진적으로 상환하는 접근 방식을 기술 부채에도 적용할 수 있다. 개발팀의 꾸준한 노력이 필요하지만 전체적인 비용 절감에 유리하다. 애플리케이션 리팩토링을 미리 계획해야 한다. 이 접근 방식은 몇 년 동안 축적된 기술 부채를 줄이는데 도움이 된다. 팀 리더는 정기적으로 기술 부채를 해결하기 위해 시간을 할애해야 한다. 애플리케이션에 영향을 주지 않고 자주 변경되는 요구 사항을 수용하는데 도움이 된다.

결론

애플리케이션을 개발할 때 항상 부채를 피할 수 있는 것은 아니다. 의사 결정에서 코드 실수에 이르기까지 발생한 기술 부채가 향후 어떤 영향을 미치는지는 대부분 알고 있을 것이다. 기술 부채는 결국 비즈니스에 영향을 줄 수 있다. 따라서 기술 부채가 어떻게 축적되는지 파악하고 이를 통제하기 위한 것을 고려해야 한다.

References:

  • https://dzone.com/articles/types-of-technical-debt-and-how-to-manage-them
  • https://asana.com/resources/technical-debt?utm_campaign=NB–KO–EN–Catch-All–All-Device&utm_source=google&utm_medium=pd_cpc_nb&gclid=CjwKCAjw6MKXBhA5EiwANWLODINX1qI3BXoFZ9pqhgr2eJlZhEmh0PyxJxZ9LI-uMvHLBURFqs8ZsBoCxzgQAvD_BwE&gclsrc=aw.ds

8/05/2022

Restful vs gRPC vs GraphQL

얼마전 프로젝트 진행 시, RESTful의 엔드포인트에 대해서 문제가 생겼었다. 구현상에 문제는 없지만 Addressability를 보장해야 하는 DX관점에서의 문제였다.

지금이야 REST로 API를 만들어서 제공하지만, 상황에 따라 gRPC 혹은 GraphQL을 사용해야 할 경우도 생기기에 각 표준에 대해서 정리하고자 한다.

통신 방식의 비교


이미지 출처: https://www.sensedia.com/post/apis-rest-graphql-or-grpc-who-wins-this-game


기술별 특성 비교


이미지 출처: https://www.sensedia.com/post/apis-rest-graphql-or-grpc-who-wins-this-game

REST

REST는 현재 가장 많이 사용되는 API 아키텍처이다. HTTP Method를 사용하여 리소스를 제공한다.

REST에서 사용되는 HTTP Method

  • POST: 새 리소스를 생성한다.
  • PUT: 리소스가 존재하는 경우 업데이트하거나 리소스가 없으면 생성한다.
  • DELETE: 리소스를 삭제한다.
  • PATCH: 기존 리소스를 부분적으로 업데이트 한다.
  • GET: 리소스를 쿼리한다.

REST의 장점은 아래와 같다.

  • 성능 - 빠른 반복 및 HTTP 표준 표현이 필요한 시스템에 가장 적합하다.
  • 확장성 - 많은 수의 구성 요소와 구성 요소 간의 상호 작용을 지원한다.
  • 단순성 - REST에는 아키텍처를 단순화하고 분리하는 균일한 인터페이스가 존재한다.

이미 오래전부터 사용되었기에 대부분의 개발자가 익숙하다는 장점이 있다. REST는 HTTP 프로토콜 디자인과 매우 밀접하게 브라우저 및 기타 HTTP 클라이언트는 기본적으로 REST API를 이해하고 있다.

하지만, REST는 만병 통치약이 아니고 유일한 API 아키텍처가 아니다. REST의 경우 리소스가 복잡할 수록 여러 API를 사용하거나 응답이 무거울 수 있다. 따라서 GraphQL로 대체되거나 gRPC를 사용하는 경우가 생기기도 한다. 그리고 REST에 대한 표준을 만들어야 한다. API를 만들때에 가장 중요한 것은 API를 사용하는 청중의 입장에서 설계하고 제공해야 한다. API 엔드포인트로 리소스를 제공하기에 하나의 API만 보면 안되고, 전체의 API의 엔드포인트를 보면서 문맥 및 의미하는 바가 잘 표현되었는지 확인해야 한다. 이 작업은 매우 어려운 작업이기에 매끄럽게 만들기가 어렵다. 이번에 발생한 것도 이 부분에서 문제가 발생한 것이다.

다른 API를 아키텍처를 사용할 이유가 없다면 REST가 가장 적합한 옵션이다. GraphQL, gRPC는 고유한 요구 사항이 있는 상황에 적합할 수 있다. 그리고 REST에 비해 학습 곡선이 가파르다.

범용적인 API가 필요할 경우 REST를 사용하면 좋다.

gRPC

gRPC는 Google에서 설계, 개발한 Google Remote Procedure Call이다. 데이터를 가볍고 빠르게 요청하기 위해 고려되었다. gPRC는 일반적인 원격 프로시저 호출보다 진화된 형태이다. gRPC를 사용하면 클라이언트는 원격 시스템이 마치 로컬인 것처럼 직접 메소드를 호출할 수 있다. gRPC는 프로토콜 버퍼(Protobufs)를 사용하여 데이터 전송을 위해 텍스트 기반의 JSON, XML이 아닌 바이너리로 직렬화된 데이터로 인터페이스를 정의한다. 또한 HTTP/1보다 더 안정적이고 빠른 HTTP/2를 사용하게 된다.

REST는 표준화된 용어를 통해 상호 작용을 정리하고 GraphQL은 생성된 스키마에 대해 요청을 실행하며 필요한 것을 가져오게 된다.

gRPC는 서버와 클라이언트 간의 관계에 의해 동작이 정의된다. 대부분의 권한은 클라이언트측에 의존하는 반면 처리 및 계산은 리소스를 제공하는 원격 서버에서 진행된다. 이점은 아래와 같다.

  • 가벼우며 클라이언트측의 리소스가 거의 필요하지 않다. 따라서 전력이 매우 부족한 상황에서 편리하게 이용할 수 있다.
  • 효율적이다. gRPC는 통신을 직렬화하는데 중점을 둔 구조화된 데이터 직렬화 방법인 protobufs를 사용한다.
  • 오픈소스 이며 자유롭게 사용, 수정 또는 분기할 수 있다.

gRPC는 정해진 양의 데이터 또는 클라이언트가 저전력이거나 리소를 보존하려는 시스템에 적합하다. 가장 좋은 예는 음성 컨트롤러, 스마트 조명 스위치, 화재 경보기, 잠금 장치 및 카메라와 같이 널리 사용되는 IoT 장치에 적용하면 장점을 최대한 이용할 수 있다.

GraphQL

GraphQL은 정확한 요청에 초점을 맞추고 필요한 것을 정확히 전달하기 위한 방식이다. GraphQL을 다른 API와 차별화하는 것은 클라이언트 중심의 접근 방식이다. 주요 이점은 아래와 같다.

  • 적응성 - 클라이언트가 원하는 데이터, 원하는 방식 및 형식을 결정한다.
  • 효율성 - 과도하게 가져오지 않고 클라이언트가 요청한 것을 정확하게 전달한다.
  • 유연성 - GraphQL은 크로스 플랫폼이며 12개 이상의 언어(Java, Perl, Python.,)을 지원한다.

GraphQL 사용 사례중 가장 많이 알려진 것은 Github이다. 확장성과 유연성 두 가지 주요 이유로 2016년에 전환했다. REST는 원하는 데이터를 얻기 위해 여러 요청을 해야 하고 각 요청에서 데이터를 과도하게 가져와야 하는 경우가 많다. Github의 급속한 성장과 수천만 명의 사용자를 보면 이것이 얼마나 부담되는 일인지 알 수 있다. GraphQL은 클라이언트가 특정 용도를 위해 특정 형식의 데이터를 요청할 수 있다는 점에 초점을 뒀기 때문에 Github의 Needs를 정확히 제공했다.

끝으로

각각의 기술은 고유한 장점과 단점이 존재한다. 목표가 무엇인지에 따라 어떤 것을 선택할지 결정되게 된다. 각 기술을 이해하고 현재 프로젝트에 가장 적합한 것이 무엇인지 판단하고 선택했으면 좋겠다.

References

  • https://medium.com/devops-dudes/graphql-vs-rest-vs-grpc-411a0a60d18d
  • https://konghq.com/blog/rest-vs-grpc-vs-graphql
  • https://www.sensedia.com/post/apis-rest-graphql-or-grpc-who-wins-this-game


8/04/2022

개발자 경험(Developer Experience)과 사용자 경험(User Experience)

서비스를 기획할 때는 UX(User Experience)관점에서 진행되는 경우가 많다. 오늘은 DX(Developer Experience)에 대해서 언급하고자 한다.

내가 하는 일이 개발자를 위한 제품을 만드는 것은 아니지만, 내부적으로 개발을 하게되면 어느 순간 다른 개발자가 조인하여 구현된 코드를 인계받아 업무를 진행하는 사례도 많기 때문에 DX 관점에서 개발을 진행할 필요성이 있어 보였다.

둘은 비슷해 보일 수 있다. DX에 대해서 정의하자면 “개발자를 위한 사용자 경험”이 아니다. DX는 기술 언어 및 도구를 이용해 사용자에 초점을 맞춘 UX의 확장이다. DX도 UX의 핵심 원칙을 따르지만 개발자가 기술 세부 사항과 프로세스를 효율적으로 이해하고 활용할 수 있게 한다는 점을 확장 시킨 개념이다.

UX는 비기술적이며 비즈니스 요구를 최종 사용자에게 적용하는데 중점을 둔다. 반면, DX는 개발자가 소프트웨어를 사용하여 솔루션을 구축할 수 있도록 하는데 중점을 둔다. 최종 사용자와 개발자의 요구 사항이 다르기 때문에 둘 간 차이가 발생한다.

DX는 UX의 원칙에서 시작된다.

훌륭한 UX는 제품을 쉽게 사용할 수 있게 만들고 계속 즐겁게 사용할 수 있도록 해야 한다. DX는 기술 관점에서 UX와 동일한 핵심 아이디어로 출발한다.

가능한 쉽게 제품을 사용하도록 해야 한다. 제품은 직관적이어야 하고 최종 사용자나 개발자는 최소한의 지침으로 제품 사용을 시작하고 목표를 달성 할 수 있어야 한다.

UX와 DX의 주요 차이점은 사용자 여정이다. 좋은 UX는 제품에 대한 사용자 여정을 가능한 간단하게 유지한다. 너무 많은 선택은 사용자에게 부담이 될 수 있고, 이로 인해 제품에서 가치를 얻는 것이 더 어려워질 수 있기 때문이다.

좋은 DX는 개발자의 목표를 가능하게 하기 위해 많은 유연성이 필요하다. 사용자 관점에서는 제품을 잘 사용하기 위해 기술에 대한 세부 정보가 필요하지 않지만, 개발자는 요구 사항을 평가할 수 있도록 기술 세부 정보에 접근 할 수 있어야 한다. 좋은 DX를 사용하면 개발자가 제품이나 서비스가 어떻게 작동하는지 쉽게 이해할 수 있으므로 성공적으로 구축할 수 있다.

좋은 UX는 사용자가 제품에 동등하게 접근할 수 있도록 하는 반면, DX는 다양한 개발자의 기술 능력을 고려하고 다양한 수준의 지원을 제공해야 한다. 경험이 많은 개발자는 더 강력한 도구에 접근하길 원하지만 경험이 적은 개발자는 구성하기 쉬울 수 있는 간단한 도구로 시작해야 할 수 있기 때문이다. 개발자 경험이 제품에 잘 맞도록 하려면 기본 사용자의 기술적 능력 및 역량을 이해하는 것이 중요하다.

UX vs DX 사례

이 글을 읽는 대부분 사람들은 서비스 앱의 사용자였을 것이다. 쇼핑앱을 이용한다고 가정해보자. 검색창에 “가방”이라는 검색어를 입력하거나 카테고리 탐색을 통해 원하는 상품에 접근할 수 있다. 그리고 원하는 상품을 장바구니에 추가하고 결제 정보 및 배송 정보를 추가하여 결제를 진행한다. 그 후 배송이 되기를 기다리면 된다.

위 관점에서 개발자가 동일한 기능을 구축한다고 생각해보자. 검색 기능에 사용되는 API를 제외하고 인증 및 결제를 처리하는 API가 필요할 것이다. 카테고리, 상품, 장바구니, 결제, 배송에 대한 API 명세를 만들고 관련된 코드를 작성해야 한다. 이때 API의 엔드포인트, 메소드, 응답, API 인증등 여러가지를 이해하고 고려해야 한다. 좋은 DX가 없으면 개발자는 문제를 신속하게 해결 할 수 없게된다.

사용자에게 “가방” 쇼핑에 대한 선택권이 많은 것처럼 개발자에게도 도구 선택권이 많다. 적합한 선택은 좋은 DX에서 시작된다. 개발자 라이브러리, 솔루션등에 대해서 잘 이용할 수 있다는 확신이 들면 선택하고 계속 사용할 것이다.

훌륭한 개발자 경험은 사용자 관점에서 개발의 요구 사항을 아는 것에서 시작된다.

우수한 개발자 경험으로 API 제품 가치 실현

개발자 경험은 개발자가 빌드할 서비스 또는 제품과 상호 작용할 때 발생하는 모든일을 포함한다. 개발자는 창조하고 혁신할 수 있는 권한을 느끼고 싶어하며 좋은 DX는 아이디어를 달성하기 위한 가능성과 단계를 보는데 도움이 된다.

개발자는 다양한 프로세스에 맞게 사용하는 서비스를 구성할 수 있어야 한다. 훌륭한 DX는 유연함을 지원하는 도구와 정보를 제공한다. 이를 수행하는 방법은 다음과 같다. 범위가 잘 지정된 다양한 API 엔드포인트 제공 여러 언어로 SDK를 개발 (혹은 API 명세서를 제공) 코드를 재사용 가능하도록 작게 분할 누구나 쉽게 이해할 수 있는 코드 만들기 작업한 것들을 광범위하게 문서화 (다음 사람을 위해)

개발자들에게 제품의 기술적 세부 사항을 이해하기에 충분한 정보를 제공하는 것은 매우 중요하다. 문서는 제품에 대한 개발자의 진입점이며 구현에 대한 것들을 알려준다. 개발자가 제품 작동 방식을 이해할 수 있다면 구현할 수 있다. 개발자가 제품 사용 방법을 배우고, 문제를 해결하고, 기존 프로세스에 통합할 수 있도록 명확한 현행화된 문서가 필요하다.

궁극적으로 개발자는 자신의 고충에 대해 제품, 도구 및 문서에서 이를 해결해야 한다고 느낄 필요가 있다. 좋은 DX를 사용하면 모든 개발자가 최소한의 지침으로 제품의 기본 구현을 할 수 있어야 한다. 예제 코드를 표시하고, 문서에 자세한 설명을 제공하고, API 명세서를 통해 개발자가 API를 사용하는 방법을 이해하고, 여러 사용 사례에 대한 명확한 예를 보여줌으로써 이를 수행할 수 있다.

개발자 경험

좋은 UX도 시간이 지남에 따라 개선하듯이 좋은 DX도 장기적으로 투자해야 하는 것이다. DX는 UX의 많은 측면을 공유하지만, 개발자는 UX외에 구현을 위한 특정 요구 사항이 존재한다는 것을 잊지 말아야 한다. 개발자를 위한 제품을 만들땐 DX를 이해해야 개발자를 고객으로 만들 수 있거나 혹은 잘 인계할 수 있기 때문이다.

7/22/2022

PL/SQL에서 Java로 자동 변환 도구가 필요하지 않은 이유

오래된 어르신 시스템을 구조개선 준비 중이다. 예전에는 비즈니스 로직 대부분을 PL/SQL로 했는지, 자바단에는 비즈니스 로직이 거의 없는 상황이다. PL/SQL을 Java로 자동 변환을 해주는 Converting Tool이 있지 않을까? 하는 마음에 찾아서 테스트를 해보았다. (사람은 게으르다.)

솔루션 벤더사의 트릭에 속은 느낌이다. 대부분 업체들은 “PL/SQL Convert to Java” 문장으로 마케팅을 하고 있었다. 하지만, 지금 시점에 일반 Java만 사용하는 곳이 없기 때문에 일반 Java로 마이그레이션을 할 필요가 없는 것이었다. ORM으로의 마이그레이션 필요한 것이었다.

왜 PL/SQL을 마이그레이션 하려고 하는지 다시 한번 생각해봤다.

  • 비즈니스 로직이 복잡하기에 PL/SQL로는 유지 관리가 어렵다.
  • 시스템이 취약해진다. 한 곳에서 변경하면 다른 곳에 영향을 줄 수 있다.
  • 새로 투입된 개발자가 제 몫을 하려면 많은 시간이 필요하다. (지금 시장에서 PL/SQL 개발자가 많을까?)
  • 새로운 기능 개발 및 제공이 느릴 수 있다.
  • 확장에 자유롭지 못하다.
  • DB는 매우 비싼 리소스이다.

PL/SQL을 Java로 자동 변환을 해준다는 솔루션에는 아래의 진실이 숨겨져 있다.

  • Java Syntax를 따르지만 Framework를 사용하지 않는다.
  • Java는 객체 지향 언어인 반면에 PL/SQL은 절차적 언어이다. 변환 도구는 도메인을 효과적으로 유추하고 해당 비즈니스 논리 코드를 도메인 엔티티에 연결할 수 없다.
  • 생성된 코드는 아키텍처 패턴을 따르지 않는다.
  • 생성된 코드는 PL/SQL보다 100~1000배는 느리게 작동한다. PL/SQL은 DBMS 내부에서 동작을 했지만 Java 코드는 애플리케이션에서 실행되고 SQL 요청을 통해 DBMS와 통신을 하는 구조다. 루프일 경우에 성능차이가 많이 발생하기에 DB 스키마 리팩토링이 필요할 수 있다.

사람이 직접 마이그레이션을 해야 위의 문제가 해결될 것 같다. 일반 Java로 변환된 코드가 사람이 작업하기에 도움이 될 것이라 생각했지만, 매우 낮은 품질의 코드가 생성되기에 현실은 더 높은 비용을 수반할 것으로 판단된다.


결국, 사람이다!

6/22/2022

Monolith 잘라 내기

현실에서 마이크로 서비스 관련 설계를 진행하다 보면, 적합하지 않은 상황이 발생하곤 한다. 이런 상황에 대해서 언급하는 글(https://dzone.com/articles/chopping-the-monolith-the-demo)을 발견해서 내용을 작성한다. 저자는 전자 상거래 영역에서 몇 년간 일을 했다고 한다. 전자 상거래의 상당 부분이 가격 책정에 전념하고 있고 가격 책정 규칙은 매우 자주 변경된다고 한다.

  • 특정 제품의 재고가 너무 많음
  • 시즌 종료: 새 상품에 대한 물류 센터 공간을 확보해야 하기에, 가격을 낮춰서 판매한다.
  • 연구에 따르면 마진을 낮추면 제품 판매가 증가하여 전반적으로 더 많은 수익이 발생한다고 한다.
  • 마케팅 목적

저자는 관련해서 예제로 코드를 만들었다. 아래는 전자 상거래 예시 화면이다.


장바구니에 항목을 추가하고 내용을 확인할 수 있는 기능이다.


초기 상황

아래 시퀀스 다이어그램은 기존 방식을 설명한다.

CheckoutHandler에서 장바구니 담기와 가격 책정 기능을 모두 포함하고 있다.

가격 책정

가격 책정 기능을 분리해야 한다. 그 이유는 이 글 처음에 작성했다. 새로운 시퀀스 다이어그램은 아래와 같다.


새로운 시퀀스 다이어그램에서는 몇 가지 변경 사항이 포함된다.

  • 가격은 분리되어 제공된다.
  • CheckoutView는 더 이상 가격 정보를 반환하지 않는다.
  • 클라이언트는 결제와 가격 책정 사이의 흐름을 조정한다.

가격 책정 서비스 대체


가격 책정 기능을 분리하여 사용하기로 결정했다면, API Gateway Pattern을 적용하여 외부에 노출되는 API와 Backend 서비스의 접점을 분리시켜줘야 한다. Apache APISIX Gateway는 실시간으로 경로 구성이 가능하고 클라이언트에 노출된 URL을 변경하지 않고도 신규 추가된 가격 책정 서비스의 API와 매핑이 가능하다.

결론

저자는 본 글에서 마이크로 서비스를 사용하지 말아야 하는 이유에 중점을 두고 예제 코드를 작성했다고 언급하고 있다. 마이크로 서비스 대신 특정 부분을 전용 서비스로서의 기능으로 분리할 수 있다고 한다.

내가 생각하기에는 이런 작업들이 계속 반복된다면, 결국 아래의 방식으로 서비스가 쪼개질 것이라고 생각한다. 처음 시작은 Monolith에서 필요에 의해 기능을 분리하는 방식으로 진행했지만, 결국에는 Monolith가 마이크로 서비스로 점진적으로 마이그레이션 되는 방식이라 생각한다.

물론, 저자가 의도한 바는 New features 단계(아래의 첫번째 단계)라고 볼 수 있다.


이 글을 읽는 분들은 이 상황에 대해서 어떻게 생각하시는지요?

References:


5/30/2022

DB 형상 관리툴

프로젝트를 준비하고 있다. DB Schema가 중요한 부분이지만 형상 관리가 되어 있지 않다. 사람에 의해서 관리가 되고 있는 실정이다. 소스 코드는 형상 관리를 하고 있지만 DB Schema는 형상 관리를 하고 있지 않기에 관련해서 정보를 찾아보았다. 데이터베이스에 대해서도 지속적인 통합이 필요하다. 본 글에서는 오픈소스 DB 형상 관리 툴인 Liquibase와 Flyway에 대해서 비교하고 bytebase에 대해서 언급하고자 한다.

Liquibase와 Flyway의 유사점

Liquibase와 Flyway는 진화되는 데이터베이스 설계를 원칙으로 하기에 유사한 기능들이 많다.

  • 일부 오픈소스이며 데이터베이스 스키마 변경 사항을 관리, 추적 및 배포에 도움이 된다.
  • 데이터베이스 스키마 변경에 대한 버전을 관리한다.
  • Java를 기반으로 하며 Spring Boot 및 Vert.x와 같은 프레임워크에 대한 지원을 제공한다.
  • Maven 및 Gradle과 같은 빌드 도구와 통합을 지원한다.
  • 스크립트를 지원한다.
  • 다양한 데이터베이스를 지원한다.

Liquibase와 Flyway의 차이점

변경사항 정의

Flyway는 변경 사항에 대해서 정의하기 위해 SQL을 사용한다. 반면 Liquibase는 XML, YAML, JSON과 같은 SQL을 포함한 다양한 형식으로 정의할 수 있는 유연성을 제공한다. Liquibase를 사용하면 데이터베이스에 구애받지 않는 언어로 작업할 수 있으며 스키마 변경 사항을 다양한 데이터베이스 유형에 쉽게 적용할 수 있다.

Flyway는 변경 사항에 따라 버전이 증가하는 방식으로 구동된다. 이 부분은 병렬 개발에 대해 충돌을 일으킬 수 있다. Flyway의 경우에는 스크립트 파일 이름으로 마이그레이션 유형을 정의한다. e.g. V01__Add_New_Column.sql

변경사항 저장

두 툴 모두 배포된 변경 사항을 테이블에 저장한다. Flyway의 경우 flyway_schema_history라는 테이블에 히스토리를 저장한다. Liquibase의 경우 databasechangelog라는 테이블에 히스토리를 저장한다.

변경 실행 순서

Flyway에서는 변경 순서를 관리하는 것이 어렵다. 파일 이름의 버전 번호와 마이그레이션 유형에 따라 달라지기 때문이다. Liquibase는 master_changelog라는 별도의 파일을 사용하여 변경 사항이 정의된 순서대로 배포된다.

변경 사항 롤백

잘못된 변경 상황이 발생할 경우 롤백이 필요하다. Liquibase는 모든 것을 롤백하거나 특정 마이그레이션을 실행 취소하는 방법을 제공한다. 하지만 유료 버전에서만 가능하다. Flyway도 유료 버전에서만 가능하다.

변경 사항의 선택적 배포

선택적 배포의 경우에는 Liquibase가 유리하다. Flyway도 가능하지만 각 환경 및 데이터베이스에 대해서 다른 구성 파일을 설정해야 하는 단점이 있다. Liquibase는 레이블과 컨텍스트를 추가하여 특정 위치에 배포할 수 있다.

스냅샷 및 데이터베이스 비교

Liquibase는 사용자가 데이터베이스의 현재 상태를 스냅샷을 생성 할 수 있다. 이것을 사용하여 다른 데이터베이스와 비교가 가능하다. 이는 데이터베이스 복제 및 장애 조치 시나리오에 매우 유용하다. Flyway는 스냅샷 기능을 지원하지 않는다.

조건부 배포

Liquibase는 사전 조건이라는 추가 기능을 제공한다. 사전 조건을 통해 사용자는 데이터베이스의 현재 상태를 기반으로 변경 사항을 적용할 수 있다. Flyway는 이 기능을 지원하지 않는다.

Bytebase


Bytebase는 데이터베이스 스키마 변경 및 버전 관리 도구이다. 웹 콘솔과 백엔드로 구성되어 있다.

기능

  • SQL 검토
  • 버전 관리 (GitOps)
  • 데이터베이스 관리
  • SQL 편집기
  • SQL 어드바이저
  • 마이그레이션 이력
  • 백업 및 복원
  • 아카이빙
  • 이상 감지

지원 데이터베이스

Liquibase

Amazon Aurora(MySQL, PostgreSQL), Amazon RDS(MariaDB, MySQL, MSSql, Oracle, PostgreSQL), RedShift, Azure SQL(MSSql), Cassandra(Apache), Cassandra(DatastaxAstra), CockroachDB, Derby, EnterpriseDB, Firebird, Google Cloud Spanner, H2, Hibernate, Hive, HyperSQL(HSQL), DB2, Impala, Informix, MariaDB, Azure SQL, MSSql, MongoDB, MySQL, Oracle, Percona XtraDB, PostgreSQL, SAP Hana, SAP MaxDB, SkySQL, Snowflake, SQLite, Sybase Anywhere, Sybase Enterprise, Vertica, VoltDB

Flyway

Oracle, SQL Server(Amazon RDS, Azure SQL Database 포함), Azre Synapse, DB2, MySQL(Amazon RDS, Azure Database, Google Cloud SQL 포함), Aurora MySQL, MariaDB, Percona XtraDB Cluster, TestContainers, PostgreSQL(Amazon RDS, Azure Database, Google Cloud SQL, TimescaleDB, YugabyteDB), Aurora PostgreSQL, Redshift, CockroachDB, SAP HANA, Sybase ASE, Informix, H2, HSQLDB, Derby, Snowflake, SQLite, Firebird

Bytebase

MySQL, PostgreSQL, TiDB, ClickHouse, Snowflask를 지원하고 Oracle, SQL Server와 같은 상용 데이터베이스 지원 계획은 없음 (이 부분이 아쉬움)

결론

도구를 사용함에 있어서는 현재 상황에 대한 절충이 필요하다. 애플리케이션의 요구 사항에 따라 Liquibase 또는 Flyway를 선택해서 사용할지 상용툴을 이용할지 고민이다. 무엇보다 Schema를 관리하시는 분들이 선호하는 툴을 이용해야 할 것 같다.

References

  • https://nubenetes.com/liquibase/#evolutionary-database-design