비관적 락, 낙관적 락, 분산 락을 다 써보고 나서야 정리했다지난 글 마지막에 커넥션 풀 데드락 얘기를 했다. 한 스레드가 커넥션 두 개를 잡으려다 서로 물려서 멈추는 상황이었다. 그걸 정리하다 보니 다음 질문이 자연스럽게 따라왔다. 애초에 락은 왜 걸고, 어떤 락을 골라야 하는 걸까.마침 내가 한 프로젝트들에 서로 다른 락이 들어가 있었다. 짠팟에서는 중복 챌린지를 막으려고 DB 비관적 락을 걸었고, Keepit에서는 AI 요약이 중복 실행되는 걸 막으려고 Redis 분산 락을 썼다. 당시엔 "이게 맞는 것 같아서" 골랐는데, 왜 그게 맞았는지 설명해보라고 하면 말이 막혔다. 그래서 이번에 제대로 정리했다.락은 왜 필요한가동시성 문제의 본질은 대부분 갱신 손실(Lost Update) 이다.스레드 A: ..
이 글은 유튜브 개발자 유미 영상을 바탕으로 개인적인 정리를 위해 작성한 글입니다.https://www.youtube.com/watch?v=SUwmtUjTArw&list=PLJkjrxxiBSFCgcsP_pzuntmqC3AlTMWFx&index=8 지난번에 등록한 OpenAI Chat 모델을 호출하는 메소드를 활용해 챗봇을 만들어보자 따라서 Chat 호출 메소드를 활용할 Controller 엔드포인트, View 페이지를 생성하기Controller- api > ChatController@Controllerpublic class ChatController { private final OpenAIService openAIService; public ChatController(OpenAIService ..
주니어 백엔드 개발자가 반드시 알아야할 실무지식 (최범균 저)📌 Chapter 04. 외부 연동 장애 대응외부 연동(결제, 알림, 검색, LLM API 등)은 내가 통제할 수 없는 영역이다. 이 장의 핵심은"외부 서비스가 느려지거나 죽어도, 내 서비스 전체가 같이 죽지 않게 만드는 것"이다.1. 타임아웃 (Timeout)가장 기본이면서 가장 자주 놓치는 설정. 타임아웃을 설정하지 않으면 스레드가 무한정 대기하게 되고,그 스레드들이 쌓이면 스레드 풀이 고갈되어 정작 멀쩡한 다른 요청까지 처리 못 하는 연쇄 장애로 번진다.구분설명권장 범위연결 타임아웃 (Connection Timeout)TCP 연결 자체를 맺는 데 걸리는 최대 대기 시간3초 ~ 5초읽기 타임아웃 (Read Timeout)연결 후 응답을 받..
시스템 디자인의 2번째 핵심 목표 - 성능 신뢰성 이야기를 하면서 기본적인 동작이 잘 되는 시스템을 어떻게 만드는지 그리고 문제 상황에서도 어떻게 오류 없이 작동하도록 하는지에 대해서 알아보았다.시스템이 정확하게 동작을 하더라도 응답 속도가 너무 느리게 되면 사용자 입장에서는 불편함을 느끼고 서비스를 이탈한다.그래서 성능도 중요하게 지켜야 할 목표 중에 하나이다.메신저 서비스에서 메시지를 전송했는데 한 5초 뒤에 상대방에게 도착을 했다면 실시간 대화 가능해야하는 메신저 서비스 특성상 이런 전송 지연은 치명적이다.또 주식매매 서비스에서 사용자가 매도 요청을 한 시점에 바로 매도가 되지 않으면 사용자 입장에서는 금전적인 손실이 일어날 수도 있어서 기능이 빠르게 동작하는 것이 중요하다. 성능의 정의 성능을 ..