개요이전 포스팅에서 현재 구현된 API의 문제점에 대해서 분석했습니다. 이번 포스팅에서는 오프셋 기반 페이지네이션으로 구현된 로직을 커서 기반 페이지네이션으로 바꾸고 그 과정에서 나오는 문제점, 나아진 점 등을 살펴보도록 하겠습니다. SQL 작성현재 커서 기반 페이지네이션을 구현하려면 크게 두가지 정보를 클라이언트에게 요구해야 합니다. 1. cursor 데이터2. 요청 파라미터 커서(기준)가 될 데이터를 받아온 후 어느 데이터로 정렬을 할지 요청 인자값을 받아와야 합니다. 정렬 기준은 다음과 같습니다. - 경매 시작일- 경매 종료일- 최고 입찰가- 상한가 unique한 값으로 페이지네이션을 구현하는 것은 쿼리도 간단하고 구현도 복잡하지 않습니다. 중복이 없으니까요. 하지만, 경매 데이터에서 정렬이 될 필..
멀티스레드 (Multi-Thread) 개념 실행되지 않은 프로그램을 실행하게 되면 주기억장치에 해당 프로그램이 로딩되고 동작할 수 있는 상태인 '프로세스' 로 바뀝니다. 이러한 동적인 상태의 프로그램을 프로세스라고 하고 프로세스 내의 일련의 작업 단위 하나를 '스레드'라고 표현합니다. 어떤 프로세스든 기본적으로 하나의 메인 스레드가 존재 합니다. 메인 스레드를 중심으로 코드에 따라서 큰 흐름이 진행되는데 프로그램의 성질에 따라서 이러한 스레드가 여러 개 필요할 수 있습니다. 예를 들면 게임이나 웹 서비스 환경에서는 들어오는 요청 수가 동시적이면서 많을 수 있기 때문에 스레드 하나로 전부 처리한다면 간단한 요청에도 많은 시간이 걸릴껍니다. 그래서 Java는 이러한 환경에서 동시다발 적으로 들어오는 요청을 ..
(모든 설명은 MySQL 8.0 기준 입니다.) 트랜잭션이란? 트랜잭션은 하나의 논리적인 기능을 수행하기 위해 여러 개의 작업 셋을 하나로 묶은 작업의 단위다. 트랜잭션은 원자성, 일관성, 격리성, 지속성 4가지의 특징을 갖는다. (ACID) ACID 원자성 (Atomicity) 트랜잭션을 구성하는 작업 전체가 성공하거나 아니면 전체가 실패하는 것 둘 중 하나만을 보장한다는 특징이다. 트랜잭션을 구성하는 여러 쿼리 중 일부분만 성공하거나 일부분만 실패하면 데이터의 정합성에 문제가 생기게 된다. 예시를 보면서 이해해보자. 기능 : 은행 시스템의 송금 송금 기능의 순서 1. 계좌 잔액 테이블에서 송금자 A의 잔액을 차감한다. 2. 계좌 잔액 테이블에서 돈을 받는 B의 잔액을 추가한다. 3. 거래 내역 테이블..
하드 디스크 드라이브 (HDD)와 솔리드 스테이드 드라이브 (SSD) 기본적으로 컴퓨터에서 CPU, Register, RAM 같은 주요 장치는 전자식 장치이다. 반면에 하드 디스크 드라이브는 기계식 장치다. 전자식 장치들 (이하 CPU, RAM 등) 의 성능은 짧은 시간 동안 매우 빠른 속도로 발전했다. 하지만 디스크 같은 기계식 장치들의 성능은 상당히 제한적으로 발전했다. 비록 최근에는 자기 디스크 원판에 의존하는 하드 디스크(HDD) 보다 원판을 사용하지 않고 NAND 플래시 메모리를 사용하는 SSD 드라이브가 많이 활용되고 있지만, 여전히 데이터 저장 매체는 컴퓨터의 가장 느린 부분이라는 사실에는 변함이 없다. 아래의 막대 그래프를 보면 HDD 보다 빠른 성능을 보이는 SSD 조차도 CPU와 약 만..
문제 한국이 낳은 세계적인 락스타 락동호는 2007년 2월 1일 역대 최대 규모의 콘서트를 열었으며, 2007년 2월 11일에 자신의 음악세계를 세상에 알리고, 2007년 3월 4일에는 자신의 작곡 비법을 세계에 공개했다. 하지만, 그 후 락동호는 음악을 접고 체스에 입문하게 되었고, 그 결과 2007년 3월 31일 Heroes원정대에서는 체스 부분으로 참가하게 된다. 그 후 절대로 음악을 하지 않을 것 같았지만, 모두의 예상을 깨고, 2007년 4월 21일 월드 노래자랑으로 신이 내린 가창력으로 우승한 뒤 자취를 감추었다. 하지만 2008년 7월 13일 드디어 락동호가 컴백한다. 락동호는 지난 몇 달간 자신의 신보에 자신의 음악적 능력을 모두 담았고, 이제 몇몇 곡 중 최고의 곡만을 앨범에 담으려고 한..
문제 공학자 길동이는 외부의 침략으로부터 마을을 지킬 수 있는 부메랑 무기를 개발하는 공학자다. 길동이는 부메랑 제작을 위한 고급 나무 재료를 구했다. 이 나무 재료는 NxM크기의 직사각형 형태이며 나무 재료의 부위마다 그 강도가 조금씩 다르다. 예를 들어 나무 재료의 크기가 2x3일 때는 다음과 같이 총 6칸으로 구성된다. 길동이는 이처럼 넓은 사각형 형태의 나무 재료를 잘라서 여러 개의 부메랑을 만들고자 한다. 그리고 부메랑은 항상 3칸을 차지하는 ‘ㄱ’모양으로 만들어야 한다. 따라서 부메랑의 가능한 모양은 다음과 같이 총 4가지다. 이때 부메랑의 중심이 되는 칸은 강도의 영향을 2배로 받는다. 위 그림에서 노란색으로 칠한 부분이 ‘중심이 되는 칸’이다. 예를 들어 앞선 예시에서는 다음과 같이 2개의..
문제 N×M의 행렬로 표현되는 맵이 있다. 맵에서 0은 이동할 수 있는 곳을 나타내고, 1은 이동할 수 없는 벽이 있는 곳을 나타낸다. 당신은 (1, 1)에서 (N, M)의 위치까지 이동하려 하는데, 이때 최단 경로로 이동하려 한다. 최단경로는 맵에서 가장 적은 개수의 칸을 지나는 경로를 말하는데, 이때 시작하는 칸과 끝나는 칸도 포함해서 센다. 만약에 이동하는 도중에 한 개의 벽을 부수고 이동하는 것이 좀 더 경로가 짧아진다면, 벽을 한 개 까지 부수고 이동하여도 된다. 한 칸에서 이동할 수 있는 칸은 상하좌우로 인접한 칸이다. 맵이 주어졌을 때, 최단 경로를 구해 내는 프로그램을 작성하시오. 입력 첫째 줄에 N(1 ≤ N ≤ 1,000), M(1 ≤ M ≤ 1,000)이 주어진다. 다음 N개의 줄에 ..
문제 한수는 크기가 2N × 2N인 2차원 배열을 Z모양으로 탐색하려고 한다. 예를 들어, 2×2배열을 왼쪽 위칸, 오른쪽 위칸, 왼쪽 아래칸, 오른쪽 아래칸 순서대로 방문하면 Z모양이다. N > 1인 경우, 배열을 크기가 2N-1 × 2N-1로 4등분 한 후에 재귀적으로 순서대로 방문한다. 다음 예는 22 × 22 크기의 배열을 방문한 순서이다. N이 주어졌을 때, r행 c열을 몇 번째로 방문하는지 출력하는 프로그램을 작성하시오. 다음은 N=3일 때의 예이다. 입력 첫째 줄에 정수 N, r, c가 주어진다. 출력 r행 c열을 몇 번째로 방문했는지 출력한다. 제한 1 ≤ N ≤ 15 0 ≤ r, c < 2N 풀이 더보기 package baekjoon; import java.io.*; import java..
💭 서론 2주차가 끝났다. 어렵지 않을 것 이라고 예상했지만 크나큰 오산이었다. 전체적인 설계부터 테스트, 컨벤션, OOP 등 기본적인 기능 구현이 20% 라면 나머지가 80%를 차지할 만큼 시간이 들었다. 비록 테스트를 전부 통과하지는 못했지만 이번 주차에서 내가 뭘 느끼고 뭘 배웠는지 공유하려고 한다. 📩 2주차 미션 게임 설명 기본적으로 1부터 9까지 서로 다른 수로 이루어진 3자리의 수를 맞추는 게임이다. 같은 수가 같은 자리에 있으면 스트라이크, 다른 자리에 있으면 볼, 같은 수가 전혀 없으면 낫싱이란 힌트를 얻고, 그 힌트를 이용해서 먼저 상대방(컴퓨터)의 수를 맞추면 승리한다. 예) 상대방(컴퓨터)의 수가 425일 때 123을 제시한 경우 : 1스트라이크 456을 제시한 경우 : 1볼 1스트..
문제 어른 상어가 마법사가 되었고, 파이어볼을 배웠다. 마법사 상어가 크기가 N×N인 격자에 파이어볼 M개를 발사했다. 가장 처음에 파이어볼은 각자 위치에서 이동을 대기하고 있다. i번 파이어볼의 위치는 (ri, ci), 질량은 mi이고, 방향은 di, 속력은 si이다. 위치 (r, c)는 r행 c열을 의미한다. 격자의 행과 열은 1번부터 N번까지 번호가 매겨져 있고, 1번 행은 N번과 연결되어 있고, 1번 열은 N번 열과 연결되어 있다. 파이어볼의 방향은 어떤 칸과 인접한 8개의 칸의 방향을 의미하며, 정수로는 다음과 같다. 마법사 상어가 모든 파이어볼에게 이동을 명령하면 다음이 일들이 일어난다. 모든 파이어볼이 자신의 방향 di로 속력 si칸 만큼 이동한다. 이동하는 중에는 같은 칸에 여러 개의 파이..