개요이번 글에서는 부하 테스트 결과를 분석하고, 이를 바탕으로 WAS 이중화를 통해 성능을 개선하는 방안을 살펴보겠다.부하 테스트이미 JMeter, Locust, K6 등 좋은 도구들이 많지만 내가 원하는 기능을 모두 충족하는 툴은 없었다. 그래서 Go 언어를 통해 직접 부하 테스트 툴을 작성했다. 시나리오채팅방 입장 (Subscribe)채팅 전송 (Send)채팅 수신 완료 후 종료테스트는 30초 동안 진행되며, 1000명, 3000명, 5000명이 동시에 접속하는 상황을 테스트한다.인프라 CPU(Core)RAM(GB)WAS22DB2 4테스트 결과 테스트 결과, 1,000명의 동시 접속자인 경우 평균 1.2초의 지연 시간이 발생하며, 심하 경우 최대 4초에 가까운 지연이 확인되었다.3,000명부터는 평균..
분류 전체보기
AMQP란?AMQP(Advanced Message Queuing Protocol)는 메시지 지향 미들웨어에서 사용되는 개방형 표준 프로토콜입니다.이 프로토콜은 애플리케이션 간에 메시지를 안정적이고 효율적으로 전달하기 위한 규격을 제공합니다. AMQP는 메시징 큐를 중심으로 애플리케이션 간의 비동기식 통신을 가능하게 하여, 분산 시스템 간의 상호작용을 원활하게 만들어 줍니다.AMQP의 동작Producer(생산자)메시지를 생성하고, 이를 큐에 전송하는 역할생산자는 일반적으로 다른 시스템이나 애플리케이션으로부터 데이터를 받아 메시지 형식으로 변환하여 큐로 전송Consumer(소비자)큐에 저장된 메시지를 읽어 처리하는 역할Queue(큐)Consumer가 메시지를 Consume 하기 전까지 보관하는 장소Excha..
개요이번 시리즈에서는 기초부터 차근차근 시작하여, 10,000명의 동시 접속자가 발생하더라도 안정적으로 동작하는 실시간 채팅 서버를 구현해보려 합니다. 우선, 부하 테스트를 위한 기본적인 기능만 구현된 채팅 프로젝트에 대해 설명드리겠습니다.Spring Security, JPA 등 기본적인 세팅은 되어 있다고 가정하고 진행하겠습니다.주요 코드build.gradle.ktsdependencies { // WebSocket implementation("org.springframework.boot:spring-boot-starter-websocket") // ...생략}StompInterceptorStompInterceptor를 통해 CONNECT 시 JWT Token을 받아 인증 ..
멀티 테넌트멀티 테넌트 아키텍처는 하나의 애플리케이션 인프라에서 여러 개의 고객(테넌트)이 서비스를 공유하도록 하는 시스템을 의미합니다. 각 테넌트는 동일한 애플리케이션과 데이터베이스 인프라를 사용하지만, 데이터와 사용자 경험은 서로 독립적이어서 다른 테넌트와는 철저히 분리됩니다. 멀티 테넌트 환경에서 데이터베이스를 관리하는 여러 방식 중, 하나의 데이터베이스에 여러 스키마를 사용하는 방법을 살펴보겠습니다.데이터베이스 구조이 예제에서는 test1, test2 등의 구조를 사용하며, 각 테넌트는 하나의 스키마와 연관되어 있습니다. 사용자가 데이터를 조회할 때, 해당 사용자가 속한 테넌트(스키마)를 파악한 후, 해당 스키마에서 데이터를 조회하게 됩니다.MyBatis에서는 스키마명을 파라미터로 직접 전달하여 ..
팩토리 패턴이란?팩토리 패턴은 객체의 생성 책임을 클라이언트 코드에서 분리하여, 구체적인 객체 생성 과정을 외부에서 처리하는 패턴입니다.일반적으로 정적 팩토리 메소드를 사용하여 객체를 반환합니다.팩토리 패턴 적용 전 코드아래 코드는 웹 IDE 프로젝트의 일부 코드입니다. Docker와 연결해 언어별로 다른 동작을 합니다.public interface LanguageExecutor { void executeCode();}public class JavaExecutor implements LanguageExecutor{ @Override public void executeCode() { System.out.println("자바 코드 실행"); }}public class Jav..
@ModelAttribute란?클라이언트가 보내는 HTTP 파라미터들을 Java 객체에 바인딩하는데 사용합니다./me?name=woong&age=26 같은 QueryString 형태 혹은 요청 본문에 삽입되어 있는 Form 형태의 데이터를 처리합니다.주요 Flow1. 요청 수신DispatcherServlet : 모든 HTTP 요청은 DispatcherServlet에 의해 수신됩니다. 이 서블릿은 프론트 컨트롤러로서 요청을 적절한 핸들러(Controller)로 라우팅합니다.2. 핸들러 매핑HandlerMapping : DispatcherServlet은 요청 URL을 기반으로 적절한 핸들러를 찾기 위해 여러 HandlerMapping 구현체를 확인합니다. 예를 들어, RequestMappingHandlerM..