계층형 아키텍처, 헥사고날 아키텍처, 벌티컬 슬라이스 아키텍처 등 다양한 패턴들이 나왔음에도 불구하고, 우리는 아직까지 정착된 아키텍처 패턴을 갖지 못했다. 누군가는 계층형 아키텍처로 개발하면 확장이 어렵다고 말하고, 누군가는 헥사고날 아키텍처로 개발하면 유지보수가 어렵고 공수가 크다고 얘기한다. 이번 포스팅은 여러 가지 아키텍처 패턴을 적용해보면서 느꼈던 각각의 장점을 결합하여 정착한 아키텍처 패턴을 소개한다. 1. 아키텍처 패턴(Architecture Pattern)이란?[ 아키텍처 패턴의 필요성과 개념 ]개발자들은 비즈니스 로직 자체를 작성하는 데에도 많은 시간을 소요하지만, 적지 않게 여러 고민을 하는 시간 역시 존재한다. “클래스 이름을 뭐라고 하지?”, “해당 클래스를 어느 패키지에 위치..
1. 운영 환경을 위한 실용적인 로그 레벨(Practical Log Level)[ 실용적인 로그 레벨(Practical Log Level) ]먼저 개인적으로 서비스를 운영하면서 느꼈던 로그 레벨에 대한 부분을 표로 정리하면 다음과 같다. 사용 환경상황DEBUG개발개발 중에 문제를 추적하고 진단하는 데 사용됨INFO개발, 운영서비스를 운영하고 상황을 이해하는 데 사용됨WARN개발, 운영잠재적인 문제나 주의가 필요한 상황을 알리기 위해 사용됨ERROR개발, 운영시스템 오류나 예외 상황을 기록하기 위해 사용됨 관련 부분을 보다 자세하 살펴보면 다음과 같다. DEBUG개발을 진행하면서 문제를 추적하고 진단하기 위한 개발 및 테스트용 로그주로 로직 검증, 버그 추적, 데이터 흐름 파악을 위해 사용되므로, 운영 ..
1. MCP 서버 프로토콜, SSE에서 Streamable HTTP 방식으로의 대변경 [ MCP 프로토콜과 JSON-RPC 2.0 데이터 포맷 ]이전 포스팅에서 설명하였듯, MCP(Modal Context Protocol)는 Antropic(엔트로픽)이 2024년 11월 26일 처음 제안되어 오늘날 가장 널리 사용되고 인기있는 AI 프로토콜 중 하나이다. MCP와 같은 AI 프로토콜은 다양한 AI 구성 요소 간에 정보를 주고 받기 위해 탄생하게 되었다.구체적으로, MCP는 클라이언트와 서버 간 메시지 교환 형식으로 JSON-RPC 2.0을 사용한다. JSON-RPC 2.0은 RPC(Remote Procedure Call) 방식의 프로토콜 중 하나로, JSON을 메시지 포맷으로 사용하는 경량의 비동기 통신..
1. Gradle 의존성 분석을 통해 NoClassDefFoundError, NoSuchFieldError 오류 트러블슈팅 & 해결하기[ Gradle의 의존성 분석을 위한 Task들 ]Gradle의 dependencies TaskGradle은 의존성 분석을 위한 다양한 Taks들을 제공하는데, 크게 2가지를 활용하게 된다.dependencies모든 의존성과 그 트리 구조를 출력하는 Task전체적인 의존성을 파악하고, 특정 의존성이 '왜 추가되었는지' 확인하는 데 용이함dependencyInsight특정 의존성에 대한 상세 정보를 출력하는 Task특정 의존성에 대해 '왜 이 버전이 결정되었는지' 확인하는 데 용이함 먼저 dependencies Task를 실행해보자. 다음과 같은 명령어로 실행할 수 있다....
1. 올바른 카프카 컨슈머(KafkaConsumer) 설정 가이드와 내부 동작 분석[ group.protocol ]설정에 대한 설명group.protocol은 consumer가 사용할 그룹 프로토콜을 지정하는 설정으로 현재 classic과 consumer 두 가지 값을 지원한다. 해당 값을 consumer로 설정하면, consumer 그룹 프로토콜이 사용되며 다른 값을 설정하거나 생략하면 classic 그룹 프로토콜이 사용된다.classic 그룹 프로토콜은 Kafka 0.9 이후 기본 제공되어온 전통적인 Kafka consumer group 관리 방식이다. session.timeout.ms, heartbeat.interval.ms 등이 기존 방식 그대로 작동하며 consumer coordinator가 리..