AI 하네스 구조 설계
·
AI
AI 코딩을 쓰다 보면 처음에는 속도에 놀라게 된다.기능 설명을 던지면 서비스 코드가 나오고, 테스트도 생기고, 리팩터링까지 제안한다. 예전 같으면 반나절은 걸렸을 작업이 몇 분 안에 초안으로 나온다. 그래서 자연스럽게 이런 생각이 든다.이제 구현은 AI에게 맡기고 사람은 방향만 보면 되는 것 아닐까? 하지만 실제 프로젝트에 붙여보면 문제는 다르게 나타났다.AI가 잘못된 방향으로 코드를 짜서 문제가 생기는 게 아니었다. 오히려 꽤 그럴듯하게 잘 짰다. 문제는 그 코드가 정말 우리가 합의한 계약과 규칙을 지키는지 그리고 AI가 스스로 만든 테스트로 자기 구현을 통과시키고 있는 건 아닌지 확인하기 어렵다는 점이었다. AI에게 구현과 테스트를 한 번에 맡기면 AI는 자기 구현이 통과하기 쉬운 기준을 만들 수 ..
데드락을 줄이는 대응 전략 - 트랜잭션, 락 순서, 인덱스 2탄
·
CS
1탄에서는 데드락이 왜 발생하는지 정리했다. 핵심은 단순하다.여러 트랜잭션이 같은 자원을 서로 다른 순서로 잡고 이미 잡은 락을 트랜잭션 종료까지 놓지 않으면 순환 대기가 생긴다. 이번 2탄에서는 그 다음 질문을 다룬다.그래서 어떻게 줄일 수 있을까? 데드락 대응은 "재시도 추가"로 끝나면 안 된다.재시도는 필요할 수 있다.하지만 원인을 줄이지 않으면 같은 충돌을 반복할 뿐이다.먼저 트랜잭션 범위, 락 획득 순서, 인덱스, 배치 처리 방식을 봐야 한다. 먼저 대응 순서를 잡자데드락이 발생했을 때 바로 설정부터 바꾸면 문제를 숨기기 쉽다.innodb_lock_wait_timeout을 늘리면 실패가 늦게 보일 수는 있다.하지만 커넥션 점유 시간도 늘어난다. 격리 수준을 낮추면 일부 gap lock은 줄 수 ..
서로 다른 요청이 각자의 락을 잡은 채 멈추는 이유 - 데드락 원인 분석 1탄
·
CS
결제 요청은 주문을 먼저 수정하고 재고를 줄인다.재고 보정 배치는 재고를 먼저 수정하고 주문 상태를 맞춘다.둘 다 단독으로 실행하면 빠르고 정상이다. 그런데 동시에 실행되면 어느 순간 둘 다 멈춘 것처럼 보인다. 운영 중인 서비스에서 가끔 이런 현상을 만날 수 있다.애플리케이션에서는 timeout이 늘고, DB에서는 lock wait이 쌓인다. 몇 초 뒤 하나의 트랜잭션이 강제로 실패하고, 실패한 요청은 다시 시도되거나 사용자에게 오류로 반환된다. 사용자는 이 문제를 보통 이렇게 느낀다.가끔 결제가 실패한다.하지만 내부에서 벌어진 일은 단순한 timeout이 아니다. 서로 다른 요청이 필요한 락을 다른 순서로 잡았고, 트랜잭션이 끝날 때까지 이미 잡은 락을 놓지 않았기 때문에 생긴 일이다.데드락은 락이 ..
브라우저에 URL을 입력하면 무슨 일이 일어날까
·
CS
이번 글에서는“사용자가 브라우저에 URL을 입력했을 때 네트워크에서 어떤 일이 일어나는가” 를 다뤄보려고 합니다.처음 네트워크를 배울 때에는 브라우저가 요청을 보내고 서버가 응답한다 정도로만 이해하고 넘어갔었습니다.그리고 전공 과목에서 들은 OSI 7계층이 존재한다는 것은 기억하지만 이 요청 흐름으로 설명하는데 어려움이 있었습니다. 그래서 이번 글에서는 URL 입력 → DNS → IP 판단 → 기본 게이트웨이 → ARP → TCP 연결 수립까지의 흐름을 정리해보겠습니다.1. 왜 이 흐름을 알아야 하는가백엔드 개발자가 이 흐름을 알아야 하는 이유는 명확합니다.실무에서는 장애가 항상 애플리케이션 내부 코드에서만 발생하지 않습니다.오히려 그보다 앞단인 네트워크, DNS, 프록시, 로드밸런서, TLS 구간에서..
[JAVA] JVM의 장점, 실행과정
·
자바
이번 글에서는 Java를 공부하면서 꼭 한 번은 제대로 정리해야 하는 주제인 JVM의 동작 원리를 다뤄보려고 합니다. 처음 Java를 배울 때에는 ".java 파일이 .class가 되고 실행된다” 정도로만 이해하고 넘어갔었습니다.하지만 백엔드 개발 중 최적화를 하기 위해서는 JVM에 대한 이해가 필요하다고 생각했고 관련된 내용들을 정리하려 합니다. 그래서 이번 글에서는 JVM의 장점부터 실행과정까지 다뤄보겠습니다. 1. JVM의 장점Java의 가장 큰 강점 중 하나는개발자가 비즈니스 로직에 더 집중할 수 있도록 실행 환경을 JVM이 상당 부분 책임져 준다는 점입니다.특히 C/C++과 비교하면 이 장점이 더 분명하게 보입니다.1-1. 자동 메모리 관리(GC)C/C++에서는 개발자가 직접 메모리를 할당하고..