전체 글 93

JPA 와 커버링인덱스

JPA 를 쓰면 사실 인덱스가 필요없다. 이건 또 무슨 헛소리일까? 필자가 맛이 가버린걸까? 자 한번 내 얘기를 들어보시라.이 주장은 커버링인덱스와 연관이 있다. 커버링인덱스는 select 쿼리의 결과 필드가 쿼리에 쓰인 인덱스라면 커버링인덱스가 발동한다. 아래의 쿼리를 보자. 이 쿼리의 col1 과 col2 는 복합인덱스로 만들어져있다고 가정해보자. 이 쿼리의 반환결과는 col1 과 col2 만 반환한다. 즉 이 경우가 커버링인덱스이다.select t.col1, t.col2 from tb\_table as t where t.col1 = ? and t.col2 =?만약 아래처럼 쿼리가 col1, col2 만 반환하는 것이 아닌 전체 를반환하는 * 와일드카드라면 커버링인덱스로 동작하지 않는다.select ..

우리가 사는 이 세상의 최소 단위, 신은 존재할까

사무실 내 옆자리에는 신학대학을 나온 팀원 한 분이 있다. 어쩌다 신학도가 웹개발자가 됬는지는 아직도 넌센스지만, 아무튼 가끔 이 분과 잡담을 나누곤 하는데, 무신론자인 나와 유신론자인 그분 사이에 생각이 충돌할 때가 종종 있다. 다툼까지는 아니고, "너는 그렇게 생각하는구나" 정도로 서로의 관점을 확인하는 수준이다. 그런데 이 분과의 대화를 통해, 나는 ‘신이 없다는 것’을 논리적으로 설명하고 싶어졌고, 그 과정에서 자연스레 이것저것 현대 과학 공부를 하게 되었다. 덕분에 나의 취미가 하나 늘어난 셈이다. 고마워해야 할지, 흠..무신론과 관련된 공부를 하다 보면 흥미로운 사실을 하나 알게 된다. 우리 세상을 구성하는 가장 기초적인 단위는 ‘입자’라는 점이다. 화학에서는 흔히 ‘원자’라는 표현을 쓰지만..

카테고리 없음 2025.07.13

스칼라 서브쿼리는 최악이다

서브쿼리의 결과가 정확히 1행 1열이라면, 이를 스칼라 서브쿼리(Scalar Subquery) 라고 부른다. 스칼라 서브쿼리는 이러한 단일 값을 SELECT 절, WHERE 절, HAVING 절 등에서 필드처럼 사용할 수 있는 서브쿼리를 의미한다. A scalar subquery is a simple operand, and you can use it almost anywhere a single column value or literal is legal, and you can expect it to have those characteristics that all operands have: a data type, a length, an indication that it can be NULL, and so ..

JPA 에서는 int 를 써야하나요? integer 를 써야하나요?

제목에 대한 대답은 JPA 에서는 integer 를 써야한다가 나의 대답이다, 그것도 확고하게. JPA 에서는, 더 나아가서 Java 에서는 int 를 사용하면 안된다.Java에서 정수를 표현하는 방법은 두 가지가 있다. int와 Integer. 전자는 primitive type이고, 후자는 wrapper type 이라 부른다. 이 정도는 JPA를 쓰는 Java 개발자라면 당연히 알고 있는 내용일테니 더 길게 설명하진 않겠다. 중요한 건 이 차이가 JPA에서 매우 중요한 문제가 된다는 거다.RDBMS에서는 null이란 개념이 존재한다. RDBMS에서 null 은 값이 아직 할당 되지 않은 상태를 나타내는 표현이며, 이는 RDBMS 에서 매우 중요하다. 그런데 java 세상에서는 int, long, boo..

테이블 풀스캔이 인덱스 보다 성능이 더 좋다.

제목이 참 자극적이다. 사실 이 말은 절반만 맞다. 상황마다 다르기 때문이다. 대체적으로 인덱스가 성능이 좋지만, 절대적으로 테이블 풀 스캔이 마냥 나쁘다는 선입견을 없애고자 이렇게 지었다.테이블 풀스캔이 무조건 나쁜 것으로 많이들 생각하지만 엄연히 말하면 나쁜 것은 아니다. 오히려 인덱스 보다 더 효율이 좋을 때가 많다. 인덱스를 깊게 공부를 해보면 인덱스가 생각보다 비효율적이란 걸 알 수 있는데, 이에 비해 풀스캔은 매우 효율적으로 동작한다.예를 들어서 PK 가 단순 증가 정수(auto increment) 로 되어 있는 테이블에 아래 쿼리를 날렸다 보자.select * from some_table where write_date between 오늘 and 다음주 limit 500,000이 때 write..

레코드 식별키 가상키 vs 복합PK

