본문 바로가기

전체보기

(243)
MySQL LIMIT 최적화(feat. 구글이 검색결과를 최대 1,000건만 제공하는 이유) 제가 말하는 것이 사실도, 정답도 아닐 수 있으니 비판적으로 읽어주시면 감사하겠습니다. MySQL LIMIT 최적화하는 방법 MySQL에서 페이징 처리를 위하여 LIMIT 키워드를 제공한다. 오라클에서는 페이징 처리를 위해 rownum 으로 레코드에 번호를 부여하고 WHERE 절에 조건 걸어서 일일이 페이징 처리하던 것에 비해 훨씬 편리하여 자주 사용된다. 이러한 페이징 처리 방법을 오프셋(offset) 페이징이라 한다. MySQL에서 제공하는 LIMIT 즉, 오프셋 페이징에는 치명적인 단점이 있다. 그것은 바로 오프셋 만큼 레코드를 읽어온 후에 필요한 레코드 수를 제외한 "나머지는 버리는 방식"으로 동작하는 것이다. 예를 들어 쿼리가 SELECT ... LIMIT 5000000, 10 처럼 LIMIT ..
MySQL 실행 계획(좋은 쿼리는 못 만들어도 뭐같은 쿼리는 만들지 말아야지) DB의 꽃 옵티마이저의 실행 계획 수립 RDBMS에서 가장 복잡하면서 가장 중요한 것은 옵티마이저(Optimizer)가 쿼리를 어떻게 실행할지 실행 계획을 결정하는 부분이다. 똑같은 쿼리라 할지라도 다양한 방법과 순서로 실행 될 수 있다. 어떤 실행 계획이 좋고 어떤 실행 계획이 안 좋은지 판단하는 건 온전히 옵티마이저의 몫이지만 개발자 역시도 어떤 실행 계획으로 수행되어야 좋은지를 알아야 최적의 실행 계획을 사용할 수 있도록 옵티마이저에게 힌트를 줄 수 있기 때문에 중요하고 반드시 학습해야하는 부분이다. 사전 지식 실행 계획에 대해 자세히 살펴보기 전에 아래의 사전 지식이 있어야 한다. 쿼리 실행 절차 SQL을 SQL 파서가 파싱하여 파서 트리(parser tree)를 만든다. 파서 트리를 기준으로 옵..
MySQL 인덱스 구조와 원리의 이해 인덱스란? 어떤 문제를 해결하기 위한 기술인가 관계형 데이터베이스는 기본적으로 데이터 영속화라는 목적이 있는 기술이다. 쉽게 말하면 어떤 애플리케이션에 필요한 데이터를 유지(저장)하는데 목적이 있다. 그러나 단순히 저장만 하는 게 아니라 저장된 데이터를 가지고 서비스를 해야 한다. 그렇다 보니 수많은 데이터 중에서 특정 조건을 만족하는 데이터를 조회하는데 일일이 검사를 하게 되면 조회 시간이 점차 증가하게 되기 마련이다. (이것은 성능 저하이자 곧 서비스 품질 저하다.) 데이터를 하나하나 전부다 조건을 검사하게 되면 검색 성능이 매우 떨어지는 문제가 발생하는데 이 문제를 해결하기 위한 기술이 바로 인덱스다. 어떻게 해결하는지 쉽게 설명하면, 일반적으로 책 뒤에 "색인"처럼 어느 페이지에 어떤 단어가 있는..
MySQL 트랜잭션과 락 - InnoDB 락, 이렇게 동작한다! 트랜잭션과 락(Transaction, Lock) 트랜잭션과 락 트랜잭션 : 논리적인 작업 단위로 전부 처리되거나 처리되지 않는 (commit/rollback) 원자성을 보장하기 위한 기능이다. 락 : 서로 다른 작업에서 같은 자원을 동시에 필요로 할 때 자원 경쟁이 일어나는데, 이때 순서대로 사용되는 동시성을 보장하기 위한 기능이다. MySQL에서 사용되는 락(LocK)은 크게 MySQL 엔진 레벨의 락과 스토리지 엔진 레벨의 락으로 나눠볼 수 있다. 스토리지 엔진 레벨의 락 스토리지 엔진(InnoDB)에서 제공하는 락(Lock, 잠금)이 있다. 기본적으로 비관적 락(Pessimistic locking)을 사용한다. 비관적 락 : 트랜잭션에서 변경하려는 레코드에 대해 락을 획득하고 쿼리를 수행하는 방식 ..
자바 백엔드 4년차 N사 경력 면접 후기(부제 : 면접을 이끄는 건 누구인가?) 쓸데없는 서론 지금 다니는 회사 동료분들 중 몇 분이 내 블로그를 알고 있기 때문에 면접 봤다는 이야기가 알려지면 좋을 것이 하나도 없지만, 면접이 주는 영감? 동기부여?가 있기도 하고 공유하는 것을 즐기는 성향 때문인지 공유 욕구가 더 강해 위험(?)을 무릅쓰고 포스팅을 하려고 한다. 4년 차 백엔드 개발자 면접 후기 우연한 기회로 N사 계열사 면접(1차 기술 면접)을 보게 되었다. 결과부터 말하면 탈락이다. 그렇기에 이 후기는 패착을 분석하는 후기다. 시간 아까운 사람을 위한 결론 코딩 테스트는 경력 채용이라 어렵지 않았음 (공부 하나도 안 하고도 주어진 테스트 케이스는 솔(solve)하는 수준? 절대 온전한 정답은 아니겠지만?) 컴퓨터 사이언스나 주니어 수준에 어울리는 기술 질문보다는 경력 즉, 어..
MySQL 아키텍처 (MySQL 엔진 구조, 스토리지 엔진 구조, 스레드 구조, 메모리 구조, 쿼리 실행 구조, Replication 구조) MySQL 서버 = MySQL 엔진 + 스토리지 엔진 MySQL 서버는 크게 MySQL 엔진과 스토리지 엔진으로 나눠볼 수 있다. MySQL 엔진은 클라이언트로부터 오는 요청 처리(요청된 SQL 문장을 분석, 최적화, ...)를 담당하고, 스토리지 엔진은 실제 데이터를 디스크 스토리지에 저장하거나 조회하는 부분을 담당한다. MySQL 엔진 Connection Handler : 커넥션 및 쿼리 요청을 처리 담당 SQL 인터페이스 : DML, DDL, Procedure, View 등 SQL 인터페이스 제공 담당 SQL 파서(parser) : SQL문법 오류 탐지 및 SQL 쿼리 문장을 MySQL이 처리하기 좋은 토큰 단위로 나눠서 트리 형태로 파싱 하는 작업 담당 SQL 옵티마이저(optimizer) : 쿼..
Spring ApplicationEvent 비동기로 처리될 것만 같지? ApplicationEventListener는 비동기가 아니다 스프링(Spring) 프레임워크를 공부하면서 왠지 모르게 가끔씩 이벤트 드리븐(Event Driven)이라는 단어도 듣게 됐다. 뿐만 아니라 스프링 5 이후로는 WebFlux가 등장하면서 논블록킹(NonBlocking), 리액티브(Reactive)라는 단어도 듣게 됐다. 그 둘이 무슨 연관성이냐 할 수 있지만, 개념에 대해서 정리가 안되어서 그런지 나는 이벤트 = 비동기 같은 생각을 은연중에 하게되었다. 이런 상황이다 보니 ApplicationContext를 이용하여 ApplicationEvent를 Publish하고 Listen하는 기능을 알았을 때, '아 이렇게 하는 거구나' 하고 넘겼고, 아무 생각 없이 "비동기"로 처리되겠거니 했다. 그..
나는 어떤 응답을 만들었는가(부제 : 그놈의 '기초', '기본'은 무엇인가) 어떤 Http Response를 줄 것 인가? 글에서 다룰 주제 이번 글에서 다룰 내용은 기술적인 내용이나 경험(?)이 아닌 개발자라면 한 번쯤 생각해볼만 한 것? 정도 된다. 최근 들어 개발자 연봉 상승 소식도 많이 들리고, 개발자 수요도 많다하고, 비교적 진입 장벽이 높지 않다는 희망적인 소식 덕분에 많은 사람들이 소프트웨어 업계로 많이 오고 있다. 전직 또는 진로 변경을 하려는 사람들은 이미 현업에 있는 사람들에게 업계 질문을 많이 할 것이다. 그리고 현업에 있는 사람들의 조언을 잘 들어보면 거기에는 "기초만 잘 다지면..." , "기본적인 것만 할줄 알면..." 이런 말이 있을 것이다. 주의해야한다. 필자도 만 3년정도 경력이 있지만 그 기초가 뭔지 기본적인 것은 뭔지 명쾌하게 말할 수 없었다. ..