본문 바로가기

전체 글

(88)
Oracle 대용량 데이터 페이징 처리 방식 비교 ( ROW_NUMBER VS OFFSET-FETCH VS KEYSET(SEEK) ) Oracle 환경에서 1,000만 건 이상의 대용량 데이터를 다루면서 페이징을 구현해야 할 경우, 적절한 페이징 방식의 선택은 성능과 안정성에 직접적인 영향을 미친다. 이번에 받은 작업은 대용량 엑셀 다운로드 기능을 구현해야하는데 기존 프로젝트에서 쓰는 페이징 기법은 뒤로 갈 수록 느리다는 단점이 존재하였다. 직접 3가지 유형을 써보고 제일 빠르게 개선된 방식을 기록해두겠다. 대표적인 페이징 방식은 다음 세 가지가 있으며, 각각의 작동 방식, 장단점, 인덱스 및 정렬 순서 유지 여부, 대용량 처리 시 문제점을 함께 비교하여 정리한다. 1. ROWNUM / ROW_NUMBER 기반 페이징Oracle 8i 이상에서 사용 가능한 방식으로, 전체 데이터를 정렬한 후 ROWNUM 또는 ROW_NUMBER()를 부..
GoF 디자인 패턴 - 데코레이터 패턴 (Decorator Pattern) 1. 데코레이터 패턴이란?데코레이터 패턴은 객체에 추가적인 책임(기능)을 동적으로 부여할 수 있게 해주는 구조 패턴이다. 서브클래싱 없이도 기능을 확장할 수 있으며, 개방-폐쇄 원칙(OCP)을 잘 지킨 설계 방식이다.특징동적 기능 확장: 런타임에 객체의 기능을 유연하게 추가 가능OCP 준수: 기존 코드를 수정하지 않고도 기능을 확장조합성 증가: 다양한 데코레이터를 조합해 기능을 유연하게 구성 가능 2. 데코레이터 패턴의 구조Component (컴포넌트): 기본 인터페이스 또는 추상 클래스ConcreteComponent (구현체): 실제 기능을 수행하는 클래스Decorator (데코레이터): Component를 구현하고 자신 안에 Component 참조ConcreteDecorator (구체 데코레이터): ..
Gradle과 Maven: 빌드 도구의 이해와 차이점 분석 1. 빌드 도구를 왜 사용할까?개발을 하다 보면, 단순히 코드를 작성하는 것만으로 끝나지 않는다.작성한 코드를 실행 가능한 프로그램으로 만들기 위해 여러 작업이 필요하다.예를 들면:소스 코드를 컴파일(코드를 기계어로 번역)테스트 코드 실행실행 파일이나 라이브러리로 패키징외부 라이브러리 의존성 다운로드이 모든 과정을 매번 수작업으로 한다면? → 번거롭고, 실수도 많고, 시간이 너무 오래 걸린다.그래서 등장한 것이 바로 빌드 도구(Build Tool).빌드 도구는 위 작업들을 자동화해주는 프로그램이다.덕분에 개발자는 코딩에만 집중할 수 있고, 빌드는 버튼 하나로 끝낼 수 있다.2. Gradle이란?Gradle은 요즘 가장 많이 쓰이는 빌드 도구 중 하나다.특징을 정리하면:스크립트 언어: 빌드 설정을 Groo..
Python에서 ModuleNotFoundError 발생 시 VS Code에서 확인해야 할 점 Python 프로젝트를 진행하다 보면, 외부 라이브러리를 설치했음에도 불구하고 ModuleNotFoundError가 발생하는 경우가 종종 있다. 예를 들어 다음과 같은 오류 메시지를 볼 수 있다.이 글에서는 위와 같은 오류가 발생하는 일반적인 원인과, VS Code 환경에서 확인하고 조치할 수 있는 방법을 정리한다. 특히 가상환경을 사용하지 않고 Python을 운영체제에 전역으로 설치해 사용하는 개발자를 위한 내용을 중심으로 설명한다. 1. ModuleNotFoundError란 무엇인가?ModuleNotFoundError는 Python에서 특정 모듈을 불러오려고 했으나 해당 모듈을 찾을 수 없을 때 발생하는 오류다. 이 오류가 발생하는 이유는 다음 중 하나다.해당 모듈이 설치되지 않았거나모듈이 설치되어는..
ROWNUM vs ROW_NUMBER() — 차이점 및 상세 비교 정리 1. 개념 비교: 두 함수의 근본적인 차이 항목 ROWNUM ROW_NUMBER() 순번 부여 시점SELECT 이후, ORDER BY 이전ORDER BY 이후에 윈도우 함수로 번호 부여정렬 반영 여부반영되지 않음원하는 정렬 기준 반영 가능고유성보장되지 않음고유하게 1부터 순번 부여페이징 용이성서브쿼리 필요직관적이고 쉬움사용 가능 DBOracle 한정SQL 표준을 지원하는 대부분의 DB 2. ROWNUM: 정렬 전 순번 부여의 한계잘못된 ROWNUM 사용 예SELECT employee_id, name, salaryFROM employeesWHERE ROWNUM 문제점: ROWNUM은 정렬 이전에 순번이 부여되므로, 원하는 정렬 기준이 반영되지 않은 채 임의의 3명이 추출됨 잘못된 결과 예시 (ROWNU..
Spring Boot와 기존 Spring의 차이점 Spring Framework는 Java 개발자들 사이에서 가장 인기 있는 오픈소스 애플리케이션 프레임워크 중 하나로, 다양한 구성 요소와 강력한 유연성을 제공합니다. 그러나 Spring을 사용하여 애플리케이션을 구축하려면 많은 설정 작업이 필요했으며, 이로 인해 개발자가 설정과 관련된 문제에 집중하기보다는 비즈니스 로직에 집중할 수 없다는 단점이 있었습니다. 이러한 문제를 해결하기 위해 등장한 것이 Spring Boot입니다.Spring Boot는 기존의 Spring Framework를 기반으로 하지만, 설정과 구성의 복잡성을 크게 줄이고, 개발자가 더 쉽게 애플리케이션을 개발할 수 있도록 돕는 도구입니다. 이 포스트에서는 Spring Boot와 기존 Spring의 차이점을 다뤄보겠습니다.1. 설정의 ..
Spring @Transactional : 원리부터 실전 주의사항까지 Spring에서 @Transactional은 가장 많이 쓰이면서도 가장 자주 오용되는 기능 중 하나다.겉으로는 단순해 보이지만, 내부 동작을 잘 모르고 쓰면 트랜잭션이 아예 시작되지 않거나, 롤백되지 않거나, 데이터 불일치 문제가 생길 수 있다.이 글에서는 단순 개념이 아니라 실제로 개발하다가 부딪히는 문제들을 기준으로 @Transactional을 깊이 있게 정리해본다.1. @Transactional이 작동하는 원리핵심은 프록시와 AOPSpring에서 @Transactional은 프록시 기반 AOP를 사용해 트랜잭션을 관리한다.즉, 트랜잭션을 시작하거나 커밋/롤백하는 실제 코드는 프록시 객체에 의해 실행된다.기본 흐름은 다음과 같다:Bean 등록 시 Spring이 트랜잭션 어노테이션이 붙은 클래스를 프록..
Spring Bean 생명주기와 스코프 정리 Spring에서 Bean은 객체를 자동으로 생성하고 관리하는 단위다. 이 Bean이 생성되고 사용되며 종료되는 전 과정이 생명주기이고, Bean이 어떤 범위로 관리되는지가 스코프다.1. Bean 생명주기Bean은 아래와 같은 순서를 따라 생성되고 제거된다.생명주기 단계객체 생성Spring 컨테이너가 Bean 정의를 기반으로 객체를 생성한다.의존성 주입생성된 객체에 필요한 의존성이 주입된다.초기화 콜백@PostConstruct 또는 InitializingBean.afterPropertiesSet()을 통해 초기화 작업 수행.사용컨테이너가 Bean을 필요에 따라 사용한다.소멸 콜백@PreDestroy 또는 DisposableBean.destroy() 호출로 정리 작업 수행. 예제@Componentpubli..

반응형