12/05/2022

모놀리식 vs 마이크로서비스, 어떤 아키텍처를 선택할까?

모놀리식과 마이크로서비스 아키텍처중 어떤 아키텍처를 선택해야 하는지에 대해서 요즘IT에 기고했다. 아래는 기고한 글 일부이다.


애플리케이션의 아키텍처 스타일(모놀리식 vs 마이크로서비스)에 대한 선택은 트렌드나 경쟁사의 특징을 따르기보다, 애플리케이션의 목표와 비즈니스 요구 사항에 따라 달라진다. (생략) 모놀리식 애플리케이션은 소프트웨어 개발을 위한 기본 접근 방식이다. 그렇다면 마이크로서비스가 대세가 된 현재 모놀리식 접근 방식을 버려야 할까? 만약 모놀리식 애플리케이션에서 마이크로서비스로 전환하면 어떤 이점이 있을까? 마이크로서비스로 애플리케이션을 만들면 비즈니스의 이점은 무엇일까? 이번 글에서는 모놀리식과 마이크로서비스 아키텍처를 비교하여 장단점을 살펴보고, 비즈니스에 적합한 소프트웨어 아키텍처를 선택하는 방법에 대해서 알아보자.

(생략)

개발자라면 누구나 내가 설계하고 작성한 코드가 비즈니스에 큰 가치를 줄 때 성취감을 느낄 것이다. 이것은 우리가 기술을 다루지만, 항상 비지니스를 염두해 두고 고민해야 함을 뜻한다. 이번 글을 참고하여, 현 비즈니스 상황에 최적화된 아키텍처를 선택할 수 있길 바란다.

아래 링크를 통해 원본 글을 볼 수 있다.

기고글 보러 가기

10/16/2022

좋은 팀 구성 및 개발 문화 조성의 중요성

 GS리테일에 입사 후 팀빌딩과 개발 문화를 구축한 경험에 대해서 요즘IT 매거진에 기고했다.

본 글은 요즘IT 매거진에 기고한 글의 일부를 가져왔다.

<출처: https://unsplash.com/photos/Zyx1bK9mqmA>

함께 할 동료가 모였으니 이제 실제 업무를 진행할 차례다. 개발팀은 잘 작동하는 소프트웨어를 구축하는 것부터 기술 변화의 빠른 속도를 따라가는 것과 같은 문제를 해결해야 하는 경우가 많다. 가장 좋은 방법의 하나는 매력적이고 창의적인 팀을 구성하는 것이다.

어떻게 매력적이고 창의적인 팀을 구성할 수 있을까? 답은 간단했다.

“즐기게 놔두는 것이다.”

(생략)

아래 링크를 통해 원본 글을 볼 수 있다.

기고글 보러 가기


10/13/2022

Moduler Monolithic 아키텍처

프로젝트를 준비하면서 아키텍처에 대한 고민이 많다. 마이크로서비스 아키텍처로 프로젝트를 하였지만, 현 상황에서는 마이크로서비스 아키텍처가 어울리지 않을 수 있다는 판단을 했고 이유는 아래와 같다.

  1. B2C라고 볼 순 있지만 사용자 수가 정해져 있다.
  2. 트래픽이 증가하는 시간이 정해져 있다.
  3. 리소스 비용을 절약해야 함 (비용 감축을 위해서 트래픽이 몰리는 시간대외에는 인스턴스를 축소할 계획 있음)
  4. 데이터베이스가 통합되어 있음 (미니서비스로 고려가 가능)
  5. 각 서비스마다 다른 기술을 사용하진 않을 것 같음
  6. 레거시가 존재하기에 리팩토링이 우선되어야 함 (이 부분이 가장 중요!)

