전체 글

전체 글

    아파치 카프카 (Kafka)

    Kafka 아파치 카프카는 가장 새로운 메시징 시스템으로, ActiveMQ, Artemis, RabbitMQ와 유사하면서도 특유의 아키텍처를 가지고 있다. 카프카는 높은 확장성을 제공하는 클러스터로 실행되도록 설계되었으며, 클러스터의 모든 카프카 인스턴스에 걸쳐 토픽을 파티션으로 분할하여 메시지를 관리한다. 카프카의 토픽은 클러스터의 모든 브로커에 걸쳐 복제된다. 클러스터의 각 노드는 하나 이상의 토픽에 대한 리더로 동작하고, 토픽 데이터를 관리하고, 클러스터의 다른 노드로 데이터를 복제한다. 각 토픽은 여러 개의 파티션으로 분할될 수 있으며, 클러스터의 각 노드는 한 토픽의 하나 이상의 파티션의 리더가 된다. 설정 implementation 'org.springframework.kafka:spring-..

    비동기 메시지 전송 (JMS, RabbitMQ)

    비동기 메시징은 애플리케이션 간에 응답을 기다리지 않고 간접적으로 메시지를 전송하는 방법으로, 통신하는 애플리케이션 간의 결합도를 낮추고 확장성을 높일 수 있다. 스프링이 제공하는 비동기 메시징으로는 JMS, RabbitMQ, AMQP, 아프치 카프카가 있다. JMS JMS는 두 개 이상의 클라이언트 간에 메시지 통신을 위한 공통 API를 정의하는 자바 표준이다. 자바로 비동기 메시징을 처리하는 가장 좋은 방법으로, 모든 구현 코드가 공통 인터페이스를 통해 함께 동작할 수 있게 해준다. 스프링은 JmsTemplate라는 템플릿 기반의 클래스를 통해 JMS를 지원하며, 메시지 기반의 POJO도 지원한다. JmsTemplate를 사용하면 프로듀서가 큐와 토픽에 메시지를 전송하고 컨슈머는 그 메시지들을 받을 ..

    13702 이상한 술집

    문제 https://www.acmicpc.net/problem/13702 13702번: 이상한 술집 프로그래밍 대회 전날, 은상과 친구들은 이상한 술집에 모였다. 이 술집에서 막걸리를 시키면 주전자의 용량은 똑같았으나 안에 들어 있는 막걸리 용량은 랜덤이다. 즉 한 번 주문에 막걸리 용 www.acmicpc.net 접근 막걸리 주전자의 개수(s개)가 나누어줄 사람(c개)보다 작거나 같고, 정해진 용량을 나누어주고 남은 막걸리는 버린다고 했으므로, 나누어줄 수 있는 막걸리의 최댓값을 결정할 수 있다. 0과 최댓값 사이에서 문제의 제한조건을 만족시키는 경우를 찾아 나서면 되므로, 이분탐색으로 풀이 풀이 lt를 1로, rt를 주전자에 들어있는 막걸리의 최솟값으로 설정 mid 값에 대해서 각 주전자마다 몇 명에..

    2110 공유기 설치

    문제 https://www.acmicpc.net/problem/2110 2110번: 공유기 설치 첫째 줄에 집의 개수 N (2 ≤ N ≤ 200,000)과 공유기의 개수 C (2 ≤ C ≤ N)이 하나 이상의 빈 칸을 사이에 두고 주어진다. 둘째 줄부터 N개의 줄에는 집의 좌표를 나타내는 xi (0 ≤ xi ≤ 1,000,000,000)가 www.acmicpc.net 접근 주어진 집들(n개)에 공유기(c개)를 설치할 때, 가장 인접한 두 공유기 사이의 최대 거리를 구하는 문제 가장 처음 든 생각은 집들 중 공유기를 설치할 집들을 선택하는 방법으로 접근하려 했으나, 이 방법의 시간 복잡도는 nCc이며, n과 c의 범위가 2 ≤ n ≤ 200,000, 2 ≤ c ≤ n 이므로 시간초과가 날 것 (제한시간 2..

    QueryDSL

    QueryDSL JPQL을 편하게 작성하도록 도와주는 빌더 클래스 모음으로, 문자가 아닌 코드 기반이기 때문에 문법 오류를 컴파일 단계에서 잡아낼 수 있다. 비표준 오픈소스 프로젝트로, JPA 뿐만 아니라 JDO, 몽고DB, Java 컬렉션 등도 거의 같은 문법으로 지원한다. 특징 쿼리 DSL의 핵심은 타입 안정성으로, 도메인 타입의 프로퍼티를 반영해서 생성한 쿼리 타입(Q)을 이용해서 쿼리를 작성한다. 또한 Query 인터페이스는 공통의 상위 인터페이스를 가지므로, 기반 기술에 상관없이 쿼리 경로와 오퍼레이션 모두 일관성있게 사용할 수 있다. JPA 쿼리 의존성 추가 // Spring Data JPA implementation 'org.springframework.boot:spring-boot-star..

    Garbage Collector (GC)

    자바 프로그래밍에서 하나의 객체는 메모리를 점유하고, 필요하지 않으면 메모리에서 해제되어야 한다. GC란 더 이상 필요가 없는 쓰레기 객체를 정리하는 작업을 말한다. 자바에서는 메모리를 GC로 관리하기 때문에, 개발자가 메모리를 처리하기 위한 로직을 만들 필요가 없다. GC 작업을 하는 가비지 콜렉터는 메모리 할당, 사용 중인 메모리 인식, 사용하지 않는 메모리 인식과 같은 일들을 수행한다. 사용하지 않는 메모리를 인식하는 작업을 수행하지 않으면, 할당한 메모리 영역이 꽉 차서 JVM에 행이 걸리거나, 더 많은 메모리를 할당하려는 현상이 발생한다. 행이란, 서버가 요청을 처리 못하고 있는 상태를 의미한다. 만약 JVM의 최대 메모리 크기를 지정해서 전부 사용한 다음, GC를 해도 더 이상 사용 가능한 메..

    JVM (Java Virtual Machine)

    HotSpot VM 자바 성능 개선을 위해 Sun에서 만든 Just In Time(JIT) 컴파일러의 이름이 HotSpot VM JIT 컴파일러는 프로그램의 성능에 영향을 주는 지점에 대해서 지속적으로 분석하며, 분석된 지점은 부하를 최소화하고, 높은 성능을 내기 위한 최적화 대상이 된다. 자바 1.3 버전부터 기본 VM으로 사용되어 왔으며, 운영되고 있는 대부분의 시스템들은 모두 HotSpot 기반의 VM HotSpot VM은 아래의 세 가지 주요 컴포넌트로 구성된다. VM 런타임 JIT 컴파일러 메모리 관리자 VM 런타임 HotSpot VM 런타임에 GC 방식과 JIT 컴파일러를 끼워 사용할 수 있다. 이를 위해서 VM 런타임은 JIT 컴파일러용 API와 가비지 컬렉터용 API를 제공한다. JVM을 ..

    REST 서비스 사용

    스프링 애플리케이션은 아래와 같은 방법을 통해 REST API를 사용할 수 있다. RestTemplate: 스프링 프레임워크에서 제공하는 간단하고 동기화된 REST 클라이언트 Traverson: 스프링 HATEOAS에서 제공하는 하이퍼링크를 인식하는 동기화 REST 클라이언트 WebClient: 반응형 비동기 REST 클라이언트 RestTemplate 클라이언트 입장에서 REST 리소스와 상호작용하려면, 클라이언트 인스턴스와 요청 객체를 생성하고, 해당 요청을 실행하고, 응답을 분석하여 관련 도메인 객체와 연관시켜 처리하면서, 도중에 발생할 수 있는 예외까지 처리해야 한다. 이러한 장황한 코드를 피하기 위해 스프링은 RestTemplate을 제공하며, RestTemplate은 REST 리소스를 사용하는 ..

    스프링 데이터 REST

    스프링 데이터 REST 스프링 데이터는 코드에 정의한 인터페이스를 기반으로 Repository를 자동으로 생성하고 필요한 기능을 수행한다. 스프링 데이터 REST는 스프링 데이터의 모듈 중 하나로, 스프링 데이터가 생성하는 Repository의 REST API를 자동으로 생성한다. 따라서, 스프링 데이터 REST를 빌드에 추가하면 정의한 각 리포지토리 인터페이스를 사용하는 API를 얻을 수 있다. 의존성 추가 implementation 'org.springframework.boot:spring-boot-starter-data-rest' 빌드에 해당 의존성만 지정해주면 이미 스프링 데이터를 사용 중인 프로젝트에서 REST API를 노출시킬 수 있다. 스프링 데이터 REST가 생성하는 REST 엔드포인트를 ..