RDBMS 모델링에서는 키 에 대한 정의가 세분화 되어 있다. 논리 모델링과 물리 모델링 에서 쓰여지는 키가 각각 다름에도 통용적으로 얘기가 되다 보니 헷갈려 하는 사람이 많다. 적어도 나는 공부할 때 많이 헤맸었다. 각각의 키에 대해서는 따로 정리 해둔 글이 있음으로, 해당 글의 설명으로 대체하겠다. https://glqdlt.tistory.com/528개인적으로는 가상키를 PK로 많이 쓰는 편이다. 컬럼 이름은 id 이고 타입은 Integer 이며 auto increment 옵션을 둔다. 그냥 단순 증가 정수를 PK로 쓴다. 그런데 가끔은 클러스터링 군집화 때문에 복합PK를 정의해야할 때도 있다, 이럴 땐 단순 증가 정수 유니크컬럼을 추가로 만들고 JPA 엔티티 상에서는 ID 인 마냥 쓰기도 한다. ..

[250620] mysql 파티션은 만병통치약일까?

MySQL에서 테이블에 파티션을 걸면 성능이 빨라진다고들 한다. 특히 대용량 테이블에선 "파티션이 정답이다", "파티션만 걸면 빨라진다"는 맹신 하는 사람이 가끔 있다. 마치 파티션이 만병통치약인 마냥 말이다.그런데 정말 그럴까? 파티션이 만병통치약이라면, 왜 mysql 은 기본적으로 파티션을 강제화하지 않는걸까? 그 이유는 파티션은 잘 써야 약이고, 잘못 쓰면 독이기 때문이다, 만병통치약이 아니다파티션은 테이블을 물리적으로 분리하는 개념이다. 동일한 하드디스크에서 테이블 데이터가 적재되어있는 물리적 파일을 N개로 나눈다고 할지라도, 같은 하드디스크 IO 영향을 받는다. 만약 물리적으로 나뉜 N개의 파일을 각기 다른 하드디스크에 적재한다면 병렬 IO 의 이점으로 성능은 많이 올라갈 수 있다. 여기서는 병..

미국 셰일 오일의 진실(a.k.a 빨강 사기맵)

미국 셰일 오일에 대해서 이야기해보려고 한다. 미국은 세계 최고의 패권국이다. 미국은 세계 최고로 소비를 가장 많이 하는 나라이기도 하다. 미국이 가장 소비를 많이 하게 된 것은 기축통화국으로서의 입지 때문이다. 미국은 달러 부채를 세계에 수출하곤 하는데, 부채를 수출하기 위해서는 무엇인가를 사야 한다. 그래서 미국은 자연스레 외부에서 많은 여러가지를 사들이면서 소비를 하게 되었다. 소비의 가장 큰 핵심 품목은 당연코 에너지이다. 미국은 중동의 에너지자원인 기름에 굉장히 많은 관심을 가졌었다. 이 관심은 중동 최대의 적인 미국이, 중동 최대 산유국이 사우디아라비아와의 기묘한 동맹으로 까지 이어졌다. 종교적인 왠수인 미국(정확히는 이스라엘) 과 기묘한 동맹에는 최대 기름 소비 국가와 최대 기름 생산 국가의..

카테고리 없음 2025.06.16

우리 몸 연대기, 대니얼 리버먼

https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=148012222 우리 몸 연대기 : 알라딘진화의 정점에 이른 현대인이 왜 각종 만성질환과 기능장애에 시달리는지, 인간의 몸과 문명은 서로 어떤 영향을 주고받아 왔는지를 진화적 관점에서 폭넓게 탐구하는 책이다. 저자인 대니얼www.aladin.co.kr 완독일 2025-05-21 이 책은 진화론에 흥미를 끌게한 책이다. 알라딘 서점에서 시간 때우다가, '건강한 두 발 동물은 어쩌다 병든 문명인이 되었나' 광고 에 혹해서 구매했다. 광고 말마따나 건강에 관한 내용을 배울 것이라고 생각했었는데, 진화론을 공부하게 될 줄 누가 알았을까. 현대인의 신체가 원시인과 거의 다를 바 없다는 사실도 처음 알게 되었다. 진화론 이..

독서 2025.06.12

[240513] mysql varchar(65535) 는 정말 65535 개의 한글을 입력할수있는걸까?

* 이 글은 mysql8 기준이다.흔히들 varchar 의 길이는 입력가능한 문자열의 최대값으로 알려져있다. 정말 그런걸까? 이는 반은 맞고 반은 틀린 말이다.지난 번(https://glqdlt.tistory.com/504)에 text 와 long text 에 대해 공부를 했었다. charset encoding 이 무엇이냐에 따라 text 에 입력가능한 글자수가 달라진다고 얘기한 바 있다. 이는 varchar 에서도 유효할까?varchar 컬럼은 한글 65535 개를 입력할 수 없다.varchar는 동적문자열이고, 최대 varchar(65535) 까지 지정이 가능하다. varchar 의 길이는 입력된 문자열의 길이와 같다고 알려져 있지만 정확히는 아니다. 테이블에 다른 컬럼이 몇개 있느냐와 charset..