전체 글

꾸준히 성장하는 개발자 WONOW 입니다. 🤗
링크https://www.acmicpc.net/problem/14889 알고리즘 선택과 근거브루트포스모든 경우의 수를 따져야한다.백트래킹경우의 수 중복 방지 정답 코드import java.util.*;import java.io.*;public class Main { static boolean[] visited; static int[][] arr; static int answer = Integer.MAX_VALUE; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); ..
링크https://school.programmers.co.kr/learn/courses/30/lessons/250136 프로그래머스SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr 주의점탐색할 때마다 MAX 값을 구하는 연산을 하면, 효율성 측면에서 매우 불리해진다. 알고리즘 선택과 근거DFS최단 거리를 구하는 문제가 아니다. 그래서 BFS 는 고려하지 않았음MAX 값을 구하는 게 중요하다.메모이제이션탐색 할 때마다 MAX 값을 구한다고 하면, 효율성 측면에서 매우 불리해진다.석유 탐색석유 덩어리를 하나의 Team 이라고 정의하고 DFS 돌릴 때 Team 배열에 해당 Team 석유 매장량을 저장한다.석유 시추팀 방문..
알고리즘 스터디가 필요했습니다.저는 이전에 하루 적어도 한 문제씩 알고리즘을 푸는 것을 목표로 잡고 행동에 옮겼습니다.  결과는 3개월만에 백준 기준 브론즈에서 골드레벨까지 올랐습니다.알고리즘 실력은 늘었습니다. 그러나 제가 기대하는 것만큼 드라마틱하게 늘지 않았습니다.왜였을까요? 솔직하게 말하면, 제가 자신있는 분야만 풀었기 때문입니다.하루에 적어도 한 문제를 풀어야하니, 배움의 목적이라기 보다는 풀이의 목적성이 더욱 강했습니다. 그래서 제가 자신있는 분야는 풀이 속도가 빨라졌으나, 전체적으로 보면 그렇게 실력이 많이 늘지 않았던 것입니다. 또한, 공부법도 명확하지 않았습니다.  저는 제가 자신있는 분야만 풀었고, 해결한 문제에 대해서 복습을 하지 않았습니다. 그래서 잘 몰랐던 분야에 대해서는 장기기억..
주소https://www.acmicpc.net/problem/2309 주의점아홉 난쟁이 중 일곱 난쟁이만 산출한다.일곱 난쟁이 키의 합은 100 이다.일곱 난쟁이를 찾을 수 없는 경우는 없다. 알고리즘 선택과 근거브루트포스 알고리즘- 문제의 달성 조건이 명확하다.- 정답이 여러개일 수 있으나 풀이의 수가 제한되어 있다. 풀이import java.util.*;public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int sum = 0; int[] arr = new int[9]; // 스파이 난쟁이 초기값은 배열 ..
이번 Radiata 프로젝트 진행하며 나는 부팀장 역할을 맡고, 타임세일 쿠폰 파트를 맡았다.프로젝트 초반에는 ERD 설계에 공을 많이 들였다. 팀원분들과 계속 소통하며 어떻게 해야 비즈니스 도메인 적으로도 이상적이고, 코드 딴에서 깔끔하게 처리를 할 수 있을까 고민을 많이 했었다. 그렇게해서 완성 된 ERD 정말 공을 많이 들인 만큼 수정이 거의 없을 정도로 깔끔하게 짜여진 ERD 였다. 그 다음은 각 파트별 아키텍처 및 구상도를 그렸다. 어떻게 동작하고, 어떤 점이 문제인지 파악하고, 추후에 해당 구상도를 보고 개발을 할 수 있게끔 하려는 목적이었다.내 생각에는 이런 구상도가 개발 시간을 단축시키는데 가장 큰 힘이 된 거 같다.   막 요런식으로,, 다른 분들도 너무 잘해주셨는데 함부로 올리면 안되니..
기존에는 분산락을 사용했었습니다.왜 동시성 제어 시 여러 선택지가 있는데, 분산락을 사용했을까요?낙관적 락과 비관적 락의 선택지분산락을 채택하기 이전에는 비관적 락으로 동시성 제어 하는 것으로 선택했습니다.비관적 락으로 데이터를 조회하게 되면 해당 트랜잭션이 끝나기 전까지는 비관적 락을 사용한 데이터에 데이터를 Insert 를 할 수 없게 됩니다.하지만 성능상 이슈가 있었습니다.낙관적 락과 비관적 락의 성능 문제공통점 - 기본적으로 다수의 쓰레드에서 DB 에 Select 문을 날려야 하는 구조이기 때문에 DB CPU 의 점유율이 요청 쓰레드에 비례해서 상승하게 됩니다. 🔐 비관적 락 - Lock 이 필요하지 않은 상황에서도 Lock 을 사용하기 때문에, 트래픽이 많은 경우에는 O(N^2) 정도까지 성능..
비관적 락에서 분산 락으로 온 이유 비관적 락에서 분산 락으로 온 이유는 DB의 CPU 점유율 때문이다. 비관적 락은 본질적으로 DB에 Select 문을 날려야 락을 걸 거나 확인 할 수 있는 구조여서, DB 에 많은 부하가 간다.그래서 Redisson 의 Pub - Sub 구조를 이용해 레디스에서 메서드에 락을 걸어 점유하지 못하게 했다. 분산 락은 느렸다.대규모 트래픽 관점에서 너무 느렸다.RPS 200 ~ 250 대가 나왔다. 쿠폰 10000 장을 발급했을 때 최소 50초나 기다려야한다.  이에 따른 응답 시간도 길어졌다. 실제 이벤트를 진행하면 어느정도 RPS 가 나와야 할까?  TPS 3600+.. 내가 구현한 분산락으로는 어림도 없다.더욱 빠른 방법을 갈구해야한다. 이렇게 해볼까?  쿠폰 AP..
재고 감소에 대해 DB 비관적락으로 구현했었다. 여기서 문제가 생겼다. 비관적락은 우선적으로 DB에 요청을 먼저 해야하기 때문에 1000 건이 들어온다고 하면 DB 자체에 1000 건의 요청이 쏠리게 된다. 그래서 DB 의 CPU 점유율이 올라가게 되었다. RDBMS 의 CPU 점유율을 관리하지 못한다면, 예상치 못한 오류가 생길 수 있다. 그래서 Redis의 분산락을 통해 구현했다. 분산락을 통해 RDBMS 의 CPU 점유율을 줄일 수 있었다.
TIL
동시성 제어 방법들분산락RDB 가 아닌 Redis 에게 분산해서 락을 걸 수 있다. DB 락DB 락에는 여러 종류가 있지만 일반적으로 X-Lock을 걸어 락을 걸 수 있다. 각 구현 방법은 이 글에서 설명하지 않을 것이다. DB 락을 걸면 되는데 왜 분산락을 사용하지?분산락을 사용하는 이유는 다음과 같다. DB 단에 부하가 안 걸린다.다른 이유 (Sorted Set 등...)는 다 제쳐두고 이게 가장 크다. DB 단에 부하가 생기면 각종 예상치 못한 오류가 발생할 수 있다. 추가로 모노DB 면 하나의 도메인에서 발생하는 트래픽이 다른 도메인 트래픽까지 영향이 갈 수 있다.그러면 안 좋겠지?
wonow_
wonow_