본문 바로가기

한화시스템 Beyond SW Camp/백엔드35

[Spring Boot] CQRS (Command Query Responsibility Segregation) 기반 이벤트 소싱 CQRS (Command Query Responsibility Segregation) CQRS는 명령과 조회를 분리하여 시스템을 더 효율적이고 확장 가능하게 만들 수 있는 패턴 Command (명령) : 데이터 변경하는 작업. C, U, D 작업-> Kafka를 사용해 이벤트 발행Query (조회) : 데이터를 읽는 작업. R 작업-> Kafka 메세지를 구독해 데이터 반영 CQRS 패턴을 기반으로 한 이벤트 소싱 + Kafka 구조 구현프로젝트 구조프로젝트는 루트 프로젝트 아래에 데이터 변경 작업만 하는 board-command-service 모듈과 데이터 읽는 작업만 하는 board-query-service 모듈로 구성하였다. 의존성 주입 (build.gradle)implementation 'org... 2025. 3. 4.
[Spring Boot] 동시성 제어 동시성 제어애플리케이션을 사용하다보면 수많은 사용자가 동시에 데이터를 읽고 쓰고 한다. 예를 들어 콘서트 티켓팅을 하다가 마지막 남은 티켓을 동시에 여러 사용자가 결제한다고 가정해보자. 이때 동시성 문제가 발생할 것이다. 사용자가 마지막 티켓을 거의 동시에 구매 버튼을 눌렀을 때 시스템이 동시성 제어를 하고 있지 않다면 하나 남은 티켓이 두 번 결제되거나 한 사람의 결제는 오류가 날 것이다. 이러한 문제를 방지하기 위해서 동시성 제어가 필요하다. 동시성 제어 : 동시에 접근하는 여러 사용자의 요청이 데이터 무결성을 해치지 않도록 관리하는 것을 의미동시성 제어를 테스트하기 위해 Postman과 같은 역할을 하는 Talend API Tester를 사용하였다.멀티 스레드 환경에서 동시성 제어를 테스트 하기 .. 2025. 2. 25.
[Spring Boot] N+1 문제 N+1 문제Spring JPA를 사용하며 프로젝트를 하다보면 한 번씩 N+1 문제를 겪는다.public class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long idx; private String email; private String password; @Builder.Default @OneToMany(mappedBy = "member") List posts = new ArrayList();}public class Post { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id.. 2025. 2. 24.
[Spring Boot] Gateway, Eureka Monolithic Architecture모든 기능이 하나의 프로젝트 안에 포함되어 한 번에 빌드하고 배포되는 구조개발과 배포가 단순하지만 서비스가 커질수록 유지보수, 확장이 어려워지고 하나의 기능에 문제가 생기면 서비스 전체에 영향을 줄 수 있는 구조이다.MSA(Microservices) Architecture애플리케이션을 작은 단위의 독립적인 서비스로 나눠 개발하고 배포하는 구조각 서비스가 독립적으로 실행되고 확장될 수 있어서 유연성이 높다. 하지만 서비스 간 통신과 관리를 위해 Spring Eureka와 같은 디스커버리 도구가 필요하다. 서비스 디스커버리 (Service Discovery) 서비스 찾기라고 생각하면 된다. MSA는 위에서 말했다시피 여러 서비스가 각각 실행된다. 예를 들면 Board.. 2025. 2. 23.
[Spring Boot] 멀티 모듈 프로젝트 멀티 모듈(Multi-Module) 프로젝트 : 하나의 큰 프로젝트를 여러 개의 작은 모듈로 나누어 관리하는 구조각 모듈들은 독립적으로 개발, 빌드가 될 수 있지만 서로 필요한 기능을 공유할 수가 있다. 각 모듈은 api 모듈 (비즈니스 로직), common 모듈(공통 유틸리티) 와 같이 하나의 역할만 담당한다.  단일 모듈은 전체 프로젝트를 한번에 빌드해야하고 멀티 모듈은 개별로 빌드 가능하다.멀티 모듈은 보통 대규모 프로젝트에 많이 쓰이고 단일 모듈은 소규모 프로젝트에 많이 쓰인다. 그치만 멀티 모듈은 의존성 관리가 다소 복잡할 수 있다는 단점이 있다. 재사용성 : 공통 기능(common 모듈)을 다른 모듈에서 쉽게 재사용 가능빠른 빌드 : 변경된 모듈만 빌드하면 되니 시간 절약유지보수 용이 : 문제.. 2025. 2. 22.
[Spring Boot] Stomp를 이용한 채팅 시스템 구현 STOMP (Simple Text Oriented Messaging Protocol) : 텍스트 기반의 메시징 프로토콜. 주로 웹 소켓을 이용해 클라이언트와 서버 간에 실시간 양방향 통신을 가능하게 하는 기술 웹 소켓과 차이점은 웹 소켓은 연결 유지와 데이터 전송을 담당하면은 STOMP는 그 위에서 메시징 기능을 추가해서 편리하게 메세지를 주고받을 수 있다. 채팅 시스템 구현을 위한 간단한 프론트엔드 채팅번호 : {{ roomIdx }} 전송 WebSocketConfig (웹 소켓과 메세징 브로커 설정 클래스)@Configuration@EnableWebSocketMessageBrokerpublic class WebSocketConfig implements WebSocketMessageBrokerC.. 2025. 2. 19.