JVM 기반의 언어를 사용할 때 보통 돈 같은 필드는 타입을 BigDecimal로 사용하는 경우가 많습니다. 그리고 필자도 개인 프로젝트를 하면서 돈과 관련된 필드는 무조건 BigDecimal을 사용했습니다. 그 이유가 궁금해서 찾아보면서 깊게 알아본 내용들을 바탕으로 정리해보겠습니다. 부동 소수점이란? BigDecimal을 쓰게된 이유를 찾기 위해선 부동 소수점이라는 개념을 먼저 알고 있어야합니다. 보통 PC에서 실수를 표현하고 연산할 때 소수점의 위치가 고정되어있는 것이 아닌 움직일 수 있는 경우를 부동 소수점이라고 합니다. IEEE 754 표준으로 보면 다음과 같이 표현할 수 있습니다. 단정 밀도의 경우 부호 : 1비트 지수 : 8비트 가수 : 23비트 배정 밀도의 경우 부호 : 1비트 지수 : 1..
https://golf-dev.tistory.com/53 Redis INCR을 이용한 분산환경에서의 동시성 제어하기 문제 상황 회사에서 분산환경에서 하루에 한 번만 요청이 가능한 기능이었지만 한 사람이 3번 이상 요청을 보낸 기록이 있어 원인을 찾아보았습니다. 우선 샘플 코드는 다음과 같습니다. fun save( golf-dev.tistory.com 위 글을 보면 Redis의 INCR (increment)은 분산환경에서도 연산의 원자성을 지켜주기 때문에 이 성질을 이용하여 분산환경에서 동시요청에 대한 count를 한 후 일정 count 이상의 요청이 들어오면 해당 요청을 discard 시킬 수 있었습니다. 그렇다면 별 다른 로직 없이 분산환경에서 Redis로 동시성을 제어할 수 있었던 이유는 무엇일까요?..
2000개 WHERE .. IN 절을 처리하는 과정에서 옵티마이저가 Index를 타지 않고 Table Full Scan을 하는 것을 확인했습니다. 이를 방지하기 위해 여러 고민을 하던 와중 FORCE 인덱스를 발견했는데 이에 대해 소개하고 어떤 상황에 쓰면 좋을지 고민해보는 시간을 가져 보겠습니다. 또한 결론적으로 말씀드리면 결국 이 방법이 아닌 다른 방법을 택했는데 그거에 관해서도 소개 드리겠습니다. 또한 모든 설명은 MySQL 기준입니다. FORCE INDEX? FORCE 인덱스는 Query Hint 중 하나로 특정 인덱스를 강제로 사용하도록 합니다. MySQL에서는 적절한 Index를 사용하지 않으면 성능이 저하될 수 있기 때문에 신중하게 선택하여야 합니다. FORCE INDEX는 다음과 같이 사용..
보통 PK로 Join을 하고 보통 우리는 PK로 많이 데이터베이스를 조회합니다. 이러한 이유는 여러가지가 있지만 그 중 논 클러스터링 인덱스와 클러스터링 인덱스의 차이에서 나오는 경우도 있는데요. MySQL을 기준으로 클러스터링 인덱스와 논 클러스터링 인덱스에 대해 알아보겠습니다. 인덱스 페이지 인덱스 페이지는 인덱스 트리의 각 노드에 해당하며, 데이터베이스 시스템은 인덱스 페이지를 사용하여 테이블에서 특정 행을 찾을 수 있습니다. 인덱스 페이지는 키 값에 대한 데이터 위치 정보를 갖고 있기 때문에, 데이터 베이스는 키 값을 인덱스에서 찾은 다음 그 데이터 위치 정보를 활용하여 테이블에서 행을 찾습니다. 인덱스 페이지는 데이터 베이스 시스템의 메모리 내부에 저장될 수도 있고, 디스크에 저장될 수 도 있습..
대표적으로 필자가 사용하는 언어인 Java와 Kotlin은 compile 방식으로 해석되고 있습니다. 그리고 compiler로 해석된 자바 바이트 코드는 JVM의 interpreter로 기계어로 번역되어 실행되고 있습니다. 그리고 OS 코드영역에 올라가 OS에서 기계어를 읽어 적절한 동작을 합니다. 그렇다면 Java나 Kotlin은 컴파일 방식을 택했고 JVM은 왜 interpreter 방식을 택했을까요? 이 둘의 차이점은 무엇일까요? ⚙️ Compiler compiler는 소스코드를 기계어로 해석합니다. 과정은 다음과 같습니다. 소스 코드 읽기 : 컴파일러는 소스 코드 파일을 읽어들입니다. 어휘 분석 : 소스 코드를 토큰이라는 작은 요소로 분해합니다. 이 단계에서 컴파일러는 주석, 공백, 탭 문자 등을..
Thread 가시성이란 ? Thread 가시성이란 Thread의 시야 범위를 뜻한다. 공유하는 변수에 연산이 일어날 때 CPU를 점유하고 동작하는데 이 때 main memory에만 존재하는 것이 아니라 CPU cache에도 공유하는 자원에 대한 데이터가 들어있다. 이 때 CPU cache를 읽어오는데 언제 main memory에 옮겨갈 지 모르기 때문에 여러 thread가 동시에 읽음 연산과 쓰기 연산을 한다면 main memory에서 cache로 데이터를 옮기는 과정에서 다른 thread가 연산을 진행하여 결국 데이터 불일치 문제가 생기는 것이다. 이런 불일치 문제를 Thread 가시성 이슈라고 하며 자바에서는 volatile 키워드를 통해 해결할 수 있다. volatile은 캐시가 아닌 main me..
최근 회사에서 작업을 하면서 문제가 생긴 이력이 있다. 발생한 이슈는 50000개 이상의 데이터를 고객에게 전달해줘야하는 배치 프로그램에서 약 400 ~ 500개의 데이터가 손실된 것이었다. 재빨리 문제를 파악하기 시작하였고 원인은 다음과 같았다. 현재 ArrayList는 heap 영역에 올라가 있어 Thread간에 자원을 공유하고 있는 상황이다. 자원을 공유하기 때문에 함수를 실행하는 과정에서 race condition이 발생하였고 데이터가 덮어씌워졌다. 이 문제를 해결하기위해 우리는 발생의 근원이 되는 Concurrency(동시성)과 Parallel(병렬성)에 대해 알아보고 문제를 해결하기 위한 전략까지 살펴볼 것이다. Concurrency 동시성은 한마디로 설명하면 동시에 실행되는 것 처럼 보여지는..
컴퓨터는 하나의 프로그램을 실행하여 사용자들로 하여금 서비스를 이용할 수 있게 하는데 이를 Process 라고 한다. 이 프로세스는 안에 작업을 하는 주체가 따로 존재하는데 우리는 이를 Thread라고 부른다. Thread를 알기 위해서는 프로세스에 대해 알아야할 필요가 있다. 프로세스를 시작으로 멀티스레드 동시성 까지 천천히 알아가보도록 하자 Process Process는 CPU 자원을 할당 받아 프로그램을 실행시킨다. Process안에는 프로그램을 실행시키기 위한 여러 주체가 존재하는데 안을 간단하게 살펴보자. 1. PCB 프로세스 제어 블록이라 불리는 PCB는 프로세스 고유 식별자(PID)와 레지스터 프로세스 상태등을 저장하고 있다. 프로세스가 생성과 동시에 고유한 PCB가 생성되고 OS는 PCB를..
Index란? 인덱스는 말 그대로 책의 맨 처음 또는 맨 마지막에 있는 색인이라고 할 수 있다. DBMS는 DB 테이블의 모든 데이터를 검색해서 원하는 결과를 갖고 오려면 오래 걸리는데, 이를 빠르게 처리하기 위해 칼럼의 값과 해당 레코드가 저장된 주소를 키와 값의 쌍으로 인덱스를 만들어 두어 값을 빠르게 탐색한다. 하지만 새로운 값을 추가하거나 삭제, 수정 시 쿼리문 실행 속도가 느려지는데 저장 성능을 희생하고 데이터의 읽기 속도를 높이는데 포커스를 맞춘 것이다. 삽입 삭제 수정 시 정렬이 된 상태로 저장이 되어야하는데 원래 있던 데이터에서 여러가지 변경해야할 비용이 발생하여 이때에는 인덱스는 효율적이지 않다. Index 자료구조 B+ Tree 인덱스 알고리즘 일반적으로 사용되는 인덱스 알고리즘은 B+..
프로젝트를 진행 중에 최근 데이터를 정렬하라는 요구사항에 대해 빠르게 성능을 올리고 싶어 여러가지를 찾아보던 중 커버링 인덱스라는 개념을 발견했다. 인덱스 ? 인덱스는 데이터를 효율적으로 탐색하는 방법이다. 하나의 색인같은 것으로 MySQL 미리 정렬된 상태의 하나의 클러스링된 테이블이 존재하면 이 테이블에 접근하여 빠르게 해당 아이디 값을 찾아가는 방식으로 동작한다. 이 때 성능이 매우 빠르기 때문에 DB 성능향상을 위해 꼭 필요한 기술이다. 커버링 인덱스? 커버링 인덱스 는 쿼리를 충족하는데 필요한 모든 데이터를 갖는 인덱스를 뜻한다.(SELECT/WHERE/GROUP BY/ ORDER BY) 아까 인덱스에서 잠시 언급한 미리 정렬된 상태의 클러스터링된 테이블에 접근하여 데이터를 인덱스 테이블에서 조..
- Total
- Today
- Yesterday
- 동시성
- java
- Redis
- 백엔드
- 개발자
- 인터뷰
- CS
- DB
- 코딩
- DevOps
- 게시판
- thread
- Spring
- 프로젝트
- 프로그래밍
- 취업
- 자바
- 코드
- MySQL
- swarm
- 취업준비
- 면접 준비
- IT
- Kotlin
- 면접준비
- 면접
- docker
- JPA
- 취준
- 개발
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |