본문 바로가기

전체 글

(51)
[Spring] 왜 Static 메서드에는 AOP가 적용되지 않을까? 문제 발생 Spring AOP를 사용하다 보면 로깅, 트랜잭션 관리 시간 측정 등의 공통 관심사를 처리하기 위해 @Around를 자주 사용하게 된다. 하지만 유틸리티 성격의 public static 메서드에 이 어노테이션을 붙였을 때 아무런 일도 일어나지 않는다.최근에 파일 업로드, 다운로드시 암/복호화 솔루션을 적용해야 하는 경우가 생겼다. 우리 솔루션에서는 파일 관련 유틸 클래스를 만들어 사용하여 처리하고 있기 때문에 관련된 클래스에 Pointcut을 지정하여 처리하려고 하였는데...해당 유틸 클래스의 메서드들이 전부 Static 메서드였기 때문에 Aspect가 동작하지 않았다. Spring AOP가 동작하는 방식 https://docs.spring.io/spring-framework/refere..
Apache Bench(ab)로 서버 부하 테스트(WSL 환경, Node 서버) Apache Bench(ab)웹 서비스를 개발하다 보면 이 서버가 동시에 몇 명이나 감당할 수 있을지 궁금해 지고는 한다.물론 실무에서는 다양한 도구들을 이용해서 부하 테스트를 진행하고 그 결과에 맞는 방안을 고민하는데 ab도 이러한 도구들 중 하나이다.아래 표는 주로 사용하는 명령어이다.옵션설명-n총 요청 수 (e.g. -n 1000)-c동시에 보낼 요청 수 (e.g. -c 50)-kKeep-Alive 활성화-pPOST 데이터 파일 지정-TContent-Type 지정-HHTTP 헤더 추가 ab 설치(Window, WSL 환경)1. WSL 설치Power shell 을 관리자 권한으로 실행한 후 wsl --install -d Ubuntu 로 wsl을 설치한다. 재부팅 후 WSL가 설치된 것을 확인할 ..
DISTINCT 대신 EXISTS가 유리한 경우 DISTINCT 대신 EXISTS가 유리한 경우?SQL을 작성하다 보면 중복 제거를 위해 DISTINCT를 사용하는 경우가 많다. 그런데 때로는 EXISTS 서브쿼리를 사용하는 것이 성능이나 가독성 측면에서 더 유리할 수 있다. 이번 글에서는 두 방식의 차이를 정리하고, 어떤 상황에서 EXISTS가 더 적합한지를 테스트해보기로 하였다. 언제 DISTINCT를 EXISTS로 대체할 수 있을까?DISTINCT는 보통 JOIN 후 중복된 결과를 제거하기 위해 사용된다다. 반면 EXISTS는 서브쿼리를 이용해"조건을 만족하는 행이 존재하는가" 여부만 체크하므로, JOIN 없이도 동일한 효과를 얻을 수 있는 경우가 있다. EXISTS가 성능적으로 유리한 시나리오아래 조건에 해당한다면 DISTINCT + J..
SQL Server 트랜잭션 로그 꽉 참 문제 해결 및 예방 문제 상황최근 웹 애플리케이션에서 메뉴 접속 기록을 데이터베이스에 저장하는 과정에서 아래와 같은 SQL Server 오류가 발생했다. 이로 인해 서비스가 정상적으로 동작하지 않는 문제가 발생했다.(참고로 DB서버의 OS는 Window 이다)[S0002][9002] 데이터베이스 '[YourDatabaseName]'의 트랜잭션 로그가 'LOG_BACKUP'(으)로 인해 꽉 찼습니다. 처음 보는 상황이였어서 당황했지만 해결방법은 비교적 간단했다. 문제 발생 원인 분석확인해본 결과 문제의 원인은 다음과 같이 세 가지라고 생각되었다. 1. 전체(Full) 복구 모델 사용 SQL Server의 전체(Full) 복구 모델은 모든 트랜잭션을 로그에 기록하므로, 데이터베이스를 특정 시점으로 복구할 수 있는 ..
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..