프로젝트 개요이번 프로젝트에서는 분산 시스템 환경에서 발생하는 다양한 문제 상황중, 서로 다른 요청이 하나의 데이터에 몰리게 되어 발생하는 레이스 컨디션(Race Condition) 문제를 분산 락을 이용해 해결하는 미니 프로젝트를 진행하고 이를 정리했습니다. 코드들을 모두 게시글에 작성할 수 없어, 일부 설정은 다른 게시글에 정리된 내용을 링크하였습니다.프로젝트 전체 코드는 아래 github을 통해 확인할 수 있습니다.https://github.com/kwj2435/spring-redis-stock-manager기술 스택Spring Boot 3.4.1Spring Data JPAJava 17Redis 7.0KafkaH2 Database 구현 요구 사항주요 기능재고 등록: 제품과 초기 재고량을 Redis에..
Redis 클러스터(Cluster)Redis 클러스터(Redis Cluster)는 분산 환경에서 데이터의 가용성과 확장성을 제공하기 위해 설계된 Redis의 네이티브 분산 시스템이다. Redis 클러스터는 데이터가 자동으로 여러 노드에 분산되며, 고가용성과 샤딩을 지원한다. Redis 클러스터를 더 쉽게 설명하면, 큰 데이터를 여러 Redis 서버에 나누어서 저장하고, 서버가 고장 나도 자동으로 복구할 수 있도록 도와주는 시스템이다.주요 특징데이터 샤딩(Sharding)데이터를 16,384개의 해시 슬롯(Hash Slot)으로 나누고 이를 여러 노드(Master)에 분산하여 저장하는 구조이다.각 마스터 노드는 일부 해시 슬롯을 담당하며, 이를 통해 데이터가 고르게 분배된다.고가용성(High Availab..
이슈 사항Dev, PJ, QA, Stage 환경에서 이슈 발생시 원인 파악을 위해 보통 Local 환경으로 해당 이슈를 가져와서 디버깅을 진행해당 문제를 Local에서 재현 및 원인파악을 위한 리소스가 적지 않게 필요문제가 발생한 환경에 직접 붙어서 디버깅을 하고 싶다는 니즈를 해결하기위한 방법을 고민JDWP(Java Debug Wire Protocol)와 설정Java 에서는 JDWP를 통해 디버거와 JVM간 통신을 지원해준다.1. 원격 디버깅 설정원격 디버깅을 활성화하려면 JVM 옵션에 디버깅 관련 설정을 추가해야한다. Java8과 Java9 이상에서의 설정 방식이 약간 다르다.Java 실행 옵션에 아래 옵션을 추가한다.Java 8java -agentlib:jdwp=transport=dt_socket,..
들어가기 앞서최근 JVM을 보완하는 새로운 가상머신이 개발되었고 생각보다 많은 서비스에서 사용중이라는 소식을 들었다.Java는 다른 컴파일러 언어에 비해 느리다는 이야기를 들었고, 그 원인이 JVM에서 비롯되었다고 익히 알고 있던 와중 보완된 JVM을 통해 Java의 성능 문제를 해결할 수 있다는 사실에 흥미를 가지고 살펴 보았다. 기존 JVM의 한계사실 Java의 시작을 함께한 JVM을 대체하기 위한 시도는 과거에도 빈번했다.C, C++, Golang과 같은 컴파일러 기반의 언어는 컴파일 과정에서 바로 기계어로 번역되고 실행 파일을 만들어낸다. 그리고 컴파일 시에 코드 최적화까지 진행하여 인터프리터 대비 뛰어난 성능을 가지고 있다. 반면, Java는 플랫폼 종속적인 문제를 해결하기 위해 인터프리터(In..
목표안정성있고 유연한 예외처리를 가진 애플리케이션 설계 방법에 대한 방법을 고민하고 정리한다. 예외(Exception)Java에서 예외는 비정상적인 상황을 나타내는 객체이며, 다음과 같이 Throwable 클래스 하위의 다음 두가지로 나뉜다. Checked Exception컴파일 시점에 처리를 강제하는 예외이다.만약 해당 예외에 대해 try-catch, throws로 처리되어 있지 않다면 컴파일 시점에 에러가 발생한다.반드시 예외처리를 해야하며, 개발자에게 안정성을 강제한다. Unchecked Exception런타임 시점에 발생하는 예외이다.컴파일러가 예외처리를 강제하지 않기때문에, 예외처리를 강제하지 않아도 된다.컴파일 시점에는 에러가 발생하지 않으나, 런타임 시점에 해당 예외처리가 되어있지 않다면 에..
카카오 로그인 공식 레퍼런스를 참고하여 작성https://developers.kakao.com/docs/latest/ko/kakaologin/common Kakao Developers카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.developers.kakao.com 프로젝트 코드 Githubhttps://github.com/kwj2435/kakao-restapi-login 기술 스택Java 17Spring Boot 3.x.xThymeleafOpenFeign 1. 카카오 개발자 센터 세팅개발을 시작하기전, 카카오에서 제공하는 Rest API 방식의 로그인 시퀀스 다이어그램을 살펴보자.1. 사용자는 카카오 로그인을..
H2 DB란?https://www.h2database.com/ H2 Database는 Java로 구현된 경량형 RDBMS이다.Server, Embedded, In-Memory 3가지 Mode를 제공하며, 간단한 설정으로 빠르게 실행할 수 있어 로컬 개발 환경에서 많이 사용된다. 별도의 DB툴이 없이도 웹 브라우저를 통해 데이터베이스를 시각적으로 관리할 수 있는 인터페이스를 제공하며, 표준 JDBC 드라이버를 제공하여 Java 애플리케이션과 쉽게 연결이 가능하다.H2 데이터 베이스 하나만으로도 여러 다른 데이터베이스(MySQL, PostgreSQL)와 유사한 SQL 문법을 사용할 수 있도록 지원한다.Spring Boot와 연동하기1. Spring 프로젝트 초기 생성시 Spring Initializr를 통해..
2022년 진행된 if(kakao)에서 발표하신 카카오모빌리티 이형구님의 JVM Warm Up 세션을 보고 정리한 내용입니다. 계정 서버 배포 직후 발생하는 초기 API 응답 Latency 지연문제를 JVM에서 원인을 찾고 해결한 내용입니다.제가 작성한 모든 글의 내용과 사진은 if(kakao)2022에서 발표한 내용을 인용 및 사용하였습니다.계정 서비스계정 서비스는 높은 TPS를 특징으로 가지고 있으며, 빠른 응답 속도를 보장하는 것이 중요한 서비스이다.Java, Spring 기반으로 서비스가 작성되어 있으며, 오늘의 내용을 살펴보기 앞서 Java에 대해 잠깐 알아볼 필요가 있다. 작성된 Java Code를 중간언어인 Byte Code로 변환되며 War, Jar로 Archive되어 사용된다. 빌드된 ..