java

Kafka

[Kafka] Kafka를 활용한 SAGA 패턴 기반 분산 트랜잭션 구현

MSA 환경에서 서비스 간의 데이터 일관성을 보장하는 것은 복잡한 문제입니다. 특히 여러 서비스에 각각 다른 데이터베이스가 존재하며 트랜잭션을 유지해야하는 상황에서 ACID 원칙을 지키는 것은 쉽지 않습니다. 이 기술적 문제를 해결하기 위하여 SAGA 패턴을 적용하여 Kafka 기반의 분산 트랜잭션을 구현하는 미니 프로젝트를 진행하고 글로 정리하였습니다. 프로젝트 전체 코드는 아래 github을 통해 확인할 수 있습니다.https://github.com/kwj2435/spring-redis-stock-managerSAGA 패턴SAGA는 '이야기' 혹은 '서사'라는 뜻을 가진 영어단어입니다. 단어의 뜻과 같이 SAGA 패턴의 분산 트랜잭션은 2PC(Two-Phase Commit)와 같은 전통적인 트랜잭션 ..

Java

[Java] Java 원격 디버깅(Java Remote Debugging)

이슈 사항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,..

Java

[Java] JVM의 한계와 GraalVM 살펴보기

들어가기 앞서최근 JVM을 보완하는 새로운 가상머신이 개발되었고 생각보다 많은 서비스에서 사용중이라는 소식을 들었다.Java는 다른 컴파일러 언어에 비해 느리다는 이야기를 들었고, 그 원인이 JVM에서 비롯되었다고 익히 알고 있던 와중 보완된 JVM을 통해 Java의 성능 문제를 해결할 수 있다는 사실에 흥미를 가지고 살펴 보았다. 기존 JVM의 한계사실 Java의 시작을 함께한 JVM을 대체하기 위한 시도는 과거에도 빈번했다.C, C++, Golang과 같은 컴파일러 기반의 언어는 컴파일 과정에서 바로 기계어로 번역되고 실행 파일을 만들어낸다. 그리고 컴파일 시에 코드 최적화까지 진행하여 인터프리터 대비 뛰어난 성능을 가지고 있다. 반면, Java는 플랫폼 종속적인 문제를 해결하기 위해 인터프리터(In..

Spring

[Spring] Java 예외(Exception) 처리 전략

목표안정성있고 유연한 예외처리를 가진 애플리케이션 설계 방법에 대한 방법을 고민하고 정리한다. 예외(Exception)Java에서 예외는 비정상적인 상황을 나타내는 객체이며, 다음과 같이 Throwable 클래스 하위의 다음 두가지로 나뉜다. Checked Exception컴파일 시점에 처리를 강제하는 예외이다.만약 해당 예외에 대해 try-catch, throws로 처리되어 있지 않다면 컴파일 시점에 에러가 발생한다.반드시 예외처리를 해야하며, 개발자에게 안정성을 강제한다. Unchecked Exception런타임 시점에 발생하는 예외이다.컴파일러가 예외처리를 강제하지 않기때문에, 예외처리를 강제하지 않아도 된다.컴파일 시점에는 에러가 발생하지 않으나, 런타임 시점에 해당 예외처리가 되어있지 않다면 에..

Spring

[Spring] 카카오 로그인 REST API 방식 적용 및 구현

카카오 로그인 공식 레퍼런스를 참고하여 작성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. 사용자는 카카오 로그인을..

Spring

[Spring] 스프링 부트(Spring Boot) - H2 DB 연동하여 사용하기(with.JPA)

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를 통해..

Java

[Java] JVM Warm up - if(kakao)2022

2022년 진행된 if(kakao)에서 발표하신 카카오모빌리티 이형구님의 JVM Warm Up 세션을 보고 정리한 내용입니다. 계정 서버 배포 직후 발생하는 초기 API 응답 Latency 지연문제를 JVM에서 원인을 찾고 해결한 내용입니다.제가 작성한 모든 글의 내용과 사진은 if(kakao)2022에서 발표한 내용을 인용 및 사용하였습니다.계정 서비스계정 서비스는 높은 TPS를 특징으로 가지고 있으며, 빠른 응답 속도를 보장하는 것이 중요한 서비스이다.Java, Spring 기반으로 서비스가 작성되어 있으며, 오늘의 내용을 살펴보기 앞서 Java에 대해 잠깐 알아볼 필요가 있다. 작성된 Java Code를 중간언어인 Byte Code로 변환되며 War, Jar로 Archive되어 사용된다. 빌드된 ..

Java

[JAVA] 회원 시스템 분산 트랜잭션(JTA) 처리와 성능 이슈 해결

분산 트랜잭션(JTA)기반의 회원 시스템 개발오랫동안 농익은 레거시 시스템은 현재 시점에서 뜯어볼수록 의문이 많은 설계와 코드들이 참 많습니다.제가 속한 서비스의 회원 시스템도 마찬가지였습니다. 서비스를 이용하는 회원의 정보가 서로 다른 3개의 DB에 나뉘어 관리되고 있었습니다. 한명의 회원 정보가 여러 DB에 나뉘어 저장되는 것도 아니고, 유입된 채널에 따라 저장되는 DB가 물리적으로 분리되어 있었습니다.즉 온라인에서 가입한 고객은 오프라인에서 확인할 수 없고, 오프라인에서 가입한 고객은 온라인 서비스에서 접근할 수 없는 구조였습니다.이는 당연히 마케팅 측면이나 서비스의 확장성 측면에서 많은 어려움을 만들고 있었고, 이를 통합하기 위한 자칭 '통합회원 프로젝트'를 진행하게 되었습니다. 분리되어 있는 D..

turtleDev
'java' 태그의 글 목록