전체 글
더티 쓰기, 갱신 손실, 쓰기 스큐
이 글은 데이터 중심 애플리케이션 서적을 참고했습니다.https://www.yes24.com/Product/Goods/59566585 데이터 중심 애플리케이션 설계 - 예스24데이터는 오늘날 시스템을 설계할 때 마주치는 많은 도전 과제 중에서도 가장 중심에 있다. 확장성, 일관성, 신뢰성, 효율성, 유지보수성과 같은 해결하기 어려운 문제를 파악해야 할 뿐 아니라www.yes24.com보통 트랜잭션 격리 수준으로 말하는 Read Uncommitted, Read Committed, Repeatable Read, Serializable 에 대해서는 많이들 공부한다. 거기서 일어나는 Dirty Read, Unrepeatable Read, Phantom Read 와 같은 문제를 다룬다.이것들은 어떤 쓰기 트랜잭션..
트랜잭션과 ACID
이 글은 데이터 중심 애플리케이션 서적을 참고했습니다.https://www.yes24.com/Product/Goods/59566585 데이터 중심 애플리케이션 설계 - 예스24데이터는 오늘날 시스템을 설계할 때 마주치는 많은 도전 과제 중에서도 가장 중심에 있다. 확장성, 일관성, 신뢰성, 효율성, 유지보수성과 같은 해결하기 어려운 문제를 파악해야 할 뿐 아니라www.yes24.com어떤 저자들은 2단계 커밋에서 유발되는 성능이나 가용성 문제 때문에 생기는 비용이 너무 커서 이를 지원할 수 없다고 주장했다. 우리는 항상 트랜잭션 없이 코딩하는 것보다 트랜잭션을 과용해서 병목지점이 생기는 성능 문제를 애플리케이션 프로그래머가 처리하게 하는 게 낫다고 생각한다.- 제임스 코벳 외, 스패너: 구글의 전역 분산..
[BOJ] 16437 : 양 구출 작전 (C++)
https://www.acmicpc.net/problem/16437걸린 시간 : 24분골드3이 맞나... 싶은 문제.알고리즘루트(1번 섬)부터 시작해서 자식들로부터 오는 양의 수를 세면 된다.dfs(int k) 메소드는 k번째 섬에 오는 양의 수이다. 만약 늑대가 다 먹어서 다 못 온다면 0이 오게 될 것이다.정답 코드#include using namespace std;int N;long long island[123457];vector children[123457];bool kind[123457];long long dfs(int k) { if (kind[k]) { long long ret = island[k]; for (int c : children[k]) { ret += dfs(c); } r..
[BOJ] 20057 : 마법사 상어와 토네이도 (C++)
https://www.acmicpc.net/problem/20057걸린 시간 : 54분 26초삼성의 상어 시리즈 문제이다. 정말 구현! 이다.알고리즘모래밭을 주어진 형태로 계속 돌면서 흩뿌리면 된다. 움직이는 기능을 하는 함수인 move()와 흩뿌리는 기능을 하는 함수인 scatter()만 구현하면 된다.움직이기move(int ci, int cj, int dir, int leftcnt) 함수는 현재 위치에서 현재 방향으로 한 칸 움직이는 함수이다. 단, 남은 횟수가 더 이상 없다면 실행을 멈추거나 방향을 바꿔서 직진한다.여기서 방향은 di, dj 배열에 좌, 하, 우, 상 순으로 넣어놨다. 따라서 반시계 방향으로 회전하려면 단순히 dir = (dir + 1) % 4; 만 실행하면 된다.또한 남은 횟수 지..
[BOJ] 3190 : 뱀 (C++)
https://www.acmicpc.net/problem/3190걸린 시간 : 56분정말 그냥 구현 문제이다. 프로그램으로 상황을 잘 표현할 수 있다면 쉬운 문제이다.나는 정말 사소한 부분에서 막혔다. 다음 부분이다.if (find(apple.begin(), apple.end(), {ni, nj}))apple이라는 벡터에서 {ni, nj} pair를 찾아 bool로 반환하는 algorithm 헤더의 함수이다.하지만, pair는 기본 자료형이 아니므로 == operator가 정의되어 있지 않다. 즉, 애초에 같다는 것이 정의되어 있지 않아서 찾을 수가 없다는 것이다.이를 위한 방법으로는 find_if 함수가 있다. 하지만, 어차피 find_if 함수가 시간복잡도가 낮은 것도 아니므로 코딩 테스트 목적으로는..
Spring의 새로운 동기식 HTTP Client, RestClient
RestTemplate 의 maintenance mode로 전환 Spring 에서 주로 사용했던 HTTP Client인 RestTemplate이 maintenance mode 로 들어가고, Webclient 로 대체해서 사용하길 권장한다는 것이다. 아래는 spring docs 의 한 부분이다. NOTE: As of 5.0 this class is in maintenance mode, with only minor requests for changes and bugs to be accepted going forward. Please, consider using the org.springframework.web.reactive.client.WebClient which has a more modern API a..
JWT 총정리 (2) - Access Token, Refresh Token
이전 게시글 https://morenow.tistory.com/56 JWT 총정리 (1) - JWT의 원리와 흐름 JWT의 탄생 이전의 인증 체계 JWT 탄생 이전의 인증 체계는 Session & Cookie 방식을 사용했다. 이 방식에서의 여러 단점이 있었지만 가장 큰 단점은 세션 저장소였다. 사용자의 세션 ID를 모아놓은 세 morenow.tistory.com 이전 게시글에서 JWT가 어떤 방식으로 동작하는지 어떤 흐름인지 알아보았다. 이제 실제 동작하는 과정을 알아보고, Spring Boot에서의 간단한 코드를 통해 분석해보자. 그리고 JWT의 단점의 절충안인 Refresh Token에 대해서도 알아보자. Access Token 서버에서 발급한 JWT를 해당 서버에 접근할 수 있다는 의미로 Acce..
[BOJ] 12015 : 가장 긴 증가하는 부분 수열 2 (C++)
https://www.acmicpc.net/problem/12015 12015번: 가장 긴 증가하는 부분 수열 2 첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ Ai ≤ 1,000,000) www.acmicpc.net 꽤 유명하지만 약간은 마이너한 가장 긴 증가하는 부분 수열, LIS 알고리즘이다. 간단히 생각해보면 O(N^2) 알고리즘은 생각하지 쉽지만 이보다 더 줄일 수 있다. O(N^2) [6, 2, 5, 1, 7, 4, 8] 이라는 배열의 LIS 를 구하는 경우를 보자. 답은 [2, 5, 7, 8] 이다. length 라는 배열을 length[i] = (i 에서 끝나는 LIS의 길이) 로 생각해보자. 이..
[BOJ] 2805 : 나무 자르기 (C++)
https://www.acmicpc.net/problem/2805 2805번: 나무 자르기 첫째 줄에 나무의 수 N과 상근이가 집으로 가져가려고 하는 나무의 길이 M이 주어진다. (1 ≤ N ≤ 1,000,000, 1 ≤ M ≤ 2,000,000,000) 둘째 줄에는 나무의 높이가 주어진다. 나무의 높이의 합은 항상 M보 www.acmicpc.net 걸린 시간 : 25분 2초 몇몇 Parametric Search 문제를 봤지만, 항상 어떤 알고리즘을 써야 할지 몰랐다. 하지만 이번 문제는 단번에 Parametric Search인 것을 알았다. 이 문제를 참고하자 자세한 매개 변수 탐색에 관한 이야기를 적어놨다. https://morenow.tistory.com/44 [BOJ] 2110 : 공유기 설치 (..
B+ Tree
인덱스 (Index) 인덱스란 추가적인 쓰기 작업과 저장 공간을 활용하여 데이터베이스 테이블의 검색 속도를 향상시키기 위한 자료구조이다. 데이터베이스에 따로 "어떠한 자료구조"를 갖고 독립적으로 저장되어 있으며, 실제 데이터가 아니라 실제 데이터를 찾기 위한 주소값(rid)만을 가지고 있다. 이 "어떠한 자료구조"에 가장 많이 쓰이는 것이 B+ Tree 이다. 특히, Hash Index 보다 범위 연산에 좋아 많이 쓰인다. B-Tree 기존의 트리에서 균형을 맞춘 Balanced Tree 이다. 가끔 B minus Tree 라고 부르는 사람들이 있던데, B-Tree 에서 - 는 단지 dash 일 뿐이다. 기존의 트리는 어떤 노드는 깊이가 깊고, 어떤 노드는 얕을 수 있었다. 이 균형을 맞추기 위한 트리가..