또한, 아래 사항들을 고려해야 한다.

  1. 글로벌 진출 시 로컬라이제이션을 고려해야 함
  2. 확장 가능하고 재사용 가능하며 유지보수가 쉽도록 만들어야 함
  3. 새로운 사람이 참여하게 되면 비즈니스 기능 및 시스템 기능을 쉽게 이해할 수 있어야 함
  4. Actor별 UI가 각각 존재해야 함
  5. 외부로 연계되는 부분이 많음
  6. 마이크로서비스 아키텍처 전환에 대한 기틀 마련

모놀리식은 단일 단위의 애플리케이션이다. 즉, 모든 비즈니스 로직이 한 곳에 있고 애플리케이션에 변경 사항이 적용되면 전체 애플리케이션에 영향을 미치기에 전체가 다시 배포되어야 한다.

또한, 모놀리식은 종종 큰 진흙 덩어리처럼 보이기도 한다. 시간이 지남에 따라 애플리케이션이 발전하기에 비대해지기 때문이다.

<출처: https://lewiseason.co.uk/2019/11/05/large-application-architectures>

위 그림은 큰 진흙 덩어리인지 분산된 진흙 덩어리인지에 따라 모듈러 모놀리식과 마이크로서비스 아키텍처를 선택하는 것에 대한 아이디어를 준다. 초반에는 모듈식 모놀리식으로 시작하고 제품이 충분히 성공적이면 마이크로서비스로의 이동을 고려해 볼 수 있다.

모놀리식 아키텍처

기존의 모놀리식 애플리케이션은 빌드할 때 코드 개발 및 유지 관리를 쉽게 하기 위해 로직을 여러 계층으로 나눈다.


<출처: https://www.n-ix.com/microservices-vs-monolith-which-architecture-best-choice-your-business/>

위의 구조는 효율적으로 애플리케이션을 구축하기 위한 방법이지만, 코드를 변경하면 전체에 영향을 미치기 때문에 유연하지 않다. 이런 상황으로 인해 순수한 모놀리식은 사용할 수 없다.

모듈식 모놀리식 아키텍처

모듈식 모놀리식 아키텍처는 먼저 로직을 모듈로 나누는 방식으로 구성되며, 각 모듈은 독립적이고 격리된다. 각 모듈에는 고유한 비즈니스 로직이 있어야 한다. 이렇게 다른 모듈에는 최대한 영향을 주지 않고 레이어를 만들고 수정할 수 있어야 한다.

<출처: https://www.fullstacklabs.co/blog/modular-monolithic-vs-microservices>

마이크로서비스 아키텍처가 모든 것을 해결하는 솔루션이 아니다. 더 적합한 다른 접근 방식이 존재할 수 있다. 결국 진화에 의해 향후에는 마이크로서비스 아키텍처로 끝나더라도 거기까지 도달하기 위한 다른 중간 단계가 존재하는 것이다.

모듈식 모놀리식은 아래의 특징을 지니고 있다.

  • 모듈은 완전히 독립적이지 않다. 다른 모듈과의 종속성이 있지만 최소화해야 한다.
  • 모듈은 상호 교환이 가능하다.
  • 코드를 재사용할 수 있다.
  • 기존의 모놀리식에 비해 종속성을 더 잘 구성할 수 있다.
  • 기존의 모놀리식보다 유지 관리하고 개발하기가 더 쉽다.
  • 배포를 위해 다른 서버가 필요 없이 전체 프로젝트를 단일 단위로 유지할 수 있다.
  • 기존의 모놀리식보다 확장성이 뛰어나다.
  • 마이크로서비스 아키텍처보다 덜 복잡하다.

일반적인 Java 패키징 체계는 아래 왼쪽 그림처럼 웹 항목, 비즈니스 로직, 데이터베이스 엑세스을 별도의 레이어 패키지로 그룹화 한다.

<출처: https://medium.com/design-and-tech-co/modular-monoliths-a-gateway-to-microservices-946f2cbdf382>

문제는 시간이 지나면 위 오른쪽 그림처럼 스파게티 코드가 만들어진다는 것이다. 이런 상황이 발생하는 것은 일반적으로 Java에서 대부분 클래스를 Public으로 선언 하기에 캡슐화하는 것이 아니기에 어디서든 접근 할 수 있게 된다.

