백엔드 개발을 4년 넘게 해오다보니 모든 순간이 레거시와 함께였고 이를 개선하며 소프트웨어가 발전되는 것을 보아왔습니다. 서비스와 제품이 진화할 때 개발자 역시 성장하는 개체이기 때문에 레거시의 발생은 필연적이며, 제품 성장에 발맞추어 소프트웨어를 변화시키고 진화시키는 것또한 필연적인 업무중 하나입니다.
이전 포스트에서 Domain Store Pattern이 현재의 JPA / Hibernate와 매우 유사한 형태를 띄고 있었다는 것을 알 수 있었습니다. 그러면 유사한 요소들을 비교하고 왜 이러한 형태를 가지게 되었는지 함께 알아봅시다.
Spring Framework를 사용하시는 분들이라면 JPA를 익숙하게 다루어 보셨을겁니다. Node.js 기반의 서버개발을 하시는 분들이라면 TypeORM, prisma, Python 진영이라면 Django ORM 혹은…
소프트웨어에서 흔히 말하는 아키텍처(Architecture)는 흔히 큰 규모의 시스템 혹은 소프트웨어 구조를 의미하는 것으로 묘사되는데 아키텍처의 어원을 살펴보면 아키텍처 패턴(Architectural Pattern)의 줄임말입니다. 패턴은 해결하는 문제의 규모에 따라 세가지 분류로 나누어지는데 아키텍처 패턴, 디자인 패턴, 이디엄이 그 예입니다. Posa1에서 소개된 세가지 분류의 정의를 함께 보겠습니다.
팀 토폴로지에서는 위와 같은 형태의 구조가 프랙탈(fractal) 구조로 이루어져야 한다고 나와있습니다. Stream-aligned team이 제품(도메인)영역에 속하는 스쿼드/제품조직을 의미합니다. 일반적으로 아마존의…
IT 업계가 성장하면서, 다양한 도구들과 기술들이 등장하며 소프트웨어 생태계는 더욱 동적으로 변화하고 있습니다. 산업과 비즈니스는 그에 맞추어 더욱 빠르게 변화합니다. IT 조직은 성장하며 쪼개지고 합쳐지고를 반복하며 더욱 복잡해집니다. 이러한 변화 속에서 소프트웨어는 MSA와 함께 작은 단위로 분리되며 변화되는 팀에 의해 주인을 잃고 snowflake server와 같은 상태가 되어버립니다.
이전 포스트에서 저희는 콘텐츠의 맥락(Context)를 추상화하여 하나의 API에서 서빙하는 방법에 대해서 함께 알아보았습니다. 그런데 아래의 이미지를 자세히 보시면, 맥락마다 콘텐츠가…
이전 포스트에서는 Jenkins Pipeline을 이용해 GitOps Workflow를 구현했었는데요. 이번 포스트에서는 Github Action을 이용해 GitOps Workflow를…
이번 포스트에서는 Sonarqube와 Github Action을 연동하는 방법에 대해서 작성해보겠습니다. 이전에 Jenkins와 Sonarqube를 연동했을 당시에는 JDK 11과…
이번 포스트에서는 Jenkins와 ArgoCD에서 Slack으로 알림을 보내는 작업을 구축해볼 예정입니다. Jenkins는 빌드 시작, 성공/실패여부와 ArgoCD에서는 Health 상태, Sync(Deploy) 성공/실패…
이번 포스트에서는 CICD 과정을 구축해볼 예정입니다. CI에서는 브랜치의 코드가 정상적으로 동작하는지 테스트하고 애플리케이션과 컨테이너를 빌드합니다. CD에서는 변경된 서버 스펙으로…
클린아키텍처가 제안한 휴리스틱 모델처럼 왜 개발이 진행될 수록 생산성이 떨어지는지 살펴보아야할 필요가 있습니다. 소프트웨어는 개발이 진행될수록 코드가 길어지고 다양한 비즈니스 로직이 생깁니다. 이것을 도메인 복잡도(Complexity)가 늘어난다고 표현합니다. 또한 소프트웨어와 조직의 규모가 커질수록 이해관계자가 많아지며 소프트웨어의 처음 설계 의도와 다른 방향으로 개발이 더욱 진행될 수도 있습니다. 이 과정에서 히스토리와 맥락이 잘 공유되지 않아 기존 설계 의도를…
이번 포스트에서는 ArgoCD를 구축해 보겠습니다. ArgoCD는 쿠버네티스를 위한 선언적인 GitOps CD툴로 컨셉이 재미있습니다.
이번 포스트에서는 node.js 기반 lambda middleware인 middly와 Lambda Powertools에 대해서 알아보고 AWS…
이번 포스트에서는 SonarQube를 통해 코드 스멜, 버그 등을 정적으로 분석하고 Jacoco를 통해 코드커버리지를 분석…
GitHub의 Hook 이벤트를 알아보고 Jenkins와 연동해보겠습니다.
Kubernetes에서 Jenkins Master — Agent로 구성된 Cluster를 구축해볼 예정입니다. Jenkins Agent는 일반적으로 JNLP(JAVA Web Start)방식으로 노드들간 통신을 합니다. 또한…
아이젠하워 매트릭스에서 본것 처럼 우선 어떠한 요구사항을 중요한 것과 중요하지 않은 것으로 나눌 수 있어야합니다. 돈과 시간 같은 자원은 유한하기 때문에 어디에 이러한 비용을 지출할지에 대한 결정은 필연적입니다. 기업은 결국 이익을 위한 집단인 점에 미루어 보았을 때, 소프트웨어는 결국 고객에게 전달되는 일종의 서비스(Service)로 고객에게 주는 핵심가치(Core Value)가 가장 중요한 것이며 핵심가치는 산업, 경쟁사로부터 경쟁우위(Edge)를 점할 수 있습니다. 유한한 자원을 투입한다면…
소프트웨어의 가치는 행위(behavior)와 구조(structure)로 이루어진다 [마틴]
소프트웨어 분야에서 설계(design)과 아키텍처(architecture)는 자주 등장하는 단어로 집을 설계하는 것을 비유로 들어보면 집의 형태, 외관, 입면도, 공간이나 방의 배치 등을 의미합니다. 건축가가 설계한 도면을 보면 앞서 말한 것 과 같은 고수준의 설계사항과 콘센트, 배선, 문 모두 어디에 위치해야하는지와 같은 세부사항도 함께 포함됩니다. 소프트웨어 설계도 이와 마찬가지로 고수준의 설계와 저수준의 설계 모두 포함하며 결국 하나의 소프트웨어는 고수준부터 저수준으로 수많은 설계와 결정사항들로 이루어져있습니다.