비관적 락, 낙관적 락, 분산 락을 다 써보고 나서야 정리했다지난 글 마지막에 커넥션 풀 데드락 얘기를 했다. 한 스레드가 커넥션 두 개를 잡으려다 서로 물려서 멈추는 상황이었다. 그걸 정리하다 보니 다음 질문이 자연스럽게 따라왔다. 애초에 락은 왜 걸고, 어떤 락을 골라야 하는 걸까.마침 내가 한 프로젝트들에 서로 다른 락이 들어가 있었다. 짠팟에서는 중복 챌린지를 막으려고 DB 비관적 락을 걸었고, Keepit에서는 AI 요약이 중복 실행되는 걸 막으려고 Redis 분산 락을 썼다. 당시엔 "이게 맞는 것 같아서" 골랐는데, 왜 그게 맞았는지 설명해보라고 하면 말이 막혔다. 그래서 이번에 제대로 정리했다.락은 왜 필요한가동시성 문제의 본질은 대부분 갱신 손실(Lost Update) 이다.스레드 A: ..
커넥션 풀이랑 스레드 풀, 면접 준비하다가 제대로 정리했다면접 스터디에서 이런 질문을 받았다."톰캣 스레드가 200개인데 커넥션 풀이 10개예요. 요청 200개가 동시에 들어오면 어떻게 되나요?" 커넥션 풀이 뭔지, 스레드 풀이 뭔지는 당연히 안다고 생각했는데 이 질문 앞에서 멈칫했다. 둘을 각각은 알고 있었지만 같이 놓고 생각해본 적이 없었다. 그래서 이참에 제대로 정리했다.풀이 왜 필요한가부터커넥션 풀과 스레드 풀은 이름만 비슷한 게 아니라 해결하려는 문제가 똑같았다.만드는 비용이 비싼 자원을 매번 새로 만들지 말고, 미리 만들어두고 빌려 쓰자는 것이다.DB 커넥션 하나를 새로 만들 때 실제로 뭐가 일어나는지 보면 왜 비싼지 감이 온다.TCP 3-way 핸드셰이크를 하고, DB 프로토콜 핸드셰이크를 ..
주니어 백엔드 개발자가 반드시 알아야할 실무지식 (최범균 저)📌 Chapter 04. 외부 연동 장애 대응외부 연동(결제, 알림, 검색, LLM API 등)은 내가 통제할 수 없는 영역이다. 이 장의 핵심은"외부 서비스가 느려지거나 죽어도, 내 서비스 전체가 같이 죽지 않게 만드는 것"이다.1. 타임아웃 (Timeout)가장 기본이면서 가장 자주 놓치는 설정. 타임아웃을 설정하지 않으면 스레드가 무한정 대기하게 되고,그 스레드들이 쌓이면 스레드 풀이 고갈되어 정작 멀쩡한 다른 요청까지 처리 못 하는 연쇄 장애로 번진다.구분설명권장 범위연결 타임아웃 (Connection Timeout)TCP 연결 자체를 맺는 데 걸리는 최대 대기 시간3초 ~ 5초읽기 타임아웃 (Read Timeout)연결 후 응답을 받..
주니어 백엔드 개발자가 반드시 알아야할 실무지식 (최범균 저)Chapter 01. 들어가며1장. 신입 개발자 A의 일화개발자 A는 내부 직원이 사용할 간단한 사이트를 만들었다.얼마안가 오류가 발생한다는 연락을 받았다.개발자 A가 개발 주소에 접근하니 DB에 연결할 수 없다는 오류가 발생한다.일부 코드에서 사용이 끝난 DB 커넥션을 닫지 않은 것이다.// 개발자 A가 작성한 문제의 코드Connection conn = ds.getConnection(); // 커넥션 풀에서 구함try {} catch (Exception e) { ... 에러 처리}// conn.close()가 누락 -> 커넥션 풀에 반환하지 않음DB 커넥션을 사용한 뒤 풀에 반환하지 않았고 그로 인해 커넥션이 누수되었다.결국 풀에 있던 ..
HTTP vs HTTPS 환경에서의 쿠키 보안 설정 Spring Boot로 인증 시스템을 구현하다 보면, 로컬 개발 환경과 배포 환경에서 쿠키 설정을 다르게 해야 하는 상황을 마주하게 됩니다.이번 글에서는 왜 그래야 하는지, 그리고 쿠키 보안의 전반적인 개념을 정리해보겠습니다.1. 문제 상황: 왜 환경마다 쿠키 설정이 다를까?Spring Boot에서 Refresh Token을 쿠키로 관리할 때, 보통 이런 식으로 환경별 설정을 분리합니다.# application-local.yml (로컬 개발)security: cookie: refresh: secure: false same-site: Lax# application-prod.yml (배포)security: cookie: re..