인기 글
최신 글
-
귀하게 자란 내가 N+1 문제 같은 걸 봐도 될까? 사실 'N+1 문제’는 워낙 유명하기 때문에 간단한 설명 뒤에 내 경험을 써보려고 한다. 이번 글은 일종의 복습이자 회고의 느낌이다.우선 N+1 문제에 대해 살짝 보고 넘어가도록 하자.ORM의 편리함 뒤에 숨겨진 함정JPA나 Hibernate 같은 ORM은 개발자에게 반복적인 SQL 작성에서 벗어나 객체 지향적으로 데이터베이스를 다룰 수 있게 해주는 도구이다. findById(). findAll() 같은 메서드를 호출하는 것만으로 데이터를 객체로 변환시킬 수 있다. 하지만 이 편리함 뒤에는 N+1 문제라는 친구가 항상 따라온다. 오늘은 이 N+1 문제가 왜 발생하고 어떻게 해결할 수 있는지 알아보자.N+1 문제 : 조회 한 번 했는데 쿼리가 100번우선 너무나도 유명하면서 쉽게 이해할 수 있기 때문에 이..
-
JOIN이 느린건 내 골반이 멈추지 않는 탓일까? ㅜ.ㅜ JOIN, 꼭 필요한데... 왜 이렇게 느릴까?서비스를 개발하면서 JOIN은 필수이다. 여러 테이블에 저장된 정보들을 이용해 의미 있는 데이터를 만들어내는 것은 JOIN 없이 불가능하다. 하지만 아무리 로직을 잘 짜도 JOIN이 들어가는 순간 쿼리가 느려지는 경우가 있다. 그리고 대부분은 비효율적인 JOIN 이 범인인 경우가 많다. 근데 항상 같은 방식으로 쿼리를 작성해도 어떤건 느리고 어떤건 빠르고 어떤건 효율적이고 어떤건 비효율적이고... 뭔가 문제일까? 단순한 INNER JOIN 이라도 작성한 쿼리를 데이터베이스가 항상 똑같은 방식으로 실행시키는 것은 아니다. DB 내부에는 옵티마이저(Optimizer)라는 똑똑한 친구가 있어서 주어진 쿼리를 가장 효율적으로 실행할 수 있는 최적의 방법을 찾아낸다...
-
이건 트랜잭션 두번째 레슨 좋은 건 너만 알기 지난 글에서 경쟁 상태를 해결하기 위한 여러 방법들을 알아보고 실습을 해보았다. 여러 방식으로 락을 적용해 동시성을 지켜냈지만 그러다 보면 의문이 하나 생긴다. 애초에 데이터를 관리하는 데이터베이스란 놈이 왜 여러 요청이 동시에 데이터를 수정하는 것을 허용해서 우리를 피곤하게 했는가.. 바로 성능(동시성)과 정합성 사이의 트레이드오프 때문이다. 그리고 이 둘 사이의 균형을 맞추기 위해 데이터베이스는 트랜잭션 격리 수준이라는 옵션을 제공한다. 요걸 자세히 알아보자. Level 1: READ UNCOMMITTED 가장 낮은 격리 수준이다. 한 트랜잭션이 아직 커밋하지 않은 변경사항조차 다른 트랜잭션에서 읽을 수 있다. 뭔가 이름부터 사용하면 문제가 발생할 것 같은 느낌이 든다. 실제로 더티 리드라는 문제가 ..
-
자OO스가 모르는 것, 못하는 것, 내가 전부 가르쳐줄게. 그냥 유행에 탑승하고 싶어서..신발을 사고싶었다. 9시 반에 발매가 된다고 해서 시간을 맞춰 들어갔다. 하지만 역시나!!서버가 터졌다. 주문과 결제까지 완료가 된 상태에서 완료를 누르니 다시 주문 페이지로 돌아가졌고 혹시나 하는 마음에 결제를 한번 더 진행했다.돈은 2번 다 나갔는데 주문이 되지 않았다... 주문 확인 내역에 아무것도 없었다. 이런 경우 나중에 순서대로 처리가 되고 취소가 된 결제는 환불이 들어오기 때문에 크게 걱정은 하지 않았지만.. 혼나야겠지?너네 동시성 제어좀 하자!!!내가 겪은 상황이 동시성 제어 때문은 아니겠지만 동시성 제어에 문제가 발생하면 비슷한 현상이 나타난다. 한정판 발매가 이뤄질 때 그 순간 수많은 요청이 동시에 서버로 들어간다. 이 때 재고가 1개 남았는데 주문이 3개..
-
내 기술은 모두 한 단계 진화한다. 내 HTTP는 모두 한 단계 진화한다.HTTP의 역사를 살펴보자.HTTP/1.0 출시 이후 HTTP/1.1부터 최신 HTTP/3까지 어떤 문제를 해결하기 위해 어떻게 진화해 왔는지!! HTTP/1.1 - 첫 번째 최적화와 새로운 숙제초창기 HTTP/1.0은 요청 하나당 TCP 연결을 하나씩 맺고 끊는 매우 비효율적인 방식이었다.이를 개선하고자 HTTP/1.1은 keep-alive라는 개념을 도입했다.keep-alive : 한번 맺은 TCP 연결을 일정 시간 동안 유지하며 여러 요청을 처리하는 방식→ 이를 통해 불필요한 TCP 연결/해제 과정을 줄여 '연결 오버헤드'라는 병목을 해결했다. (연결/해제 과정에서의 비용이 크다.) 하지만 이로 인해 새로운 숙제가 생겼다. 바로 HOL Blocking(Head-..