전체 글

지속가능한 삶
개요이전 포스팅에서 현재 구현된 API의 문제점에 대해서 분석했습니다. 이번 포스팅에서는 오프셋 기반 페이지네이션으로 구현된 로직을 커서 기반 페이지네이션으로 바꾸고 그 과정에서 나오는 문제점, 나아진 점 등을 살펴보도록 하겠습니다. SQL 작성현재 커서 기반 페이지네이션을 구현하려면 크게 두가지 정보를 클라이언트에게 요구해야 합니다. 1. cursor 데이터2. 요청 파라미터 커서(기준)가 될 데이터를 받아온 후 어느 데이터로 정렬을 할지 요청 인자값을 받아와야 합니다. 정렬 기준은 다음과 같습니다. - 경매 시작일- 경매 종료일- 최고 입찰가- 상한가 unique한 값으로 페이지네이션을 구현하는 것은 쿼리도 간단하고 구현도 복잡하지 않습니다. 중복이 없으니까요. 하지만, 경매 데이터에서 정렬이 될 필..
개요경매 글 목록을 불러오는 api의 구조를 개선하여 목표하는 성능까지 올려보는 과정을 기록하고자 해당 시리즈를 작성하기로 하였습니다. 본론에 앞서서 해당 프로젝트의 더미 데이터로 유저 약 100만, 기프티콘 개수 약 2천만, 경매 글 개수 약 100만 개를 생성해놓은 상태입니다. 문제 인식부하 테스트를 하기 전, postman으로 먼저 간단하게 응답 시간이 얼마나 걸리는지 테스트 해봤습니다. 응답 시간이 매우 느립니다.. 네 이건 뭐 부하테스트를 할 필요도 없이 먼저 해당 API의 문제를 살펴보는 것이 좋을 것 같다는 판단을 했습니다. 전체적인 로직을 파악해본 결과 문제는 아래 부분 정도로 정의했습니다. 1. 페이지네이션 오프셋 성능 저하 문제2. N + 1 문제3. queryDSL 에서 cross j..
· 후기
무슨 스터디인가? JS Code의 박재성님께서 진행하시는 CS 기술면접 스터디이다. 개인적으로 CS 준비가 거의 되어있지 않았었고 언젠가는 다가올 기술면접에 하루 빨리 대비해야 했다. 그래서 어떻게 준비할까 고민하던 찰나에 유튜브에서 모의 면접 스터디를 운영한다는 소식을 보았고 나 자신에게 강제성을 부여하고자 신청을 했다. 스터디 내용 나는 DB 모의면접으로 신청했다. 매 주 금요일 오후 8 ~ 10시까지 진행했다. 매 주 주제가 있고 해당 주제에 예상질문 템플릿을 주신다. 해당 주제를 공부하면서 질문에 대한 답변도 미리 준비하여 스터디를 진행하였다. 1주차는 일정이 있어서 거의 참여하지 못했고 2주차 부터 본격적으로 시작했다. 2주차는 SQL, 3주차는 인덱스, 4주차는 이상현상과 정규화, 5주차는 트..
· Dev/Java
멀티스레드 (Multi-Thread) 개념 실행되지 않은 프로그램을 실행하게 되면 주기억장치에 해당 프로그램이 로딩되고 동작할 수 있는 상태인 '프로세스' 로 바뀝니다. 이러한 동적인 상태의 프로그램을 프로세스라고 하고 프로세스 내의 일련의 작업 단위 하나를 '스레드'라고 표현합니다. 어떤 프로세스든 기본적으로 하나의 메인 스레드가 존재 합니다. 메인 스레드를 중심으로 코드에 따라서 큰 흐름이 진행되는데 프로그램의 성질에 따라서 이러한 스레드가 여러 개 필요할 수 있습니다. 예를 들면 게임이나 웹 서비스 환경에서는 들어오는 요청 수가 동시적이면서 많을 수 있기 때문에 스레드 하나로 전부 처리한다면 간단한 요청에도 많은 시간이 걸릴껍니다. 그래서 Java는 이러한 환경에서 동시다발 적으로 들어오는 요청을 ..
· Dev/DB
(모든 설명은 MySQL 8.0 기준 입니다.) 트랜잭션이란? 트랜잭션은 하나의 논리적인 기능을 수행하기 위해 여러 개의 작업 셋을 하나로 묶은 작업의 단위다. 트랜잭션은 원자성, 일관성, 격리성, 지속성 4가지의 특징을 갖는다. (ACID) ACID 원자성 (Atomicity) 트랜잭션을 구성하는 작업 전체가 성공하거나 아니면 전체가 실패하는 것 둘 중 하나만을 보장한다는 특징이다. 트랜잭션을 구성하는 여러 쿼리 중 일부분만 성공하거나 일부분만 실패하면 데이터의 정합성에 문제가 생기게 된다. 예시를 보면서 이해해보자. 기능 : 은행 시스템의 송금 송금 기능의 순서 1. 계좌 잔액 테이블에서 송금자 A의 잔액을 차감한다. 2. 계좌 잔액 테이블에서 돈을 받는 B의 잔액을 추가한다. 3. 거래 내역 테이블..
· Dev/DB
이상현상이란? DB에서 이상현상이란 테이블 설계를 적절하게 하지 못한 경우 야기할 수 있는 문제들을 의미합니다. 관계형 데이터베이스는 릴레이션 간 관계를 설정함으로써 데이터의 무결성을 지키고 중복된 데이터들이 나오지 않도록 합니다. 하지만 어떤 서비스를 만들기 위해서 DB 설계 도중 잘못된 설계를 하여 이러한 부분이 깨지게 될 경우 3가지 정도 부분에서 문제가 일어나게 됩니다. 1. 데이터 삽입 시 문제가 발생하는 삽입 이상 (Insertion Anomaly) 2. 데이터 수정 시 문제가 발생하는 갱신 이상 (Update Anomaly) 3. 데이터 삭제 시 문제가 발생하는 삭제 이상 (Deletion Anomaly) 이제 차례대로 해당 이상현상들에 대해서 살펴보겠습니다. 우선, 이해를 빠르게 하기 위하..
· Dev/DB
하드 디스크 드라이브 (HDD)와 솔리드 스테이드 드라이브 (SSD) 기본적으로 컴퓨터에서 CPU, Register, RAM 같은 주요 장치는 전자식 장치이다. 반면에 하드 디스크 드라이브는 기계식 장치다. 전자식 장치들 (이하 CPU, RAM 등) 의 성능은 짧은 시간 동안 매우 빠른 속도로 발전했다. 하지만 디스크 같은 기계식 장치들의 성능은 상당히 제한적으로 발전했다. 비록 최근에는 자기 디스크 원판에 의존하는 하드 디스크(HDD) 보다 원판을 사용하지 않고 NAND 플래시 메모리를 사용하는 SSD 드라이브가 많이 활용되고 있지만, 여전히 데이터 저장 매체는 컴퓨터의 가장 느린 부분이라는 사실에는 변함이 없다. 아래의 막대 그래프를 보면 HDD 보다 빠른 성능을 보이는 SSD 조차도 CPU와 약 만..
· Dev/DB
개요 우리가 데이터를 조회하거나 데이터를 삽입, 수정, 삭제할 때 쓰는 SQL을 실행하면 내부에서는 어떻게 처리 될까? 이 부분에 대해 내부적으로 처리단계를 공부하고자 이 글을 작성하게 되었다. Parsing (파싱) 우리가 SQL을 실행하면 먼저 SQL 파서가 해당 SQL이 유효한지 체크한다. 동시에 MySQL 서버가 이해할 수 있는 방식으로 SQL 문장을 이루는 개별 구성요소를 분석하고 파싱해서 파싱 트리 (내부적인 구조체)를 만든다. 이 과정에서 사전에 정의된 문법이 틀리진 않았는지 Syntax Check를 하고 쿼리가 올바른 의미인지 Semantic Check 를 해서 2단계를 거치게 된다. Optimization (최적화) 해당 과정에서는 SQL 옵티마이저가 일을 수행하게 된다. 첫번 째로 파싱..
· Dev/PS
문제 n가지 종류의 동전이 있다. 각각의 동전이 나타내는 가치는 다르다. 이 동전을 적당히 사용해서, 그 가치의 합이 k원이 되도록 하고 싶다. 그 경우의 수를 구하시오. 각각의 동전은 몇 개라도 사용할 수 있다. 사용한 동전의 구성이 같은데, 순서만 다른 것은 같은 경우이다. 입력 첫째 줄에 n, k가 주어진다. (1 ≤ n ≤ 100, 1 ≤ k ≤ 10,000) 다음 n개의 줄에는 각각의 동전의 가치가 주어진다. 동전의 가치는 100,000보다 작거나 같은 자연수이다. 출력 첫째 줄에 경우의 수를 출력한다. 경우의 수는 231보다 작다. 풀이 더보기 package footdev._5주차; import java.io.*; import java.util.*; public class BOJ_동전_1 { ..
· Dev/Test
문제 상황 재고가 감소되는 비즈니스 로직에 대해서 트랜잭션 처리를 해주고 비관적 락을 사용해 동시성 처리를 해주도록 해서 동시성을 제어하려고 로직을 짰다. 그리고 테스트를 통해 스레드풀을 생성해서 여러 스레드가 한번에 해당 트랜잭션에 접근하는 환경을 만들어 테스트를 하였다. 분명 Pessimistic Lock을 걸어서 해당 트랜잭션에 순차적으로 접근하도록 했다. 100개의 요청이 순차적으로 처리된다면 값은 0이 되어야 하는데 아래와 같이 순차적으로 처리가 되지 않았다. 어디선가 DB에 락이 제대로 걸리지 않았던가 트랜잭션 처리가 되지 않았거나 둘 중 하나의 문제인 것 같아서 어디가 문제인지 찾아보기로 했다. Pessimistic Lock 설정 위와 같이 쿼리와 함께 락 설정을 해주었다. 아래는 비즈니스 ..
풋데브
지루함에 익숙해지자