전체 글130 Kafka 트랜잭션과 Spring 트랜잭션 시점 차이로 인한 데이터 일관성 문제 들어가며카프카를 사용하면서 카프카 트랜잭션과 스프링 트랜잭션의 시점 차이로 인한 데이터 일관성 문제에 대해 해결한 글을 작성할 예정이다. 이는 결론적으로 트랜잭션과 카프카 이벤트 발행 사이에서 발생하는 정합성 문제이다. 문제 상황발생한 문제의 상황은 트랜잭션 내에서 데이터 변경 후 이벤트를 발행하는 경우, 다른 서비스에서 트랜잭션 커밋 이전의 데이터를 사용할 때이다. 이때 예외가 발생해버리는 것이다. 문제 원인 및 해결트랜잭션이 커밋되기 이전에 카프카 이벤트를 발행하면, 트랜잭션의 실패 여부와 상관없이 이벤트는 발행되도록 구현했던 것이 문제의 원인이었다. 이를 해결하기 위해 TransactionalEventListener를 활용했다. 현재 spring transaction이 후에 kafka 이벤트가 .. Tech/Kafka 2024. 5. 23. JVM 구조에 대해 1. 클래스 로더(Class Loader)클래스 로더는 JVM이 실행 중에 필요한 클래스 파일을 동적으로 로드하는 역할을 합니다.클래스 로더는 계층 구조로 이루어져 있으며, 최상위 로더부터 하위 로더까지 순차적으로 클래스를 로드합니다.클래스 로더는 클래스 파일을 메모리에 로드하고, 링크와 초기화 과정을 거쳐 실행 가능한 상태로 만듭니다.2. 실행 엔진(Execution Engine)실행 엔진은 로드된 클래스의 바이트코드를 해석하고 실행하는 역할을 합니다.실행 엔진에는 인터프리터와 JIT(Just-In-Time) 컴파일러가 포함되어 있습니다.인터프리터는 바이트코드를 한 줄씩 해석하여 실행하고, JIT 컴파일러는 자주 사용되는 메서드를 네이티브 코드로 변환하여 실행 속도를 높입니다.3. 런타임 데이터 영역(.. Tech/Java 2024. 5. 22. 면접 팀 스터디 1주차 1. Call by reference란 무엇이고 보통 어떻게 쓰이나요?Call by Reference는 함수 호출 시 변수의 참조값(주소)을 전달하는 방식입니다. 이렇게 하면 함수 내부에서 원본 변수의 값을 직접 변경할 수 있습니다. 즉, 함수 내부에서 변경한 내용이 원본 변수에 반영됩니다.Call by Value는 함수 호출 시 변수의 값을 복사해서 전달하는 방식입니다. 이 경우 함수 내부에서 변수 값을 변경해도 원본 변수의 값은 변경되지 않습니다.꼬리 질문자바의 호출 방식은?2. override와 overload 설명오버라이딩(Override)은 상위 클래스의 메서드를 하위 클래스에서 재정의하는 것입니다.오버로딩(Overload)은 같은 이름의 메서드를 매개변수 타입이나 개수를 달리하여 정의하는 것입.. 면접 준비 2024. 5. 20. Redis Replication 적용하기 들어가며레디스는 Stateliss의 특성을 가지므로 휘발성이 존재한다. 잘못하면 저장해둔 데이터가 다 날아가버리는 불상사가 생길 수 있다. 그래서 이를 방지하기 위해 master-slave 관계를 가진 서버를 추가로 미리 만들어 놓는다.개인 프로젝트를 진행하면서 레디스 서버 장애를 대비하기 위해 Replication 방식을 도입했다. 오늘은 스프링 부트를 통해 어떻게 적용을 했고, 테스트 결과에 대해 포스팅하려고 한다.적용 방법docker-compose.yml 우선 master 레디스 서버 1개, replica 서버 2개를 도커로 띄웠다. 기존에는 1개의 서버만 동작했으나 총 3개로 늘어났다.여기서 주의해야하는 부분은 slave 서버 컨테이너의 command 이다.command: redis-server .. CS/DB 2024. 5. 18. [Kafka] 하나의 토픽에 두개의 컨슈머가 구독하면 안되나요? 들어가며개인 프로젝트에서 대규모 데이터 처리를 위해 카프카를 도입했다. MSA를 사용해 서비스를 분리했기 때문에 주문이 들어오면 각 서비스 간에 이벤트를 주고 받게 된다. 주문 취소 기능을 구현하다가 하나의 토픽에 대해 두개의 컨슈머가 구독하여 각 서비스에서 행동을 하도록 구현을 했다. 그러나 하나의 서비스에서만 이벤트를 받아서 동작하였다. 이 문제를 분석하고 해결한 방식에 대해 작성할 예정이다. 문제 발생발생한 문제에 대해서는 이전에 설명한 것과 같다. 다시 간단하게 요약하자면 하나의 토픽을 두개의 컨슈머가 구독한 상황에서 하나의 컨슈머만 이벤트를 처리하고 있다는 것이다.처음에는 파티션이 1개여서 발생한 문제라고 추측을 했다. 그래서 파티션을 2개로 늘려서 다시 시도해봤지만 실패했다.이때 실패한 이유는.. Tech/Kafka 2024. 5. 16. [항해 취업 리부트 코스] 개인프로젝트 4주차 후기 어쩌다보니 벌써 4주차가 끝났다...!기능 구현 하고 MSA 사용하기 위해 멀티모듈로 분리하고, 새로운 기술을 도입하느라 어려움을 겪던 게 엊그제 같은데 마지막 주차가 끝이 났다. 프로젝트를 하면서 혼자서는 절대 몰랐을 정보들도 많이 얻었고, 팀원들 그리고 멘토님, 매니저님들로부터 많은 걸 배울 수 있었다.또 개발을 하면서 내 스스로 어떤 사람인가에 대해 다시금 생각해볼 수 있었던 것 같다.나는 실패가 두려워 도전과 새로운 시도를 무서워하는 사람이라고 생각했다. 그렇기에 과거의 경험을 믿고 그 전에 사용해봤던 것만 추구하며 나의 바운더리를 스스로 제한하려는 경향이 있었던 것 같다. 하지만 이번 개인 프로젝트 주차를 진행하면서 내가 새로운 시도에 열려 있고, 도전하는 걸 즐길 수 있는 사람이라는 걸 알게 .. 항해99 취업 리부트 코스/WIL 2024. 5. 14. [Caching] 상품 주문 성능 개선 들어가며현재 진행하고 있는 프로젝트에서 레디스 캐시를 사용해 재고 관리를 하고 있다. 처음에는 write-throgh 전략을 사용했다. 데이터 정합성을 맞추는 게 가장 중요하다고 생각했다. 사용자에게 재고를 보여줄 때 정확해야하기 때문이다. 그러나 데이터베이스에 자주 접근하기 때문에 성능도 조금 떨어질 수 있다는 점이 trade-off로 존재한다.그래서 우선 가장 먼저 사용했던 전략에 대해 테스트를 수행했다. 그 다음에는 write-back 전략을 사용해서 테스트를 해보았다. 사실 write-through 방식을 사용하면서 캐시의 확실한 장점을 제대로 사용하지 못한다는 느낌이 들었다. 계속 데이터베이스에 들어갔다 나올거면 간김에 재고도 감소시키면 될텐데... 라는 생각이 들었다.캐시의 장점을 좀 더 활용.. CS/DB 2024. 5. 11. [항해 취업 리부트 코스] 개인프로젝트 3주차 후기 들어가며3주차... 대망의 3주차... 지금까지는 아무것도 아니었다. 프로젝트 주차의 피날레...? 랄까 😵💫이번주에는 결제 관련 api를 만들고 자동화 테스트 툴 구축하는 것이 목표이다. 우선 결제 관련 api를 만들면서 상품 재고 감소 -> 주문 -> 배송 -> 결제 이 프로세스로 동작한다.현재 결제 진입 api는 거의 다 완성한 상태고 결제 api가 남아있다. 결제 프레세스에 대해 EDM을 활용해서 이벤트를 처리할 생각이다. 원래는 AWS sqs 를 사용했지만 대용량 처리라는 주제에 걸맞게 카프카를 도입해보기로 했다.어제는 카프카 세팅을 완료하고 토픽을 생성하고 재고 감소, 주문, 배송 프로세스까지 완료 했다. 트러블 슈팅 및 기술적 고민Circuit Breaker 메소드에 적용하는 방식cir.. 항해99 취업 리부트 코스/WIL 2024. 5. 7. [백준] 2373번 세 용액 들어가며두 용액을 이분탐색으로 풀어서 이 문제도 이분탐색으로 풀어야하나? 라는 생각이 당연하게 들었다. 근데 보통 left, right로 나눠서 3개의 포인터(?)를 가지고 답을 구해나가야하는데 이건 세가지인데? 이런 혼란이 생겼다. 그래서 아 그럼 2개씩 뽑아서 구한 조합의 합을 먼저 구하고 원본 배열 (nC2 + n) 합쳐서 이분탐색을 돌리면 3개의 합이 나오지 않을까? 라고 생각했다. 근데 3개의 원소를 어떻게 기록하지...이처럼 생각이 많았던 문제이다. 브루트포스, 조합을 거쳐갔지만 결국 이분탐색으로 풀었다. 문제 풀이우선 이분탐색이지만 주의할 점은 3개의 용액의 합을 비교해서 풀어야한다는 것이다. 그래서 2중으로 반복문이 돌아가겠지만 이분 탐색이므로 O(nlgn)이 될것으로 예상된다.1. 먼저.. CS/자료구조&알고리즘 2024. 5. 7. 동시성 이슈를 해결하기 위한 Redisson 적용기 들어가며현재 개인프로젝트로 예약 구매 이커머스 프로젝트를 진행하고 있다. 특정 시간에 구매 버튼이 활성화되는 예약 구매 시스템이다. 해당 시간에는 많은 트래픽이 몰리는 상황을 조건으로 걸 예정이다. 이를 구현하기 위해 동시성 이슈를 학습하고 이를 해결하는 방법에 대해 알아보았다. 다양한 방법이 존재했지만 그중에서도 Redis의 Redisson을 사용하기로 했다. 그래서 여러가지 방법과 그중에서도 Redisson을 선택한 이유에 대해서 이야기 해보려고 한다. 동시성 이슈란?쉽게 말하면 공유된 자원에 동시에 접근해 발생하는 문제를 말한다.결국 Race Condition(경쟁 상태)가 발생하게 되는 것인다. Race Codition 란?둘 이상의 입력 또는 조작의 타이밍이나 순서 등이 결과값에 영향을 줄 수 .. CS/DB 2024. 5. 5. 멀티 모듈 자바 21 보호되어 있는 글 입니다. 2024. 5. 2. Spring Boot 3.x.x 버전에서 TestContainers 적용하기 보호되어 있는 글 입니다. 2024. 4. 30. 이전 1 2 3 4 5 6 ··· 11 다음 728x90 반응형