목록전체 글 (115)
도당탕탕
클래스를 사용할 때 대부분의 클래스는 하나 이상의 자원을 사용할 것이다. 그중 Utility 클래스나 싱글톤 클래스를 만들어 자원을 효율적으로 사용할 수 있다. 하지만 이는 다음과 같은 문제가 발생할 수 있다. 다음 예를 들어 보자. Utility 클래스의 검시기 사전 public class SpellChecker { private static final Dictionary dictionary = ...; private SpellChecker() {} public static boolean isValid(String word) { ... } public static List suggestions(String typo) { ... } } Singleton 클래스의 검시기 사전 publicclass Spel..
싱글톤 패턴이란 인스턴스를 오직 하나만 생성할 수 있는 클래스를 말한다. 즉 함수와 같은 무상태 객체나 설계상 유일해야 하는 시스템 컴포넌트를 들 수 있다. 싱글톤 패턴으로 클래스 오브젝트가 만들어지면 어플리케이션 내에서 전역으로 해당 오브젝트를 사용할 수 있다. 하지만 싱글턴 패턴은 다음과 같은 단점이 있다. 바로 클래스를 싱글턴으로 만들면 이를 사용하는 클라이언트를 테스트하기가 어려워 질수 있다는 것이다. 싱글톤이 인터페이스로 정의해서 만든 것이 아니라면 Mock 으로 대체해 테스트 하기가 어렵기 때문이다. 물론 테스트가 아예 안되는 것은 아니다. PowerMock같은 도구를 통해 정적 메소드를 테스트 하게 할 수 있고 Mockito 3.4.0 버전에서는 정적 메소드를 지원해 준다고 한다. 싱글톤 패..
저번 글에서 인덱스 스캔에 관련하여 공부를 했었습니다. 이번에는 인덱스의 사용목적에 대해 공부해보겠습니다. 인덱스 구조 인덱스를 생성하면 어떤 과정을 거칠까요? 아마 다음과 같이 이루어질 것입니다. 데이터베이스 엔진은 생성된 인덱스를 별도의 저장공간을 만듭니다. 인덱스화 된 데이터들을 별도의 저장공간에 저장시킨다. 위에서 봤을 때 인덱스 테이블도 같이 만들기 때문에 비효율적으로 보이지만, 테이블의 모든 로우를 매번 검색하지 않고 빠르게 데이터를 찾아올 수 있기 때문에 인덱스는 매우 유용하다고 생각합니다. 인덱스와 조인 관계 일단 조인은 무엇이며 왜 사용하는 것일까요? 조인은 여러 테이블에서 레코드를 조합하여 하나의 로우로 표현한 것이다. 운영중인 많은 서비스들에서 하나의 테이블에 모든 데이터를 담지 않습..
이번 글에는 인덱스를 왜 사용하는지, 인덱스 스캔과 테이블 스캔, 인덱스 종류 등 인덱스에 대해 공부해 보도록 하겠습니다. 인덱스를 왜 사용할까? 인덱스를 왜 사용할까요? 데이터베이스를 공부해보셨던 사람들은 아마 이런 생각을 할겁니다. 인덱스를 사용하면 빠르게 데이터를 찾을 수 있기 때문에 인덱스를 사용하는거 아냐? 네! 맞습니다. 테이블 풀 스캔하는 것 보다 인덱스 스캔을 하면 데이터를 빠르게 찾을 수 있다는 사실은 누구나 알고 있습니다. 하지만 여기서 궁금한점! 어느 상황에서든 인덱스 스캔이 테이블 스캔보다 빠를까요? 인덱스 스캔 VS 테이블 스캔 우선 인덱스 스캔과 테이블 스캔에 대해 보죠. 인덱스 스캔과 테이블 스캔의 정의는 다음과 같습니다. 인덱스 탐색 쿼리를 만족하는 레코드를 추출 하기위해 인..
RDB에서 NULL은 데이터가 들어가지 않은 특별한 값입니다. 따라서 NULL은 동등이나 연산자로 비교가 불가능하고 IS NULL 키워드를 통해 널 값이 있는지 없는지만 확인 할 수 있습니다. 인덱스는 보통 WHERE 조건 절엥 자주 사용되는 컬럼, 분포도가 높은 컬럼을 선정합니다. 그리고 인덱스를 통해 쿼리의 성능을 향상 시킵니다. 따라서 개발자는 인덱스를 설정할 때 해당 컬럼이 NULL을 포함하는지 혹은 NULL값을 포함한 인덱스를 시스템이 어떻게 처리하는지 등 고려해야합니다. 인덱스의 특별한 기능 데이터베이스 시스템에서 인덱스를 걸때 NULL를 제외해주고 인덱스를 생성할 수 있는 기능을 제공합니다. 만약 이런 기능이 없으면 어떻게 될까요? NULL도 인덱스가 되버려 저장 공간이 심각하게 낭비 될 것..
프로젝트를 진행하면서 비즈니스 로직만 생각해왔지 빌드 도구에 대해 생각해 본적이 없었습니다. 따라서 이번 기회에 그래들에 대해 정리해 볼까 합니다. Gradle 이란? 그래들이란 어플리케이션을 유연하게 실행 시켜줄 빌드 자동화 도구입니다. 그래들은 다음과 같은 특징을 지니고 있다고 합니다. 고성능 : 그래들은 I/O 작업만 실행하여 불필요한 작업을 방지합니다. JVM : 그래들은 JVM에서 실행되며 JDK가 필요로 합니다. 이는 자바 개발자들에게 익숙하고 좋은 도구라고 생각합니다. 그렇다고 JVM에만 국한되지 않으며 다른 네이티브 프로젝트에도 빌드를 지원합니다. 규약 : 메이븐과 다르게 일반적인 유형의 프로젝트를 쉽게 빌드를 할 수 있습니다. 규칙 재정의, Task 추가, 규칙 기반 빌드를 통해 사용자가..
이번 글은 공부하면서 이해가 안갔던 용어들을 정리해 보는 시간을 갖을려고 합니다. 데이터베이스 엔진 첫번째로 볼 용어는 데이터베이스 엔진(스토리지 엔진) 입니다. 데이터베이스 엔진은 위키에서 다음과 같이 말합니다. 데이터베이스 엔진은 DBMS가 데이터를 삽입, 추출, 삭제, 수정을 사용하는 기본 소프트웨어 컴포넌트이다. 즉 DB에서 데이터를 어떠한 방식으로 저장하고 접근할 것인지, 데이터 접근이 얼마나 빠른지, 얼마나 안정적인지, 트랜잭션 관리 등 시스템을 운영하는 핵심적인 요소라 볼 수 있습니다. 또한 종종 데이터베이스 서버 또는 데이터베이스 관리시스템(DBMS) 라 불리기도 합니다. 데이터베이스 엔진을 조작하기 위해서는 다음과 같은 방법이 있습니다. DBMS 고유의 사용자 인터페이스를 이용하는 방법 ..
정규화된 테이블은 비정규화된 테이블보다 컬럼의 개수가 적고 저장 공간도 많이 차지하지 않기 때문에 성능이 좋아집니다. 또한 단일 공간으로 이루어진 데이터이기 때문에 갱신과 삽입이 빠르게 수행되고 중복이 없어 DISTINCT나 GROUP BY 사용을 현저하게 줄여줍니다. 데이터 웨어하우스에서 역정규화? 하지만 데이터 웨어하우스에서는 왜 역정규화를 사용해야 할까요? 아니 그보다 데이터 웨어하우스는 무엇일까요? 위키에서는 이렇게 말합니다. 데이터 웨어하우스(data warehouse)란 사용자의 의사 결정에 도움을 주기 위하여, 기간 시스템의 데이터베이스에 축적된 데이터를 공통의 형식으로 변환해서 관리하는 데이터베이스를 말한다. 즉 쉽게 말하면 데이터들을 수집하고 분석하는 즉 일종의 다차원 분석을 제공해주는 ..