본문 바로가기

분류 전체보기

(47)
Java 람다와 effectively final 최근 Java 프로젝트에서 XML 파일을 처리하면서 아래와 같은 코드를 작성하게 되었다.boolean[] replaced = {false};doc.traverse(new NodeVisitor() { @Override public void head(Node node, int depth) { // 익명 클래스 내부에서 외부 변수의 상태를 변경 replaced[0] = true; } @Override public void tail(Node node, int depth) { // no-op }}); 이 코드를 다른 개발자가 보고 "왜 굳이 원시 타입인 boolean을 배열로 감싸서 사용하나요? 그냥 boolean 변수 사용하면 안되나요?" ..
뷰 머징(View merging) - 뷰 머징을 이용한 쿼리성능 향상 데이터베이스 옵티마이저는 쿼리 성능을 향상시키기 위해 사용자가 작성한 SQL을 내부적으로 다양한 형태로 변환하여 실행 계획을 최적화하는데 이러한 변환 기법들 중 하나가 바로 뷰 머징(View Merging)이다.뷰 머징은 데이터베이스 옵티마이저가 쿼리 처리 방식을 결정하는 과정에서 중요한 역할을 하므로 이를 잘 활용하면 쿼리 성능을 획기적으로 개선할 수 있다. 뷰 머징(View Merging)이란?뷰 머징은 데이터베이스 옵티마이저가 FROM 절에 있는 인라인 뷰(Inline View)의 경계를 허물고, 메인 쿼리와 뷰의 쿼리를 합쳐서 하나의 쿼리처럼 최적화하는 기법을 의미한다. 뷰 머징의 동작 방식 및 이점뷰 머징이 이루어지면 옵티마이저는 마치 처음부터 하나의 쿼리였던 것처럼 전체를 분석하고 최적화한다..
@SchedulingConfigurer를 이용한 배치 시스템의 운영화 개요 Spring에서는 @Scheduled 애노테이션 하나만으로 간단하게 배치 작업을 등록할 수 있다.하지만 실제 운영 환경에서는 단순한 애노테이션 기반 스케줄링으로는 한계가 명확하다.이 글에서는 @Scheduled의 구조적 한계에 대해 알아보고, 이를 극복하기 위해 @SchedulingConfigurer 기반의 DB 메타 중심 배치에 대해 정리하려고 한다. @Scheduled의 한계 @Scheduled는 간단한 테스트나 단일 노드 환경에는 적합하지만, 복잡한 실무 환경에서는 운영 안정성을 확보하기 어렵다.동적 제어 불가실행 중인 배치를 중지하거나 갱신할 수 없다상태 추적 어려움언제 실행됐는지, 다음 실행은 언제인지 외부에서 알 수 없다운영툴 연동 어려움모니터링 시스템에서 실행 상태 조회/변경이 어렵..
NL조인 기반 인덱스 설계 https://product.kyobobook.co.kr/detail/S000001975837 친절한 SQL 튜닝 | 조시형 - 교보문고친절한 SQL 튜닝 | 책 제목은 필자가 애청하는 라디오 프로그램 ‘손에 잡히는 경제’ 중 ‘친절한 경제’라는 코너에서 착안했다. 어려운 경제 이슈를 일반인 눈높이에 맞게 풀어서 설명해 주는product.kyobobook.co.kr 요즘 SQL 튜닝에 대해 관심이 생겨 관련된 내용을 공부하는 중이다.그러던 중 '친절한 SQL 튜닝' 이라는 책에서 아래와 같은 내용을보게 되었다. (책 내용 중...)개발 업무를 하다 보면 다음과 같이 인덱스 생성을 요청받는 경우가 종종 있다. PRA_HST_STC_N1 : SALE_ORG_ID + STRD_GRP_ID + STRD_ID..
같은 SELECT인데 결과가 0건(MyBatis) 들어가며 최근에 SpringBoot + MyBatis로 구성된 서버 개발 중 동료가 예상치 못한 문제를 겪은 것을 보았다.반복문 내에서 똑같은 SELECT 쿼리를 여러 번 호출했는데, 첫 번째 호출에서는 결과가 정상적으로 나왔지만, 이후 호출에서는 결과가 0건으로 나타난 문제가 바로 그것이다.처음에는 쿼리 문법이나 전달된 파라미터가 잘못됐는지 의심했으나 문제가 동일하게 발생했다. 그러다가 MyBatis의 캐시 설정 때문이라는 것을 알게 되었다.나도 나중에 같은 일을 겪게 될 수도 있을 것이라는 생각이 들어서 이번 기회를 통해 아래와 같은 내용을 정리해 보는 시간을 갖고자 한다.MyBatis의 캐시 종류와 내부 동작 방식useCache, flushCache 옵션의 정확한 역할과 사용법캐시 관련 옵션을 설정..
리눅스 커널의 러스트 논쟁과 오픈소스 생태계의 번아웃 이 글은 아래 글들을 읽고 이해한 대로 정리해본 글입니다.https://byline.network/2025/02/19-436/https://byline.network/2025/02/12-381/   들어가며최근 리눅스 커널과 러스트(Rust) 언어의 병합을 둘러싼 논쟁이 커뮤니티 전체의 주목을 받고 있다. 이번 갈등은 단지 기술적인 문제가 아니라 오픈소스 프로젝트 유지관리자의 역할과 번아웃, 그리고 커뮤니티의 지속 가능성 문제로 확대되어 큰 의미를 지닌다. 이 글에서는 이번 사건의 흐름을 짚어보면서 오픈소스 생태계가 직면한 현실적인 고민을 살펴보고자 한다.   1. 리눅스 커널에 러스트 도입을 둘러싼 갈등 시작 리눅스 커널은 오랫동안 C 언어를 기반으로 개발되어 왔으며, 강력한 성능과 하드웨어와의 긴밀한..
Index Skip Scan과 In-List 튜닝 인덱스 탐색의 중요성 보통 DB에서 조회 작업을 하는 경우 인덱스를 잘 사용하는지 여부에 따라 조회 쿼리 성능이 크게 향상될 수 있다.그렇기 때문에 같은 결과를 내는 쿼리라도 WHERE 절의 조건을 적절하게 사용하여 인덱스 사용 및 인덱스 탐색 방식을 다르게 하여 성능이 잘 나오게 할 수도 있으며, 반대로 성능이 나오지 않을 수도 있다.이 글에서 간략하게 Index Skip Scan과 Index Range Scan에 대해 정리해보고, 같은 인덱스를 사용하더라도 WHERE 절의 조건에 따라 옵티마이저가 어떻게 실행계획을 선택하는지 정리해 보려고 한다.   INDEX SKIP SCAN이란?INDEX SKIP SCAN 개념INDEX SKIP SCAN은 인덱스의 선두 컬럼이 WHERE 조건에 없을 때도, 후행 ..
추상화 예시 - 팩토리 메서드 활용 https://www.inflearn.com/course/%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%EC%9E%85%EB%AC%B8/dashboard 객체 지향 프로그래밍 입문 강의 | 최범균 - 인프런최범균 | 잘 하는 개발자가 되기 위해서는 유연한 코드를 작성할 줄 알아야합니다. 객체 지향을 이용해서 변경하기 좋은 유연한 코드를 만드는 방법을 알아보세요., 좋은 코드, 좋은 설계를 하고www.inflearn.com https://www.inflearn.com/course/%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4/dashboard 코딩으로 학습하는 Go..