TIL

    헥사고날 아키텍처 Hexagonal Architecture 란?

    사이드 프로젝트를 하면서 헥사고날 아키텍처를 접하게 되었는데,새로운 아키텍처를 사용하면서 이런 부분이 왜 개선이 되었구나를 직접 느끼게 되어그 내용에 대해 정리해본다.  전통적인 웹-도메인-영속성 구조에서는 한 계층의 변화가 다른 계층에도 영향을 끼칠 수 있다. 사실 평소에 개발하면서 느꼈던 것이었다. 예를 들어 다른 Controller가 같은 Service를 사용하면 Controller의 변경이 Service 계층에 영향을 주면서 애플리케이션의 유연성과 확장성을 떨어뜨린다.  클린아키텍처를 는 이런 문제에 대한 해결책을 제공한다. 각 계층이 본연의 책임을 가지고 독립적으로 동작하도록 설계되어 있어, 외부의 변화에 덜 민감하고 내부 로직의 변화가 외부에 영향을 미치는 것을 최소화한다. 이를 통해 유지보수..

    웹 어플리케이션에서의 동시성 제어 (feat. Lock)

    화면에서 사용자가 버튼을 N번 연달아 클릭했다고 생각해보자. API가 연달아 호출된다. 만약 DB에 insert, update, delete하는 로직이 있었다면 같은 데이터가 N개 insert되는 등의 동시성 이슈가 발생한다. 물론 화면에서 더블클릭을 막는 등 여러 방법이 있겠지만 이번 포스팅에서는 백엔드 서버에서 Lock을 통해 해결하는 방식에 대해 알아본다.  사실 Lock에 대해서는 이전에 운영체제(OS)를 다루면서 포스팅한 적이 있다.https://simsim231.tistory.com/134 [OS] Process 동기화(1)[OS] Process 동기화(1) Process 동기화란 여러 프로세스가 공유하는 자원의 일관성을 유지하는 것 임계구역(Critical Section) 문제 do { en..

    EDA 기반의 MSA 환경에서 서비스간 데이터 정합성 맞추기 (SAGA Pattern, Outbox Pattern)

    EDA(Event Driven Architecture) 기반의 MSA(Microservice Architecture) 환경에서 서비스간 데이터 정합성은 어떻게 맞추는지 고민한 내용을 정리해본다. 문제상황 (예시)전제- 모놀리틱 구조에서 MSA 환경으로의 변경으로 주문 서비스, 배송 서비스를 분리- MSA 환경에서 서비스간 결합도가 낮은 방식으로 통신하기 위해 비동기 방식인 Kafka 사용메인 로직주문완료(주문서비스) -> 주문완료 이벤트 발행(Kafka) -> 배송정보 생성(배송서비스)위와 같은 상황에서 이런 의문이 든다. 주문서비스와 배송서비스가 분리된 환경에서 주문완료는 성공했는데 배송정보 생성이 실패하면 이전에 성공한 로직은 어떻게 처리해줄까? (분리된 서비스의 트랜잭션은 어떻게 처리해주는게 좋을까..

    Kafka Consumer의 commit을 제어하는 enable.auto.commit과 AckMode

    우리가 Kafka Consumer의 commit을 제어한다고 했을 때 보통 2가지 설정값을 떠올린다. enable.auto.commit과 AckMode다. 그렇다면 enable.auto.commit도 Consumer의 commit을 제어하는 설정값이고, AckMode도 Consumer의 commit을 제어하는데 이 둘이 따로 관리되는 걸까?  일단 consumer가 offset을 commit 하는 것은 Kafka의 내부 Topic인 __consumer_offsets에 저장하는 행위이며, consumer는 이 offset 값을 참조해서 다음에 처리한 메시지를 읽어온다는 것이 기본 개념이다. Commit에는 자동커밋과 수동커밋이 있는데 enable.auto.commit으로 Kafka 클라이언트의 커밋방식 제..

    Servlet부터 Filter와 Interceptor까지

    ServletHTTP 요청이 WAS, Servlet에 의해 처리되고 응답이 되는 과정을 보면 Servlet이 어떤 것인지 알 수 있다.HTTP 요청 -> WAS는 Request, Response 객체를 만들어서 Servlet 객체 호출 -> Servlet 객체에서 Request  객체에서 HTTP 요청 정보를 꺼내서 비즈니스 로직 수행 -> 다시 Response 객체에 HTTP 응답 정보를 담아서 WAS가 Response 객체에 담겨있는 내용으로 HTTP 응답 정보를 생성해서 클라이언트로 보냄 즉, Servlet은 Web Application에서 HTTP 프로토콜을 이용해 요청을 처리하고 응답을 하는 자바 클래스이다.이러한 servlet을 관리해주는 것이 Servlet Container이다. Servle..

    무중단 배포 전략 - 롤링, 블루-그린, 카나리 배포

    서비스가 과거 모놀리식 구조에서 MSA(Micro Service Architecture) 구조로 쪼개지고 배포 주기도 짧아지면서 배포 방식 또한 변화가 생겼다. 기존 서버를 종료하고 새로운 버전의 서버를 실행하는 중단 배포 방식(유저가 서비스를 이용할 수 없는 시간인 downtime이 존재한다.)보다는 서비스가 중단되지 않는(zero-downtime) 무중단 배포 방식을 많이 채용한다. 무중단 배포(Zero-downtime deployment)에는 서비스가 중단되지 않은 상태로 새로운 버전을 사용자들에게 배포하는 것을 의미한다. 무중단 배포를 하기 위해서는 최소 서버가 2대 이상 필요하다. 가장 많이 알려져 있는, 무중단 배포의 3가지 전략, 롤링 배포, 블루-그린 배포 그리고 카나리 배포에 대해 알아보..

    SQL 성능 확인, Plan(실행계획) 보는 법

    mybatis로 개발을 하면서 query의 성능을 최적화 시키는게 필요한 시점들이 있다. 이때 튜닝을 하게 된느데 튜닝의 기초라고 할 수 있는 플랜 보는 법을 알아보자. 1. plan (실행계획) 이란? DBMS는 SQL을 수행할 최적의 처리 경로를 생성해 주는 핵심 엔진인 옵티마이저(Optimizer)를 가지고 있다. 이 옵티마이저는 우리가 SQL을 작성하고 실행하면 이 쿼리를 어떤 순서로 실행하겠다고 실행계획을 세우게 된다. 이 실행계획이 어떤 순서로 짜여져 있냐에 따라 성능의 차이가 크기 때문에 plan을 보는 방법을 알아두면 쿼리 성능 개선에 큰 도움이 된다. 2. plan 보는 법 툴을 확인하거나 "Explain plan for"를 쿼리 앞단에 붙여서 실행계획을 떠보면 위와 비슷한 형식으로 나온..

    Maven Lifecycle (+ Gradle, Ant)

    Intellij에서 우측의 maven을 클릭하면 clean, validate.. 등 다양한 버튼이 있다.각각이 어떤 행위를 하는 버튼인지 알려면 maven의 lifecycle을 이해해야한다. MavenMaven이란 빌드도구다. 소스코드를 컴파일, 테스트, 정적 분석 등을 실시해서 실행 가능한 애플리케이션으로 생성을 도와주고 계속해서 늘어나는 라이브러리를 자동 추가 및 관리해주는 도구다. 만약 우리가 빌드도구를 사용하지 않고 빌드를 한다면 개발하면서 필요한 다양한 라이브러리들을 직접 다운로드하고 관리하기 어려울 것이고 빌드 프로세스를 수동으로 호출할 때 어떤 순서로 하고 무엇을 빌드할지 파악하기 어려울 것이다. 이를 도와주는 빌드도구 중 하나가 maven이다. Maven으로 프로젝트를 생성하면 아래와 같이..