전체보기 164

MSA에서의 모니터링과 로깅 전략

마이크로서비스 아키텍처는 서비스 간의 결합도를 낮추어 확장성과 유연성을 제공하지만, 이러한 환경에서는 모니터링과 로깅 전략이 매우 중요합니다. 이 글에서는 마이크로서비스 환경에서의 모니터링과 로깅의 중요성과 이를 위한 전략을 자세히 살펴보겠습니다. 1. 모니터링의 중요성 마이크로서비스 아키텍처에서는 각각의 서비스가 분산되어 있기 때문에 모든 서비스의 성능 및 가용성을 지속적으로 모니터링하는 것이 중요합니다. 이를 통해 다음과 같은 이점을 얻을 수 있습니다. - 시스템의 성능 파악 : 모든 서비스의 응답 시간 및 부하를 모니터링하여 성능 문제를 식별합니다. - 가용성 보장 : 서비스의 다운타임을 최소화하기 위해 실시간으로 서비스의 상태를 파악하고 장애를 빠르게 대응합니다. - 스케일링 결정 : 부하가 증가..

MSA 2024.03.03

MSA의 확장성과 효과적인 관리: 써킷 브레이커

안녕하세요. 이번에는 마이크로서비스 아키텍처에서의 확장성과 효과적인 관리에 대해 정리해보겠습니다. 특히, 신뢰성을 확보하기 위한 써킷 브레이커에 대한 내용을 중점적으로 다룰 것입니다. ● 확장성: 수평적 vs. 수직적 확장 1. 수평적 확장 (Horizontal Scaling) 수평적 확장은 각 서비스를 여러 서버 인스턴스로 확장하여 시스템 성능을 향상시키는 방법 중 하나입니다. 마이크로서비스 아키텍처에서는 새로운 인스턴스를 동적으로 추가하여 트래픽을 분산시키고, 서비스의 부하를 분담할 수 있습니다. 이를 통해 시스템의 안정성을 유지하면서 확장성을 확보할 수 있습니다. 2. 수직적 확장 (Vertical Scaling) 수직적 확장은 단일 서버의 성능을 향상시키는 방법으로, 각 서비스의 서버 자원을 업그..

MSA 2024.03.02

마이크로서비스 아키텍처 구성 요소 : API 게이트웨이

안녕하세요. 이번에는 마이크로서비스 아키텍처에서 중요한 역할을 하는 "API 게이트웨이"에 대해 알아보겠습니다. 마이크로서비스 아키텍처에서 API 게이트웨이는 어떤 역할을 하는지, 그리고 어떻게 활용되어야 하는지에 대한 내용을 다뤄보겠습니다. API 게이트웨이의 역할 API 게이트웨이는 마이크로서비스 아키텍처에서 클라이언트와 서비스 간의 중간 매개체로 작동합니다. 이는 여러 가지 기능을 수행하여 전체 시스템을 더 효율적으로 만들어줍니다. 1. 통신 라우팅 API 게이트웨이는 클라이언트의 요청을 받아 어떤 마이크로서비스로 전달할지를 결정하는 역할을 합니다. 이를 통해 클라이언트는 특정 서비스의 위치를 알 필요 없이 API 게이트웨이의 주소만 알면 됩니다. 2. 인증 및 권한 부여 보안은 마이크로서비스 아키..

MSA 2023.12.15

마이크로서비스 아키텍처 (MSA) 소개

안녕하세요. 오늘은 현대 소프트웨어 개발에서 핵심적인 역할을 하는 "마이크로서비스 아키텍처"에 대해 더 깊이 살펴보려고 합니다. 마이크로서비스 아키텍처란? 마이크로서비스 아키텍처는 소프트웨어 시스템을 여러 작은 독립적인 서비스로 나누어 관리하는 아키텍처 디자인 패턴입니다. 이는 전통적인 모놀리식(Monolithic) 아키텍처에서 벗어나, 각 서비스가 독립적으로 개발, 배포, 확장, 유지보수될 수 있도록 하는 것을 목표로 합니다. 모놀리식 vs 마이크로서비스 전통적인 모놀리식 아키텍처에서는 모든 기능이 하나의 대규모 애플리케이션에 통합되어 있습니다. 이에 반해, 마이크로서비스 아키텍처는 각 서비스가 자체적으로 데이터베이스와 통신하며, 독립적인 기능을 수행합니다. 마이크로서비스의 이점 - 독립적인 배포와 확..

MSA 2023.12.11

[CleanCode] 동시성

CleanCode - 동시성 동시성이 필요한 이유? 동시성은 '무엇'과 '언제'를 분리하는 전략입니다. '무엇'과 '언제'를 분리하면 애플리케이션 구조와 효율이 극적으로 나아집니다. 동시성에 대한 일반적인 오해 동시성은 항상 성능을 높여준다. 여러 스레드가 프로세서를 공유하거나, 여로 프로세서가 동시에 처리할 계산이 충분히 많은 경우 성능이 높아집니다. 위 경우 같을 때 성능을 높여줍니다. 항상은 아닙니다. 동시성을 구현해도 설계는 변하지 않는다. 단일 스레드와 다중 스레드 시스템은 설계가 다릅니다. 웹 또는 EJB 컨테이너를 사용하면 동시성을 이해할 필요가 없다. 반드시 이해해야 데드락, 동시 수정등의 문제를 피할 수 있습니다. 동시성 방어 원칙 단일 책임 원칙 주어진 메서드/클래스/컴포넌트를 변경할 ..

