Dynamic Proxy vs CGLIB 방식 차이
·
스프링
들어가며토비의 스프링을 읽으며 Spring AOP는 프록시 기반으로 동작하며 그 프록시를 생성하는 방식에는 JDK Dynamic Proxy와 CGLIB가 있다는걸 알게 되었습니다. 0. Dynamic Proxy vs CGLIB 방식 차이를 알아야 하는 이유 JDK Dynamic Proxy와 CGLIB의 차이를 알아야 하는 이유는 Spring AOP가 어떤 방식으로 동작하는지 이해하기 위해서입니다. Spring의 AOP 기능은 모두 프록시 객체를 통해 동작합니다. 따라서 프록시가 어떤 방식으로 생성되는지에 따라 AOP가 적용되는 범위와 조건이 달라집니다. 이 차이를 모르면 특정 상황에서 AOP가 왜 동작하지 않는지 설명하기 어렵습니다. 예를 들어 @Transactional이 같은 클래스 내부 호출에서 적..
Mockito 핵심 개념 Mock, Stub, Spy(feat : JUnit5)
·
스프링
들어가며CCommit 멘토링 중에 Mockito와 JUnit 5 관련해서 이야기가 나왔는데, Mockito가 JUnit 5에 포함되어 있는 개념으로만 알고 있다고 대답했습니다. 테스트 코드를 여러 번 짜봤지만 자세히는 몰랐던 것이죠. 지금까지 멘토링을 진행하면서 배우고 느낀것은 기술의 등장 배경과 장단점을 잘 알고 쓰는 개발자가 좋은 개발자라는 것입니다.그렇다면 이제는 그냥 넘어갈 수 없죠.잘못 알거나 모르는 건 괜찮습니다. 잘못 안다는 것은 학습의 계기가 될 수 있고, 모른다는 것은 배울 수 있는 기회이자 엄청난 성장 가능성이기 때문이죠. 저는 아직 모르는 것도 많고 공부할 것도 많지만 엄청난 성장 가능성이 있는 개발자라고 생각합니다. 새벽에 글을 작성하다 보니 감성에 젖어 서론이 조금 길어졌네요..
Elasticsearch의 형태소 분석기와 역인덱스: 검색 엔진의 핵심
·
개발 알쓸신잡
0. 들어가며검색 기능을 공부하면서 MySQL의 LIKE 쿼리를 접하게 되었습니다. 단순 문자열 매칭을 통해 원하는 데이터를 찾을 수 있다는 점에서 직관적이고 이해하기 쉬운 방법이었습니다. 하지만 실제로 조금 더 깊게 살펴보면서 LIKE의 한계를 알게 되었습니다. 데이터가 많아질수록 성능이 급격히 저하될 수 있다는 점이 가장 큰 문제였습니다. 그 원인은 크게 세 가지로 나눌 수 있습니다. 첫째, 전체 테이블 스캔: LIKE '%검색어%'와 같이 앞쪽에 와일드카드가 붙으면 인덱스를 전혀 활용하지 못하고 모든 행을 검사하게 됩니다.둘째, 조인과 집계 연산 부담: 검색과 함께 복잡한 조인이나 정렬, 집계를 수행하면 한 쿼리에서 처리해야 하는 데이터가 기하급수적으로 늘어나 속도가 떨어집니다.셋째, 데이터 증가에..
스프링 트랜잭션(@Transactional) 전파레벨 7가지
·
스프링
0. 들어가며프로젝트를 진행하면서 @Transactional은 정말 자주 사용해왔습니다. 데이터 정합성이 중요한 로직이라면 거의 당연하다는 듯이 어노테이션을 붙였고 문제가 발생하면 "트랜잭션이 있으니 괜찮겠지"라고 안일하게 생각했었습니다.하지만 토비의 스프링 5장 서비스 추상화를 읽고 문득 이런 생각이 들었습니다."나는 트랜잭션을 사용하고 있는 걸까, 아니면 그냥 붙이고 있는 걸까?"특히 하나의 트랜잭션 메서드 안에서 다른 트랜잭션 메서드를 호출할 때 어떤 경우에는 전체가 함께 롤백되고 어떤 경우에는 일부만 롤백되는 이유를 명확하게 설명하지 못하는 저를 발견하였습니다.그동안 막연하게 사용해왔던 @Transactional을 조금 더 명확하게 이해해보고 싶다는 생각이 들어 트랜잭션 전파 레벨 7가지를 정리해..
MySQL SQL 파서(Parser)와 옵티마이저(Optimizer) 내부 동작 정리
·
데이터베이스
0. 들어가며MySQL을 공부하면서 MySQL 파서와 옵티마이저에 대해 알게 되었습니다.MySQL은 SQL을 그대로 실행하지 않고, 먼저 해석한 뒤 어떤 방식으로 실행할지를 결정합니다. 이 과정이 결국 DB에 큰 영향을 준다는 점이 중요하게 느껴졌습니다. 예전에는 그냥 SQL만 잘 짜면 되는 거 아닌가라는 생각을 했었는데 이 과정을 알고 난 후에는 같은 SQL문이라도 DB 성능을 결정하는 것은 옵티마이저와 파서라는 걸 알게 되었습니다. 그래서 이번 글에서는 MySQL에서 SQL이 처리되는 흐름을 기준으로 파서와 옵티마이저가 각각 어떤 역할을 하고 이 과정이 왜 DB 성능과 직결되는지를 공부하면서 이해한 내용 위주로 정리해보려고 합니다. 1. MySQL에서 SQL이 처리되는 흐름MySQL은 클라이언트로부..
데이터베이스 락의 모든 것 - 공유 락, 배타 락, 그리고 분산 락
·
데이터베이스
0. 들어가며최근에 데이터베이스를 공부하면서 동시에 여러 트랜잭션이 같은 데이터를 처리할 때 발생할 수 있는 문제들을 접하게 되었습니다.처음에는 단순히 SQL 쿼리와 테이블 설계만 생각했는데 공부를 이어가다 보니 락(Lock)이라는 개념이 얼마나 중요한지 깨닫게 되었습니다. 예를 들어 은행 계좌의 잔액을 동시에 수정하거나, 쇼핑몰에서 재고를 차감할 때 락이 없으면 데이터가 꼬일 수 있다는 사실을 알게 되었습니다. 이 글에서는 제가 공부하면서 이해하게 된 공유 락, 배타 락, 분산 락에 대해서 정리해보려고 합니다.1. 락이란 무엇인가 - 동시성 제어의 핵심락은 동시에 실행되는 여러 트랜잭션이 같은 데이터에 접근할 때 데이터의 일관성을 보장하기 위한 것입니다. 쉽게 설명하자면 누군가 데이터를 사용하고 있..