결국, Jigsaw(자바 모듈 관리)를 이용해서 패키지를 관리해야 한다. (참고: https://openjdk.org/projects/jigsaw/)


<출처: https://medium.com/design-and-tech-co/modular-monoliths-a-gateway-to-microservices-946f2cbdf382>

위 그림의 패키징 체계에서는 비즈니스 로직 및 데이터 엑세스를 구현한 클래스는 보호되고, 해당 패키지의 접근은 유일하게 정의된 인터페이스를 통해서만 이루어지기에 된다.

이렇게 하면, 느슨하게 결합된 모듈을 만들 수 있고 인터페이스를 일관되게 유지 할 수 있고 향후 마이크로서비스 아키텍처로 전환 할 경우에도 유리하게 작용될 수 있다고 생각한다.

좋은 아키텍처는 끊임없이 진화하는 작업이며 올바른 솔루션은 운영 규모에 따라 달라진다.

이번 선택이 올바른 선택이길 바란다.


10/05/2022

소프트웨어 아키텍트의 역할

처음 IT 분야에서 일을 시작했을 때 소프트웨어 설계자라는 직책이 나의 관심을 끌었었다. 소프트웨어 혹은 애플리케이션 아키텍트라는 이름이 아름답고 우아하게 보였다. 그리고 아키텍트가 되기로 마음먹었었다.

아키텍트가 되기 위해서는 코딩, 아키텍처, 패턴, 커뮤니케이션 스킬 등 다양한 주제를 깊이 있게 공부하고 경험해야 했다. 나에게 아키텍트가 된다는 것은 훌륭한 개발자가 되고 아키텍처에 대해서 최대한 아는 것을 의미했기 때문이다.

우리는 일반적으로 수석 개발자나 우수한 개발자가 자신은 아키텍트라고 말하는 것을 본다. “Role of the Software Architect”에서 Simon Brown은 소프트웨어 아키텍트가 되는 것은 간단한 일이 아니라고 말한다. 점진적으로 역할을 수행하는데 필요한 경험과 자신감을 얻게 되는 과정이 필요하다. Simon Brown은 아키텍트를 역할로 간주하므로 한 사람이 수행하거나 팀에서 공유될 수 있다.

이번 글에서는 내가 생각하는 아키텍트의 역할을 정리해 보았다. 프로젝트 수행 시마다 아래의 역할을 잘 수행하려고 노력 중이다.


<이미지 출처: https://unsplash.com/photos/mfB1B1s4sMc>

아키텍트의 역할

Architectural Drivers

비즈니스 목표를 이해하고 솔루션을 제공하고 기능 및 비기능적 요구사항과 환경의 제약을 고려하여 아키텍처를 수립해야 했다. 소프트웨어 설계자는 비기능 요구 사항 및 제약 조건이 아키텍처에 큰 영향을 미치기에 이를 고려해야 한다는 점을 인식해야 한다.

소프트웨어 설계

소프트웨어 설계는 아키텍트에게는 정말 중요한 역할이다. 아키텍처 드라이버에서 제기하는 문제를 해결하고 시스템의 전체 구조에 대한 비전을 만드는 방법에 관한 것이다. 디자인 패턴과 최상위 디자인 접근 방식에 능숙해야 하고 기술 선택도 잘 해야 한다.

기술적 위험

아키텍트는 프로젝트에서 사용할 기술을 선택해야 한다. 이 행위는 위험 관리에 대한 부분이기도 하다. 복잡성이나 불확실성에 대한 리스크를 줄이고 이익이 있는 곳에서는 리스크를 도입해야 한다. 이 과정에서 가장 중요한 것은 성숙된 기술을 사용하는 것이다. 대부분의 경우에 새로운 기술에 대한 경쟁 우위 유혹을 받을 수 있다. 명심할 점은 소프트웨어 세계에서의 얼리어답터는 해당 기술의 버그를 찾아주는 선구자 역할을 수행할 수 있다.

아키텍처 진화

소프트웨어 아키텍처의 결과는 유지 관리 및 확장이 쉬운 소프트웨어야 한다. 아키텍트는 담당한 소프트웨어가 성장하도록 설계해야 한다.

코딩

아키텍트도 개발자이다. 이 점을 잊으면 안 된다. 대부분 사람들은 아키텍트가 되면 코딩할 필요가 없다고 생각한다. 이것은 매우 위험한 생각이다. 소프트웨어 아키텍트가 된다는 것은 코딩 작업등에 반드시 참여한다는 의미는 아니지만, 설계 및 구현에 대한 부분을 전달하는데 지속적으로 참여해야 함을 의미한다. 코딩에 대한 기반이 없으면 주도하고 나아갈 수 없다.

품질 보증

버그가 많은 제품을 출시하는 경우에는 아키텍트의 역할에 대한 의미가 퇴색된다. 품질에 대한 보증은 아키텍트 역할의 일부로 간주해야 한다. 코딩 표준, 디자인 원칙 및 도구 그리고 프로젝트의 품질을 보장하기 위한 기준선이 필요하다. 아키텍트가 설계한 것이 프로젝트 전반에 일관되게 구현되고 있는지 상시 확인해야 한다. 이런 행위를 아키텍처 원칙 준수라고 한다.

결론

소프트웨어 아키텍트가 되려면 정말 많은 일을 해서 경험을 쌓아야 한다는 사실을 알아야 한다. 어려운 의사 결정을 내리고 책임을 질 준비가 되어 있어야 한다. 가장 중요한 점은 실패하지 않을 제품을 제공할 것을 보장해야 한다.

8/18/2022

애플리케이션 현대화로 가는 길

 

오래된 기술

어느 회사나 오래된 기술로 만들어진 시스템을 가지고 있을 것이다. 이것과 관련해서 흔히들 “잘 작동하면 만지지 마세요.”라고 얘기한다. 변경 사항이 없을 경우에는 맞는 말이다. 잘 동작되고 있는데 굳이 변경할 필요는 없기 때문이다. 하지만, 문제가 발생하거나 변경을 해야 할 경우에는 어떻게 해야 할까? 오래된 기술을 알고 있는 사람을 고용하기는 매우 어려울 것이다. 10~20년전에 이 코드를 작성한 사람들은 아마 은퇴를 했을 것이고, 젊은 개발자들은 이 기술을 배우고 싶어하지 않을 것이다. 억지로 하라고 하면 이탈로 이어질 것이고, 좋은 개발자는 그 조직에 있지 않게 될 것이다.

새로운 기술 채택 및 비즈니스 상황 대응

새로운 기술과 패턴들은 놀라운 속도로 등장하고 있다. 과거에 존재했던 것들보다 현대에는 관련 기술이 풍부하고 더 최적화되어 있는 것들이 많다. 이런 기술들을 적용하는 것은 디지털 세계에서 생존하는데 매우 중요하지만, 레거시 시스템으로 운용하는 기업은 경쟁의 속도를 따라 갈 수 없다. 비즈니스를 지원하는데 많은 비용과 시간이 소요되기에 필요 시점에 고객이 원하는 기능을 제공할 수 없기 때문이다.

애플리케이션은 언제 구식이 되는가?

빌게이츠는 “성공한 기업은 다른 기업보다 먼저 자신의 제품을 구식으로 만든 기업이다.”라는 말을 했다. 이 분야에서 일하면서 매년 새롭게 기술이 탄생하는 것을 지켜보게된다. 하지만, 새로운 기술이 나왔다고 바로 적용하진 않는다. 일반적으로 10-15년 정도가 애플리케이션의 수명이라고 생각한다. 시스템을 “구식”이라고 정의할 수 있는 기준은 무엇일까?

  1. 도입한 솔루션이 있을 경우, 벤더사의 지원을 더이상 받을 수 없을때에 해당된다.
  2. 새로운 비즈니스 요구사항을 반영하기 어려운 상황이 발생한 경우에 해당된다. (억지로 반영하다가는 부채만 쌓이게 된다.)
  3. 현재는 사용되지 않는 하드웨어 혹은 특정 상황에서만 작동되는 경우에 해당된다.

어떻게 현대화를 해야 할까?

애플리케이션을 현대화하기 위해서는 다음 사항이 고려되야 한다.

  • 현대화를 해서 어떤 결과를 얻고자 하는가?
  • 어떤 자원을 가지고 있는가?
  • 직접 코드를 수정하거나 제어할 수 있는가?
  • 변경되거나 새롭게 만들어야 하는 항목에 대해 위험 평가를 수행해야 한다.

현대화에 대한 비용 옵션은 어떤 것들이 있을까?

  1. 다음 세대로 미루고 아무것도 하지 않음
    • 가장 쉬운 방법이다. 현대화를 통해 비즈니스 가치를 찾지 못한다면 올바른 선택이 될 수 있다.
    • 어떤 시스템을 현대화하려고 하는데, 연관된 시스템들이 많아서 전부 건들 수 없는 경우에도 해당된다. 모두 완료되어야 현대화가 되기 때문에 불가한 상황이라고 판단
  2. 재호스팅 또는 리프트 앤 시프트
    • 클라우드로 아무 수정없이 옮기는 방법이다.
  3. 재구축
    • 재호스팅을 하면서 코드를 약간 변경하는 방식이다. 예를 들어서 데이터베이스, 검색 기능등은 클라우드 리소스를 활용한다.
  4. 애플리케이션 프론트엔드 현대화
    • 백엔드에서 제공하는 API를 이용해 프론트엔드만 현대화하는 방식이다.
    • UX는 시대에 따라 자주 변하기에 레거시 애플리케이션의 일반적인 문제 중 하나를 제거할 수 있다.
    • 단, API가 잘 만들어져 있어야 한다.
  5. 리팩토링
    • 간혹 애플리케이션이 현재 상황에 맞게 구축되지 않았거나 진화가 안되었을 경우에 해당된다.
    • 비즈니스 로직은 변화하지 않으며, 코드가 새롭게 작성되는 방식이다.
  6. 완전 재구축
    • 이 경우, 레거시 시스템을 완전 새로운 애플리케이션으로 대체한다.
    • “빅뱅”으로 재구축하기에 철저한 분석, 설계, 테스트 및 데이터 마이그레이션 전략이 필요하다.
    • 또한, 이전 애플리케이션으로 롤백하는 전략이 필요하다.

끝으로

현대화를 하기 위해서는 위험도, 예산, 시간, 리소스, 애플리케이션 종속성과 같은 제약 조건을 고려해야 한다. 가장 좋은 방법은 기존 애플리케이션을 분석하고 평가하여 TO-BE 방향성을 식별하는 것이다. 각 옵션에 대해 비용 및 위험 대비 효과와 같은 ROI를 추정해야 한다. 백데이터가 있어야 현대화 진행에 대한 의사결정을 할 수 있을 것이다.

8/17/2022

레거시 시스템 구조개선 고민

하나의 거대한 모놀리스로 되어 있는 오래된 시스템을 구조 개선을 하기 위해 분석중이다. 분석을 시작하기 전에는 마이크로서비스에 대한 언급이 많았다. 마이크로서비스는 훌륭한 방법이긴 하다. 모듈식이며 확장 가능하고 내결함성도 좋다. 이름만 들어도 익히 알고 있는 유명한 곳에서 이 모델을 사용하여 큰 성공을 거두었기에 마이크로서비스로 아키텍처를 잡는 것이 훌륭하게 보일 수 있다.

그러나 마이크로서비스로 성공한 대부분의 기업은 처음부터 마이크로서비스로 시작하진 않았다. 트위터나 에어비앤비 같은 경우는 마이크로서비스로 전환을 했지만, 현재 복잡성과 대면을 하고 있다. 마이크로서비스를 사용해서 성공한 회사도 최선의 방법을 계속 찾고 있는 것이다.

모놀리스에서 마이크로서비스로 개선하는 것은 간단한 작업도 아니고… 더군다나 PL/SQL, DB Custom Function, Trigger, EAI로 도배되어 있는 현 시스템을 바로 전환하기에는 무리가 있다. 궁극적으로는 향후에는 마이크로서비스로 갈 것이지만, 기술 부채를 먼저 해결하는 Goal을 설정했다. 그 이유는 아래와 같다.

마이크로서비스는 성숙한 제품이어야 가능

마틴파울러가 작성한 MonolithFirst(https://martinfowler.com/bliki/MonolithFirst.html) 에는 마이크로서비스로 시작하는 경우에 대한 케이스가 있다.

  1. 성공적인 마이크로서비스는 너무 거대해서 부서지게된 모놀리스에서 시작한 경우
  2. 처음부터 마이크로서비스로 구축된 시스템이 실패로 끝나는 경우

초기 설계를 제대로 하지 못한다면 모놀리스보다 마이크로서비스를 리팩토링하는 것이 훨씬 어렵기에 초기 설계를 잘해야 한다. 현재는 마이크로서비스로 전환한다라고 얘기할 단계가 아니고, 더욱 성숙되게 만드는 작업이 우선시되어야 한다.

내가 일하고 있는 회사는?

스타트업에서 처음 서비스를 만든다고 가정하면 초반에는 확장성이 필요하지 않을 것 같다. 아마도 필요한 시점은 서비스 런칭 후 몇 년내에 발생할 것이다. (잘 된다는 가정) 따라서, 처음부터 복잡한 아키텍처를 선택할 이유는 없을 것이다.

반면, 이미 운영되고 있는 서비스는 얘기가 달라진다. 확장성과 유연성이 필요할 것이다. (현재 내 상황이 이렇다.) 그래서 DB에 집중되어 있는 비즈니스 로직을 애플리케이션으로 이동시키면서 Miniservice 형태의 서비스 분리를 고려중이다. (서비스별 DB 분리는 어려운 상황이다.)

어르신 시스템 생명 주기

모든 애플리케이션은 생명 주기가 존재한다. 레거시 시스템은 오래되고 복잡한 부분이 많고, 현재 사용되고 있지 않은 기술들도 많이 적용되어 있다. 이런 시스템을 마이크로서비스로 전환한다면 기존 코드를 버리는 것이 효과적일 것이다. 하지만, 작동을 하고 있는 제품을 버리기는 쉽지 않다. 비용을 고려해야 하기 때문이다. 우선 모듈화를 선행해야 한다.

모듈화에도 많은 공수가 들어가지만, 개발을 보다 간단하게 만들기 때문에 가치는 충분하다. 모듈화라는 것은 큰 모놀리스를 작게 만들기 때문이다. 모듈화는 마이크로서비스로 전환하기 전에 꼭! 필요한 단계이다. 모듈식 모놀리스로 만들면 코드는 독립적인 모듈로 분할하여 얽혀있는 코드 문제를 해결해야 한다. 모듈식 모놀리스는 마이크로서비스와는 달리 네트워크 통신이 아닌 내부 API 호출로 통신하게 된다. 기존 소스를 활용하진 않지만, 모듈형태로 구성이 되어 있는지 확인해야 하고, 되어 있지 않다면 모듈화를 설계상 고려해야 한다.

준비가 안되거나 견고한 설계 없이 마이크로서비스로 여정을 시작한다면 매우 힘든 시간을 겪을 것이다. 결국 바꾸고 싶은 모습으로 가기 위한 선행 작업들을 진행해야 한다. 최종 Goal로 가기위한 선행 조건을 만족시키는 것이 이번 프로젝트의 목표이다.(기반이 튼튼해야 하기에…)

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