분류 전체보기(78)
-
메시지 브로커 중에 Kafka를 도입한 이유
메시지 브로커란?메시지 브로커는 애플리케이션 간 서로 통신할 때 정보를 주고받을 수 있도록 도와주는 소프트웨어이다.우체국처럼 메시지를 보내는 쪽인 **생산자(Producer)**와 메시지를 받는 쪽인 소비자(Comsumer) 사이에서 메시지를 전달하는 역할을 수행한다.그렇기 때문에 MSA(Micro Service Architecture) 또는 분산 시스템에서 서비스 간 통신에 주로 사용되는 경우가 많고, 시스템 로그 처리, 비동기 메시지 큐 등 다양한 곳에서 활용된다.왜 메시지 브로커가 필요한가?메시지 브로커가 필요한 이유는 다음과 같다.편지를 받는 사람(Consumer)는 편지를 쓰는 사람(Producer)이 편지를 다 쓸때까지(=메시지를 생산할때까지), 멍 때리며 가만히 있지 않는다. 무언가 일을 하..
2025.03.06 -
Cursor기반 페이지네이션으로 성능 개선하기
현재 [강아지 모아보기]페이지에서 5가지 속성(브리더의 인증여부, 견종, 분양가능상태, 성별, 크기)을 기반으로 다중검색이 가능한 상황이다.기존 코드는 아래와 같다.@Transactional(readOnly = true)public ResponseEntity getDogs(Pageable pageable, Long dogTypeId, String verification, Boolean isAvailable, Gender gender, Size size) { Specification spec = Specification .where(DogSpecification.isVerified(verification)) ..
2025.03.06 -
비관적 락과 낙관적 락, 둘 중에 어떤것을 적용할까?
SNS프로젝트를 하다가, 특정 인기 게시물에 대한 좋아요 개수가 multi-thread환경에서 올바르게 증가되지 않는 현상을 발견하였다.인기 게시물의 경우, 수십명이 좋아요를 누르게 될 것이다. 여러 Thread가 좋아요 컬럼에 update를 하다가 여러 경합이 발생했을 것이라고 판단하였다.이 문제를 해결하고자 비관적락을 도입하여 좋아요 개수가 올바르게 증가하도록 하였다.이번 글에서는 비관적 락과 낙관적 락의 차이에 대해 설명하고, 왜 비관적 락을 도입했는지 설명하고자 한다.DB 충돌 상황을 개선할 수 있는 방법DB에 접근해서 데이터를 수정할 때, 위 SNS프로젝트처럼, 동시에 수정이 일어나 충돌이 일어날 수 있다.이를 해결할 수 있는 방법으로 크게 2가지를 제시한다.첫번째, 테이블의 Row에 접근시, ..
2025.02.28 -
JVM
Java21의 Virtual Thread에 대해 공부하던 중, VM 스레드라는 용어가 나왔다. 자주 접하는 용어이지만, 더 깊이 학습하고자 작성하게 되었다.Platform Thread (플랫폼 스레드)는 OS 스레드를 래핑 하여 구현한 JVM 스레드 Java Virtual Machine의 줄임말.직역하면, ‘자바를 실행하기 위한 가상 기계’라고 할 수 있다.Java는 OS에 종속적이지 않다는 특징을 가지고 있다. OS에 종속받지 않고 실행되기 위해선 OS위에서 Java를 실행시킬 무언가가 필요하다. 그게 바로 JVM이다.즉, OS에 종속받지 않고 CPU가 Java를 인식, 실행할 수 있게 하는 가상 컴퓨터이다.Java 소스코드, 즉 원시코드(*.java)는 CPU가 인식을 하지 못하므로 기계어로 컴파일을..
2025.02.27 -
DB Connection Pool
스프링부트 애플리케이션 성능을 최적화하기 위한 방법 중 DB Connection Pool을 늘리는 방법이 있다.이번 글은 DB Connection Pool이 무엇인지 알아보고자 한다. DB Connection Pool이란 애플리케이션과 DB서버가 통신할 수 있도록 하는 기능이다.아래 코드는 Java의 DB Connection을 JDBC를 이용해 구현한 예이다.public Connection getConnection() { try { return DriverManager.getConnection("jdbc:mysql://" + SERVER + "/" + DATABASE + OPTION, USERNAME, PASSWORD); } catch (final SQLExc..
2025.02.27 -
Ch04. 스트림 소개
스트림 소개거의 모든 자바 애플리케이션은 컬렉션을 만들고 처리하는 과정을 포함합니다. 대부분의 프로그래밍 작업에 사용되며, 컬렉션으로 데이터를 그룹화하고 처리할 수 있습니다. 비즈니스 로직상 컬렉션에 대해 특정 카테고리로 그룹화 하던가, 특정 키워드를 사용하여 원하는 결과를 찾는 연산을 요구하는 작업이 있을 수 있습니다. 대부분 데이터베이스에서는 선언형으로 이와 같은 연산을 표현할 수 있습니다. 예를 들어 ‘SELECT name FROM cars WHERE price 이처럼 자동차의 속성을 이용하여 어떻게 필터링 할 것인지는 구현할 필요가 없습니다. 어떻게 구현해야 할지 명시할 필요가 없고 구현은 자동으로 제공됩니다. 컬렉션으로도 이와 비슷한 기능을 만들 수 있지 않을까? 많은 요소를 포함하는 커다란 ..
2024.06.25