전체 글47 Custom DSL 읽기 쉬운 코드 설계 한 번 작성된 코드는 생각보다 오래 살아남는다. 코드는 쓰는 시간보다 읽히는 시간이 훨씬 길다. 한 명의 개발자가 작성한 코드는 여러 명의 개발자가 여러 번 읽고, 수정하고, 확장한다.그래서 좋은 코드는 “동작하는 코드”를 넘어서 의도를 쉽게 파악할 수 있는 코드여야 한다. 이때 도움이 되는 개념이 바로 Custom DSL이다.DSL은 개발 언어를 모르는 사람이라도 비즈니스 용어만 알고 있다면 대략적인 의미를 이해할 수 있도록 돕는다. DDD에서 말하는 유비쿼터스 언어를 코드로 옮기는 가장 현실적인 방법이기도 하다.Custom DSL 고수준 코드란 무엇인가다음은 주어진 횟수만큼 메시지를 출력하는 가장 전통적인 코드다.for (int i = 0; i 이 코드는 정확히 동작하지만, 자바를 처음 보는 사람에게.. 2026. 2. 14. 동작 파라미터화 Query 설계 시작에 앞서: 실행 환경과 전제이 글은 Query 중심의 CRUD 서비스를 동작 파라미터화 관점에서 다시 설계해보는 기록이다. 복잡한 도메인 규칙보다 “요청 → 조건 → 쿼리” 흐름이 핵심인 서비스에서, 어떻게 하면 Service 계층을 최소화하면서도 구조를 무너지지 않게 유지할 수 있을까에 초점을 맞춘다.예제 코드는 아래 환경에서 동작한다.Java: 21Launcher JVM: 21.0.5 (Amazon.com Inc. 21.0.5+11-LTS)Spring Boot: starter-web, starter-data-jpaQueryDSL, MySQL, Lombok$ java -versionopenjdk version "21.0.5" 2024-10-15 LTSOpenJDK Runtime Environment.. 2026. 2. 14. 동작 파라미터화 실전 정리 시작에 앞서: 실행 환경본 글의 모든 코드는 아래 환경에서 컴파일 및 런타임 테스트를 완료했다. 환경 차이로 인한 혼란을 줄이기 위해 버전 정보를 먼저 명확히 한다.Java: 21Launcher JVM: 21.0.5 (Amazon Corretto)$ java -versionopenjdk version "21.0.5" 2024-10-15 LTSOpenJDK Runtime Environment Corretto-21.0.5.11.1모든 예제는 추가 설정 없이 정상적으로 동작한다.요구사항과 문제의 본질주어진 요구사항은 단순하다. 바나나 목록에서 원하는 조건을 만족하는 바나나만 필터링하고 싶다.하지만 조건은 계속 늘어난다.빨간색 바나나만 찾고 싶다초록색 바나나만 찾고 싶다무거운 바나나만 찾고 싶다가벼운 바나나만 .. 2026. 2. 13. 인덱스 스킵 스캔 실행계획 일반적으로 다중 컬럼 인덱스를 생성하면 해당 인덱스를 사용하기 위해 쿼리의 WHERE 절에는 선행 컬럼 조건이 반드시 포함되어야 한다.예를 들어 (gender, hire_date) 순서로 복합 인덱스를 생성했다면 gender 조건 없이 hire_date만으로는 인덱스를 사용할 수 없는 것이 기존 MySQL의 동작 방식이었다.하지만 MySQL 8.0부터는 옵티마이저가 선행 컬럼 조건이 없더라도 인덱스를 활용할 수 있도록 인덱스 스킵 스캔이라는 최적화 기능이 도입되었다.이 기능은 특히 선행 컬럼의 기수성이 낮을 때 효과적으로 동작한다.인덱스 스킵 스캔과 선행 컬럼employees 테이블에 (gender, hire_date) 인덱스를 생성했다고 가정해보자.기존 방식이라면 아래와 같은 쿼리만 인덱스를 사용할 수.. 2026. 2. 13. 루즈 인덱스 스캔 실행계획 루즈 인덱스 스캔은 말 그대로 인덱스를 듬성듬성 읽는 방식이다. 모든 인덱스 키를 연속으로 읽는 것이 아니라 필요한 지점만 건너뛰며 읽는다.인덱스 레인지 스캔이 구간 내의 모든 인덱스를 읽는 방식이라면 루즈 인덱스 스캔은 중간에 불필요한 인덱스 키를 과감히 생략한다.이 스캔 방식은 GROUP BY와 집합 함수, 특히 MIN(), MAX() 최적화에서 가장 큰 효과를 발휘한다. 그 배경에는 인덱스의 정렬 특성이 있다.루즈 인덱스 스캔 정렬 원리인덱스는 항상 좌측을 기준으로 정렬된다. 문자열이라면 왼쪽 문자부터, 복합 인덱스라면 가장 왼쪽 컬럼부터 정렬 기준이 된다.employees 테이블에서 first_name과 hire_date로 복합 인덱스를 구성했다고 가정하자.정렬 순서는 다음과 같다. 먼저 firs.. 2026. 2. 12. 인덱스 풀 스캔 실행계획 MySQL 실행계획을 보다 보면 type 값이 index로 표시되는 경우가 있다. 이는 인덱스를 사용하긴 하지만 조건 범위를 좁히지 못하고 인덱스의 처음부터 끝까지 모두 읽는 방식이다. 이를 인덱스 풀 스캔이라고 한다.인덱스 레인지 스캔과 달리 선택도가 낮거나 조건절이 인덱스 선두 컬럼을 사용하지 못할 때 발생한다. 그럼에도 불구하고 테이블 풀 스캔보다 효율적인 경우가 존재한다.인덱스 풀 스캔 개념과 특징인덱스 풀 스캔은 인덱스를 사용하지만 조건에 의해 범위를 줄이지 못하고 리프 노드를 처음부터 끝까지 순차적으로 읽는다.일반적으로 인덱스는 테이블 데이터보다 크기가 작다. 따라서 테이블 전체를 읽는 것보다 인덱스만 읽는 것이 디스크 I/O 측면에서 유리할 수 있다.특히 커버링 인덱스로 처리되는 경우 테이블.. 2026. 2. 12. 이전 1 2 3 4 5 6 7 8 다음