JVM 80

CORS와 Preflight Request

CORS Corss-Origin Resource Sharing의 약자로 서로 다른 도메인 간 리소스 공유를 제어하는 메커니즘이다. 브라우저는 동일 출처 정책에 의해 다른 호스트로에 리소스 요청을 차단한다. cross origin의 예시 기준 URL http://kyoulho.com 프로토콜이 다른 경우 https://kyoulho.com 포트가 다른 경우 http://kyoulho.com:8080 도메인이 다른 경우 http://ulho.com 하위 도메인 http://sub.kyoulho.com maxAge 설정 maxAge를 설정하면 동일한 도메인에서 동일한 리소스에 대한 CORS 요청 시 매번 사전 검사 요청을 보내지 않고 캐시 된 결과를 사용할 수 있다. maxAge 값만큼 시간이 지나면 캐시가 ..

JVM/SpringMVC 2024.03.09

자바 내부 클래스(Inner Classes)

자바에서 내부 클래스는 다른 클래스 내에 정의된 클래스를 말한다. 내부 클래스는 특정 클래스에 종속되어 있으며, 외부 클래스의 멤버에 접근할 수 있다. 내부 클래스는 코드의 구조화, 은닉성, 캡슐화를 강화하는 데 사용될 수 있다. 장점 내부 클래스에서 외부 클래스의 멤버들을 쉽게 접근할 수 있다. 사용이 제한된 클래스를 내부에 둠으로써 코드의 복잡성을 줄일 수 있다. 종류 인스턴스 클래스(Instance Class) 외부 클래스의 멤버변수 선언위치에 선언하며, 외부 클래스의 인스턴스멤버처럼 다루어진다. 주로 외부 클래스의 인스턴스 멤버들과 관련된 작업에 사용될 목적으로 선언된다. public class OuterClass { private int outerField; public class InnerCl..

JVM 2024.03.01

쓰레드 동기화

쓰레드 동기화란?쓰레드 동기화는 여러 쓰레드가 공유 자원에 접근할 때 발생할 수 있는 데이터 불일치와 같은 문제를 해결하는 기술이다. 이를 통해 프로그램이 예측 가능하고 안전하게 실행될 수 있도록 한다. synchronized 키워드자바에서는 synchronized 키워드를 사용하여 메소드나 블록을 동기화할 수 있다. 이를 통해 특정 코드 영역에는 하나의 쓰레드만 접근할 수 있도록 보장할 수 있다.// 메소드 동기화public synchronized void synchronizedMethod() { // 동기화가 필요한 코드}// 블록 동기화public void someMethod() { // 비동기화 코드 synchronized (lockObject) { // 동기화가 필요..

JVM 2024.03.01

Google JIB

등장 배경 Jib 이전에 도커 이미지를 만들기 위해서는 dockerfile을 작성하고 dockerignore 파일을 작성하고 디펜던시들을 따로 분리해서 저장하고 분리된 의존성을 하나의 레이어로 관리하고 최대한 캐시를 활용해 다시 한번 dockerfile을 변경해야 했다. 이 모든 과정이 복잡하고 학습 난이도는 높으며 자주 하는 작업이 아니었기에 이전에 어떻게 했는지 다시 찾아보는 시간이 필요했다. 그래서 이 모든 과정을 단순하게 만들기 위해 Jib가 등장했다. Jib의 장점 로컬 Docker 의존성 제거 Jib는 Dockerfile 작성 없이도 빌드 환경에 Docker가 없이도 이미지를 빌드할 수 있다. 이는 Jib가 컨테이너 이미지를 생성할 때, 애플리케이션 파일과 의존성을 레이어로 나누어 구성하는 방..

JVM 2024.01.30

모니터링(Micrometer, Prometheus, Grafana)

Micrometer 애플리케이션의 메트릭 수집을 단순화하고, JVM 기반의 애플리케이션에서 사용하기 쉬운 메트릭 API를 제공하는 라이브러리이다. 특히 스프링 기반의 애플리케이션에서는 Micrometer가 스프링의 메트릭 제공에 통합되어 사용된다. 또한, 다양한 모니터링 시스템과의 통합을 지원하여 Prometheus, Grafana, InfluxDB, Datadog 등 다양한 백엔드로 메트릭을 전송할 수 있다. 여러 Micrometer의 기능 중 하나로 Timer가 있다. Timer는 특정 코드 블록이나 메서드의 실행 시간을 측정하고 해당 지표를 메트릭으로 수집한다. 호출 빈도와 지연 시간을 시계열로 기록하여 애플리케이션의 동작을 모니터링할 수 있다. @Timed 어노테이션은 Micrometer에서 제공..

JVM/SpringCloud 2024.01.03

Zipkin

ZipkinZipkin은 분산 시스템에서의 추적 및 모니터링을 위한 오픈 소스 소프트웨어이다. 주로 마이크로서비스 아키텍처에서 사용되며 서비스 간 통신과 연관된 각 단계의 지연 시간 및 성능을 추적하여 문제를 식별하고 해결하는 데 도움이 된다.SpanSpan은 하나의 요청에 사용되는 작업의 단위이다. 예를 들어, 서비스 간의 요청 또는 로컬 작업과 같은 작업 단위를 나타낼 수 있다. Span은 시작 시간, 종료 시간, 태그 등의 정보를 포함하여 특정 작업에 대한 세부 정보를 기록한다.TraceTrace는 관련된 여러 Span들의 모음으로, 전체 작업의 흐름을 나타낸다. 서비스 간의 요청이 발생하면, 해당 요청에 대한 Span이 생성되고, 이러한 Span들이 모여 Trace를 형성한다. Trace는 전체 ..

JVM/SpringCloud 2024.01.03

Resilience4J - CircuitBreaker

Circuit Breaker 서킷 브레이커는 연결의 성공/실패를 카운트하여 실패율이 임계치를 넘어섰을 때 자동적으로 접속을 차단하는 시스템이다. 마이크로서비스 아키텍처에서 서비스 간 통신에서 발생할 수 있는 장애와 지연으로부터 전체 시스템의 안정성을 유지하는데 도움이 되는 중요한 디자인 패턴이다. Sliding Window 서킷 브레이커는 슬라이딩 윈도우를 통해 호출 결과를 저장하고 집계한다. 슬라이딩 윈도우의 방식은 마지막 N개의 호출 결과를 집계하는 카운트 기반과 마지막 N초 간 일어난 호출 결과를 집계하는 시간 기반이 있다. Circuit Breaker State 닫힌(Closed) 상태 초기 상태로, 모든 호출이 허용된다. 서비스 호출 중 에러 비율이 설정된 임계값을 넘어가면 서킷 브레이커는 열린..

JVM/SpringCloud 2024.01.02

Kafka를 활용한 데이터 베이스 비동기 통신

이벤트 중심 아키텍처 JDBC 또는 JPA를 사용하여 DB에 직접 접속하는 경우, 애플리케이션과 DB 간의 동기 상태로 인해 서비스 지연 및 다른 서비스에 대한 영향이 발생할 수 있다. 또한, 트래픽이 증가하거나 DB Locking이 발생할 경우 성능 문제가 발생할 수 있다. 이러한 문제를 해결하기 위해 Kafka Sink Connector를 사용하면 비동기 방식의 데이터 처리, 데이터 전달의 효율적인 관리, 안정적인 클러스터 구성, 서비스 간의 느슨한 결합, 이벤트 중심 아키텍처 등 다양한 이점을 얻을 수 있습니다. 특히 대용량 및 다중 서비스 환경에서는 MQ와 같은 서비스의 도입이 유용할 수 있다. Dto data class KafkaOrderDto( val schema: Schema, val pay..

JVM/SpringCloud 2024.01.01

Kafka를 활용한 마이크로 서비스간 비동기 통신

라이브러리 implementation("org.springframework.kafka:spring-kafka") kafka Consumer 설정 @Configuration @EnableKafka class KafkaConsumerConfig { // 토픽에 접속하기 위한 설정 정보 @Bean fun consumerFactory(): ConsumerFactory { val properties = mapOf( ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG to "127.0.0.1:9092", ConsumerConfig.GROUP_ID_CONFIG to "consumerGroupId", ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG to StringD..

JVM/SpringCloud 2024.01.01

마이크로서비스간 동기 통신

동기식 HTTP 통신 클라이언트가 요청을 보내고, 서버는 해당 요청에 대한 응답을 즉시 반환하는 방식으로 요청에 대한 응답이 필요한 경우 사용된다. 간단하며 직관적인 구조로 에러 처리가 상대적으로 쉬운 장점이 있지만 클라이언트는 응답을 기다려야 하므로, 블로킹이 발생할 수 있으며 서비스의 의존성이 높아질 가능성이 있다. Spring Boot의 RestTemplate을 이용하는 방식과 Spring Cloud의 Feign Client를 이용한 방식이 있다. RestTemplate RestTemplate 빈 등록 Spring Boot를 사용한다면, RestTemplate은 기본적으로 빈으로 등록되어 있다. 따라서 별도의 설정 없이 주입하여 사용할 수 있다. 그러나 Spring Boot를 사용하지 않는다면, R..

JVM/SpringCloud 2023.12.30