CleanCode 2023.12.10

[CleanCode] 창발성

CleanCode - 창발성 창발적 설계로 깔끔한 코드를 구현하자. 여기서 창발성이란 무슨 뜻일까요? 보통 자주쓰는 단어는 아닙니다. 사전에 따르면 창발성이란 하위 계층(구성 요소)에는 없는 특성이나 행동이 상위 계층(전체 구조)에서 자발적으로 돌연히 출현하는 현상이라고 합니다. 책에서는 켄트 벡이 제시한 단순한 설계 규칙 네 가지가 소프트웨어 설계 품질을 크게 높여준다고 합니다. 이는 다음과 같습니다. - 모든 테스트를 실행한다. - 중복을 없앤다. - 프로그래머의 의도를 표현한다 - 클래스와 메서드 수를 최소로 줄인다. 1. 모든 테스트를 실행한다. 무엇보다 먼저 설계는 의도한대로 돌아가는 시스템을 내놓아야 합니다. 문서로는 잘 설계했지만, 의도한 대로 시스템이 동작하는지 검증할 방법이 없다면 인정받..

CleanCode 2023.12.05

[CleanCode] 시스템

CleanCode - 시스템 이 장에서는 사용과 제작이 다르다는 사실을 명심하는 것부터 시작됩니다. 사용과 제작을 분리하는 메커니즘 하나가 의존성 주입(DI)입니다. DI는 제어의 역전(IoC)기법을 의존성 관리에 적용한 메커니즘입니다. IoC에서는 한 객체가 맡은 보조 책임을 새로운 객체에게 전적으로 떠넘깁니다. 새로운 객체는 넘겨받은 책임만 맡으므로 단일책임원칙을 지키게됩니다. 호출하는 객체는 실제로 반환되는 객체의 유형을 제어하지 않습니다. 대신 의존성을 능동적으로 해결합니다. 확장 '처음부터 올바르게' 시스템을 만들 수 있다는 믿음은 미신이라고 합니다. (말이 안됩니다!) 그래서 우리는 오늘 주어진 사용자 스토리에 맞춰 시스템을 구현해야 합니다. 그리고 내일은 새로운 스토리에 맞춰 시스템을 조정하..

CleanCode 2023.11.14

[CleanCode] 클래스

CleanCode - 클래스 클래스를 정의하는 표준 자바 관례에 따르면, 가장 먼저 변수 목록이 나옵니다. 변수 목록 다음에는 공개 함수가 나옵니다. 그리고 그 이후에는 비공개 함수가 나옵니다. 즉, 추상화 단계가 순차적으로 내려갑니다. 클래스를 만들 때 첫 번째 규칙은 크기입니다. 클래스가 작아야 좋다고 책에서는 강조를 하고 있습니다. 크기를 줄이는 방법 중 중요한 것은 바로 '작명' 입니다. 클래스 이름은 해당 클래스 책임을 기술해야 합니다. 명확히 해당 클래스의 책임을 기술한다면 클래스의 크기를 줄이는데 많은 도움이 됩니다. (하지만 작명이 가장 어려운 것 같습니다!) 그 다음은 SRP (Single Responsibility Principle). 단일 책임 원칙에 대해 설명합니다. SRP는 클래스..

CleanCode 2023.11.13

[CleanCode] 단위 테스트

CleanCode - 단위 테스트 이 장에서는 TDD에 대해 간단히 소개하고 있습니다. 책에서 알려주는 TDD 법칙 세 가지가 있는데, 다음과 같습니다. - 실패하는 단위 테스트를 작성할 때까지 실제 코드를 작성하지 않는다. - 컴파일은 실패하지 않으면서 실행이 실패하는 정도로만 단위 테스트를 작성한다. - 현재 실패하는 테스트를 통과할 정도로만 실제 코드를 작성한다. 하지만 단순히 이렇게 일하면 실제 코드와 맞먹을 정도의 방대한 테스트 코드가 생기며, 관리 문제를 유발하기도 합니다. 그래서 깨끗한 테스트코드 관리가 필요합니다. 테스트 코드는 실제 코드 못지 않게 중요합니다. 그러므로 실제 코드처럼 깨끗하게 짜야 합니다. 테스트는 유연성, 유지보수성, 재사용성을 제공합니다. 깨끗한 테스트는 다음 규칙을 ..

CleanCode 2023.11.11

[CleanCode] 경계

CleanCode - 경계 시스템에 들어가는 모든 소프트웨어를 직접 개발하는 경우는 거의 없습니다. 때로는 패키지를 사고, 때로는 오픈 소스를 쓰며, 때로는 다른 부서에서 만든 컴포넌트를 쓰며 개발합니다. 이렇듯 외부 코드를 사용하는 경우가 많은데, 이 외부 코드를 우리 코드에 깔끔하게 적용시켜야 합니다. 책에서는 이러한 경계를 깔끔하게 처리하는 방법을 안내해주고 있습니다. 예시로 java.util.Map 클래스가 등장합니다. Map은 굉장히 다양한 인터페이스로 수 많은 기능을 제공하고 있습니다. ex) clear(), remove(Object key), put(Object key, Object value)... Map을 단순히 반환하면 사용자가 불필요한 기능까지 전달하거나 변환의 책임까지 전가합니다. ..

CleanCode 2023.11.11