본문 바로가기

포스트464

[SQL] Cardinality vs Selectivity (카디널리티와 선택도) 차이점 및 구하는 쿼리 데이터베이스나 빅데이터 분야에서 '카디널리티(Cardinality)'와 '선택도(Selectivity)'는 자주 언급되는 용어다. 이 용어의 차이점을 정확히 알고 있어야 가지고 있는 데이터의 특성을 잘 파악할 수 있다. 카디널리티와 선택도는 절대적인 수치가 아닌 두 개의 데이터 집합의 특성을 비교하는 상대적인 개념으로 사용해야한다. 카디널리티(Cardinality) 카디널리티는 특정 데이터 집합에서 유니크한 값의 개수를 의미한다. 예를 들어 데이터베이스의 테이블의 '성별' 컬럼의 경우 생물학적인 성별을 고려할 때 '남자'와 '여자'로 구성된다. 성별 컬럼의 카디널리티는 2라고 할 수 있다. 반대로 주민등록 번호 같이 PK 혹은 CandidateKey는 테이블에 존재하는 모든 레코드들에 유니크할 수 있다... 2021. 8. 3.
7월 독서 통계 - 독서의 시작 '밀리의 서재'라는 서비스가 있다. 일정 금액을 매달 지불하면 '밀리의 서재'에 있는 전자책들을 무제한 읽을 수 있는 서비스다. 일종의 '독서 뷔페'같은 느낌의 서비스다. 원래는 책을 읽을 때마다 기록을 하고 느낀점과 중요 포인트들을 정리했었다. 하지만 그러다보니 책을 읽으면서 부담이 생겼다. '이 책을 읽으면서 이렇게 글을 쓰면 되겠군', '아직 이전에 읽은 책에 대해서 글을 못 썼는데 새로운 책을 읽어도 될까?' 등의 부담이 생겼다. 책은 그냥 읽으면 되는데... 유튜브 영상은 부담없이 보면서 독서에 대한 부담은 더 늘어나게 되었다. 그래서 그냥 책은 읽고, 한달간 읽은 책에 대한 간단한 내용들만 포스팅 하기로 했다. 2021년 7월 독서 통계 (5권) 경제경영 2권 역사 1권 자기계발 1권 소설 1.. 2021. 8. 2.
[MySQL] 오라클(Oracle) Merge into 구문 따라하기 - 중복키 (Duplicate key) 처리 오라클을 사용하면 'Merge into' 구문이라는 편리한 DML 구문을 사용할 수 있다. PK 혹은 Unique Index가 생성되어 있는 테이블에 데이터를 입력할 때, PK나 Unique Key에 해당하는 값이 이미 테이블에 존재하면 "Error Code: 1062. Duplicate entry '??' for key PRIMARY" 같은 에러가 발생한다. 이 경우 Insert 구문 대신 update 구문을 사용해서 기존에 있는 데이터를 업데이트해야한다. 이 때, 테이블에 데이터가 존재하는지 조회하고 없으면 insert, 있으면 update로 동작하도록 해야한다. 하지만 동시성 이슈로 select 해서 존재유무를 판단하고 insert 혹은 update 하는 사이에 다른 세션에서 새로운 값을 inser.. 2021. 8. 2.
[MySQL] 반올림과 버림 함수 - ROUND(), TRUNCATE() 숫자 데이터를 다룰 때 은근히 반올림과 버림을 많이 사용한다. MySQL에서는 반올림과 버림 기능을 제공하기 위해 ROUND() 함수와 TRUCATE() 함수를 제공한다. 반올림 (ROUND) MySQL의 쿼리에서 ROUND() 함수를 사용하면 반올림을 사용할 수 있다. ROUND() 함수는 2개의 인자를 받는데 "ROUND(숫자, 반올림할 자릿수)" 형태로 사용하면 된다. 예를들어 다음 쿼리들은 주석처리한 결과를 출력한다. SELECT ROUND(1234.56789) FROM DUAL -- 1235 SELECT ROUND(1234.56789 ,1) FROM DUAL -- 1234.6 SELECT ROUND(1234.56789 ,4) FROM DUAL -- 1234.5679 SELECT ROUND(123.. 2021. 8. 1.
[MySQL] 랭크(Rank)와 백분위(Percentile) 구하는 쿼리 예제 오라클을 사용하다가 MySQL을 사용하는 환경으로 옮겼을 때 여러가지 어려움을 만나게 된다. 오라클에서 지원하는 기능을 MySQL에서 지원하지 않는 경우인데 그 중 하나가 랭크(Rank)와 백분위(Percentile)를 구해야하는 경우다. MySQL 랭크 쿼리 오라클의 경우 테이블에 다음과 같은 데이터가 들어있을 때 create table t1(a number); insert into t1 values(3); insert into t1 values(6); insert into t1 values(9); insert into t1 values(2); insert into t1 values(5); insert into t1 values(8); insert into t1 values(1); insert into.. 2021. 7. 31.
[Java(자바)] ThreadLocal 사용법 설명과 예제 자바를 이용해 멀티 스레드 프로그래밍을 하면 성능향상을 얻을 수 있다. 하나의 스레드에서 해야할 작업들을 여러스레드로 나누어 동시에 처리하면 훨씬 빠른 시간안에 작업을 마무리할 수 있다. 하지만 멀티 스레드 프로그래밍에서 가장 고민해야할 부분은 공유 리소스에 대한 동시성 제어다. 여러 스레드가 공통으로 접근하는 변수 값을 저장하고 읽는 과정을 동기화해야 문제가 생기지 않는다. 자바는 synchronized 키워드를 이용해서 특정 메소드 혹은 코드 블럭을 동기화 시키는 방법을 제공한다. synchronized 키워드와 더불어 자바에서 제공하는 도구로 ThreadLocal이 있다. ThreadLocal은 각 스레드가 자신만 접근할 수 있는 변수로 여러 스레드가 동시에 접근할 수 있지만 각자 자기만의 공간을 .. 2021. 7. 30.
[Java] SAXParser Exception - "[Fatal Error] :1:1: Premature end of file" 예외 해결방법 자바 애플리케이션에서 SAX 파서를 이용해 XML 문서를 파싱하다가 다양한 예외를 만나게된다. 이번 포스트에서 설명할 예외는 "[Fatal Error] :1:1: Premature end of file." 혹은 "[Fatal Error] :1:1: 예기치 않은 파일의 끝입니다."라는 Exception이다. 말 그대로 SAX 파서의 입력 스트림이 예상하지 갑작스레 끝났을 경우에 발생한다. 가장 흔한 예외 케이스는 SAX 파서에 빈 문자열이 입력되면 발생한다. 다음 예제 코드르 보자. import java.io.StringReader; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import.. 2021. 7. 29.
[Java] XML 서브 트리를 루트로하는 새로운 XML Document 생성 (org.w3c.dom.Node 클래스를 Document로 변환) XML 문서는 트리 형태로 해석할 수 있다. 그러다보니 루트에서 따라내려가다가 XML 문서의 특정 서브트리 부분을 루트로하는 새로운 XML 문서를 만들고 싶은 경우가 있다. 예를 들어 다음과 같은 XML Document가 있다고 하자. value 1 value 2 value 3 XPath 등을 이용해서 에 해당하는 Node 객체를 얻어왔을 때 노드의 서브 트리를 Root로 하는 새로운 Document를 얻어오고 싶을 경우가 있다. value 3 org.w3c.dom.Document 인터페이스에는 importNode() 라는 메소드가 있으며, 이 메소드를 이용해서 새로운 Document를 만들 수 있다. org.w3c.dom.Node 클래스를 Root로 하는 새로운 org.w3c.dom.Document를 .. 2021. 7. 28.
[Java] GSON 라이브러리 사용법 및 예제 - 자바 객체와 JSON 다루기 자바를 이용해 데이터를 주고 받을 때 직렬화(Serialize) 포맷으로 JSON이나 XML 같은 텍스트 포맷을 사용하는 경우가 많다. 특히 REST API를 통해 데이터를 제공하는 경우 json이나 xml 포맷을 표준으로 삼는 경우가 많다. 텍스트를 사용하는 만큼 데이터를 처리하는데 상당히 높은 수준의 유연성을 제공하기 때문이다. 다만 텍스트로 표현되어있는 데이터에서 원하는 데이터를 뽑아오기 위해서는 문서를 파싱해야한다. 이번 포스트에서는 JSON 문서를 파싱하기 위해 GSON 이라는 라이브러리를 사용하도록 하겠다. GSON GSON은 구글에서 만든 자바 오브젝트의 직렬화/역직렬화 라이브러리다. GSON은 내부적으로 리플렉션(Reflection)을 사용하고 있어 사용자가 귀찮게 이런저런 옵션을 넣어주지.. 2021. 7. 27.