무지를 아는 것이 곧 앎의 시작

분류 전체보기 6

Hibernate in_clause_parameter_padding 속성을 사용한 메모리 절약

문제 개발하다 보면 무리한 join을 회피하기 위해 in 절 쿼리를 사용해야할 경우가 많다. public interface ExampleRepository extends JpaRepository{ List findByIdIn(List ids); } 위와 같은 코드를 작성했을 때 다음과 같은 쿼리가 호출될 것이다. select ... from example where id in (? ,? ,? ...) 그런데 여기서 보면 ids는 고정된 크기가 아니며, 요청된 갯수에 따라서 쿼리문이 길어질 수 있다. 애초에 RDBMS 자체에서 갯수 제한을 두기도 하거니와 너무 많은 요소가 포함되었을 때 DB에 한번의 요청이 너무 많은 작업을 요구하기 때문에 in 절에 너무 많은 갯수를 넣는건 바람직하지 못하다. 그래서 적..

JPA 2023.12.14

멀티 모듈 프로젝트 세팅하기

멀티 모듈 프로젝트는 왜 세팅할까? A 엔티티가 있고 이걸 다루는 API 서버 어플리케이션이 있다. 근데 마침 같은 A 엔티티를 다루는 배치 어플리케이션의 개발이 필요하다. 별도의 프로젝트로 배치 어플리케이션을 개발하면, 그 배치 어플리케이션 쪽에도 A 엔티티와 관련된 코드를 옮겨줘야 한다. 그리고 이 A엔티티를 다루는 어드민 전용 API 어플리케이션이 또 필요하다. 이것도 별도의 프로젝트로 개발한다면, A 엔티티는 세 군데에 동시에 코드가 존재하게 될 것이다. 마치 아래 그림처럼. 이러한 구조가 되었을 때, 만약 A 엔티티의 요구사항이 변해서 수정이 생기면 어떻게 될까? 각각의 프로젝트에서 각각 A 엔티티에 수정 사항을 반영시켜야 하고, 미처 반영하지 못하고 배포를 나갔을 경우엔 어떠한 문제가 생길지도..

Spring 2023.11.27

분산락 언제 잡고 어떻게 잡는게 좋을까

프로젝트 진행하다 보면 동시성 이슈를 해결해야할 때가 있다. 최근 사이드 프로젝트에 북마크 기능을 구현할 때 어떻게 동시성 이슈를 잡았었고 어떤 고민을 해서 잡는 방법을 채택했는지 기록해볼까 한다. 도메인 간단 이해 일단 도메인 구조를 보면, Place(장소)라는게 있고, 이 장소에 북마크를 찍는개념으로 해서 Bookmark(북마크)가 있고 1(장소):N(북마크)로 되어있다. 그리고 Place 리스트를 조회할 때 bookmark 갯수가 같이 노출돼야하기 때문에 성능 최적화를 위해 bookmarkCount라는 컬럼을 Place가 반정규화해서 들도록 했다. /// imports... /// annotations... public class Place extends AbstractRootEntity { @Id..

CS 2023.10.09

커버링 인덱스와 ICP(index condition pushdown)에 대한 고민

사이드 프로젝트를 할때 특정 검색 기능의 성능이 느려 개선 백로그로 잡아두었었다. 다만, 회사와 기타 일정에 이리저리 치이고 치이다 보니 결국 그 사이드 프젝이 끝날 때까지 건드리지를 못했었는데, 추석 연휴를 맞이해서 갑자기 생각이 났고.. 쉬는 김에 한번 개선해보기로 했다. 개선 시작 검색 성능 개선이 목적이다 보니 해당 쿼리에 인덱스를 태울 생각을 먼저 했고, 기존엔 그 어떤 인덱스도 타고 있지 않던걸 확인했다. 테스트용 DB를 생성해서 다음과 같이 지저분한(..?) 프로시저를 태워 데이터를 적재했다. 테스트용 더미 데이터 insert create table place( -- 테스트 대상 테이블 id bigint auto_increment primary key, name varchar(150) not..

DB 2023.09.30

Serializable로 동시성을 잡으려 하면 데드락을 만납니다

최근 우연찮은 기회로 현업 개발자와 동시성 이슈에 대한 얘기를 할 기회를 얻었다. 동시성 이슈에 대해서 고민해보고 어떤 상황에 어떤 방식으로 해결하는 결론을 내렸는 지 정리된 걸 얘기해 보았는데, 결론은 Serializable을 쓸 일은 없었지만 내가 고민한 과정중에 있었고 지식 교정이 필요한 걸 알게 되었다. 이번 포스팅에선 그 점을 다뤄볼까 한다. DB에 데이터가 공유자원이다. 동시성을 어떻게 해결할거냐? RDBMS라면 일단 낙관락, 비관락 이런걸 해결책으로 떠올릴 수 있고, 여러 저장소와 글로벌 트랜잭션이 필요하다면 Redis로 공유 락을 잡는 방법도 있다. 이건 모범 답안이고, 이런 방법들을 알기 전에 나는 격리 레벨을 Serializable로 설정하면 데이터에 락이 걸려서 트랜잭션간 동시성이 잡..

DB 2022.12.05

얘는 대체 왜 이럴까? (모르면 죽을 수 있음)

0.1 + 1.1은 1.2가 아니란다. 컴퓨터 이녀석 정확한 놈인 줄 알았는데 마냥 그렇지도 않은가보다. 메모리 저 값들은 메모리에 쓰여지는 값들이다. 메모리가 어떻게 생겼는 지 이해할 필요가 있다. 메모리는 0과 1을 저장할 수 있는 bit라고 부르는 칸이 무수히 많이 뭉쳐진 구조이다. 여기엔 0과 1만 저장할 수 있기 때문에 컴퓨터가 데이터를 저장하는 방법에 따라서 공간을 잡고 데이터를 저장한다. ex) 정수 5 → 00000101 정수 10 → 00001010 더 큰 수를 저장하고 싶으면 칸을 늘려서 저장 16칸은 -32768 ~ 32767까지 저장 가능 실수형은 어떻게 저장할까? (float 자료형 기준) 5.125라는 숫자를 저장하려면 어떻게 할까? 5.125 → 101.001(2진법) 컴퓨터는..

CS 2022.11.22